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

MerkmalHard LinkSymbolischer Link
BezugWeiterer Name für denselben InodeSpeichert einen Zielpfad
Eigene Inode-NummerNein, alle Namen verwenden denselben InodeJa, der Symlink besitzt einen eigenen Inode
Gleiche DateidatenJa, direkter Zugriff auf dieselben DatenNein, Zugriff erfolgt über das Ziel
DateisystemgrenzenNicht überschreitbarKönnen überschritten werden
VerzeichnisseFür normale Benutzer grundsätzlich nicht erlaubtKann auf Verzeichnisse zeigen
Fehlendes ZielEin Hard Link hat kein getrenntes Ziel; die Daten bleiben über jeden Link erreichbarKann als defekter Link bestehen bleiben
Löschen des LinksEntfernt nur einen Namen; Daten bleiben bei weiteren Links erhaltenEntfernt nur den Symlink
Löschen oder Umbenennen des ZielsEin anderer Name bleibt gültig; es gibt kein besonderes OriginalDer Link kann defekt werden
Typische VerwendungGleichwertige Namen einer regulären Datei im selben DateisystemFlexible Pfade, Verzeichnisse und Ziele über Dateisystemgrenzen hinweg

Wichtige ln- und Prüfoptionen

Befehl oder OptionZweckHinweis
ln QUELLE LINKNAMEErstellt einen Hard LinkStandardverhalten ohne Option
ln -s QUELLE LINKNAMEErstellt einen SymlinkQUELLE wird als Zielpfad gespeichert
-fEntfernt ein vorhandenes Ziel vor dem AnlegenNur mit sorgfältiger Pfadprüfung verwenden
-nBehandelt einen vorhandenen Symlink auf ein Verzeichnis als Link selbstVerhindert in passenden Fällen das Folgen des Symlinks
-TBehandelt LINKNAME immer als konkreten NamenDas letzte Argument wird nicht als Zielverzeichnis interpretiert
-r oder -srErstellt einen relativen SymlinkUnterstützung hängt von der ln-Implementierung ab
ls -liZeigt Inode-Nummern und Link-AnzahlFür Hard-Link-Vergleiche geeignet
stat DATEIZeigt detaillierte MetadatenEnthält Inode und Link-Anzahl
readlink LINKGibt den gespeicherten Symlink-Pfad ausFührt normalerweise keine vollständige Auflösung durch
readlink -f LINKVersucht, den kanonischen Zielpfad zu bestimmenKann bei fehlenden Komponenten fehlschlagen
find . -type lSucht 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, mv und 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.