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/nvme1n1
deveria ter ficado /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 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 lsblk
edf -h
antesexecutando o dd
comando. 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 /boot
ainda 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/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
, 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 gpt
tipo 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:
- https://askubuntu.com/questions/94421/is-there-a-way-to-recover-files-from-a-storage-device-partially-overwrite-with
- Substituí acidentalmente o disco errado pelo dd, como recuperar?
Já instalei o testdisk
utilitá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 dumpe2fs
comando.
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 dumpe2fs
no 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=1024
agora, 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 dd
ao 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.ext4
sem 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 -n
ver 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 gdisk
documentação sobre recuperação de dadospara detalhes. Resumindo: quando você inicia gdisk
no 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 gdisk
não perguntar qual tabela de partição usar, você ainda poderá carregar a tabela de backup usando a c
opçã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/start
e /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 /boot
e armazenou seus kernels lá. Portanto, você precisará reinstalar os pacotes do kernel usando um chroot
ou outro meio. O mesmo vale para o seu gerenciador de inicialização ou gerenciador de inicialização.
Responder3
- Desligue o computador (imediatamente)
- Inicialize-o com um sistema de resgate.
- Execute
testdisk
para tentar recuperar seus dados. (Se você tiver espaço suficiente, tire uma imagem do dispositivo usandodd
e executetestdisk
nessa 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 testdisk
e photorec
.