VMware ESXi and vSphere Cluster Management
Linux-Verknüpfungen: Hard Links und symbolische Links verstehen
Lerne den Unterschied zwischen Hard Links und symbolischen Links unter Linux kennen. Mit ln, ls, stat, readlink und find erstellen und prüfen.
Linux-Verknüpfungen, meist Links genannt, geben einer Datei zusätzliche Namen oder stellen einen alternativen Zugriffspfad bereit. Technisch gibt es dabei zwei wichtige Varianten: harte Links und symbolische Links (Symlinks oder Soft Links).
Beide Varianten werden mit ln angelegt, funktionieren intern aber unterschiedlich. Wer diese Unterschiede versteht, kann Dateien sicherer verwalten, Konfigurationspfade flexibel gestalten und typische Fehler beim Verschieben oder Löschen vermeiden.
Die Grundidee von Links
Ein Dateiname ist unter Linux nicht identisch mit den eigentlichen Dateidaten. Zur Einordnung helfen drei Begriffe:
- Ein Verzeichniseintrag ordnet einen Namen in einem Verzeichnis einer Inode-Nummer zu.
- Ein Inode beschreibt die Metadaten einer Datei und verweist auf ihre Datenblöcke.
- Die Dateidaten enthalten beispielsweise den Text oder den Programmcode.
Ein Link ist daher nicht einfach eine zweite Kopie. Er stellt entweder einen weiteren Namen für denselben Inode bereit oder speichert einen Pfad, unter dem ein anderes Objekt erreichbar ist.
Typische Einsatzfälle sind:
- ein kürzerer oder bequemerer Zugriffspfad,
- ein alternativer Name für ein Programm mit einer anderen Betriebsart,
- eine Konfigurationsdatei an mehreren erwarteten Pfaden,
- Kompatibilität mit Programmen, die einen bestimmten Dateinamen oder Verzeichnisort voraussetzen.
Inodes und das Linux-Dateisystemmodell
Ein Inode ist eine Dateisystemdatenstruktur. Er enthält unter anderem Eigentümer, Berechtigungen, Zeitstempel, Dateigröße, die Link-Anzahl und Verweise auf die Datenblöcke. Der Dateiname befindet sich normalerweise nicht im Inode.
Vereinfacht sieht die Zuordnung so aus:
Verzeichnis Inode Daten
------------------ ------------------ ----------------
bericht.txt ----> 4711 ---> Inhalt der Datei
bericht-kopie.txt ----> 4711 ---> Inhalt der Datei
Die beiden Verzeichniseinträge verwenden hier dieselbe Inode-Nummer. Die Link-Anzahl des Inodes beträgt mindestens zwei.
Inode-Informationen untersuchen
Mit ls -i lässt sich die Inode-Nummer anzeigen. Die Option -l ergänzt die lange Dateiliste:
ls -li bericht.txt bericht-kopie.txt
Eine mögliche Ausgabe sieht beispielsweise so aus:
4711 -rw-r--r-- 2 anna users 1200 Aug 19 10:15 bericht-kopie.txt
4711 -rw-r--r-- 2 anna users 1200 Aug 19 10:15 bericht.txt
Die gleiche Inode-Nummer und die Link-Anzahl 2 sind ein starkes Indiz für einen Hard Link. Für ausführlichere Metadaten eignet sich stat:
stat bericht.txt
In der Ausgabe sind besonders Inode und Links relevant. Die Inode-Nummer gilt innerhalb eines Dateisystems; sie ist nicht zwingend systemweit eindeutig.
Harte Links
Ein Hard Link ist ein weiterer Verzeichniseintrag, der auf denselben Inode wie ein vorhandener Dateiname zeigt. Deshalb greifen alle harten Links auf dieselben Dateidaten und Metadaten zu.
Aus Sicht des Dateisystems gibt es bei harten Links keine besondere Originaldatei. Beide Namen sind gleichwertig. Wird der Inhalt über einen Namen geändert, ist die Änderung sofort auch über den anderen Namen sichtbar.
Hard Link erstellen
Ohne Option erstellt ln einen harten Link:
ln bericht.txt bericht-kopie.txt
ls -li bericht.txt bericht-kopie.txt
Das zweite Argument ist hier der neue Linkname. Es handelt sich trotz des Namens bericht-kopie.txt nicht um eine unabhängige Kopie. Wird die Datei mit einem Editor über diesen Namen geändert, verändert sich dieselbe Datei.
Was passiert beim Löschen?
rm bericht.txt entfernt den Verzeichniseintrag bericht.txt. Der Inode und die Daten bleiben erhalten, solange mindestens ein weiterer harter Link existiert. Erst wenn die Link-Anzahl null erreicht und kein Prozess die Datei mehr geöffnet hält, kann das Dateisystem die Datenblöcke freigeben.
Das erklärt auch, warum Speicherplatz nach dem Löschen eines Dateinamens nicht immer sofort frei wird: Ein weiterer Hard Link oder ein noch geöffnetes Dateihandle kann die Daten weiterhin halten.
Grenzen harter Links
- Harte Links können normalerweise nur innerhalb desselben Dateisystems angelegt werden. Eine andere eingehängte Partition oder ein anderes Gerät bildet eine Dateisystemgrenze.
- Für normale Benutzer sind harte Links auf Verzeichnisse in der Regel verboten. Andernfalls könnten Schleifen und Inkonsistenzen in der Verzeichnisstruktur entstehen.
- Harte Links sind vor allem für reguläre Dateien geeignet.
Symbolische Links
Ein symbolischer Link ist eine eigene spezielle Datei. Ihr Inhalt ist ein gespeicherter Zielpfad, beispielsweise /opt/anwendung/config.ini. Der Symlink besitzt deshalb einen eigenen Inode und eine eigene Inode-Nummer.
Beim Zugriff auf den Symlink löst Linux den gespeicherten Pfad auf und greift anschließend auf das Ziel zu. Ein Symlink kann auf eine reguläre Datei, ein Verzeichnis oder ein Ziel in einem anderen Dateisystem zeigen.
Symbolischen Link erstellen
ln -s /opt/anwendung/config.ini ~/config-aktuell
Die Option -s steht für symbolisch. Das erste Argument ist die Quelle beziehungsweise der gespeicherte Zielpfad. Das zweite Argument ist der Name des Symlinks.
Mit ls -l wird ein Symlink typischerweise so angezeigt:
lrwxrwxrwx 1 anna users 27 Aug 19 10:20 config-aktuell -> /opt/anwendung/config.ini
Das erste Zeichen l kennzeichnet den Dateityp als symbolischen Link. Die Pfeilnotation zeigt den gespeicherten Zielpfad. Die scheinbaren Berechtigungsbits eines Symlinks sind auf vielen Linux-Systemen keine eigenständige Zugriffskontrolle; maßgeblich sind die Rechte des Zielobjekts und der übergeordneten Verzeichnisse.
Absolute und relative Symlink-Ziele
Ein absoluter Pfad beginnt mit / und ist unabhängig vom aktuellen Arbeitsverzeichnis:
ln -s /opt/anwendung/config.ini ~/config-aktuell
Ein relativer Pfad wird dagegen relativ zum Verzeichnis des Symlinks interpretiert, nicht relativ zum Verzeichnis, in dem der Befehl ausgeführt wurde. Beispiel:
ln -s ../shared/einstellungen.conf config/einstellungen.conf
Liegt der Link in config/, bedeutet ../shared/einstellungen.conf den Pfad shared/einstellungen.conf ausgehend von diesem Link-Verzeichnis.
Relative Symlinks sind praktisch, wenn eine gesamte Projektstruktur gemeinsam verschoben werden soll und die relative Beziehung zwischen Link und Ziel erhalten bleibt. GNU-ln unterstützt dafür häufig:
ln -sr ../shared/einstellungen.conf config/einstellungen.conf
Die Option -r beziehungsweise --relative berechnet aus den angegebenen Pfaden einen relativen Zielpfad. Da diese Option nicht bei jeder Implementierung verfügbar ist, sollte die lokale Dokumentation mit man ln geprüft werden.
Fehlende Ziele und defekte Symlinks
Ein Symlink kann bereits angelegt werden, obwohl sein Ziel noch nicht existiert. Wird das Ziel später verschoben, umbenannt oder gelöscht, bleibt der Link bestehen, kann aber nicht mehr aufgelöst werden. Ein solcher Link heißt defekter oder hängender Symlink.
Das Löschen des Symlinks löscht nicht dessen Ziel:
rm ~/config-aktuell
Entfernt wird nur die spezielle Link-Datei.
Hard Link und symbolischer Link im Vergleich
| Merkmal | Hard Link | Symbolischer Link |
|---|---|---|
| Bezug | Weiterer Name für denselben Inode | Speichert einen Zielpfad |
| Eigene Inode-Nummer | Nein, alle Namen verwenden denselben Inode | Ja, der Symlink besitzt einen eigenen Inode |
| Gleiche Dateidaten | Ja, direkter Zugriff auf dieselben Daten | Nein, Zugriff erfolgt über das Ziel |
| Dateisystemgrenzen | Nicht überschreitbar | Können überschritten werden |
| Verzeichnisse | Für normale Benutzer grundsätzlich nicht erlaubt | Kann auf Verzeichnisse zeigen |
| Fehlendes Ziel | Ein Hard Link hat kein getrenntes Ziel; die Daten bleiben über jeden Link erreichbar | Kann als defekter Link bestehen bleiben |
| Löschen des Links | Entfernt nur einen Namen; Daten bleiben bei weiteren Links erhalten | Entfernt nur den Symlink |
| Löschen oder Umbenennen des Ziels | Ein anderer Name bleibt gültig; es gibt kein besonderes Original | Der Link kann defekt werden |
| Typische Verwendung | Gleichwertige Namen einer regulären Datei im selben Dateisystem | Flexible Pfade, Verzeichnisse und Ziele über Dateisystemgrenzen hinweg |
Wichtige ln- und Prüfoptionen
| Befehl oder Option | Zweck | Hinweis |
|---|---|---|
ln QUELLE LINKNAME | Erstellt einen Hard Link | Standardverhalten ohne Option |
ln -s QUELLE LINKNAME | Erstellt einen Symlink | QUELLE wird als Zielpfad gespeichert |
-f | Entfernt ein vorhandenes Ziel vor dem Anlegen | Nur mit sorgfältiger Pfadprüfung verwenden |
-n | Behandelt einen vorhandenen Symlink auf ein Verzeichnis als Link selbst | Verhindert in passenden Fällen das Folgen des Symlinks |
-T | Behandelt LINKNAME immer als konkreten Namen | Das letzte Argument wird nicht als Zielverzeichnis interpretiert |
-r oder -sr | Erstellt einen relativen Symlink | Unterstützung hängt von der ln-Implementierung ab |
ls -li | Zeigt Inode-Nummern und Link-Anzahl | Für Hard-Link-Vergleiche geeignet |
stat DATEI | Zeigt detaillierte Metadaten | Enthält Inode und Link-Anzahl |
readlink LINK | Gibt den gespeicherten Symlink-Pfad aus | Führt normalerweise keine vollständige Auflösung durch |
readlink -f LINK | Versucht, den kanonischen Zielpfad zu bestimmen | Kann bei fehlenden Komponenten fehlschlagen |
find . -type l | Sucht symbolische Links | -ls ergänzt eine ausführliche Ausgabe |
Links prüfen und verwalten
Symlink-Ziel untersuchen
readlink ~/config-aktuell
readlink -f ~/config-aktuell
readlink gibt den im Link gespeicherten Text aus. Dieser kann relativ oder absolut sein und muss nicht selbst bereits ein kanonischer Pfad sein. readlink -f löst Verzeichnisse und weitere Symlinks möglichst vollständig auf. Wenn das Ziel oder ein notwendiger Pfadbestandteil fehlt, kann die Auflösung scheitern.
Symlinks finden
find . -type l -ls
Dieser Befehl listet symbolische Links unterhalb des aktuellen Verzeichnisses auf. In vielen GNU-find-Umgebungen findet der folgende Befehl Links, deren Ziel nicht aufgelöst werden kann:
find . -xtype l -print
Die Option -xtype ist nicht auf jeder Unix-Variante gleich verfügbar. Bei Unsicherheit hilft man find.
Vorhandenes Zielargument beachten
Wenn das letzte Argument von ln ein bereits vorhandenes Verzeichnis ist, legt ln den neuen Link normalerweise innerhalb dieses Verzeichnisses an. Dadurch kann ein Link an einem unerwarteten Ort oder unter einem unerwarteten Namen entstehen.
Gib den gewünschten Linknamen deshalb möglichst ausdrücklich an. Mit -T lässt sich bei unterstützten GNU-Systemen erzwingen, dass das letzte Argument als konkreter Zielname behandelt wird. Beim Ersetzen vorhandener Links können Kombinationen aus -f, -n und -T passend sein. Prüfe vor dem Einsatz besonders bei Skripten die lokale ln-Dokumentation.
Praktische Beispiele
Eine Datei unter zwei gleichwertigen Namen verwenden
printf '%s\n' 'Version 1' > bericht.txt
ln bericht.txt bericht-kopie.txt
ls -li bericht.txt bericht-kopie.txt
stat bericht.txt
Beide Namen zeigen auf denselben Inode. Eine Änderung an bericht-kopie.txt verändert den Inhalt von bericht.txt. Wird einer der Namen entfernt, bleibt der andere nutzbar.
Eine Konfiguration über einen stabilen Pfad anbieten
ln -s /opt/anwendung/config.ini ~/config-aktuell
ls -l ~/config-aktuell
readlink ~/config-aktuell
Programme oder Benutzer können den kurzen Pfad ~/config-aktuell verwenden, während die eigentliche Datei an ihrem festen Ort bleibt.
Kurzen Zugriff auf ein Verzeichnis schaffen
ln -s /srv/projekte ~/projekte
Danach führt cd ~/projekte zum Verzeichnis /srv/projekte. Für Verzeichnisse ist ein Symlink die übliche Link-Variante.
Alternativer Befehlsname
Ein Programm kann über mehrere Namen erreichbar sein. Ein Hard Link kann dabei mehrere gleichwertige Namen für dieselbe reguläre Programmdatei bereitstellen. Häufiger werden für veränderliche Installationspfade jedoch Symlinks verwendet, etwa wenn ein allgemeiner Name auf die aktuell ausgewählte Version eines Programms zeigen soll.
Defekten Symlink reparieren
readlink ~/config-aktuell
find ~/ -xtype l -print
Prüfe zunächst, welcher Zielpfad gespeichert ist und ob das Ziel tatsächlich existiert. Danach kannst du den Link kontrolliert entfernen und mit dem korrekten Ziel neu erstellen:
rm ~/config-aktuell
ln -s /opt/anwendung/neue-config.ini ~/config-aktuell
Sicherheit und Praxis
Beim Zugriff über einen Symlink gelten im Wesentlichen die Berechtigungen des Zielobjekts. Zusätzlich müssen die beteiligten Verzeichnisse durchsuchbar sein. Die Berechtigungsbits des Symlinks selbst sind auf vielen Linux-Dateisystemen nicht als normale Zugriffskontrolle veränderbar oder relevant.
Besondere Vorsicht ist bei rekursiven Befehlen und nicht vertrauenswürdigen Pfaden nötig. Ein Programm, das einem Symlink folgt, kann dadurch auf eine Datei außerhalb des erwarteten Verzeichnisses zugreifen. Das ist beispielsweise bei temporären Dateien, Installationsskripten und Administrationswerkzeugen ein Risiko.
- Prüfe Pfade vor destruktiven Befehlen wie
rm,mvund rekursiven Operationen. - Verlasse dich in Skripten nicht ungeprüft auf Dateinamen aus fremden Verzeichnissen.
- Berücksichtige, ob ein Werkzeug Symlinks selbst erhält oder ihrem Ziel folgt.
- Teste Backup-, Archivierungs- und Kopierbefehle mit ihren konkreten Optionen, da sich ihr Verhalten gegenüber Symlinks unterscheiden kann.
Beim Entfernen eines Links verwende rm LINKNAME oder unlink LINKNAME. Ziel und Link müssen dabei klar unterschieden werden: Entfernst du den Symlink, bleibt das Ziel erhalten; löschst du dagegen den Zielpfad selbst, kann der Symlink anschließend defekt sein.
Fehlerbehebung
Hard Link kann nicht erstellt werden
Meldet ln einen Fehler wegen unterschiedlicher Geräte oder Dateisysteme, liegen Quelle und Link wahrscheinlich auf verschiedenen eingehängten Dateisystemen. Erstelle in diesem Fall einen Symlink oder lege den Hard Link innerhalb desselben Dateisystems an.
Symlink lässt sich nicht öffnen
Prüfe mit readlink, ob der gespeicherte Pfad korrekt ist. Das Ziel könnte verschoben, umbenannt oder gelöscht worden sein. Stelle es wieder her oder erstelle den Symlink mit dem richtigen Ziel neu.
Relativer Symlink funktioniert nach dem Verschieben nicht
Ein relativer Symlink hängt von der Position des Link-Verzeichnisses ab. Wird nur der Link oder nur ein Teil der Projektstruktur verschoben, kann die bisherige relative Beziehung ungültig werden. Berechne den Pfad vom neuen Link-Verzeichnis aus neu oder verwende einen absoluten Pfad, wenn die Ziele unabhängig verschoben werden.
Nach dem Löschen eines Hard Links wird kein Speicher frei
Prüfe mit stat die Link-Anzahl. Weitere harte Links können noch existieren. Außerdem kann ein Prozess die Datei geöffnet halten; in diesem Fall wird der Speicher erst nach dem Schließen des Dateihandles freigegeben.
Ein Programm verwendet falsche Ressourcenpfade
Programme können relative Ressourcenpfade unterschiedlich behandeln. Manche verwenden den aufgerufenen Pfad, andere lösen den Symlink zunächst auf. Dokumentiere das Verhalten des Programms und nutze bei Bedarf einen Wrapper oder den erwarteten realen Pfad.
Entscheidungshilfe
- Verwende einen Hard Link, wenn eine reguläre Datei im selben Dateisystem mehrere gleichwertige Namen erhalten soll.
- Verwende einen Symlink, wenn du auf ein Verzeichnis zeigen, Dateisystemgrenzen überschreiten oder einen flexiblen beziehungsweise austauschbaren Pfad bereitstellen möchtest.
- Nutze relative Symlinks, wenn die Beziehung innerhalb einer verschiebbaren Verzeichnisstruktur erhalten bleiben soll.
- Nutze absolute Symlinks, wenn das Ziel unabhängig vom Ort des Links eindeutig feststeht.
Symlinks wirken für viele Anwender wie Verknüpfungen aus grafischen Betriebssystemen. Technisch sind sie jedoch eigene Dateisystemobjekte, die einen Pfad speichern. Harte Links dagegen sind zusätzliche Verzeichniseinträge für denselben Inode.
Weitere Übungen und die wichtigsten Befehle findest du in diesem Beitrag zu Linux-Verknüpfungen und Links.