Was ist ein Hardlink? — Definition von The Linux Information Project (LINFO)

Ein Hardlink ist lediglich ein zusätzlicher Name für eine bestehende Datei unter Linux oder anderen Unix-ähnlichen Betriebssystemen.

Für jede Datei können beliebig viele Hardlinks und damit beliebig viele Namen erstellt werden. Harte Links können auch zu anderen harten Links erstellt werden. Sie können jedoch nicht für Verzeichnisse erstellt werden, und sie können keine Dateisystemgrenzen überschreiten oder sich über Partitionen erstrecken.

Das Betriebssystem macht keinen Unterschied zwischen dem Namen, der einer Datei ursprünglich zugewiesen wurde, als sie zum ersten Mal erstellt wurde, und allen Hard Links, die später zu dieser Datei erstellt werden, außer dass sie lediglich mehrere Namen für dieselbe Datei sind. Das liegt daran, dass der ursprüngliche Name und alle harten Links auf denselben Inode verweisen. Ein Inode ist eine Datenstruktur (d. h. eine optimierte Art der Informationsspeicherung), die alle Informationen über eine Datei (z. B. ihre Größe, ihre Zugriffsrechte, wann sie erstellt wurde und wo sie sich im System befindet) mit Ausnahme ihres Namens bzw. ihrer Namen und ihrer eigentlichen Daten speichert. Die Tatsache, dass Inode-Nummern nur innerhalb eines Dateisystems eindeutig sind, ist der Grund dafür, dass sie nicht über Dateisysteme und Partitionen hinweg funktionieren.

Harte Links werden mit dem Befehl ln erstellt. Zum Beispiel würde der folgende Befehl einen harten Link mit dem Namen hlink1 zu einer Datei mit dem Namen file1 erstellen, beide im aktuellen Verzeichnis (d.h. dem Verzeichnis, in dem der Benutzer gerade arbeitet):

ln file1 hlink1

Wenn ein harter Link erstellt wird, gibt es keinen offensichtlichen Hinweis darauf, dass er sich von jeder anderen Datei unterscheidet. Das heißt, Hardlinks scheinen Dateien desselben Typs zu sein wie ihre Zieldateien (d. h. die Dateien, mit denen sie verknüpft sind), wenn sie mit Befehlen wie ls (d. h. Liste) und file (das verwendet wird, um den Typ der angegebenen Dateien zu bestimmen) angezeigt werden. Auch in einer grafischen Benutzeroberfläche (GUI) sind die Symbole für harte Links identisch mit denen für ihre Zieldateien.

Dass der ursprüngliche Name einer Datei und alle harten Links zu dieser Datei denselben Inode haben, kann man deutlich sehen, wenn man den Befehl ls mit der Option -i (d. h. Inode) verwendet. So würde zum Beispiel folgendes zeigen, dass die Inode-Nummern von file1 und hlink1 aus dem obigen Beispiel identisch sind:

ls -i file1 hlink1

Die Anzahl der harten Links zu einer Datei wird in der zweiten Spalte der Ausgabe angezeigt, die durch die Verwendung von ls mit der Option -l (d.h., long) erzeugt wird. Es ist ersichtlich, dass die Zahl die Summe der Zieldatei und aller harten Links zu ihr ist (d.h., die Summe des ursprünglichen Namens und aller später hinzugefügten Namen) und dass sie für die Zieldatei und für jeden dieser Links gleich ist.

Hart verlinkte Dateien können auch mit dem Befehl find mit der Option -type f (um nur reguläre Dateien auszuwählen) gefolgt von der Option -links +1 (um alle regulären Dateien mit mehr als einem harten Link zu ihnen anzuzeigen) wie folgt gefunden werden:

find -type f -links +1

Wenn eine Änderung am Inhalt einer Datei vorgenommen wird, bleibt die Verknüpfung zu allen harten Links erhalten. Einige Texteditoren können jedoch die Verknüpfung aufheben, indem sie einen neuen Inode für den geänderten Inhalt erstellen1. Daher kann es ratsam sein, wichtige Verknüpfungen nach der Änderung von Dateien zu überprüfen.

Oberflächlich betrachtet scheint der Befehl rm Dateien zu entfernen oder zu löschen. In Wirklichkeit reduziert er jedoch die Anzahl der harten Links einer Datei (d.h. die Anzahl der Namen, die die Datei hat) um eins und hat keinen direkten Einfluss auf die Inode oder die Daten der Datei. Wenn der Zähler Null erreicht, scheint die Datei verschwunden zu sein, da es keine einfache Möglichkeit mehr gibt, auf sie zu verweisen. Die Daten der Datei sind jedoch erst dann wirklich gelöscht, wenn die Speicherstelle(n) auf der Festplatte (HDD) oder einem anderen Speichermedium, die sie enthält, durch eine neue Datei überschrieben wird.

Das folgende Beispiel würde also den Hardlink hlink1, der im obigen Beispiel erstellt wurde, entfernen:

rm hlink1

Wenn Sie rm erneut mit dem einen verbleibenden Namen wie folgt verwenden, werden die Daten der Datei praktisch unzugänglich:

rm file1

Die vielleicht nützlichste Anwendung für Hardlinks ist die Möglichkeit, Dateien, Programme und Skripte (d. h. Kurzprogramme) leicht zu finden.d. h. Kurzprogramme) in einem anderen Verzeichnis als der ursprünglichen Datei oder ausführbaren Datei (d. h., die ausführbare Version eines Programms). Die Eingabe des Namens des Hardlinks führt dazu, dass das Programm oder Skript auf die gleiche Weise ausgeführt wird wie unter seinem ursprünglichen Namen.

Symbolische Links, auch Softlinks genannt, sind nützlicher als Hardlinks, weil sie sowohl auf Verzeichnisse als auch auf Dateien in verschiedenen Dateisystemen und auf verschiedenen Partitionen verweisen können. Außerdem haben symbolische Links bei der Verwendung einer grafischen Benutzeroberfläche spezielle Symbole, die sie sofort als Links und nicht als normale Dateien erkennen lassen. Sie haben jedoch den Nachteil, dass sie unbrauchbar werden, wenn ihre Zieldatei gelöscht wird.

Aliase ähneln oberflächlich gesehen harten Links, da sie eine weitere Möglichkeit darstellen, mehrere Namen für eine Datei zu vergeben. Allerdings ist der Alias-Befehl in die Shell (d.h. das Programm, das die reine Text-Benutzeroberfläche bereitstellt) integriert und kein separates Programm, und der Mechanismus unterscheidet sich stark von dem der Hardlinks. Wie symbolische Links können Aliase nicht nur für Dateien, sondern auch für Verzeichnisse verwendet werden und können Dateisystem- und Partitionsgrenzen überschreiten. Darüber hinaus kann ein Alias als Kurzname für einen beliebigen Shell-Text (d.h. einen Befehl oder eine Reihe von verknüpften Befehlen, einschließlich tbeir Optionen und/oder Argumente) verwendet werden.

________
1Tests unter Red Hat Linux 9 ergaben, dass harte Links beim Ändern von Dateien mit dem Texteditor gedit zerstört wurden. Bei der Verwendung der Texteditoren vi und Abiword sowie des Hex-Editors KHexEdit auf derselben Linux-Version wurden sie jedoch nicht unterbrochen. Die Tatsache, dass gedit keine harten Links beibehält, ist darauf zurückzuführen, dass es eine Kopie der geänderten Datei anlegt, die es speichert (und damit die neue Inode-Nummer), anstatt die Änderungen an der Originaldatei vorzunehmen, wobei diese Kopie den Namen der Originaldatei erhält. Ein ähnlicher Test mit einer neueren Version von gedit (2.14.0) auf Fedora Core 5 zeigte jedoch, dass das Problem behoben war und keine Links mehr unterbrochen wurden.