Link para um inode específico

14

Eu tenho um arquivo que foi excluído, mas ainda é mantido aberto por um programa. Encontrei o número do inode usando lsof. Como posso criar um link físico para esse inode?

Jeff Ferland
fonte

Respostas:

31

Você não pode criar um link para ele, mas pode recuperá-lo. Vamos fazer um experimento:

$ echo blurfl >myfile.txt
$ tail -f myfile.txt &
$ rm myfile.txt

myfile.txt acabou, mas o inode é mantido vivo pelo comando tail. Para recuperar seu arquivo, primeiro encontre o PID do processo mantendo o inode:

$ ps auxw | grep tail
sunny      409  0.0  0.0   8532   824 pts/5    S    18:07   0:00 tail -f myfile.txt

O PID é 409. chdir para / proc / 409 / fd / e lista o conteúdo:

dr-x------ 2 sunny sunny  0 2009-07-24 18:07:18 .
dr-xr-xr-x 7 sunny sunny  0 2009-07-24 18:07:17 ..
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 0 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 1 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:18 2 -> /dev/pts/5
lr-x------ 1 sunny sunny 64 2009-07-24 18:07:33 3 -> /home/sunny/tmp/myfile.txt (deleted)

Os diretórios / proc / [PID] / fd / contêm links simbólicos para os descritores de arquivos de todos os arquivos que o processo usa. Nesse caso, o link simbólico "3" aponta para o arquivo excluído. Portanto, para restaurar o arquivo, copie o conteúdo para um novo arquivo:

$ cat 3 >/home/mydir/saved_file.txt
sunny256
fonte
Eu fiz isso com um depurador de sistema de arquivos em um passado distante (por exemplo, "debugfs dump"), mas o conceito é o mesmo.
Gerald Combs
1
resposta agradável, +1
asdmin 24/07/2009
Isso não funciona para mim. Dado que '3' é um link simbólico pendente, não um descritor de arquivo "real", ele sempre cria um arquivo vazio.
Rob Chanter
4
@ Rob: Não, não. Se o descritor de arquivo estiver em uso, o link simbólico aponta para dados válidos, caso contrário, o link simbólico não existiria em primeiro lugar. Quando o arquivo é fechado, o link simbólico desaparece. Você tinha um espaço depois do "3", certo? Caso contrário, você exibirá o conteúdo do descritor de arquivo 3 no shell atual e provavelmente isso está vazio.
sunny256
1
O único problema é que, se o arquivo ainda estiver sendo gravado, a cópia que você fizer será truncada. Provavelmente não há tempo entre quando a gravação é interrompida e o arquivo é fechado para fazer isso, para que você obtenha um arquivo completo.
precisa saber é o seguinte
-8

Não há uma maneira portátil de fazer isso no Linux. A melhor maneira seria provavelmente interromper toda a atividade no sistema de arquivos, interromper o programa que mantém o arquivo aberto, desmontar o sistema de arquivos e usar um depurador do sistema de arquivos para reconectá-lo a um diretório. Se você exportou o sistema de arquivos pelo NFS, pelo menos algumas versões do NFS podem permitir a leitura dos dados do arquivo no NFS.

Vatine
fonte
2
você pode perder o arquivo uma vez que você matar o programa
DukeLion