Resumo:
- Deixei cair meu laptop com SSD dentro
- A unidade não pode mais ser montada ou fsck-able (o temido erro de entrada/saída)
- Entretanto, o disco ainda está intacto/funcionando o suficiente para ler a tabela de partições e verificar a senha de criptografia
- Se conectado externamente via USB, a unidade fica totalmente invisível, não sendo reconhecida de forma alguma
- O que aconteceu?
- Existe alguma maneira de consertar isso?
Detalhes completos:
Tenho um antigo ThinkPad T420 de 2012. Eu uso o Ubuntu 20.04 e a partição principal é criptografada. Alguns dias atrás, eu o deixei cair. Ele desligou imediatamente e não inicializa mais na unidade principal.
A unidade de inicialização principal é um SSD (Samsung 870 EVO) que é conectado ao laptop por meio de um caddy que adapta a unidade para caber no compartimento da unidade óptica.
Embora não haja danos visíveis no SSD ou no adaptador, meu primeiro pensamento foi que o dano era no conector/adaptador ou algo assim que foi danificado ou solto. Então, removi o SSD do laptop e o conectei a um adaptador SATA para USB . Foi um fracasso total. Conectei-o a alguns computadores diferentes e a unidade parecia totalmente invisível (nenhum novo dispositivo em /dev
, nenhuma entrada em lsusb
). (O adaptador SATA para USB em si funciona bem quando o testei com um HDD diferente.)
No entanto, se eu colocar o SSD de volta em seu local/caddy original e inicializar o Linux via USB, a unidade não ficará totalmente invisível, mas também aparentemente não poderá ser usada.
Posso ver a tabela de partição da unidade:
ubuntu@ubuntu:~$ sudo fdisk -l /dev/sda
Disk /dev/sda: 465.76 GiB, 500107862016 bytes, 976773168 sectors
Disk model: Samsung SSD 870
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: 0xe62c1c13
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 1050623 1048576 512M b W95 FAT32
/dev/sda2 1052670 976771071 975718402 465.3G 5 Extended
/dev/sda5 1052672 2549759 1497088 731M 83 Linux
/dev/sda6 2551808 976771071 974219264 464.5G 83 Linux
A unidade está criptografada, então não posso simplesmente montá-la diretamente, mas preciso passar por algumas etapas antes:
ubuntu@ubuntu:~$ sudo cryptsetup open /dev/sda6 ssd
Enter passphrase for /dev/sda6:
se eu digitar a senha errada, ele me rejeita:
Warning: keyslot operation could fail as it requires more than available memory.
No key available with this passphrase.
mas se eu digitar a senha correta, ele me deixa entrar e o dispositivo /dev/mapper/ssd
aparece como esperado.
Agora há mais um passo de rigamarole. O comando é sudo vgchange -ay
, que deve fazer o dispositivo /dev/vgubuntu/root
aparecer. Quando tentei pela primeira vez, esse comando funcionou, mas no momento, ele não faz mais nada (as coisas estão se deteriorando com o passar do tempo, veja abaixo).
Neste ponto, você deve conseguir montar /dev/vgubuntu/root
, mas mount
falha com um "erro de entrada/saída" genérico (não tenho o erro exato em mãos no momento). fsck
Também falha com "erro de entrada/saída" e um segundo erro algo como "nenhum superbloco encontrado".
No momento estou correndo ddrescue
para ver o que pode ser recuperado:
sudo ddrescue --idirect /dev/sda /media/ubuntu/whatever/rescue.img /media/ubuntu/whatever/rescue.log
Parece que está fazendo alguma coisa, mas muito lentamente e estou um pouco cético de que realmente terá sucesso.
Outra observação: o problema parece piorar e você obtém mais erros quanto mais tempo a unidade estiver conectada. Por exemplo, inicialmente você pode ler a tabela de partição com sudo fdisk -l /dev/sda
o que mostrei acima. No entanto, eventualmente isso deixará de funcionar:
ubuntu@ubuntu:~$ sudo fdisk -l /dev/sda
fdisk: cannot open /dev/sda: Invalid argument
Mas ele voltará a funcionar se você retirar o drive e recolocá-lo novamente.
O que aconteceu com o disco? Algo pode ser feito para recuperá-lo?
Em relação à primeira questão:
Eu realmente não sei, mas veja os comentários do Dr. Moishe Pippik e Ramhound para uma explicação parcial.
Para a segunda pergunta:
a resposta é um claro sim. Seja qual for o problema, o disco não foi danificado muito gravemente;
ddrescue
consegui recuperar quase todas as informações do disco, e consegui extrair todos os arquivos que precisava.Vou explicar todo o processo de recuperação, caso ajude alguém.
Como mencionei anteriormente, tive que conectar o drive internamente em vez de via USB para conseguir lê-lo, então foi isso que fiz aqui: inicializei o Linux ativo via pendrive, li o drive danificado dentro do computador e copiei para um drive de backup conectado via USB.
O primeiro passo é executar
ddrescue
, que faz basicamente exatamente o que é anunciado. Eu usei o guia aqui , mas há uma ressalva importante: se você estiver usando Linux live, não seja estúpido como eu e salve o log de resgate no diretório home, que desaparecerá assim que você reiniciar.Então o comando inicial a ser executado é
e o resultado final que vi foi
99,98% resgatados na primeira tentativa, nada mal.
(Uma observação: ocasionalmente,
ddrescue
falhará com a mensagemddrescue: /dev/sdc: Unaligned read error. Is sector size correct?
. Quando isso acontecer, retire o disco, coloque-o novamente e execute novamente o mesmo comando (mas certifique-se de que o nome do dispositivo não mudou, por exemplo, de/dev/sdc
para/dev/sdd
), que continuará de onde parou.)Após a execução inicial, você pode tentar novamente, o que usa exatamente o mesmo comando, exceto com o
--retry-passes=N
argumento adicionado. Minha experiência foi que cada nova tentativa adicional resgatou algumas centenas de kB adicionais de dados, mas era tão lento para uma quantidade tão pequena de dados que, em um certo ponto, desisti.Agora você tem sua imagem de disco com alguns (10.000 ou mais) buracos nela. Se quiser, você pode fazer uma cópia da imagem, só para o caso de você estragar a primeira.
Neste ponto consegui montar o sistema de arquivos de interesse:
Neste ponto, eu consegui ver a estrutura completa do diretório e todos os meus arquivos. Abri alguns arquivos e tudo parecia normal.
Antes de fazer qualquer outra coisa, eu queria determinar quais arquivos seriam corrompidos (ou seja, quais arquivos tinham dados armazenados nos setores defeituosos que não foram recuperados pelo ddrescue). Há uma ferramenta
ddrutility
que supostamente faz exatamente isso, mas não pareceu funcionar e suspeito que não funcione com discos criptografados. Então, escrevi alguns scripts python extremamente rápidos e sujos para fazer o trabalho. (Créditos a esta resposta por me dizer osdebugfs
comandos a serem executados)Note que no script abaixo, é essencial que o
partition_start_sectors
valor esteja correto! Se você tem um esquema de particionamento simples, você pode simplesmente usarfdisk -l
para encontrá-lo. No entanto, para configurações com LUKS e coisas LVM, isso não é suficiente. Eventualmente, eu encontrei o comandodmsetup table
, que mostra as informações necessárias:Portanto, o deslocamento relevante é 2551808 + 32768 + 2048.
O script 1 encontra números de blocos do sistema de arquivos e inodes associados a setores defeituosos no log de recuperação:
Script 2 encontra nomes de arquivos associados a inodes:
Isso identificou cerca de 250 arquivos que estavam corrompidos. Com certeza, quando eu tentava abrir os supostos arquivos corrompidos, eles estavam bagunçados (por exemplo, parcialmente renderizados para jpegs, ruídos de clique e pulando para mp3s). Felizmente, dos 250 arquivos, todos eram arquivos com os quais eu não me importava, ou então arquivos dos quais eu já tinha backups anteriores suficientes.
Ele também identificou cerca de 200 blocos de sistema de arquivos não recuperados que não estavam associados a nenhum arquivo. Eu não tinha certeza do que fazer sobre eles. Olhando para a saída de
dumpe2fs
, não parecia que esses eram blocos que continham metadados do sistema de arquivos. Mas eles também não foram marcados como livres. Então não tenho certeza exatamente do que eles são.Depois disso, você pode executar
fsck
. Embora por algum motivo eu não entenda quefsck
o comando em si não fez nada, e eu preciso executare2fsck
:fsck
encontrará muitos erros, mas felizmente nada catastrófico no meu caso.Neste ponto, você pode montar sua unidade e copiar todos os arquivos que quiser dela.