Zum Hauptinhalt springen

Hard und Soft Links

Ein Link ist eine Referenz von einem Pfad im Dateisystem zu einer anderen Datei oder einem Ordner. Linux unterstützt zwei Arten: Hard links und Symbolische (soft) links. Beide werden mit dem ln Befehl erstellt, aber verhalten sich sehr unterschiedlich.

Inodes

Jede Datei im Linux Dateisystem wird anhand einer Inode identifiziert, einer Nummer, die auf die eigentlichen Daten auf der Festplatte verweist. Ein Dateiname ist eigentlich nur ein Label, das einer Inode zugeordnet wird, dadurch können auch mehrere Dateinamen auf dieselbe Inode zeigen.

ls -i file.txt # Zeigt die Inode Nummer einer Datei

Ein Hard Link erstellt einen zusätzlichen Dateinamen für dieselbe Inode. Beide Namen verweisen auf die gleiche Datei auf der Festplatte, aber keine der beiden ist wirklich das Original. Die Datei wird erst wirklich von der Festplatte gelöscht, wenn der letzte Hard Link gelöscht wird.

ln target.txt linkname.txt

Eigenschaften

  • Beide teilen sich die gleiche Inode
  • Das Löschen eines Links beeinflusst keinen der anderen
  • Kann sich nicht über mehrere Dateisysteme erstrecken, beide Links müssen auf derselben Partition sein
  • Es können keine Verzeichnisse verlinkt werden (Außer einer seltenen Ausnahme, die für das Betriebssystem reserviert ist)
  • Es kann keine Datei verlinkt werden, die nicht existiert

Beispiel

echo "hello" > original.txt
ln original.txt hardlink.txt
ls -li original.txt hardlink.txt
# 12345 -rw-r--r-- 2 user user 6 Apr 25 10:00 original.txt
# 12345 -rw-r--r-- 2 user user 6 Apr 25 10:00 hardlink.txt
rm original.txt
cat hardlink.txt # Gibt immer noch "hello" aus

Ein symbolischer Link ist eine kleine Spezialdatei, die nur den Pfad zu einer anderen Datei oder einem Verzeichnis speichert. Die Spezialdatei verfügt über eine eigene Inode. Wenn das Ziel bewegt oder gelöscht wird, wird der Soft Link zu einem "Dangling" Link und ist somit nicht mehr funktionsfähig.

ln -s target.txt linkname.txt

Eigenschaften

  • Verfügt über eine eigene Inode
  • Kann sich über mehrere Dateisysteme erstrecken
  • Kann auf Verzeichnisse zeigen
  • Kann auf ein nicht-existierendes Ziel zeigen (kaputter/dangling Link)
  • Kann absolute oder relative Pfade zum Ziel verwenden

Beispiel

echo "hello" > original.txt
ln -s original.txt softlink.txt
ls -li original.txt softlink.txt
# 12345 -rw-r--r-- 1 user user 6 Apr 25 10:00 original.txt
# 12346 lrwxrwxrwx 1 user user 12 Apr 25 10:00 softlink.txt -> original.txt
rm original.txt
cat softlink.txt # error: No such file or directory
EigenschaftHard LinkSoft Link
Zeigt aufInodePfad
Eigene Inode?Nein (Besitzt die gleiche wie das Ziel)Ja
Kann sich über mehrere Dateisysteme erstrecken?NeinJa
Kann auf Verzeichnisse zeigen?NeinJa
Kann auf eine nicht existente Datei zeigen?NeinJa
Überlebt die Löschung des Ziels?JaNein
Erstellt mitlnln -s

Die gängigsten ln Optionen

BefehlBeschreibung
ln target nameErstellt einen Hard Link
ln -s target nameErstellt einen Soft Link
ln -f target nameEntfernt (überschreibt) eine bereits existierende Datei am Zielort
ln -i target nameFragt, bevor es eine existierende Datei am Zielort überschreibt
ln -b target nameErstellt ein Backup vom Ziel, bevor es ersetzt wird (hängt ~ an den Dateinamen an)
ln -v target nameGibt die Namen aller verlinkten Dateien aus (verbose)
ln -sf target nameErzwingt das Ersetzen eines existierenden Links mit demselben Namen
readlink nameZeigt den Pfad an, auf den ein symbolischer Link verweist
readlink -f nameLöst alle Symlinks zum kanonischen absoluten Pfad auf

Wann verwendet man was?

  • Hard Links sind nützlich, um mehrere stabile Namen für die gleiche Datei zu haben (zum Beispiel Backup-Snapshots, die unveränderten Inhalt teilen), ohne dabei mehr Festplattenspeicher zu verbrauchen.
  • Soft Links sind die beliebtere Wahl für Shortcuts. Zum Beispiel zum schnellen Versionswechsel eines Tools (z.B. /usr/bin/python => python3.12), oder zum Referenzieren von Dateien über verschiedene Mount Points.