O debugfs tem um comando que permite você ter mais
detalhes sobre os inodes. Quando você tiver uma lista
com todos inodes que você quer recuperar tente o
comando: (estou supondo que estou interessado no inode
148003.
debugfs: stat <148003>
Inode: 148003 Type: regular Mode: 0644 Flags: 0x0 Version:
1
User: 503 Group: 100 Size: 6065
File ACL: 0 Directory ACL: 0
Links: 0 Blockcount:
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x31a9a574 -- Mon May 27 13:52:04 2000
atime: 0x31a21dd1 -- Tue May 21 20:47:29 2000
mtime: 0x313bf4d7 -- Tue Mar 5 08:01:27 2000
dtime: 0x31a9a574 -- Mon May 27 13:52:04 2000
BLOCKS:
594810 594811 594814 594815 594816 594817
TOTAL: 6
Se você possui muitos inodes para verificar, tente o
comando abaixo:
# cut -c1-6 lsdel.out | grep "[0-9]" | tr -d " " >
path/para/inodes
Vai gerar o arquivo inodes, que vai conter apenas o
número dos inodes para recuperar, um por linha. Esse
arquivo vai ser útil então para usarmos neste novo
comando, para obter os dados extendidos de cada inodes:
# sed 's/^.*$/stat <\0>/' inodes | debugfs
/dev/hda5 > path/to/stats
O arquivo stats contém toda informação
necessária de cada inode.
Agora com base nestas informações e sabendo
quais inodes queremos recuperar vamos enfim recuperar os
dados.
Arquivos pequenos (menos de 12 blocks)
Se o arquivo possui menos de 12 blocks, toda a sequência
de blocos desse arquivo está gravada dentro de um inode.
debugfs tem um comando que permite você recuperar esse
arquivo automaticamente. Vamos mostrar abaixo.
Primeiro fazemos o stat denovo:
debugfs: stat <148003>
Inode: 148003 Type: regular Mode: 0644 Flags: 0x0 Version:
1
User: 503 Group: 100 Size: 6065
File ACL: 0 Directory ACL: 0
Links: 0 Blockcount: 12
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x31a9a574 -- Mon May 27 13:52:04 1996
atime: 0x31a21dd1 -- Tue May 21 20:47:29 1996
mtime: 0x313bf4d7 -- Tue Mar 5 08:01:27 1996
dtime: 0x31a9a574 -- Mon May 27 13:52:04 1996
BLOCKS:
594810 594811 594814 594815 594816 594817
TOTAL: 6
O arquivo tem 6 blocos, podemos mandar o debugfs grava-lo
no arquivo, recovered.000:
debugfs: dump <148003> /mnt/recovered.000
Podemos imaginar que deva existir algum lixo no final do
arquivo, se ele não ocupar perfeitamente o tamanho de um
bloco. Mas isso pode ser facilmente retificado, por temos o
tamanho real do arquivo nas informações do stat,
então podemos usar o comando abaixo para gerar um novo
arquivo, agora com tamanho real:
# dd count=1 if=/mnt/recovered.000 of=/mnt/resized.000
bs=6065
O novo arquivo /mnt/resized.000 foi gerado, se ele
não tiver sido sobre escrito, ele estará
idêntico ao original. Para evitar a perda do arquivo, o
quanto mais rápido voce fizer o unmount, menos danos
voce terá.