Linux-Tutorial / Harte Links vs. Symbolische Links in Linux: Unterschiede und Beispiele
Ein Hardlink ist ein anderer Name für denselben Datei-Inode, während ein symbolischer Link ein separater Eintrag ist, der einen Pfad zu einem anderen Speicherort speichert. Beide bieten eine andere Möglichkeit, auf eine Datei zuzugreifen, verhalten sich jedoch unterschiedlich, wenn sich der ursprüngliche Name ändert oder eine Dateisystemgrenze überschritten wird. In dieser Lektion werden Sie beide Links erstellen und den Unterschied beobachten.
Für die Bedeutung von Inode-Nummern und Linkanzahlen siehe Dateiattribute mit file und stat lesen.
Zwei Ideen hinter Datei-Links
Ein Verzeichniseintrag wie report.txt liefert einen Namen, der in einem Pfad verwendet wird. Das Dateisystem verwaltet die Metadaten der Datei mit einem Inode. Das Hinzufügen eines Hardlinks erstellt einen weiteren Namen für denselben Inode. Wenn einer dieser Namen entfernt wird, bleibt der andere weiterhin zugänglich, solange er existiert.
Ein symbolischer Link ist ein eigenständiger Eintrag, der den Pfadstring seines Ziels enthält. Das System folgt diesem Pfad, wenn Sie den Link öffnen. Verschwindet das benannte Ziel oder wird es verschoben, kann der Link bestehen bleiben, während der Zugriff darüber fehlschlägt. Dies wird als defekter Link bezeichnet.
| Vergleich | Hardlink | Symbolischer Link |
|---|---|---|
| Worauf er verweist | Derselbe Datei-Inode | Ein Ziel-Pfadstring |
| Inode | Gleich wie der ursprüngliche Name | Hat seinen eigenen Inode |
| Ursprünglicher Name entfernt oder geändert | Der andere Name funktioniert immer noch | Kann fehlschlagen, wenn der gespeicherte Pfad nicht mehr aufgelöst wird |
| Ein anderes Dateisystem | Kann die Grenze nicht überschreiten | Kann auf einen Pfad in einem anderen Dateisystem zeigen |
| Zielverzeichnis | Kann im Allgemeinen nicht erstellt werden | Kann erstellt werden |
Erstellen Sie eine Übungsdatei und beide Links
Arbeiten Sie in einem neuen Verzeichnis in Ihrem Home-Ordner. Wenn ~/linux-course-09-practice bereits existiert, wählen Sie einen anderen Namen. Der folgende mkdir-Befehl schlägt fehl, wenn das Verzeichnis bereits existiert. Stoppen Sie, wenn das passiert: Das Fortfahren könnte eine bestehende Datei überschreiben.
mkdir ~/linux-course-09-practice cd ~/linux-course-09-practice pwd
Überprüfen Sie, dass pwd das Verzeichnis bezeichnet, das Sie gerade erstellt haben, bevor Sie eine Datei erstellen. Der folgende printf schreibt eine Zeile in original.txt.
printf 'version 1\n' > original.txt ln original.txt hard.txt ln -s original.txt shortcut.txt
Der erste ln verwendet sein Standardverhalten, um einen Hardlink zu erstellen. Der zweite erstellt einen symbolischen Link mit -s. shortcut.txt speichert den relativen Pfad original.txt. Interpretieren Sie diesen Pfad relativ zu dem Verzeichnis, das den Link enthält, nicht zum aktuellen Arbeitsverzeichnis der Shell.
Überprüfen Sie Inodes und das Linkziel
Verwenden Sie GNU stat, um die Inode-Nummer (%i) und die Anzahl der Hardlinks (%h) anzuzeigen. readlink gibt den in einem symbolischen Link gespeicherten Pfad aus.
stat -c '%i %h %n' original.txt hard.txt shortcut.txt readlink shortcut.txt
Tatsächliche Inode-Nummern unterscheiden sich je nach System, aber original.txt und hard.txt sollten dieselbe Nummer teilen und eine Linkanzahl von zwei anzeigen, wie in dieser Abbildung. shortcut.txt hat einen anderen Inode.
123456 2 original.txt 123456 2 hard.txt 789012 1 shortcut.txt original.txt
Diese Zahlen sind Beispiele, keine gemessenen Ergebnisse. Der relative Pfad original.txt, der von readlink ausgegeben wird, löst sich innerhalb des Verzeichnisses auf, das den Link enthält, sodass alle drei Namen derzeit Zugriff auf denselben Inhalt bieten.
cat original.txt cat hard.txt cat shortcut.txt
Jeder Befehl gibt version 1 aus. Identischer Inhalt bedeutet jedoch nicht, dass die drei Namen dieselbe zugrunde liegende Struktur haben.
Was passiert, wenn sich der ursprüngliche Name ändert?
Benennen Sie original.txt im Übungsverzeichnis um. hard.txt bleibt lesbar, da er denselben Inode benennt. shortcut.txt zeigt immer noch auf den alten Pfad original.txt, daher wird er fehlerhaft.
mv original.txt renamed.txt cat hard.txt readlink shortcut.txt
cat hard.txt druckt version 1, während readlink shortcut.txt weiterhin original.txt druckt. An diesem Punkt sollte cat shortcut.txt melden, dass das Ziel nicht gefunden werden kann. Um einen Link zum neuen Namen im selben Verzeichnis zu erstellen, könnten Sie ln -s renamed.txt new-shortcut.txt ausführen.
Das Entfernen eines symbolischen Links mit rm shortcut.txt entfernt normalerweise nur den Link selbst, nicht das Ziel. Ein nachgestellter Schrägstrich oder ein Befehl, der auf eine Datei in einem verlinkten Verzeichnis abzielt, kann jedoch die Bedeutung eines Pfads ändern. Überprüfen Sie das genaue Ziel, bevor Sie etwas löschen.
Welchen Link sollten Sie verwenden?
Verwenden Sie einen Hardlink, wenn Sie einen anderen Namen für eine Datei im gleichen Dateisystem wollen und die Datei zugänglich bleiben soll, falls ein Name verschwindet. Ein symbolischer Link ist flexibler, wenn Sie auf ein Verzeichnis oder einen Pfad in einem anderen Dateisystem verweisen müssen oder möchten, dass das Ziel als Pfad sichtbar ist. Wenn Sie planen, den symbolischen Link zu verschieben oder sein Ziel umzubenennen, denken Sie daran, dass ein relatives Ziel aus dem eigenen Verzeichnis des Links interpretiert wird.
Weitere Informationen zur Handhabung des Ziels und zu Optionen finden Sie im ln-Befehlsleitfaden. Der readlink-Leitfaden erklärt den gespeicherten Zielpfad und dessen Auflösung ausführlicher.
Stellen Sie den ursprünglichen Namen nach dem Vergleich wieder im gleichen Übungsverzeichnis her. Wenn Sie separat eine neue original.txt erstellt haben, prüfen Sie sie, bevor Sie etwas überschreiben. Eine optionale new-shortcut.txt verweist immer noch auf renamed.txt und muss separat behandelt werden.
mv -i renamed.txt original.txt cat shortcut.txt stat -c '%i %h %n' original.txt hard.txt
Der ursprüngliche symbolische Link liest wieder version 1; die beiden Hard-Link-Namen teilen immer noch einen Inode.
Offizielle Dokumentation
Die GNU Coreutils ln-Dokumentation behandelt Hard- und symbolische Links, und die GNU readlink-Dokumentation behandelt die Ausgabe des Zielpfads.




