Recuperando arquivos apagados - Parte I
Por: Guilherme Cox ( 19/07/2001 )

Introdução

Vamos mostrar nesse artigo quais passos devemos seguir para recuperar arquivos apagados e que não deveriam. Para conseguir isso, basicamente precisamos ter acesso 'root', ou pelo menos ter acesso de leitura ao 'raw device' aonde o arquivo é gravado. Vamos mostrar também algumas ferramentas úteis, não só para essa situação, mas como para situações referentes a filesystems e disk management. Voce vai precisar ter instalado em seu ambiente o package e2fsprogs. Eles serão usados nesse artigo, e é default a instalação dele na maioria das distribuições.

Backup

No Linux não existe nenhuma maneira automática para recuperar arquivos apagados. Nao existe nenhuma proteção do Kernel ou do filesystem prevendo esse tipo de situação. Eles assumem que um arquivo apagado, deve ser apagado, e não aceita erros. O que vamos mostrar aqui, não é 100% eficiente, é uma tentativa de recuperar dados quando eles são vitais.

A melhor maneira de fazer recuperação de arquivos é tendo um bom sistema de BACKUP. Como nem todos tem condições de ter unidades de fita, é facil ocorrer situações aonde voce apaga dados que não eram para ser apagados. Principalmente quando usamos o modo recursivo do comando rm, 'rm -r'. Algumas distribuições ( Red Hat, por exemplo ), criam aliases para o comando rm para 'rm -i', pedindo confirmação para cada arquivo apagado. Esse tipo de solução é fraca e pode ser facilmente sobreposta, usando 'rm -f FILE'. Uma outra forma de proteger arquivos importantes é setar permissão para 440. Dessa forma sempre que voce tentar apagar um arquivo com essas permissões, irá abrir um prompt perguntando se voce realmente deseja fazer isso. O problema dessa forma de proteção, é que voce esta se banindo para escrever no arquivo.

Uma boa forma de proteger arquivos importantes é criando links e diretórios escondidos. Deixando os arquivos reais dentro do diretório escondido, e no lugar aonde o arquivo deveria estar, você deixa um link. Essa solução é boa para proteger contra deletar o arquivo, mas não protege para sobre escrever. Um exemplo para essa dica é:

# mkdir /.backup
#ln /etc/passwd /.backup

Se você apagar /etc/passwd, você tem ainda uma cópia no /backup. Basta refazer o link, ao inverso agora, para recuperar o arquivo. Novamente alertando que essa solução não protege contra sobre escrever o arquivo. Como por exemplo:

# cp /dev/null /etc/passwd

O arquivo (/.backup/passwd) seria zerado, assim como /etc/passwd.



Filesystem ext2

O filesystem ext2 tem alguns atributos que podem ajudar a proteção. Esses atributos podem ser setados com o comando 'chattr'. Para conhecer todo o potencial desse comando voce pode executar 'man chattr', de qualquer forma vamos mostrar aqui algumas situações:

atributo 'a', Append-only:
Com esse atributo, o arquivo só poderá ser aberto em mode de append. Isso quer dizer que o arquivo não pode ser apagado, e os dados que já existem nele não pode ser sobre escritos. Voce só pode incluir dados neste arquivo. Se um diretório for setado com esse atributo (o /var/spool/mail geralmente é) todos os arquivos e diretórios dentro dele não podem ser apagados. O único usuário capaz de setar ou tirar esse atributo é o superuser, 'root'.

# chattr +a ARQUIVO

atributo 'c', compressed:
Com esse atributo, o kernel automaticamente comprime o arquivo ao grava-lo no disco. Isso tudo é feito de maneira transparente. Quando uma leitura é feita, você recebe o arquivo de maneira uncompressed.

# chattr +c ARQUIVO

atributo 'i', immutable:
Este atributo não permite que o usuário mude, apague, faça um (hard) link, renomei o arquivo (ou diretório). Também não é possível incluir dados no arquivo com esse atributo. Somente o usuário superuser 'root' pode setar ou tirar esse atributo.

# chattr +i ARQUIVO

atributo 's':
Quando um arquivo com esse atributo é deletado, os blocos que ele ocupava são zerados pelo kernel.

# chattr +s ARQUIVO

atributo 'u', undelete:
Quando um arquivo com esse atributo é deletado, os blocos que ele ocupava são guardados. Isso deveria funcionar como a Lixeira do MS-Windows. Para que isso funcione, é preciso que você aplique um patch no seu kernel. Você pode encontrar no LinuxHQ , referências para essa solução. Basicamente, estamos movendo arquivo apagados para outro diretório, e é necessário um daemon para que faca uma limpeza dentro de um período estipulado.

# chattr +u ARQUIVO

Existe também o programa 'lsattr', que vai listar todos os arquivos/diretórios com os atributos de cada um. É como um 'ls' que lista os atributos dos arquivos.



Recuperando arquivos - método I

Até agora estivemos falando de soluções para proteção, agora vamos mostrar como fazer a recuperação propriamente dita. Para o caso em que você apagou um arquivo e precisa dele de volta de qualquer jeito, não tem backup e não tem como revê-lo de maneira alguma. Sao para esses casos que você deve usar esta solução. A taxa de recuperação não é de 100%, varia de acordo com o quanto o seu disco é usado. Para estações de trabalho não servidoras de recursos, essa taxa pode chegar até 80%, se assim que apagado o arquivo você parar com tudo e tentar recupera-lo. Um outro fator de recuperação é o tamanho do arquivo e a fragmentação da sua partição. Arquivos grandes ou partições muito fragmentadas dificultam muito a recuperação.

Nosso objetivo é recuperar os dados que estão gravados no disco, mas não são mais visíveis para o sistema operacional. Quando você apaga um arquivo, você na verdade apaga um link para o bloco de dados aonde o arquivo é armazenado. Existem uma série de flags de controle no bloco. Uma delas é se o bloco contém ou não um arquivo. Em outras palavras se ele pode ou não ser usado. Uma das formas de recuperar um arquivo é mudar essa flag e informar que agora esse bloco não é mais um bloco deletado. Essa maneira não é segura e você vai depender de muita sorte, ainda mais quando se tratarem de arquivo grandes, que são gravados em vários blocos de dados. Uma outra maneira, essa mais segura, eficiente, porém mais demorada, é procurar aonde os dados se encontraram na sua partição e copia-los para um novo arquivo.

Primeiramente, e independentemente do método escolhido, precisamos desmontar (unmount) o filesystem em que os arquivos foram deletados. Assim que você perceber que apagou arquivos indevidademente, é recomendado que desmonte a partição e remonte em estado read-only. Assim não tem como sobrescrever os blocos apagados, e os danos podem ser menores.

Para desmontar a partição no diretório /home:

# umount /home

Para remontar com flags read-only, você pode fazer a leitura/execução dos arquivos nesta partição, mas não pode escrever nada:

# mount -o ro,remount /home

Se os arquivos apagados estão na partição 'root' /, você precisa incluir a opção '-n':

# mount -n -o ro,remount /

Se quando voce tentar desmontar a partição, receber a mensagem de erro: 'Resource busy', significa que algum programa está usando algum arquivo dentro dessa partição, e que não foi possível desmontar a partição. Para saber quem é esse programa e tomar as atitudes necessárias, existe um utilitário que os lista. Para o nosso exemplo usandos da seguinte forma:

# fuser -v -m /home

Isso lista cada processo que esteja usando a partição /home. Você pode mandar agora um comando para 'matar' todos esses processos, para que você possa executar o unmount. Talvez seja necessário que se use o suid para isso, contando que nem todos os processos tem como proprietário você mesmo.

# fuser -k -v -m /home

Outra forma de matar os processos, é descrita abaixo. Para os programas que usam as bibliotecas signal, essa forma abaixo é mais limpa.

# fuser -k -TERM -v -m /home

Conclusão

Nesse primeiro artigo você conferiu uma pequena introdução sobre backup e recuperação de arquivos. Nas próximas semanas estarei falando sobre outros métodos de recuperação, além de como recuperar arquivos muito grandes. Não perca!



Copyright (C) 1999-2000 Linux Solutions