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 -L
Option mit -s
abwesend: 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 /proc
Dateisystemhierarchie, 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?