Zum Inhalt springen

Links

Linux kennt zwei Arten von Links: Hard-Links und symbolische Links (Symlinks). Beide erlauben es, dass eine Datei unter mehreren Namen erreichbar ist – aber auf grundlegend unterschiedliche Weise.

Ein Hard-Link ist ein weiterer Verzeichniseintrag, der auf denselben Inode zeigt wie die Originaldatei. Es gibt kein Original und keine Kopie – beide Namen sind vollständig gleichwertig.

Terminal-Fenster
ln quelle.txt hard-link.txt
Verzeichnis:
"quelle.txt" → Inode 48291
"hard-link.txt" → Inode 48291 ← derselbe Inode!

Da beide Einträge denselben Inode referenzieren, gilt:

  • Änderungen über einen Namen sind sofort über den anderen sichtbar
  • Löschen eines Eintrags mit rm entfernt nur diesen Verzeichniseintrag – der Inode (und die Daten) bleiben bestehen, solange noch mindestens ein weiterer Name darauf zeigt
  • Die Anzahl der Verweise auf einen Inode (Link Count) ist in der ls -l-Ausgabe in der zweiten Spalte sichtbar
Terminal-Fenster
ls -li quelle.txt hard-link.txt
# 48291 -rw-r--r-- 2 alice alice 1234 Mär 17 10:00 hard-link.txt
# 48291 -rw-r--r-- 2 alice alice 1234 Mär 17 10:00 quelle.txt
# ^--- Link Count = 2
Abschnitt betitelt „Warum Hard-Links nicht über Partitionsgrenzen funktionieren“

Inodes sind dateisystemlokal – jedes Dateisystem (jede Partition, jedes eingehängte Laufwerk) verwaltet seine eigene Inode-Tabelle mit eigenen Nummern. Inode 48291 auf /home und Inode 48291 auf /media/usb sind völlig verschiedene Dinge.

Ein Hard-Link ist nichts anderes als eine Inode-Nummer in einem Verzeichniseintrag. Eine Inode-Nummer aus einem anderen Dateisystem referenzieren – das ist schlicht nicht möglich.

Terminal-Fenster
ln /home/alice/datei.txt /media/usb/link.txt
# ln: /media/usb/link.txt: ungültige partitionsübergreifende Verknüpfung

Ein symbolischer Link ist eine eigenständige Datei mit einem eigenen Inode, deren Inhalt ein Pfad zu einer anderen Datei oder einem Verzeichnis ist. Das Dateisystem folgt diesem Pfad automatisch.

Terminal-Fenster
ln -s ziel.txt symlink.txt
ln -s /etc/nginx/nginx.conf ~/nginx.conf # absoluter Pfad
ln -s ../freigabe/ verknuepfung/ # relativer Pfad
Verzeichnis:
"ziel.txt" → Inode 48291 (normale Datei, Daten liegen hier)
"symlink.txt" → Inode 51002 (Symlink, enthält den Text "ziel.txt")

Symlinks anzeigen:

Terminal-Fenster
ls -l symlink.txt
# lrwxrwxrwx 1 alice alice 8 Mär 17 10:05 symlink.txt -> ziel.txt
# ^--- 'l' für Link
EigenschaftHard-LinkSymbolischer Link
Eigener InodeNein (teilt Inode mit Ziel)Ja
Funktioniert über PartitionenNeinJa
Funktioniert auf VerzeichnisseNeinJa
Bleibt gültig wenn Ziel gelöschtJa (Daten bleiben erhalten)Nein (dangling symlink)
Sichtbar als Link in ls -lNeinJa (->)