Lien vers un inode spécifique

14

J'ai un fichier qui a été supprimé, mais est toujours maintenu ouvert par un programme. J'ai trouvé le numéro d'inode en utilisant lsof. Comment puis-je créer un lien dur vers cet inode?

Jeff Ferland
la source

Réponses:

31

Vous ne pouvez pas créer de lien vers celui-ci, mais vous pouvez le récupérer. Faisons une expérience:

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

myfile.txt a maintenant disparu, mais l'inode est maintenu en vie par la commande tail. Pour récupérer votre fichier, trouvez d'abord le PID du processus gardant l'inode:

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

Le PID est 409. chdir vers / proc / 409 / fd / et listez le contenu:

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)

Les répertoires / proc / [PID] / fd / contiennent des liens symboliques vers les descripteurs de fichiers de tous les fichiers utilisés par le processus. Dans ce cas, le lien symbolique "3" pointe vers le fichier supprimé. Donc, pour restaurer le fichier, copiez le contenu dans un nouveau fichier:

$ cat 3 >/home/mydir/saved_file.txt
ensoleillé256
la source
J'ai fait cela avec un débogueur de système de fichiers dans un passé lointain (par exemple "debugfs dump"), mais le concept est le même.
Gerald Combs
1
belle réponse, +1
asdmin
Ça ne marche pas pour moi. Étant donné que «3» est un lien symbolique pendant, pas un «vrai» descripteur de fichier, il crée toujours juste un fichier vide.
Rob Chanter
4
@Rob: Non, ce n'est pas le cas. Si le descripteur de fichier est utilisé, le lien symbolique pointe vers des données valides, sinon le lien symbolique n'existerait pas en premier lieu. Lorsque le fichier est fermé, le lien symbolique disparaît. Vous aviez un espace après le "3", non? Sinon, vous allez plutôt afficher le contenu du descripteur de fichier 3 dans le shell actuel, et c'est probablement vide.
sunny256
1
Le seul problème est que si le fichier est toujours en cours d'écriture, la copie que vous effectuez sera tronquée. Il n'y a probablement pas de temps entre l'arrêt de l'écriture et la fermeture du fichier pour que vous obteniez un fichier complet.
KayEss
-8

Il n'y a aucun moyen portable de le faire sous Linux. Le meilleur moyen serait probablement de faire cesser toute activité sur le système de fichiers, de tuer le programme qui maintient le fichier ouvert, de démonter le système de fichiers et d'utiliser un débogueur de système de fichiers pour le rattacher à un répertoire. Si vous avez le système de fichiers exporté via NFS, au moins certaines versions de NFS peuvent vous permettre de lire les données de fichier via NFS.

Vatine
la source
2
vous risquez de perdre le fichier une fois que vous avez tué le programme
DukeLion