Comando dd errado na unidade principal - Como recuperar dados?

Comando dd errado na unidade principal - Como recuperar dados?

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

Aqui estão os detalhes:

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

/dev/nvme1n1deveria ter ficado /dev/sdb.

Minha unidade principal /dev/nvme1n1continha 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 archlinux-2017.08.01-x86_64.isoé 541065216 bytes ou516MB

O computador ainda está funcionando e parece estar funcionando bem, e eu tenho a saída lsblkedf -h antesexecutando o ddcomando. A saída éexatamente o mesmocomo quando executo os comandos agora. Presumo que porque os dados estão armazenados 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 /bootainda imprime o conteúdo do diretório (provavelmente informações em cache), mas o conteúdo do arquivo está danificado e em execução ls /boot/EFIou ls /boot/loaderpreenche 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, fica bem claro que a tabela de partição (e provavelmente todos os dados na partição de inicialização) foi destruída. Deve ser do gpttipo disklabel 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 testdiskutilitário, que parece promissor, mas quero ter certeza de que executei as etapas corretasenquanto o computador ainda está funcionando. Se eu desligá-lo agora, ele não inicializará mais, então aqui estão as perguntas:

  • Qual a melhor forma de recuperar desta situação?
  • Como restauro a tabela de partições para o formato anterior e como recrio a partição /boot? Estou executando o Arch Linux com o kernel mais recente.
  • Existe alguma maneira de saber o que estava contido (e destruído?) Nos primeiros 4 MB da minha partição raiz?

EDIT: Adicionando mais informações e detalhes aqui com base na sugestão de @WumpusQ.Wumbley para executar o dumpe2fscomando.

A saída básica (primeiras 50 linhas) de dumpe2fs:https://pastebin.com/fBuFRQfE

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

Isto é 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

O que é seguido por MUITOS grupos que dizem [...]8192 free inodes, 0 directories, 8192 unused inodes [...]O primeiro grupo que realmente relata 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

Responder1

Presumo que a tabela de partições e a partição de inicialização possam ser recriadas facilmente, então vou me concentrar na partição ext4.

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

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

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

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

Mas a próxima coisa é a tabela de inodes, e aqui você provavelmente perdeu muitos inodes, incluindo o diretório raiz, diário e outros inodes especiais. Será bom tê-los de volta. Obviamente, pelo menos o diretório raiz ainda está funcional, ou quase todos os comandos que você tenta executar já estariam falhando.

Se você executar um dd if=/dev/nvme1n1p2 of=/some/external/device bs=4096 count=1024agora, obterá uma cópia de backup de tudo o que está em seu cache atualmente, misturado com os dados inválidos 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 ddao contrário, para colocar os dados parcialmente bons de volta no disco, substituindo as coisas ruins que estão lá agora.

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

A maior parte do que você perdeu provavelmente são inodes. Na verdade, é bastante provável que você não tivesse nenhum arquivoconteúdonos primeiros 4 MB do disco. (Executei mkfs.ext4sem opções em um arquivo de imagem de 1 TB, e o primeiro bloco não-metdata 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 dump postado no pastebin revela ótimas notícias:

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 acreditamos que apenas 4 MB no início do sistema de arquivos foram sobrescritos, só precisamos nos preocupar 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 de forma simples e2fsck -b $backup_superblock_number(após uma reinicialização). Você poderia pelo menos tentar isso para -nver o que ele pensa.

Responder2

Se o disco usa GPT, a tabela de partição deve ser recuperável usando os dados GPT de backup no final do disco. Você pode fazer isso com gdisk; vera gdiskdocumentação sobre recuperação de dadospara detalhes. Resumindo: quando você inicia gdiskno disco, ele iráprovavelmenteobserve o dano e pergunte se deseja usar os dados GPT de backup ou os dados MBR. Se você escolher a opção GPT e depois escrever as alterações, a tabela de partição será corrigida. Se gdisknão perguntar qual tabela de partição usar, você ainda poderá carregar a tabela de backup usando a copção no menu recuperação e transformação.

Se isso falhar, você ainda poderá recriar a tabela de partições (ou pelo menos os pontos inicial e final das partições) usando os dados nos arquivos /sys/block/nvme1n1/nvme1n1p1/starte /sys/block/nvme1n1/nvme1n1p1/size(e da mesma forma para /dev/nvme1n1p2). Porém, se você recorrer a esses dados, é imperativo que vocêNÃOdesligue o computador, ao contrário do que hek2mgl aconselhou. Dito isto, hek2mgl não está errado ao dizer que continuar a usar o disco em seu estado atual corre o risco de piorar as coisas. No geral, eu diria que o melhor compromisso é tentar corrigir o problema da tabela de partições o mais rápido possível e, em seguida, desligar e corrigir o problema do sistema de arquivos a partir de um disco de emergência.

Infelizmente, seu ESP está torrado. Dado o layout do seu disco, suponho que você montou o ESP /boote armazenou seus kernels lá. Portanto, você precisará reinstalar os pacotes do kernel usando um chrootou outro meio. O mesmo vale para o seu gerenciador de inicialização ou gerenciador de inicialização.

Responder3

  1. Desligue o computador (imediatamente)
  2. Inicialize-o com um sistema de resgate.
  3. Execute testdiskpara tentar recuperar seus dados. (Se você tiver espaço suficiente, tire uma imagem do dispositivo usando dde execute testdisknessa imagem)

Por que você deveria desligar o computador imediatamente? Se um novo arquivo for criado (algo em /run provavelmente) ou anexado a (/var/log/...), então o sistema de arquivos precisará examinar as informações existentes (ruins!) para decidir onde armazenar os dados. Quando esta decisão é tomada com base em informações incorretas, é alto o risco de que os blocos de dados existentes sejam substituídos. Isso os faz perder para sempre. Mesmo para ferramentas como testdiske photorec.

informação relacionada