Comando dd errado na unidade principal - Como recuperar dados?

4

Ok, algo irritantemente estúpido aconteceu. Eu queria copiar um arquivo ISO do Arch Linux para meu pendrive USB, mas estava com pressa e acidentalmente entrei na minha unidade principal como o parâmetro of .

Aqui estão os detalhes:

$ sudo dd bs=4MB if=archlinux-2017.08.01-x86_64.iso of=/dev/nvme1n1

/dev/nvme1n1 deveria ter sido /dev/sdb .

Minha unidade principal /dev/nvme1n1 continha duas partições:

  • Uma partição de inicialização EFI de 512 MB
  • Uma partição ext4 abrangendo o restante da unidade de 1 TB

O tamanho do arquivo de archlinux-2017.08.01-x86_64.iso é 541065216 bytes ou 516 MB

O computador ainda está em execução e parece estar funcionando bem, e eu tenho a saída de lsblk e df -h antes executando o comando dd . A saída é exatamente a mesma de quando eu executo os comandos agora. Eu suponho porque os dados estão em cache:

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
nvme1n1     259:5    0 931.5G  0 disk 
├─nvme1n1p1 259:6    0   512M  0 part /boot
└─nvme1n1p2 259:7    0   931G  0 part /

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme1n1p2  916G   22G  848G   3% /
/dev/nvme1n1p1  511M   36M  476M   7% /boot

ls /boot ainda imprime o conteúdo do diretório (provavelmente informações armazenadas em cache), mas o conteúdo do arquivo está danificado e a execução ls /boot/EFI ou ls /boot/loader preenche a tela com caracteres aleatórios, incluindo muitos Input/output error .

Aqui estão mais algumas informações:

$ cat /proc/partitions
major minor  #blocks  name

 259        5  976762584 nvme1n1
 259        6     524288 nvme1n1p1
 259        7  976237255 nvme1n1p2

$ sudo fdisk -l /dev/nvme1n1
Disk /dev/nvme1n1: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x282bad86

Device         Boot Start     End Sectors  Size Id Type
/dev/nvme1n1p1 *        0 1056767 1056768  516M  0 Empty
/dev/nvme1n1p2        164  131235  131072   64M ef EFI (FAT-12/16/32)

Olhando para a saída de fdisk , está bem claro que a tabela de partição (e provavelmente todos os dados na partição de inicialização) foi destruída. Deve ser um tipo de disco gpt e os tamanhos / tipos de partição estão errados. Infelizmente, devido ao tamanho do arquivo ISO (516 MB), ele também substituiu os primeiros 4 MB da minha partição raiz.

Uma saída ligeiramente diferente de gdisk :

$ sudo gdisk /dev/nvme1n1

# selected GPT when asked "Found valid MBR and GPT. Which do you want to use?"

Command (? for help): p
Disk /dev/nvme1n1: 1953525168 sectors, 931.5 GiB
Model: Samsung SSD 960 EVO 1TB                 
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): <guid>
Partition table holds up to 248 entries
Main partition table begins at sector 2 and ends at sector 63
First usable sector is 64, last usable sector is 1056704
Partitions will be aligned on 8-sector boundaries
Total free space is 1 sectors (512 bytes)

Number  Start (sector)    End (sector)  Size       Code  Name
   2             164          131235   64.0 MiB    0700  ISOHybrid1

Algumas perguntas relacionadas que encontrei:

Já instalei o utilitário testdisk , que parece promissor, mas quero garantir que execute as etapas corretas enquanto o computador ainda estiver em execução . Se eu desligar agora, não será mais iniciado, então aqui estão as perguntas:

  • Qual é a melhor maneira de se recuperar dessa situação?
  • Como restaurar a tabela de partições para o formulário anterior e como recriar a partição / boot? Estou executando o Arch Linux com o kernel mais recente.
  • Existe alguma maneira de saber o que foi contido (e destruído?) nos primeiros 4 MB da minha partição raiz?

EDITAR: Adicionando mais informações e detalhes aqui com base na sugestão do @WumpusQ.Wumbley de executar o comando dumpe2fs .

A saída básica (primeiras 50 linhas) de dumpe2fs : link

Para mim, parece bastante normal, até mesmo o número mágico do sistema de arquivos ( 0xEF53 ) está correto.

Isso é seguido por Group 0 :

Group 0: (Blocks 0-32767) csum 0x9569 [ITABLE_ZEROED]
  Primary superblock at 0, Group descriptors at 1-117
  Reserved GDT blocks at 118-1141
  Block bitmap at 1142 (+1142)
  Inode bitmap at 1158 (+1158)
  Inode table at 1174-1685 (+1174)
  21349 free blocks, 8177 free inodes, 2 directories, 8177 unused inodes
  Free blocks: 11419-32767
  Free inodes: 16-8192

Que é seguido por MUITOS grupos que dizem [...]8192 free inodes, 0 directories, 8192 unused inodes [...] O primeiro grupo que realmente reporta alguns diretórios não é até Group 3648 , ou cerca de 25.000 linhas depois:

Group 3648: (Blocks 119537664-119570431) csum 0xa9ea [ITABLE_ZEROED]
  Block bitmap at 119537664 (+0)
  Inode bitmap at 119537680 (+16)
  Inode table at 119537696-119538207 (+32)
  23930 free blocks, 1670 free inodes, 614 directories, 1670 unused inodes
  Free blocks: 119546502-119570431
  Free inodes: 29890939-29892608

Existem muitos superblocos de backup em todo o sistema de arquivos:

$ sudo dumpe2fs /dev/nvme1n1p2 | grep -i superblock | wc -l
dumpe2fs 1.43.5 (04-Aug-2017)
19
    
por friederbluemle 13.08.2017 / 16:32

3 respostas

3

Eu assumo que a tabela de partições e a partição de inicialização podem ser recriadas facilmente, então vou focar na partição ext4.

O layout do sistema de arquivos é um pouco dependente das opções usadas ao criá-lo. Eu descreverei o caso comum. Você pode ver se isso corresponde ao seu executando dumpe2fs no dispositivo (que esperamos encontrar todos os metadados de nível superior no cache, em vez de ler do disco).

O tamanho normal do bloco para sistemas de arquivos ext4 é de 4096 bytes, então você perdeu 1024 blocos.

A primeira coisa sobrescrita foi o bloco 0, o superbloco primário. Isso não é um problema por si só, porque existem superblocos de backup. Depois disso é a tabela de descritor de grupo, que também tem backups dentro do sistema de arquivos.

Depois, há bitmaps de bloco e bitmaps de inode. É aqui que a notícia começa a ficar um pouco pior. Se algum deles estiver abaixo do bloco 1024, o que provavelmente é, você perdeu informações sobre quais inodes e blocos estão em uso. Essas informações são redundantes e serão reconstruídas pelo fsck com base no que encontrar percorrendo todos os diretórios e inodes, se estiverem intactos.

Mas a próxima coisa é a tabela de inode, e aqui você provavelmente perdeu muitos inodes, incluindo o diretório raiz, o diário e outros inodes especiais. Será bom ter aqueles de volta. Obviamente, o diretório raiz, pelo menos, ainda é funcional, ou apenas sobre todos os comandos que você tenta executar já estaria falhando.

Se você executar um dd if=/dev/nvme1n1p2 of=/some/external/device bs=4096 count=1024 agora, obterá uma cópia de backup do que estiver em seu cache atualmente, misturada com os dados incorretos dos blocos que não estão armazenados em cache. Então, depois de inicializar um disco de recuperação, você pode fazer o mesmo dd no sentido inverso, para colocar de volta os dados parcialmente bons no disco, sobrescrevendo todas as coisas ruins que estão lá agora.

Depois disso, você pode encontrar ferramentas de recuperação automatizadas ( fsck , testdisk ) funcionam bem o suficiente. Caso contrário, você tem um mapa que pode ser usado para ajudar na recuperação manual. Usando as listas "bloco livre" de dumpe2fs , você sabe quais blocos ignorar.

A maior parte do que você perdeu provavelmente é inodes. Na verdade, é bem provável que você não tenha nenhum arquivo conteúdo nos primeiros 4 MB de disco. (Eu corri mkfs.ext4 sem opções em um arquivo de imagem de 1TB, e o primeiro bloco não-metadata acabou sendo o bloco 9249)

Cada inode que você conseguir recuperar identificará os blocos de dados de um arquivo inteiro. E esses blocos de dados podem estar localizados em todo o disco, não necessariamente nas proximidades.

Dia 2

O despejo postado no pastebin revela uma ótima notícia:

Group 0: (Blocks 0-32767) csum 0x9569 [ITABLE_ZEROED]
  Primary superblock at 0, Group descriptors at 1-117
  Reserved GDT blocks at 118-1141
  Block bitmap at 1142 (+1142)
  Inode bitmap at 1158 (+1158)
  Inode table at 1174-1685 (+1174)
  21349 free blocks, 8177 free inodes, 2 directories, 8177 unused inodes
  Free blocks: 11419-32767
  Free inodes: 16-8192

Como achamos que apenas 4MB no início do sistema de arquivos foram sobrescritos, precisamos nos preocupar apenas com os blocos 0-1023. E os blocos GDT reservados vão até o bloco 1141! Este é o tipo de dano que deve ser reparado por um simples e2fsck -b $backup_superblock_number (após uma reinicialização). Você poderia pelo menos tentar com -n para ver o que pensa.

    
por 13.08.2017 / 22:19
1

Se o disco usou o GPT, a tabela de partições deve ser recuperável usando os dados do GPT de backup no final do disco. Você pode fazer isso com gdisk ; consulte a documentação de gdisk sobre recuperação de dados para obter detalhes. Resumindo: quando você executar gdisk no disco, provavelmente notará o dano e perguntará se você deseja usar os dados de backup da GPT ou os dados do MBR. Se você escolher a opção GPT e, em seguida, gravar as alterações, a tabela de partições será corrigida. Se gdisk não perguntar sobre qual tabela de partição usar, você ainda poderá carregar a tabela de backup usando a opção c na recuperação & menu de transformação.

Se isso falhar, você ainda pode recriar a tabela de partição (ou pelo menos os pontos de início e de término das partições) usando os dados em /sys/block/nvme1n1/nvme1n1p1/start e /sys/block/nvme1n1/nvme1n1p1/size files (e de forma semelhante para /dev/nvme1n1p2 ) . Se você recorrer a esses dados, é imperativo que você NÃO desligue o computador, ao contrário do que o hek2mgl recomendou. Dito isto, hek2mgl não está errado que continuar a usar o disco em seu estado atual corre o risco de piorar a situação. No geral, eu diria que o melhor compromisso é tentar corrigir o problema da tabela de partição o mais rápido possível e, em seguida, desligar e corrigir o problema do sistema de arquivos de um disco de emergência.

Infelizmente, o seu ESP é torrado. Dado o layout do seu disco, eu acho que você montou o ESP em /boot e armazenou seus kernels lá. Assim, você precisará reinstalar seus pacotes do kernel usando um chroot ou algum outro meio. O mesmo vale para o seu gerenciador de inicialização ou gerenciador de inicialização.

    
por 14.08.2017 / 16:56
0
  1. Desligue o computador (imediatamente)
  2. Inicialize com um sistema de recuperação.
  3. Execute testdisk para tentar recuperar seus dados. (Se você tiver espaço suficiente, tire uma imagem do dispositivo usando dd e execute testdisk nessa imagem)

Por que você deve desligar o computador imediatamente? Se um novo arquivo for criado (algo em / run probaly) ou anexado a (/ var / log / ...), o sistema de arquivos precisará examinar as informações existentes (ruins!) Para decidir onde armazenar os dados. Quando essa decisão é tomada com base em informações incorretas, o risco é alto de que os blocos de dados existentes sejam sobrescritos. Isso os faz perdidos para sempre. Mesmo para ferramentas como testdisk e photorec .

    
por 13.08.2017 / 16:48