Warum fungieren symbolische Links in / proc / $ PID / fd / als Hardlinks?

767
user300811

Wenn das Ziel eines symbolischen Links gelöscht wird, zeigt es auf nichts und es gibt keine Möglichkeit, auf den Inhalt des gelöschten Ziels zuzugreifen.

Dateien in /proc/$PID/fd/werden als symbolische Links angezeigt, sie ermöglichen jedoch den Zugriff auf den Inhalt des gelöschten Ziels, wie hier erläutert: Gelöschte Linux-Dateien mit wiederherstellenlsof .

Wie funktioniert das? Warum wird es als symbolischer Link angezeigt, wenn es nicht als Einheit fungiert? Ist es die symbolische Link-Implementierung des proc-Dateisystems, die einen Verweis auf den Inode der Datei enthält?

3
Sie haben ein Missverständnis: Der Löschvorgang ist erst abgeschlossen, wenn alle Prozesse, die zum Zeitpunkt des Löschvorgangs die Datei verwendet haben, abgeschlossen sind: Erst dann wird der gelöschte * Inode * in den Pool der verfügbaren Inodes zurückgegeben und der Inhalt der Datei * beginnt * durch Überschreiben beschädigt werden. Bis dahin ist * inode * noch in Ordnung und zeigt auf den Bereich der Festplatte, der die betreffende Datei enthält. Sobald * less * abgeschlossen ist, verschwindet der Softlink und die Datei * testing.txt *. MariusMatutiae vor 7 Jahren 1
Versuchen Sie, dies auf einem ext4-Dateisystem zu replizieren. Der Smbolic-Link wird ungültig, sobald Sie die Datei löschen, selbst wenn das Programm mit der geöffneten Datei noch läuft. Dies ist ein völlig anderes Verhalten als für den Symlink in / proc / $ PID / fd / user300811 vor 7 Jahren 0

1 Antwort auf die Frage

1
Kamil Maciorowski

Wenn sein Ziel gelöscht wird, erscheint eine Entität in /proc/$PID/fd/bei der Verwendung von ls(1)oder als defekter symbolischer Link. Sie file(1)wird jedoch beim Öffnen mit anders dargestellt open(2).

Auf meinem Debian 9 habe ich strace(1)gesehen, was passiert, wenn ich versuche, einen Symlink zu lesen. Der Befehl lautet sudo strace cat "$symlink". Die relevante Zeile von stderr lautet

  • entweder OK

    open("$symlink", O_RDONLY) = 3 
  • oder ENOENT

    open("$symlink", O_RDONLY) = -1 ENOENT (No such file or directory) 

(Anmerkung: Ich sage nicht, dass dies open(2)im Allgemeinen alle möglichen Ergebnisse sind ).

Die Ergebnisse:

 | regular symlink | /proc/$PID/fd/$N | ---------------+-----------------+------------------+ exists, valid | OK | OK | exists, broken | ENOENT | OK | <- the difference doesn't exist | ENOENT | ENOENT | ---------------+-----------------+------------------+ 

Ich habe auch gelernt, dass, wenn ich laufe file "$symlink", ruft sie lstat(2), readlink(2)und stat(2). Dies sind Systemaufrufe, die auf Pfaden und nicht auf Dateideskriptoren basieren. Wenn der Symlink existiert (gültig oder defekt), open(2)wird er niemals aufgerufen, um ihn oder sein Ziel zu öffnen. ENOENTfrom stat(2)zeigt an, dass die Verbindung unterbrochen ist.

Meine Schlussfolgerung lautet: "Defekter Link" ist eine Eigenschaft, die von der Ausgabe einiger Systemaufrufe abgeleitet wird. aber wenn Sie öffnen einen Link aus /proc/$PID/fd/, open(2)nur weiß, was damit zu tun und kümmert sich nicht darum, was anderes Werkzeug (e) ergeben würde.

Beachten Sie das ganze /procnur ein "normales" Dateisystem. Wenige Macken:

  • Dateien können dynamischen Inhalt haben, sie werden jedoch nicht mit Systemaufrufen geändert (try inotifywait).
  • Objekte können (dis) erscheinen, werden jedoch nicht mit Systemaufrufen (erneut inotifywait) erstellt oder gelöscht .
  • In gewissem Sinne existieren Objekte möglicherweise nicht, bis Sie mit ihnen interagieren. Lauf bashund warte ein paar Minuten. Rufen Sie ls -l /proc/$$/fdauf, um die Dateideskriptoren anzuzeigen. Wahrscheinlich werden ctimes "diesen Moment" zeigen. Wenn Sie den Befehl jedoch alle paar Sekunden wiederholen, werden Sie feststellen, dass sich die Zeiten nicht ändern. (Trivia: Zuerst dachte ich, ich könnte diese Frage beantworten. Bestimmen Sie, wie lange eine Datei mit statSymlinks in geöffnet ist,/proc/$PID/fd/ aber ich habe mich geirrt; jetzt wissen Sie warum).

Kein Wunder, dass sich diese Symlinks, nach denen Sie gefragt werden, unter bestimmten Umständen nicht wie normale Symlinks verhalten. Das Ganze /procsollte sich etwas anders verhalten. Ich nehme an, es open(2)wurde absichtlich die Fähigkeit gegeben, daraus Nutzen zu ziehen.