Wat is een hard link? — definitie van The Linux Information Project (LINFO)

Een hard link is niet meer dan een extra naam voor een bestaand bestand op Linux of andere Unix-achtige besturingssystemen.

Een willekeurig aantal hard links, en dus een willekeurig aantal namen, kan voor een bestand worden aangemaakt. Hard links kunnen ook worden gemaakt naar andere hard links. Ze kunnen echter niet worden gemaakt voor mappen, en ze kunnen niet bestandssysteem grenzen overschrijden of overspannen partities.

Het besturingssysteem maakt geen onderscheid tussen de naam die oorspronkelijk aan een bestand is toegekend toen het voor het eerst werd gemaakt en eventuele hard links die vervolgens naar dat bestand worden gemaakt, behalve dan dat het slechts meerdere namen voor hetzelfde bestand zijn. Dit komt omdat de oorspronkelijke naam en eventuele harde koppelingen allemaal naar dezelfde inode verwijzen. Een inode is een gegevensstructuur (d.w.z. een geoptimaliseerde manier om informatie op te slaan) waarin alle informatie over een bestand wordt opgeslagen (b.v. de grootte, de toegangsrechten, wanneer het is aangemaakt en waar het zich op het systeem bevindt) behalve de naam of namen en de eigenlijke gegevens. Het feit dat inode nummers alleen uniek zijn binnen een bestandssysteem is de reden dat ze niet werken tussen bestandssystemen en partities.

Harde koppelingen worden gemaakt met het ln commando. Het volgende zou bijvoorbeeld een hard-link maken met de naam hlink1 naar een bestand met de naam file1, beide in de huidige directory (d.w.z. de directory waarin de gebruiker momenteel werkt):

ln file1 hlink1

Wanneer een hard-link wordt gemaakt, is er geen duidelijke indicatie dat deze verschilt van een ander bestand. Dat wil zeggen dat hardlinks bestanden lijken te zijn van hetzelfde type als hun doelbestanden (dat wil zeggen, de bestanden waaraan ze zijn gekoppeld) wanneer ze worden bekeken met opdrachten zoals ls (dat wil zeggen, lijst) en file (dat wordt gebruikt om het type van een gespecificeerd bestand te bepalen). Ook wanneer ze in een GUI (grafische gebruikersinterface) worden bekeken, zijn de pictogrammen voor hard links identiek aan die voor hun doelbestanden.

Dat de oorspronkelijke naam van een bestand en alle hard links naar dat bestand allemaal dezelfde inode hebben, kan duidelijk worden gezien door het ls commando te gebruiken met zijn -i (d.w.z., inode) optie. Het volgende zou bijvoorbeeld laten zien dat de inode-nummers van bestand1 en hlink1 uit het bovenstaande voorbeeld identiek zijn:

ls -i file1 hlink1

Het aantal hard links naar een bestand wordt getoond in de tweede kolom van de uitvoer die wordt geproduceerd door ls te gebruiken met de -l (d.w.z., lange) optie. Het is te zien dat het aantal de som is van het doelbestand en alle harde koppelingen daarnaar (d.w.z, de som van de initiële naam en alle later toegevoegde namen) en dat het hetzelfde is voor het doel en voor elke dergelijke link.

Hardgekoppelde bestanden kunnen ook worden gevonden met het commando find met de optie -type f (om alleen gewone bestanden te selecteren) gevolgd door de optie -links +1 (om alle gewone bestanden met meer dan één hardkoppeling weer te geven), en wel als volgt:

find -type f -links +1

Wanneer de inhoud van een bestand wordt gewijzigd, blijft de koppeling met alle hardkoppelingen behouden. Sommige tekstverwerkers kunnen de koppeling echter verbreken door een nieuwe inode te maken voor de gewijzigde inhoud,1 en het kan dus verstandig zijn om belangrijke koppelingen te controleren nadat bestanden zijn gewijzigd.

De opdracht rm lijkt op het eerste gezicht bestanden te verwijderen of te wissen. In werkelijkheid vermindert het echter de hard link count (het aantal namen dat het bestand heeft) met één, en het heeft geen directe invloed op de inode of de gegevens van het bestand. Wanneer de telling nul bereikt, lijkt het bestand te zijn verdwenen omdat er geen eenvoudige manier meer is om er naar te verwijzen. De gegevens van het bestand worden echter pas echt verwijderd wanneer de locatie(s) op de harde schijf (HDD) of een ander opslagmedium waarop het bestand staat, wordt overschreven door een nieuw bestand.

Het volgende zou bijvoorbeeld de vaste koppeling hlink1 die in bovenstaand voorbeeld is gemaakt, verwijderen:

rm hlink1

Wanneer u rm opnieuw gebruikt met de naam die als volgt is overgebleven, zouden de gegevens van het bestand vrijwel ontoegankelijk worden:

rm file1

Misschien wel de meest nuttige toepassing van hard links is om bestanden, programma’s en scripts (d.d.w.z. korte programma’s) gemakkelijk kunnen worden geopend in een andere directory dan het oorspronkelijke bestand of uitvoerbare bestand (d.w.z, de gebruiksklare versie van een programma). Door de naam van de hard-link in te typen wordt het programma of script op dezelfde manier uitgevoerd als met de oorspronkelijke naam.

Symbolische koppelingen, ook wel soft links genoemd, zijn nuttiger dan hard links omdat ze zowel naar directories als naar bestanden op verschillende bestandssystemen en op verschillende partities kunnen worden gemaakt. Bovendien hebben symbolische koppelingen bij gebruik van een GUI speciale pictogrammen die onmiddellijk aangeven dat het om koppelingen gaat en niet om gewone bestanden. Ze hebben echter het nadeel dat ze onbruikbaar worden als hun doelbestand wordt verwijderd.

Aliassen lijken oppervlakkig gezien op hard links in die zin dat ze een andere manier zijn om een bestand van meerdere namen te voorzien. Echter, het alias commando is ingebouwd in de shell (d.w.z., het programma dat de tekst-only gebruikersinterface levert) in plaats van een apart programma te zijn en het mechanisme is heel anders dan dat van hard links. Net als symbolische koppelingen kunnen aliassen niet alleen worden gebruikt voor bestanden maar ook voor mappen en kunnen ze bestandssysteem- en partitiegrenzen overschrijden. Bovendien kan een alias worden gebruikt als een korte naam voor een shell tekst (d.w.z. een commando of een serie gekoppelde commando’s, inclusief tbeir opties en/of argumenten).

________
1Tests op Red Hat Linux 9 toonden aan dat hard links werden verbroken bij het wijzigen van bestanden met behulp van de gedit teksteditor. Ze werden echter niet verbroken bij gebruik van de teksteditors vi en Abiword en de hex-editor KHexEdit op dezelfde versie van Linux. Dat gedit er niet in slaagde de harde koppelingen te behouden, was te wijten aan het feit dat het eigenlijk een kopie maakt van het gewijzigde bestand dat het bewaart (en dus het nieuwe incodenummer) in plaats van de wijzigingen in het originele bestand aan te brengen, maar deze kopie krijgt wel de naam van het originele bestand. Echter, een soortgelijke test met een nieuwere versie van gedit (2.14.0) op Fedora Core 5 liet zien dat het probleem was gecorrigeerd en dat er geen verbreking van koppelingen was.