Como recuperar arquivos apagados no Linux
Quase todo mundo já passou por isso. Na hora de mover um arquivo, digitamos errado e sai algo assim:
rm ~/temp/fotos_casamento/* ~/Fotos/casamento
É claro que a ideia era usar o comando "mv" para mover os arquivos, e não o "rm", que os remove. Você deve estar se perguntando, "por que diabos os desenvolvedores do UNIX deram nomes tão parecidos para esses comandos?"
Mas agora já foi... será que existe alguma chance de conseguir os documentos de volta?
De acordo com o FAQ do ext3, não é possível restaurar arquivos excluídos em um sistema de arquivos ext3: "Para garantir que o ext3 possa retomar uma quebra de vínculo com segurança após um travamento do sistema, ele 'zera' os ponteiros de blocos do inode, enquanto o ext2 apenas marca esses blocos como não utilizados e marca o inode como excluído, deixando os ponteiros de bloco de lado. Sua única chance é usar o grep para encontrar partes dos arquivos excluídos e torcer."
Não empolgou muito, empolgou?
Acontece que muita gente destrói dados acidentalmente, então acabaram surgindo algumas soluções para tentar resolver isso. A primeira coisa a fazer quando se exclui um arquivo acidentalmente é verificar se algum programa ainda está fazendo uso dele. Por exemplo, se você estiver assistindo ao vídeo "aniversario_das_criancas.mpg" no MPlayer e o arquivo for apagado, o MPlayer ainda tem um link para o arquivo. Este comando procura arquivos abertos e exibe os resultados:
lsof
grep aniversario_das_criancas.mpg
O comando retorna o nome do programa que está com o arquivo aberto (no caso, o MPlayer), o ID do processo do programa, o nome do usuário que está acessando o arquivo e o número descritor desse arquivo. No meu caso, a saída foi esta:
mplayer 11297 jesse 3r REG 8,3 4552773 16793772 aniversario_das_criancas.mpg
O que interessa mesmo é o ID do processo (11297) e o número descritor do arquivo (3r). Com essas informações, podemos copiar o arquivo facilmente. Observe que no comando abaixo nós removemos o "r" do número descritor do arquivo.
cp /proc/11297/fd/3 meu_arquivo_restaurado.mpg
Esse comando copia o arquivo original e salva o dia. Mas e quando você remove um arquivo que não está sendo usado por nenhum programa? Nesse caso, pare de usar imediatamente o sistema de arquivos no qual o arquivo estava. Comece desmontando a partição (no meu caso, /dev/sda3):
umount /dev/sda3
Baixe o ext3grep (disponível nos repositórios de várias distros) ou o extundelete. Os dois usam opções parecidas, e contam com uma documentação bastante útil. No meu exemplo, vou usar o ext3grep.
O próximo passo é tentar localizar e recuperar os arquivos perdidos. Se for só um arquivo, use a opção "--restore-file". No meu exemplo, vou informar ao ext3grep o nome do arquivo que perdi e o dispositivo/partição que o abrigava.
ext3grep --restore-file jesse/Vídeo/aniversario_das_criancas.mpg /dev/sda3
No meu caso, o ext3grep encontrou o arquivo e salvou-o em um diretório chamado "RESTORED_FILES". A busca pelos dados pode demorar algumas horas em um HD moderno. Mas e se você perdeu uma coleção de arquivos e/ou não lembra o nome deles? Use a opção "--restore-all", que tenta recuperar todos os arquivos excluídos.
ext3grep --restore-all /dev/sda3
Ao tentar recuperar grupos grandes de arquivos, geralmente é uma boa ideia limitar o período de exclusão, senão você vai ficar cheio de lixo que não interessa. Por exemplo, para restaurar arquivos perdidos depois do dia 1º de janeiro, use:
ext3grep --restore-all --after `date -d "Jan 1 00:00" +%s` /dev/sda3
Nos testes que fiz com o ext3grep, tive pouco mais de 2/3 de êxito nas tentativas de recuperação de arquivos. Não é o ideal, mas é melhor do que perder todos os arquivos. Outra ferramenta útil é o PhotoRec, que tenta encontrar arquivos perdidos no HD. Só usei o PhotoRec uma vez, mas ele fez um trabalho excelente de recuperação.