Links
Ein Name ist nicht die Datei
Abschnitt betitelt „Ein Name ist nicht die Datei“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.12Linux 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.
ls -li /usr/bin/python3 /usr/bin/python3.12ls -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.
Symlinks mit ln -s
Abschnitt betitelt „Symlinks mit ln -s“mkdir -p ~/links && cd ~/linksecho "Version 1" > bericht-v1.txtln -s bericht-v1.txt aktuell.txtls -lcat aktuell.txtDie 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?
mv bericht-v1.txt bericht-alt.txtcat aktuell.txtls -lcat 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.
Hardlinks mit ln
Abschnitt betitelt „Hardlinks mit ln“cd ~/linksecho "Version 1" > bericht-v1.txtln bericht-v1.txt kopie.txtls -liBeide 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:
echo "Zeile 2" >> kopie.txtcat bericht-v1.txtrm bericht-v1.txtcat kopie.txtls -liNach 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/xschlägt fehl, wenn/tmpein eigenes Dateisystem ist. Ein Symlink kann das. - Nicht auf Verzeichnisse. Sonst könnte der Baum Schleifen enthalten, und
findoderrm -rwürden nie fertig. Die einzigen Hardlinks auf Verzeichnisse legt das Dateisystem selbst an:.und... Deshalb hat ein leeres Verzeichnis den Link-Count2, 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 |
Wo Links im Alltag vorkommen
Abschnitt betitelt „Wo Links im Alltag vorkommen“- Programmversionen.
/usr/bin/python3zeigt aufpython3.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/editorfü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.
ls -l /usr/bin/editorls -l /etc/alternatives/editorreadlink -f /usr/bin/editorreadlink -f löst alle Symlinks auf und zeigt den endgültigen Pfad.
Lösung anzeigen
script labs/linux/04-dateisystem/links.txtmkdir -p ~/links && cd ~/linksecho "Erste Fassung" > original.txtln -s original.txt sym.txtln original.txt hard.txtls -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.txtcat sym.txtcat 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.txtcat 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.exitSelbstcheck · 5 Fragen
Weiterführend
Abschnitt betitelt „Weiterführend“man ln,man readlink- ubuntuusers-Wiki: ln