Link zu einem bestimmten Inode

14

Ich habe eine Datei, die gelöscht wurde, aber noch von einem Programm geöffnet ist. Ich habe die Inode-Nummer mit lsof gefunden. Wie kann ich eine feste Verbindung zu dieser Inode herstellen?

Jeff Ferland
quelle

Antworten:

31

Sie können keinen Link dazu erstellen, aber Sie können ihn zurückholen. Lass uns ein Experiment machen:

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

myfile.txt ist jetzt weg, aber die Inode wird durch den Befehl tail am Leben erhalten. Um Ihre Datei zurückzugewinnen, müssen Sie zunächst die PID des Prozesses ermitteln, bei dem der Inode erhalten bleibt:

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

Die PID lautet 409. chdir to / proc / 409 / fd / und listet den Inhalt auf:

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)

Die Verzeichnisse / proc / [PID] / fd / enthalten symbolische Links zu Dateideskriptoren aller Dateien, die der Prozess verwendet. In diesem Fall zeigt der Symlink "3" auf die gelöschte Datei. Um die Datei wiederherzustellen, kopieren Sie den Inhalt in eine neue Datei:

$ cat 3 >/home/mydir/saved_file.txt
sunny256
quelle
Ich habe dies in der Vergangenheit mit einem Dateisystem-Debugger gemacht (zB "debugfs dump"), aber das Konzept ist dasselbe.
Gerald Combs
1
nette
antwort
Das funktioniert bei mir nicht. Da '3' ein baumelnder Symlink und kein "echter" Dateideskriptor ist, wird immer nur eine leere Datei erstellt.
Rob Chanter
4
@Rob: Nein, das tut es nicht. Wenn der Dateideskriptor verwendet wird, verweist der Symlink auf gültige Daten, andernfalls würde der Symlink überhaupt nicht existieren. Wenn die Datei geschlossen wird, verschwindet der Symlink. Du hattest ein Leerzeichen nach der "3", oder? Wenn nicht, geben Sie den Inhalt von Dateideskriptor 3 stattdessen in der aktuellen Shell aus, und das ist wahrscheinlich leer.
sunny256
1
Das einzige Problem dabei ist, dass die von Ihnen erstellte Kopie abgeschnitten wird, wenn die Datei noch geschrieben wird. Es liegt wahrscheinlich keine Zeit zwischen dem Beenden des Schreibvorgangs und dem Schließen der Datei, damit Sie eine vollständige Datei erhalten.
KayEss
-8

Es gibt keine tragbare Möglichkeit, dies unter Linux zu tun. Der beste Weg wäre wahrscheinlich, alle Aktivitäten auf dem Dateisystem einzustellen, das Programm zu beenden, das die Datei geöffnet hält, das Dateisystem abzuhängen und es mit einem Dateisystem-Debugger erneut an ein Verzeichnis anzuhängen. Wenn Sie das Dateisystem über NFS exportieren lassen, können Sie in einigen Versionen von NFS möglicherweise die Dateidaten über NFS hinweg lesen.

Vatine
quelle
2
Sie können die Datei verlieren, wenn Sie das Programm
beenden