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.

Ernest A
fonte
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ê.

derobert
fonte
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 .

mwfearnley
fonte
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.

Cachinhos Dourados
fonte
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.)

Peter Teoh
fonte
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 .

taro
fonte
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.

slm
fonte
1
Não vejo como esse método poderia me ajudar a descobrir onde o sistema de arquivos é iniciado.
Ernest A