Vor kurzem wurde ich während eines Vorstellungsgesprächs danach gefragt. Ich war ehrlich und sagte, dass ich wusste, wie sich ein symbolischer Link verhält und wie man einen erstellt, aber ich verstehe nicht den Einsatz eines Hardlinks und wie er sich von einem symbolischen unterscheidet.
Antworten
Zu viele Anzeigen?Unterhalb des Dateisystems werden Dateien durch Inodes repräsentiert. (Oder sind es mehrere Inodes? Nicht sicher.)
Eine Datei im Dateisystem ist im Grunde genommen ein Verweis auf einen Inode.
Ein Hardlink erstellt einfach eine weitere Datei mit einem Verweis auf denselben zugrunde liegenden Inode.
Wenn Sie eine Datei löschen, wird ein Verweis auf den zugrunde liegenden Inode entfernt. Der Inode wird nur gelöscht (oder löschbar/überschreibbar), wenn alle Verweise auf den Inode gelöscht wurden.
Ein symbolischer Link ist ein Verweis auf einen anderen Namen im Dateisystem.
Sobald ein Hardlink erstellt wurde, erfolgt der Verweis auf den Inode. Das Löschen, Umbenennen oder Verschieben der Originaldatei wirkt sich nicht auf den Hardlink aus, da dieser auf den zugrunde liegenden Inode verweist. Änderungen an den Daten im Inode spiegeln sich in allen Dateien wider, die auf diesen Inode verweisen.
Hinweis: Hardlinks sind nur innerhalb desselben Dateisystems gültig. Symbolische Links können über Dateisysteme hinweg reichen, da sie einfach der Name einer anderen Datei sind.
Wie der Spruch sagt, ist ein Bild mehr wert als tausend Worte. Hier ist, wie ich es visualisiere:
So kommen wir zu diesem Bild:
-
Erstellen Sie im Dateisystem einen Namen
myfile.txt
, der auf einen neuen Inode verweist (der die Metadaten für die Datei enthält und auf die Datenblöcke zeigt, die ihren Inhalt enthalten, d.h. den Text "Hallo, Welt!":$ echo 'Hallo, Welt!' > myfile.txt
-
Erstellen Sie einen hartem Link
my-hard-link
zur Dateimyfile.txt
, was bedeutet "erstellen Sie eine Datei, die auf denselben Inode zeigen sollte, auf denmyfile.txt
zeigt":$ ln myfile.txt my-hard-link
-
Erstellen Sie einen symbolischen Link
my-soft-link
zur Dateimyfile.txt
, was bedeutet "erstellen Sie eine Datei, die auf die Dateimyfile.txt
zeigen sollte":$ ln -s myfile.txt my-soft-link
Schauen wir, was passiert, wenn myfile.txt
gelöscht (oder verschoben) wird: my-hard-link
zeigt immer noch auf dieselben Inhalte und ist daher nicht betroffen, während my-soft-link
jetzt auf nichts zeigt. Andere Antworten diskutieren die Vor- und Nachteile jeder Option.
Einige Beispiele, die helfen könnten.
Erstellen Sie zwei Dateien mit Daten:
$ printf Cat > foo
$ printf Dog > bar
Erstellen Sie einen harten und einen weichen (auch symbolischen) Link:
$ ln foo foo-hard
$ ln -s bar bar-soft
Listen Sie den Verzeichnisinhalt im Langformat nach zunehmender Größe auf:
ls -lrS
lrwxr-xr-x 1 user staff 3 3 Apr 15:25 bar-soft -> bar
-rw-r--r-- 2 user staff 4 3 Apr 15:25 foo-hard
-rw-r--r-- 2 user staff 4 3 Apr 15:25 foo
-rw-r--r-- 1 user staff 4 3 Apr 15:25 bar
Dies sagt uns, dass
-
1. Spalte: Der Dateimodus für die Soft- und Hard-Links unterscheidet sich
- Symbolischer Link:
lrwxr-xr-x
- Dateityp:
l
= symbolischer Link - Besitzerberechtigungen:
rwx
= lesbar, beschreibbar, ausführbar - Gruppenberechtigungen:
r-x
= lesbar, nicht beschreibbar, ausführbar - Andere Berechtigungen:
r-x
= lesbar, nicht beschreibbar, ausführbar
- Dateityp:
- Harter Link:
-rw-r--r--
- Dateityp:
-
= reguläre Datei - Besitzerberechtigungen:
rw-
= lesbar, beschreibbar, nicht ausführbar - Gruppenberechtigungen:
r--
= lesbar, nicht beschreibbar, nicht ausführbar - Andere Berechtigungen:
r--
= lesbar, nicht beschreibbar, nicht ausführbar
- Dateityp:
- Symbolischer Link:
-
2. Spalte: Die Anzahl der Verknüpfungen ist für die harten verknüpften Dateien höher
-
5. Spalte: Die Größe des Symbolischen Links ist kleiner, da es eine Referenz ist und keine Kopie
-
Letzte Spalte: Der symbolische Link zeigt die verlinkte Datei über
->
Das Ändern des Dateinamens von foo hat keinen Einfluss auf foo-hard:
$ mv foo foo-new
$ cat foo-hard
Cat
Die Änderung des Inhalts von foo spiegelt sich in foo-hard wider:
$ printf Dog >> foo
$ cat foo-hard
CatDog
Harte Links wie foo-hard zeigen auf den Inode, den Inhalt der Datei.
Das gilt nicht für symbolische Links wie bar-soft:
$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft
cat: bar-soft: Datei oder Verzeichnis nicht gefunden
Der Inhalt der Datei konnte nicht gefunden werden, da der symbolische Link auf den geänderten Namen und nicht auf den Inhalt zeigt.
Ebenso, Wenn foo
gelöscht wird, behält foo-hard
weiterhin den Inhalt bei; wenn bar
gelöscht wird, ist bar-soft
lediglich eine Verknüpfung zu einer nicht existierenden Datei.
Hardlinks sind nützlich, wenn die Originaldatei verschoben wird. Zum Beispiel das Verschieben einer Datei von /bin nach /usr/bin oder /usr/local/bin. Ein Symbolic Link zur Datei in /bin würde dadurch unterbrochen werden, aber ein Hardlink, der direkt auf den Inode für die Datei verweist, würde sich nicht darum kümmern.
Hardlinks können weniger Speicherplatz benötigen, da sie nur einen Verzeichniseintrag belegen, während ein Symbolic Link seinen eigenen Inode benötigt, um den Namen zu speichern, auf den er zeigt.
Hardlinks benötigen auch weniger Zeit zur Auflösung – Symbolic Links können auf andere Symbolic Links verweisen, die sich in symbolisch verlinkten Verzeichnissen befinden. Einige davon könnten sich auf NFS oder anderen Dateisystemen mit hoher Latenz befinden und somit Netzwerkverkehr zur Auflösung verursachen. Hardlinks werden immer in einem einzigen Suchvorgang auf dem gleichen Dateisystem aufgelöst und beinhalten niemals Netzwerklatenz (wenn es sich um einen Hardlink auf einem NFS-Dateisystem handelt, würde der NFS-Server die Auflösung durchführen und es wäre für das Client-System unsichtbar). Manchmal ist das wichtig. Nicht für mich, aber ich kann mir vorstellen, dass dies für Hochleistungssysteme wichtig sein könnte.
Ich glaube auch, dass Funktionen wie mmap(2) und sogar open(2) dieselbe Funktionalität wie Hardlinks nutzen, um den Inode einer Datei aktiv zu halten, sodass selbst wenn die Datei unlink(2)ed wird, der Inode bestehen bleibt, um dem Prozess weiterhin Zugriff zu gewähren, und erst wenn der Prozess es schließt, verschwindet die Datei wirklich. Dies ermöglicht viel sicherere temporäre Dateien (wenn man das Öffnen und Löschen atomar durchführen kann, wofür es möglicherweise eine POSIX-API gibt, an die ich mich nicht erinnere, dann haben Sie wirklich eine sichere temporäre Datei), in der Sie Ihre Daten lesen/schreiben können, ohne dass jemand darauf zugreifen kann. Nun, das war wahr, bevor /proc jedem die Möglichkeit gab, auf Ihre Dateideskriptoren zuzugreifen, aber das ist eine andere Geschichte.
Übrigens, das Wiederherstellen einer Datei, die in Prozess A geöffnet ist, aber im Dateisystem unlink ist, beruht darauf, Hardlinks zu verwenden, um die Inode-Links wiederherzustellen, sodass die Datei nicht verschwindet, wenn der Prozess, der sie geöffnet hat, sie schließt oder beendet.
Soft-Link:
Soft oder symbolisch ist eher eine Verknüpfung zur Originaldatei....wenn du das Original löschst, schlägt die Verknüpfung fehl und wenn du nur die Verknüpfung löschst, passiert nichts mit dem Original.
Soft-Link-Syntax: ln -s Pfad_zur_Zieldatei Verknüpfung
Ausgabe: Verknüpfung -> ./Zieldatei
Beweis: readlink Verknüpfung
Auch in der Ausgabe von ls -l Verknüpfung
siehst du den ersten Buchstaben in lrwxrwxrwx
als l, was darauf hinweist, dass die Datei eine symbolische Verknüpfung ist.
Löschen der Verknüpfung: unlink Verknüpfung
Hinweis: Wenn du möchtest, dass deine symbolische Verknüpfung auch nach dem Verschieben funktioniert, gib unbedingt den absoluten Pfad an und nicht den relativen Pfad beim Erstellen einer symbolischen Verknüpfung. z.B. (beginnend von /root/benutzer/Zieldatei und nicht ./Zieldatei)
Hard-Link:
Hard-Link ist mehr eine Spiegelkopie oder mehrere Pfade zur selben Datei. Mach etwas mit Datei1 und es erscheint in Datei 2. Das Löschen einer Datei lässt die andere weiterhin bestehen.
Der Inode (oder die Datei) wird nur gelöscht, wenn alle (hard)Links oder alle Pfade zum (selben Datei)inode gelöscht wurden.
Wenn einmal ein Hard-Link erstellt wurde, hat die Verknüpfung den Inode der Originaldatei. Das Löschen, Umbenennen oder Verschieben der Originaldatei beeinträchtigt den Hard-Link nicht, da er mit dem zugrunde liegenden Inode verknüpft ist. Alle Änderungen an den Daten im Inode spiegeln sich in allen Dateien wider, die sich auf diesen Inode beziehen.
Hard-Link-Syntax: ln Zieldatei Verknüpfung
Ausgabe: Eine Datei mit dem Namen Verknüpfung wird erstellt, mit derselben Inode-Nummer wie die Zieldatei.
Beweis: ls -i Verknüpfung Zielfile
(überprüfe ihre Inodes)
Löschen der Verknüpfung: rm -f Verknüpfung
(Lösche die Verknüpfung wie eine normale Datei)
Hinweis: Symbolische Verknüpfungen können Dateisysteme überspannen, da sie einfach der Name einer anderen Datei sind. Während Hard-Links nur innerhalb desselben Dateisystems gültig sind.
Symbolische Verknüpfungen haben einige Funktionen, die Hard-Links fehlen:
-
Hard-Links verweisen auf den Dateiinhalt. Während Symbolische Verknüpfungen auf den Dateinamen verweisen.
-
Die Größe eines Hard-Links entspricht der Größe des Inhalts, während eine Symbolische Verknüpfung die Größe des Dateinamens hat.
-
Hard-Links teilen denselben Inode. Symbolische Verknüpfungen nicht.
-
Hard-Links können nicht über Dateisysteme hinweg verweisen. Symbolische Verknüpfungen schon.
-
Du weißt sofort, auf was eine symbolische Verknüpfung zeigt, während du bei Hard-Links das gesamte Dateisystem durchsuchen musst, um Dateien zu finden, die denselben Inode teilen.
# find / -inum 517333
/home/bobbin/sync.sh /root/synchro
-
Hard-Links können nicht auf Verzeichnisse verweisen.
Die Hard-Links haben zwei Einschränkungen:
- Verzeichnisse können nicht hard verknüpft werden. Linux erlaubt dies nicht, um die zyklische Baumstruktur von Verzeichnissen aufrechtzuerhalten.
- Ein Hard-Link kann nicht über Dateisysteme hinweg erstellt werden. Beide Dateien müssen sich auf demselben Dateisystem befinden, da verschiedene Dateisysteme unterschiedliche unabhängige Inode-Tabellen haben (zwei Dateien auf verschiedenen Dateisystemen, aber mit derselben Inode-Nummer, sind unterschiedlich).
- See previous answers
- Weitere Antworten anzeigen
4 Stimmen
Über 'do not understand the use of a hard link' kann es in Build-Systemen verwendet werden, die viele Binärdateien kopieren. Das Erstellen eines Hardlinks anstelle einer tatsächlichen Kopie beschleunigt die Dinge. MSBuild 4.0 unterstützt dies.
20 Stimmen
Ich finde diesen Link sehr nützlich, um es zu verstehen. askubuntu.com/questions/108771/…
3 Stimmen
unix.stackexchange hat eine gute Liste von Aufzählungspunkten... sehr hilfreich, da sie alle Einschränkungen sehr prägnant darstellt und leicht zu überfliegen ist. (viele dieser Aufzählungspunkte behandeln Randfälle/Haken, die nur in den Kommentaren zu dieser Frage erwähnt werden... oder überhaupt nicht erwähnt werden)
1 Stimmen
youtube.com/watch?v=lW_V8oFxQgA