Wozu dient "ln -L" (--logical)?

2990
user36520

Ich kann in der ln man-Seite lesen:

 -L, --logical make hard links to symbolic link references 

Ich habe irgendwo gelesen, dass ln -Lman Dateien, die gelöscht wurden, aber noch geöffnet sind, mithilfe des /procDateisystems neu verknüpfen kann . Zum Beispiel:

ln -L /proc/1234/fd/12 /tmp/my-file 

Aber ich bekomme ENOENT: Keine solche Datei oder Verzeichnis. Wenn ich ein anderes Dateisystem versuche, erhalte ich stattdessen einen ungültigen geräteübergreifenden Link.

Wenn ich ln -Lgelöschte Dateien nicht wiederherstellen kann, wofür kann es verwendet werden?

4

2 Antworten auf die Frage

6
ktf

Nun, ein bisschen mehr Neuling-freundliche Antwort ...

Vorab einige Grundlagen

Eine einfache Ansicht, wie Dateien auf UNIX / Linux-Systemen gespeichert werden, ist: Ein Verzeichniseintrag besteht aus dem Namen, den Sie mit ls -l sehen, und einer Inode-Nummer (möglicherweise mit ls -i ). Der Inode enthält die tatsächlichen Informationen, in denen Ihre Daten im Dateisystem gespeichert sind (ua Besitz, Berechtigungen, ggf. weitere Inodes usw.):

(Zeit für UTF-8-Spaß ... ;-))

Einfache ansicht:

┌─────────────────┐ ┌───────┐ ┌─────────────┐ │ directory entry │ ─► │ Inode │ ─► │ data blocks │ └─────────────────┘ └───────┘ └─────────────┘ 

Nun zum Unterschied zwischen harten und symbolischen Links:

Ein Hardlink ist einfach ein Verzeichniseintrag, der auf denselben Inode verweist wie ein bereits vorhandener, während ein symbolischer Link nur eine spezielle Datei ist, die den Namen einer anderen Datei enthält (die direkt im Inode gespeichert wird, wenn der Pfadname klein genug ist) sich einfügen). Dies ist der Grund, warum

  • Feste Links zu derselben Datei können keine unterschiedlichen Dateizugriffsberechtigungen haben (da diese im Inode gespeichert werden).
  • Hardlinks müssen sich im selben Dateisystem befinden

Erweiterte einfache Ansicht

 ┌─────────────────┐  │ hard link │ ───────┐ └─────────────────┘ ▼ ┌─────────────────┐ ┌───────┐ ┌─────────────┐ │ example_file │ ─► │ Inode │ ─► │ data blocks │ └─────────────────┘ └───────┘ └─────────────┘ ▲ └───────────────────────┐ │ ┌─────────────────┐ ┌─────────┴──────────┐ │ symbolic link │ ─► │ filename reference │ └─────────────────┘ └────────────────────┘ 

Nun zurück zu der -LOption mit -sabwesend: Es erlaubt Ihnen, einen Hardlink einer Datei zu erstellen, auf den ein symbolischer Link zeigt (Wie "Hardlink" im obigen Beispiel).

Warum könnte das helfen, gelöschte Dateien wiederherzustellen, die aber noch von einem geöffneten Programm verwendet werden?

Nun, das Verhalten davon hängt sicherlich von der Implementierung ab und Ihre Laufleistung kann sich auf allen UNIX / Linux-Plattformen unterscheiden, aber ich versuche zu erklären, wie es funktionieren könnte :

Wenn eine Datei gelöscht wird (sagen wir über rm (1) ), ist der aufgerufene Systemaufruf immer unlink (2) . Es entfernt den Verzeichniseintrag und reduziert den Verbindungszähler (im Inode verwaltet) um einen.

Wenn der Verknüpfungszähler null erreicht, ist es Zeit für das Betriebssystem, die Daten zu bereinigen (tatsächlich geben Sie die Datenblöcke frei, auf die der Inode zeigt, und dann den Inode selbst. ABER wenn die Datei noch geöffnet ist, wird diese Task normalerweise auf ein Programm verschoben, das den Inode verwendet endet.

Heutzutage unterhalten die meisten UNIX-Systeme eine /procDateisystemhierarchie, in der nach Verweisen auf offene Dateien gesucht werden kann, bei denen es sich um (überraschende!) Symbolische Links handelt. Wenn man den richtigen Eintrag findet, ln -L kann es hilfreich sein, eine Verbindung zum Inode wiederherzustellen, den Link-Zähler erneut zu erhöhen und somit zu verhindern, dass das Betriebssystem den Inode löscht (wenn der glückliche Benutzer schnell genug ist und das Programm noch läuft).

Hinweis: Damit dies funktioniert, muss sich der Speicherort des neuen Links in demselben Dateisystem befinden, in dem sich das Original befunden hat!

Letztes Beispiel

 ┌─────────────────┐  │ rescue_link │ ───────┐ └─────────────────┘ ▼ ┌─────────────────┐ ┌───────┐ ┌─────────────┐ │ *** removed *** │ │ Inode │ ─► │ data blocks │ └─────────────────┘ └───────┘ └─────────────┘ ▲ └───────────────────────┐ │ ┌─────────────────┐ ┌─────────┴──────────┐ │ /proc/bla/fd/n │ ─► │ filename reference │ └─────────────────┘ └────────────────────┘ 

Letzte Worte

Es gibt viele Dinge, die die korrekte Erstellung des Links verhindern könnten, und es hängt sehr davon ab, wie der symbolische Link selbst implementiert wird, und ich muss zugeben: Ich habe ernsthafte Zweifel, dass es mit vielen UNIX-Varianten funktionieren wird - aber vielleicht ein Freiwilliger, der will einige Zeit damit verbringen, dies zu testen?

4
reinierpost

GNU-Dienstprogramme werden hauptsächlich mit infoSeiten dokumentiert . Von der GNU ln-Infoseite :

‘-L’ ‘--logical’ If -s is not in effect, and the source file is a symbolic link, create the hard link to the file referred to by the symbolic link, rather than the symbolic link itself.  

Also dereferenziert man einfach symbolische Links als Quellargumente.