Zum Inhalt springen

Links

Wenn du ls -l /usr/bin/python3 eingibst, siehst du keine Datei, sondern einen Verweis:

lrwxrwxrwx 1 root root 10 Apr 9 12:33 /usr/bin/python3 -> python3.12

Linux kennt zwei Arten solcher Verweise, Symlinks und Hardlinks. Um den Unterschied zu verstehen, musst du wissen, wie ein Dateisystem eine Datei überhaupt speichert.

Ein Dateisystem wie ext4 verwaltet jede Datei in einem Inode (index node). Dort stehen die Metadaten: Besitzer, Gruppe, Rechte, Grösse, Zeitstempel und die Adressen der Datenblöcke auf der Platte. Was nicht im Inode steht, ist der Name. Der Name ist nur ein Eintrag in einem Verzeichnis, der auf eine Inode-Nummer zeigt.

flowchart LR
    subgraph Verzeichnis
        n1["bericht.txt"]
        n2["kopie.txt (Hardlink)"]
        n3["aktuell.txt (Symlink)"]
    end
    n1 --> I["Inode 5321<br/>rw-r--r-- anna<br/>Links: 2"]
    n2 --> I
    I --> D[("Datenblöcke<br/>Hallo Welt")]
    n3 -. "enthält den Text: bericht.txt" .-> n1

Ein Hardlink ist ein zweiter Verzeichniseintrag, der auf denselben Inode zeigt. Beide Namen sind gleichberechtigt, keiner ist das «Original». Der Inode zählt mit, wie viele Namen auf ihn zeigen: der Link-Count, die zweite Spalte in ls -l.

Ein Symlink (symbolischer Link, Softlink) ist eine eigene kleine Datei mit eigenem Inode, deren Inhalt ein Pfad ist. Beim Zugriff folgt der Kernel diesem Pfad. Ob dort etwas liegt, ist dem Symlink egal.

Hands-on: Inode-Nummern sichtbar machen.

Terminal-Fenster
ls -li /usr/bin/python3 /usr/bin/python3.12
ls -ld /bin

-i zeigt die Inode-Nummer als erste Spalte. Die beiden python3-Einträge haben verschiedene Nummern, weil der Symlink eine eigene Datei ist.

Terminal-Fenster
mkdir -p ~/links && cd ~/links
echo "Version 1" > bericht-v1.txt
ln -s bericht-v1.txt aktuell.txt
ls -l
cat aktuell.txt

Die Reihenfolge ist Ziel zuerst, dann Linkname, wie bei cp und mv. Die Ausgabe zeigt aktuell.txt -> bericht-v1.txt, und die Rechte des Symlinks sind immer lrwxrwxrwx. Sie spielen keine Rolle, es gelten die Rechte der Zieldatei.

Was passiert, wenn das Ziel verschwindet?

Terminal-Fenster
mv bericht-v1.txt bericht-alt.txt
cat aktuell.txt
ls -l

cat meldet No such file or directory, obwohl ls den Link anzeigt. Der Symlink zeigt ins Leere; man nennt das einen dangling link. Benenne die Datei zurück, und er funktioniert wieder.

Terminal-Fenster
cd ~/links
echo "Version 1" > bericht-v1.txt
ln bericht-v1.txt kopie.txt
ls -li

Beide Namen haben dieselbe Inode-Nummer und der Link-Count steht auf 2. Es gibt keine Kopie der Daten, die Platte speichert «Version 1» genau einmal. Änderst du über einen Namen, siehst du es über den anderen:

Terminal-Fenster
echo "Zeile 2" >> kopie.txt
cat bericht-v1.txt
rm bericht-v1.txt
cat kopie.txt
ls -li

Nach rm bericht-v1.txt ist der Inhalt noch da. rm löscht nicht die Datei, sondern einen Namen; der Link-Count sinkt auf 1. Erst wenn der letzte Name weg ist und kein Programm die Datei mehr offen hat, gibt das Dateisystem die Blöcke frei. Umbenennen und Verschieben des «Originals» ist dem Hardlink ebenfalls egal, der Inode bleibt derselbe.

Zwei Grenzen von Hardlinks:

  • Nicht über Dateisysteme hinweg. Inode-Nummern gelten nur innerhalb eines Dateisystems. ln /home/anna/x /tmp/x schlägt fehl, wenn /tmp ein eigenes Dateisystem ist. Ein Symlink kann das.
  • Nicht auf Verzeichnisse. Sonst könnte der Baum Schleifen enthalten, und find oder rm -r würden nie fertig. Die einzigen Hardlinks auf Verzeichnisse legt das Dateisystem selbst an: . und ... Deshalb hat ein leeres Verzeichnis den Link-Count 2, und jeder Unterordner erhöht ihn um eins.
Symlink Hardlink
Zeigt auf einen Pfad (Text) einen Inode
Eigener Inode ja nein, derselbe
Ziel gelöscht Link zeigt ins Leere Daten bleiben erhalten
Ziel verschoben Link bricht kein Problem
Auf Verzeichnisse ja nein
Über Dateisysteme ja nein
Sichtbar in ls -l l und -> nur am Link-Count und ls -i
  • Programmversionen. /usr/bin/python3 zeigt auf python3.12. Kommt eine neue Version, wird nur der Symlink umgebogen; kein Skript muss angepasst werden. Dasselbe Prinzip steckt hinter /etc/alternatives: ls -l /usr/bin/editor führt über mehrere Symlinks zum tatsächlichen Editor.
  • usrmerge. /bin -> usr/bin, wie auf der ersten Seite gesehen.
  • Dienste. systemd aktiviert einen Dienst, indem es einen Symlink in /etc/systemd/system/multi-user.target.wants/ anlegt. Das siehst du in Modul 9.
  • Backups mit Hardlinks. Wenn ein Backup-Programm die Dateien von gestern per Hardlink in das Backup von heute übernimmt und nur geänderte Dateien neu kopiert, hast du jeden Tag ein vollständiges Abbild, das fast keinen Platz braucht. Genau das macht rsync --link-dest, das in Modul 10 kommt. Apple Time Machine arbeitete jahrelang nach demselben Prinzip.

Hands-on: Verfolge eine Symlink-Kette bis zum Ende.

Terminal-Fenster
ls -l /usr/bin/editor
ls -l /etc/alternatives/editor
readlink -f /usr/bin/editor

readlink -f löst alle Symlinks auf und zeigt den endgültigen Pfad.

Lösung anzeigen
Terminal-Fenster
script labs/linux/04-dateisystem/links.txt
mkdir -p ~/links && cd ~/links
echo "Erste Fassung" > original.txt
ln -s original.txt sym.txt
ln original.txt hard.txt
ls -li
# Antwort 1: sym.txt beginnt mit l und zeigt -> original.txt, eigene Inode-Nummer.
# hard.txt hat dieselbe Inode-Nummer wie original.txt, beide haben Link-Count 2.
rm original.txt
cat sym.txt
cat hard.txt
# Antwort 2: sym.txt zeigt auf den Pfad original.txt, der nicht mehr existiert: No such file or directory.
# hard.txt ist ein zweiter Name fuer den Inode, die Daten sind noch da.
echo "Zweite Fassung" > original.txt
cat sym.txt
# Antwort 3: Zweite Fassung. Der Symlink folgt dem Pfad, egal welche Datei jetzt dort liegt.
ln ~/links ~/links-hard
# Antwort 4: ln: /home/anna/links: hard link not allowed for directory. Hardlinks auf Verzeichnisse wuerden Schleifen im Baum erlauben.
exit

Selbstcheck · 5 Fragen

1. Du löschst die Zieldatei eines Symlinks. Ist der Symlink noch lesbar?
2. Du löschst eine von zwei hart verlinkten Dateien. Was passiert mit den Daten?
3. Welcher Befehl erzeugt einen Symlink namens aktuell auf die Datei v2?
4. Welche Aussagen zu Hardlinks stimmen? (mehrere Antworten möglich)
5. Woran erkennst du in ls -l einen Symlink?