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.