Por ser um sistema operacional multiusuário e multitarefa, depois que os arquivos no Linux são excluídos, eles são difíceis de recuperar. Embora o comando delete apenas marque o nó do arquivo para exclusão e não limpe realmente o conteúdo do arquivo, outros usuários e alguns processos que gravam no disco substituirão rapidamente os dados.
1. Uma breve introdução à estrutura do sistema de arquivos Ext2
No sistema de arquivos Ext2 usado pelo Linux, os arquivos são armazenados em blocos. Por padrão, o tamanho de cada bloco é 1K e diferentes blocos são diferenciados por números de bloco. Cada arquivo também possui um nó, que contém o proprietário do arquivo, permissões de leitura e gravação, tipo de arquivo e outras informações. Para um arquivo menor que 12 blocos, o número do bloco de dados do arquivo é armazenado diretamente no nó. Se o arquivo for maior que 12 blocos, o nó armazena o número do bloco indireto após 12 números de bloco. No bloco correspondente a esse número de bloco indireto, os números dos 256 blocos de dados do arquivo são armazenados (cada bloco em Ext2fs). O número ocupa 4 bytes, então o número do bloco que pode ser armazenado em um bloco é 1024/4=256). Se houver arquivos maiores, os blocos indiretos secundários e ** blocos indiretos também aparecerão no nó.
2. Métodos para recuperar arquivos excluídos acidentalmente
A maioria das distribuições Linux fornece uma ferramenta debugfs que pode ser usada para editar o sistema de arquivos Ext2. Mas antes de usar esta ferramenta, ainda há trabalho a ser feito.
Primeiro, remonte a partição onde o arquivo excluído acidentalmente está localizado no modo somente leitura. Use o seguinte comando: (assumindo que o arquivo esteja na partição /usr)
mount -r -n -o remount /usr -r indica montagem somente leitura; -n indica não gravar em /etc/mtab. Se você estiver restaurando arquivos em /etc, adicione este parâmetro. Se o sistema disser que a partição xxx está ocupada, você pode usar o comando fuser para verificar quais processos usam os arquivos nesta partição:
fusor –v –m /usr
Se não houver processos importantes, interrompa-os com o seguinte comando:
fusor -k –v –m /usr
Esses sistemas de arquivos podem então ser remontados.
Se todos os arquivos estiverem instalados em uma partição / grande, você pode usar o linux single para entrar no modo de usuário único no prompt de inicialização para minimizar a chance do processo do sistema gravar dados no disco rígido ou simplesmente travar o disco rígido em outro local . na máquina. Além disso, não grave os dados recuperados em/acima para evitar danificar esses dados úteis. Se houver DOS/Windows na máquina, você poderá gravar nestas partições:
montar –r –n /dev/hda1 /mnt/had
Então você pode executar debugfs: (assumindo que o Linux esteja em /dev/hda5)
#debugfs /dev/hda5
O prompt debugfs debugfs aparecerá:
Use o comando lsdel para listar informações sobre muitos arquivos excluídos:
debugfs:lsdel debugfs: 2692 inodes excluídos encontrados. Tamanho dos blocos do modo proprietário do inode Tempo excluído 164821 0 100600 8192 1/1 Dom, 13 de maio 19:22:46 2001 36137 0 100644 4 1/1 Terça, 24 de abril 10:11:15 2001 196829 0 100644 149500 38/38 Seg, 27 de maio 13:52:04 2001 |
Existem muitos arquivos listados (2692 encontrados aqui). O primeiro campo é o número do nó do arquivo, o segundo campo é o proprietário do arquivo, o terceiro campo são as permissões de leitura e gravação, seguido pelo tamanho do arquivo, número de blocos ocupados e. tempo de exclusão.
Então podemos determinar quais precisamos com base no tamanho do arquivo e na data de exclusão. Por exemplo, queremos restaurar o arquivo com o nó 196829:
Você pode primeiro observar o status dos dados do arquivo:
debugfs:stat <196829> Inode: 196829 Tipo: regular Modo: 0644 Flags: 0x0 Versão: 1 Usuário: 0 Grupo: 0 Tamanho: 149500 ACL do arquivo: 0 ACL do diretório: 0 Links: 0 Número de blocos: 38 Fragmento: Endereço: 0 Número: 0 Tamanho: 0 ctime: 0x31a9a574 - segunda-feira, 27 de maio 13:52:04 2001 atime: 0x31a21dd1 - Terça, 21 de maio, 20:47:29 2001 mtime: 0x313bf4d7 - Terça, 5 de março, 08:01:27 de 2001 dtime: 0x31a9a574 - segunda-feira, 27 de maio 13:52:04 2001 BLOCOS: 594810 594811 594814 594815 594816 594817 TOTAL: 38 |
Então você pode usar o comando dump para restaurar o arquivo:
debugfs: despejo <196829> /mnt/hda/01.sav
Isso irá restaurar o arquivo. Saia do debugfs:
debugfs: sair
Outra maneira é editar o inode manualmente:
debugfs:mi <196829> Modo [0100644] ID do usuário [0] ID do grupo [0] Tamanho [149500] Hora de criação [0x31a9a574] Hora da modificação [0x31a9a574] Tempo de acesso [0x31a21dd1] Tempo de exclusão [0x31a9a574] 0 Contagem de links [0] 1 Contagem de blocos [38] Sinalizadores de arquivo [0x0] Reservado1[0] Arquivo acl [0] Acl do diretório [0] Endereço do fragmento [0] Número do fragmento [0] Tamanho do fragmento [0] Bloco direto #0 [594810] Bloco Indireto Triplo [0] |
Depois de usar o comando mi, uma linha de informações é exibida para edição por vez. Para outras linhas, você pode pressionar Enter diretamente para confirmar, alterar o tempo de exclusão para 0 (não excluído) e alterar a contagem de links para 1. Depois de fazer as alterações, saia do debugfs:
debugfs: sair
Então verifique /dev/hda5 com fsck
fsck /dev/hda5
O programa dirá que encontrou o bloco de dados perdido e o colocará em perdido+encontrado. Os arquivos neste diretório são o que queremos.