Één detail dat we tot nu toe verborgen hebben gehouden, is dat de Linux kernel bijna alles als een bestand in aanmerking neemt. Tevens directory's en devices: het zijn slechts speciale soorten bestanden.
Zoals je je misschien kunt herinneren, wordt door het eerste teken van een ls -l het type bestand weergegeven. Voor een gewoon bestand, zal dit gewoon een - zijn. Andere mogelijkheden zijn:
d (directory)
l (symbolische link)
b (block device)
c (character device)
p (named pipe)
s (socket)
Symbolische links (worden ook wel symlinks of soft links genoemd) zijn de andere soort links naast hardlinks. Een symlink is een speciaal bestand dat "verwijst naar" een hardlink op ieder gemount bestandssysteem. Wanneer je de inhoud van een symlink probeert te lezen, geeft het de inhoud van het bestand waarnaar het verwijst in plaats van de inhoud van de symlink zelf. Aangezien directory's, devices en andere symlinks typen bestanden zijn, kun je niet met een symlink hiernaar verwijzen.
Dus een hardlink bestaat uit een bestandsnaam en een inode-nummer. Een bestand is eigenlijk een inode: een lokatie op de disk, type bestand, permissie mode, enz. Een symlink is een inode dat de naam van een hard link bevat. Door een symlink vormt een bestandsnaam met een andere bestandsnaam een koppel, terwijl door een hardlink een bestandsnaam met een inode-nummer wordt gekoppeld.
Alle hardlinks naar hetzelfde bestand hebben gelijke status. Dat wil zeggen dat de ene net zo goed is als de ander; als je een bewerking op de ene uitvoert is dat hetzelfde als wanneer je die bewerking op één van de anderen uitvoert. Dit komt doordat hardlinks allen naar dezelfde inode verwijzen. Bewerkingen op symlinks, aan de andere kant, hebben soms effect op de inode van de symlink (die met de naam van een hardlink) en soms effect op de hardlink waarnaar verwezen wordt.
Er zijn een aantal belangrijke verschillen tussen symlinks en hardlinks:
Symlinks kunnen bestandssystemen doorkruisen. Dit komt omdat de volledige bestandsnaam, te beginnen bij de root-directory, er in staat, en alle volledige bestandsnamen zijn uniek. Aangezien hardlinks naar inode-nummers verwijzen, en inode-nummers alleen binnen een enkel bestandssysteem uniek zijn, zouden ze dubbelzinnig zijn als het bestandssysteem niet bekend was.
Je kunt wel symlinks, maar geen hardlinks naar directory's aanmaken. Iedere directory heeft hardlinks --- de weergave ervan in de ouderdirectory, zijn . entry, en de .. entry in ieder van zijn subdirectory's --- maar om het bestandssysteem orde op te leggen, zijn er geen andere hardlinks naar directory's toegestaan. Het gevolg daarvan is dat het aantal bestanden in een directory gelijk is aan het aantal hard links naar die directory minus twee (je trekt de naam van de directory en de link . ervan af).
Je kunt alleen een hardlink maken naar een bestaand bestand, omdat er een inode-nummer moet zijn waarnaar het verwijst. Je kunt echter wel een symlink naar ieder bestand aanmaken, ongeacht of een dergelijke bestandsnaam in werkelijkheid bestaat.
Het verwijderen van een symlink verwijdert slechts de link. Het heeft geen effect op het bestand waarnaar werd gelinkt. Het verwijderen van de enige hardlink naar een bestand verwijdert het bestand.
Probeer:
cd naar je home-directory. ln met de -s optie maakt een symbolische link; in dit geval één genaamd MyTmp welke naar de bestandsnaam /tmp/me verwijst.
De uitvoer zou er ongeveer zo uit moeten zien:
lrwxrwxrwx 1 havoc havoc 7 Dec 6 12:50 MyTmp -> /tmp/me |
Je zal de foutmelding "No such file or directory" krijgen, omdat het bestand /tmp/me niet bestaat. Merk op dat je er toch een symlink naar aan zou kunnen maken.
Maak de directory /tmp/me aan.
Zou nu moeten werken.
Maak een bestand aan in MyTmp.
Het bestand werd eigenlijk aangemaakt in /tmp/me.
Verwijder de symbolische link. Merk op dat hiermee de link wordt verwijderd, niet datgene waarnaar het verwijst. Dus je gebruikt rm niet rmdir.
Ruim achter je op.