Verknüpfungen - Soft- und Hardlinks
 

Es gibt unter Linux zwei Arten von Verknüpfungen, sogenannte symbolische Verknüpfungen, auch Softlinks genannt und Hardlinks. Der Unterschied ist, ein symbolischer Link ist ein spezieller Dateityp, der lediglich die Pfadangabe enthält und dadurch erkennbar ist, daß ein "l" vorangestellt ist, z.B.
# ls -al
lrwxrwxrwx 1 root root 10 Apr 19 2003 /var/mail/ -> spool/mail

Der Teil nach dem Pfeil "->" gibt an, worauf der Link zeigt, dabei ist zu beachten, daß Kommandos und Dateioperationen die sich auf Dateiinhalte beziehen, auf das Ziel umgeleitet werden. Anders ausgedrückt, eine Kopieraktion mit cp auf den Link angewandt, kopiert nicht den Link, sondern die Datei auf die der Link zeigt! Somit sind auch die Dateirechte des Links irrelevant, da ein chmod auf einen Link angewandt nicht die Rechte des Links verändert, sondern dessen Ziel!
Anders jedoch bei Kommandos und Dateioperationen die sich auf Verschieben, Umbenennen oder Löschen, also auf Dateinamen beziehen, diese wirken auf den Link, nicht auf das Ziel!

Symbolische Verknüpfungen (Softlinks) anlegen oder das Ziel verändern

# ln -s datei link
legt einen Link an. Existiert der Link schon, muß man mit -f mehr Gewalt anwenden:
# ln -s datei link
ln: 'link': File exists
# ln -sf datei link

Symbolische Verknüpfungen (Softlinks) kopieren, umbenennen oder löschen

Wie schon erwähnt, kopiert ein einfacher Kopierbefehl die Datei auf die der Link zeigt. Möchte man den Link selbst kopieren, hilft die Option -d (keinen symbolischen Links folgen)
# cp -d link kopie
Um einen Link umzubennen reicht der normale mv-Befehl:
# mv alter-linkname neuer-linkname
Um den Link zu löschen, der normale rm-Befehl:
# rm link

Hardlinks

Um "harte" Verknüpfungen zu verstehen, muß man sich mit der Organisation von Dateien im Dateisystem vertraut machen. Im Dateisystem werden Dateien anhand von Inodes organisiert. Ein Inode enthält alle wichtigen Informationen der Datei wie Rechte, Eigentümer, Zeitstempel, Größe, Typ, usw., sowie Verweise, wo die Nutzdaten sich auf der Platte befinden. Man kann sich die Nummer des zugehörigen Inodes mittels des ls-Befehls mit der Option -i anzeigen lassen, z.B.
# ls
Datei1
Datei2
# ls -i
16390 Datei1
45634 Datei2

Es ist wichtig zu verstehen, daß der Dateiname nicht im Inode abgelegt wird, sondern im Verzeichnis: ein Verzeichnis ist etwas vereinfacht gesagt nur eine spezielle Datei, die eine Tabelle mit Namen und Inode-Nummern enthält. Wenn das System eine Datei sucht, wird es im Verzeichnis nachsehen und die zugehörige Inode-Nummer erhalten.
Da Dateinamen von ihren Dateien entkoppelt sind, kann man einer Datei mit dem Kommando ln (ohne Option -s, denn die ist ja für Softlinks) weitere Namen zuweisen. Solche Mehrfachnamen heißen hard links.
# ls -i
16390 Datei1
# ln Datei1 Datei2
# ls -i
16390 Datei1
16390 Datei2

Da es sich dabei um zwei Verzeichniseinträge für denselben Inode handelt, müssen beide Namen im selben Dateisystem (selbe Partition) liegen, denn nur dort sind Inode-Nummern eindeutig.
Der Vorteil von harten Links liegt in ihrer Löschung. Wenn man bei einem symbolischen Link die Datei löscht, zeigt der Link ins Leere. Wenn ein Hardlink gelöscht wird, wird lediglich einer der Namen gelöscht und nicht die Datei selber. Erst beim letzten Namen wird auch die Datei gelöscht. Um den letzten Namen festzustellen, gibt es einen sogenannten Referenzzähler, welchen der ls-Befehl anzeigt:
# ls -l
-rw-r--r-- 2 udo udo 494 Feb 4 11:25 Datei1
-rw-r--r-- 2 udo udo 494 Feb 4 11:25 Datei2
# rm Datei1
# ls -l

-rw-r--r-- 1 udo udo 494 Feb 4 11:25 Datei2

Damit empfehlen sich hard links immer dann, wenn es kein "Original" geben soll oder wenn die Reihenfolge des Löschens vorab nicht feststeht, z.B. bei News-Artikeln auf einem USENET-Server, die gleichzeitig in verschiedenen Gruppen gespostet werden.

Zugehörige Hardlinks finden

Möchte man wissen, welche Dateien zur selben Inode-Nummer gehören, also Hardlinks sind, hilft der find-Befehl. Ein Beispiel:
# ls -i
16390 Datei1
16390 Datei2

# find /home/udo -inum 16390
/home/udo/Datei1
/home/udo/Datei2