Como encontro o deslocamento de um sistema de arquivos ext4?


9

Eu tenho um disco rígido com falha que não consegue gravar ou ler os primeiros setores do disco. Apenas fornece erros de E / S e é tudo o que existe. Existem outras áreas no disco que parecem (principalmente) bem. Estou tentando montar uma partição (ext4) e ver se consigo acessar alguns arquivos que gostaria de recuperar. Como o mountcomando suporta uma offsetopção, eu devo poder montar o sistema de arquivos, mesmo que a tabela de partição seja ilegível e não gravável. O problema é como encontrar o deslocamento. Nenhuma das ferramentas ext4 parece ter esse recurso específico.


1
Experimente o testdisk e o registro fotográfico que o acompanha.
— jippie

O @jippie demorou 6 horas para testar o disco inteiro e, no final, não encontrou nenhuma partição. Eu acho que a melhor estratégia é tentar encontrar o local do sistema de arquivos diretamente e montá-lo.
— Ernest A

O photorec provavelmente conseguirá tirar seus arquivos do disco, mas os nomes de arquivos e nomes de caminho serão perdidos. Se você conseguir montar o sistema de arquivos que é, obviamente, sua melhor opção, mas se o testdisk não encontrou nenhum, é provável que o início do sistema de arquivos também esteja corrompido.
— jippie

Respostas:


13

Não existe um deslocamento padrão por si só, pois é claro que você pode iniciar a partição onde quiser. Mas vamos assumir por um momento que você está procurando a primeira partição, e ela foi criada com padrões mais ou menos aceitáveis. Existem dois lugares em que você pode encontrá-lo, supondo que você esteja usando uma tabela de partição tradicional do DOS:

  1. Começando no setor (512 bytes) 63. Essa era a tradição por muito tempo e funcionou até que alguém inventasse discos 4K ...
  2. A partir do setor (512 bytes) 2048. Essa é a nova tradição, para acomodar discos 4K.
  3. Uma opção de bônus! Analisando o setor 56. É o que acontece se alguém mover a partição 63-start para torná-la alinhada com um setor 4K.

Agora, para continuar, você desejará escolher sua ferramenta hex-dump favorita e aprender um pouco sobre o Layout de disco ext4 . Em particular, ele começa com 1024 bytes de preenchimento, que o ext4 ignora. Em seguida, vem o superbloco. Você pode reconhecer o superbloco verificando o número mágico 0xEF53 no deslocamento 0x38 (no início do superbloco ou 0x438 no início da partição ou 1080 em decimal.) O número mágico é little-endian. Portanto, ele é realmente armazenado no disco como 0x53EF.

Aqui está o que isso se parece com xxd -a:

0000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 0000400: 0040 5d00 0084 7401 33a0 1200 33db a600 .@]...t.3...3... 0000410: 4963 5300 0000 0000 0200 0000 0200 0000 IcS............. 0000420: 0080 0000 0080 0000 0020 0000 6637 0952 ......... ..f7.R 0000430: 6637 0952 0200 1600 53ef 0100 0100 0000 f7.R....S....... 0000440: 9938 f851 004e ed00 0000 0000 0100 0000 .8.Q.N..........

Observe que, quando você der o deslocamento para montagem (ou perda de ajuste), deverá dar o deslocamento para onde o preenchimento começa - não para o superbloco.

Agora, se não é a primeira partição, ou não está em um dos dois (três) pontos esperados, você basicamente procura o número mágico 0xEF53. Isto é o que testdisk(recomendado em um comentário) faz por você.


2
SUCESSO!!! Eu tive que escrever meu próprio roteiro. testdisknão o encontraria. Obrigado a todos pela ajuda.
— Ernest A

Com base nisso, você pode usar algo como dd if=/dev/sda skip=$start_sector | xxd -a | grep '[02468]30: .... .... .... .... 53ef'para obter algumas correspondências prováveis. Provavelmente não é muito rápido, mas você pode deixá-lo funcionar enquanto encontra um método melhor.
— mwfearnley

Veja minha resposta abaixo para o "método melhor" agora. Nota: apenas a varredura desse número em dados aleatórios encontrará um falso positivo a cada 65536 setores (32 MB).
— Mwfearnley

obrigado por isso. devido ao fato de ele me levou um segundo de leitura para aviso testdisk, eu só tive que adicionar uma edição para um tl;dr:cabeçalho
— Jan-Stefan Janetzky

5

Com base na resposta do @ derobert , escrevi um programa ( gist ) que analisará um fluxo de entrada dde examinará cada setor em busca de algo parecido com o início de uma partição ext.

Funcionará pelo menos o mais rápido que ddpuder ler no seu disco rígido. Uma versão resumida está abaixo.

O uso mais simples é justo sudo dd if=/dev/xxx | ext2scan, embora você provavelmente deseje modificar o ddcomando para melhorar o tamanho do bloco ou escolher uma região para pesquisar.

#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main() {
  unsigned char const MAGIC[2] = {0x53, 0xef};
  unsigned char const ZEROS[512] = {0};

  long long int sector = 0;

  char buf[4][512];
  int empty1, empty2;

  while (read(STDIN_FILENO, buf[sector&3], 512) > 0) {
    if (!memcmp(buf[sector&3] + 0x38, MAGIC, 2)) {
      printf("Found a possible ext2 partition at sector %lld", sector-2);

      empty1 = !memcmp(buf[(sector-2)&3], ZEROS, 512);
      empty2 = !memcmp(buf[(sector-1)&3], ZEROS, 512);

      if (empty1 && empty2) printf(" (first two sectors are empty :)\n");
    }
    sector++;
  }
}

Nota: encontrará não apenas o início das partições, mas também superblocos dentro delas.

Em ambos os casos, eu recomendaria o uso dumpe2fspara analisar os resultados. Você pode despejar o início do superbloco suspeito em um arquivo (pelo menos os seis primeiros setores, de acordo com meu teste informal) e, se for um superbloco, dumpe2fsinformará (entre outras coisas) a localização relativa dos outros superblocos .


2

Adivinhe onde a partição começa e aplique uma força bruta:

bsz=512 # or 1024, 2048, 4096 higher = faster

for i in {2..10000000}; do
    echo "--->$i<---"
    mount -o offset=$(($bsz*$i)) -t ext4 /dev/whatever /mnt/foo
    if [ $? == 0 ]; then # whahoo!
        echo Eureka
        break
    fi
done

Imagino que isso possa levar algum tempo, mas se você já passou 6 horas com o testdisk, talvez valha a pena tentar.


Hah, isso é muita força bruta!
— derobert

Funciona, mas é lento; Eu tentei isso em uma imagem de múltiplas partições cujos deslocamentos eu conhecia, para que eu pudesse iniciá-la bem perto. Jogou na echo "--->$i<---"linha por causa disso, pois, caso contrário, é impossível avaliar o progresso. Eu acho que você poderia aumentar bszpara 4096, o que acelerará as coisas.
— Goldilocks

Você poderia acelerar muito se assumir o layout tradicional em que as partições iniciam em um limite de "faixa" (ou é cilindro?).
— derobert

minha estimativa era pobre por esta solução para ser prático, mas pode trabalhar em outras circunstâncias
— Ernest A

2

Tente outra opção (por exemplo, usando debugfs e fsck.ext4):

debugfs:

Você precisa montar os debugfs primeiro (não o próprio disco rígido com falha):

http://johnsofteng.wordpress.com/2013/11/20/sysfs-procfs-sysctl-debugfs-and-other-similar-kernel-interfaces/

http://afzalkhanlinuxtalk.wordpress.com/2013/08/07/how-to-recover-deleted-file-in-linux/comment-page-1/#comment-8

http://blesseddlo.wordpress.com/2010/10/12/using-debugfs/

(essencialmente, é usar "debugfs -w" com o modo ativado para gravação e, em seguida, seguido de "lsdel" para listar todos os arquivos excluídos). alternativamente, você pode usar

e aqui está o fsck.ext4:

http://linuxexpresso.wordpress.com/2010/03/31/repair-a-broken-ext4-superblock-in-ubuntu/

Outro é o "sleuthkit" ("sudo apt-get install sleuthkit"), que possui comando como "istat" para fornecer informações sobre os blocos sobre os inodes - dos quais você pode obter o deslocamento e, assim, bloquear o conteúdo dos dados facilmente.

https://www.ibm.com/developerworks/cn/linux/l-cn-ext4resize/

(BTW, se o tamanho do bloco for 1024, do comando "show_super_stats" do debugfs, segue-se que o bloco 1 tem 1024 bytes de deslocamento desde o início do disco e cada grupo de blocos também pode ter vários blocos.)


1

Eu tinha uma imagem de firmware de e-book que incluía a imagem da partição ext3fs, para montar e editar que eu tinha que digitalizar a imagem usando a ferramenta bgrep para encontrar todas as posições do número mágico do ext3fs 0x53EFe tentar montar usando as compensações encontradas.

Aqui está um script abreviado que executa a montagem:

#!/bin/sh
FW_IMAGE=$1
MOUNT_POINT=$2

FS_TYPE=ext3
EXTFS_MAGIC_NUM=53ef
MAGIC_OFFSET=1080

OFFSETS=`bgrep $EXTFS_MAGIC_NUM $FW_IMAGE | awk '{print toupper($NF)}'`
for OFFSET in $OFFSETS; do
  OFFSET=`echo "ibase=16; $OFFSET" | bc`
  OFFSET=`expr $OFFSET - $MAGIC_OFFSET`
  sudo mount -t $FS_TYPE -o loop,offset=$OFFSET $FW_IMAGE $MOUNT_POINT 2>/dev/null
  if [ $? -eq 0 ]; then
    echo "Success!  Offset is: $OFFSET."
    break
  fi
done

Script completo localizado aqui .


0

Isso não foi testado, mas acho que você pode usar o método discutido nesta seção de perguntas e respostas da SU, intitulado: Pesquisa inversa de inode / arquivo a partir do deslocamento no dispositivo bruto no linux e ext3 / 4? .

Parece que você pode usar o inode de um arquivo + o deslocamento dos discos + o tamanho do bloco para determinar o deslocamento do arquivo.


1
Não vejo como esse método poderia me ajudar a descobrir onde o sistema de arquivos é iniciado.
— Ernest A
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.