Ik Van Linux

Snelkoppelingen


Linux kent natuurlijk ook snelkoppelingen. Ze worden alleen anders genoemdd. Een snelkoppeling heet in Linux en link. Sterker nog, Linux kent twee soorten snelkoppelingen, een harde link en een symbolische link.
Voor de demonstratie van snelkoppelingen, die ik vanaf nu links ga noemen, maak ik een bestand met de naam rund aan in een verder lege directory. Alle links komen in die directory te staan omdat ik dan met slechts één ls commando kan laten zien wat er gebeurt wanneer een link wordt aangemaakt. Maar natuurlijk mag je links ook in andere directories plaatsen.

mkdir beesten
cd beesten
echo "Runderen zijn beesten." > rund

Symbolische link

Laat ik met de symbolische link (Engels: Symbolic link) beginnen, want die wordt het vaakste gebruikt. Een Symbolische link geeft een naam aan een verwijzing naar het originele bestand, net zoals je dat wellicht gewend bent van Windows.

ln -s rund koe

Links maak je met het ln commando. De -s optie geeft aan dat we een Symbolische link willen maken. Dan komt de naam van het bestand waar we een link van willen maken, gevolgd door de naam van die nieuwe link.

ls
koe rund

Er staan nu twee bestanden in de directory. Soms zie je dat die twee bestanden verschillend van kleur zijn, maar dat is afhankelijk van je terminal instellingen.

cat koe
Runderen zijn beesten.

Zie je, de inhoud van koe is nu gelijk aan die van het bestand rund.

ls -l
lrwxrwxrwx 1 san san  4 Jun 14 07:25 koe -> rund
-rw-r--r-- 1 san san 23 Jun 14 07:25 rund

Het wordt pas leuk wanneer je de lange versie van de inhoud van de directory opvraagt. De informatie van het bestand rund is zoals we dat al gewend zijn. Maar wat staat er allemaal bij het bestand koe?
Allereerst zie je bij de permissies lrwxrwxrwx staan. De eerste l geeft aan dat het een link is, en dus geen echt bestand. Voor de rest mag je alles met die link, iedereen mag het lezen, schrijven en uitvoeren. Maar dat is natuurlijk niet echt het geval, want het bestand waarnaar toe verwezen wordt mag door iedereen gelezen worden, maar mag alleen door de eigenaar geschreven worden. Je kunt de permissies van een symbolische link niet eens veranderen.
Verder zien we dat het bestand koe slechts 4 bytes lang is, terwijl het originele bestand 23 bytes lang is. Het bestand koe bevat dus eigenlijk nauwelijks informatie. De echte informatie staat namelijk in het bestand waar naar toe verwezen wordt.
En helemaal rechts staat dat het bestand koe verwijst naar het bestand rund.

Wat gebeurt er wanneer we het originele bestand wissen, of hernoemen. Laten we het hernoemen.

mv rund schaap
cat koe
cat: koe: No such file or directory

Aj, het bestand koe bestaat niet zegt hij. Als je in de directory kijkt zie je dat de link koe nog wel bestaat, maar het bestand rund, waar de link naar toe verwijst bestaat niet meer.
Dit is in ons geval simpel te herstellen door het originele bestand terug te zetten door het weer de originele naam te geven.

mv schaap rund
cat koe
Runderen zijn beesten.

Ook directories kun je linken. Sterker nog, directories kunnen uitsluiten via een symbolische link gelinkt worden. Je kunt dus geen hard link maken van een directory.
Door een link te maken van een directory maak je een nieuwe naaam aan van die directory. De directory met die nieuwe naam bevat ook dezelfde bestanden als de originele directory natuurlijk. Ook als je een nieuw bestand in een van de twee directories plaatst zal dat bestand in beide directories voor komen.

Je kunt zo veel links naar hetzelfde bestand maken als je wilt. Maar als je dat originele bestand weggooit zijn alle links ook meteen waardeloos geworden.
Je kunt ook links maken naar een andere link. Zolang zo'n link uiteindelijk maar een keer bij een echt bestand of directory aan komt is alles prima.

Harde link

In Windows kennen we geen harde links. Harde links zijn ook alleen maar mogelijk op Linux partities. Op een USB staaf, die geformatteerd is op FAT32 kun je dus geen harde links maken.
Een andere restrictie voor harde links is dat zo’n link alleen op dezelfde partitie kan worden geplaatst als het originele bestand.

ln rund stier
ls -l
lrwxrwxrwx 1 san san  4 Jun 17 10:51 koe -> rund
-rw-r--r-- 2 san san 23 Jun 17 10:50 rund
-rw-r--r-- 2 san san 23 Jun 17 10:50 stier

Merk op dat het maken van een harde link bijna hetzelfde is als het maken van een symbolic link, met als verschil dat voor een harde link de -s parameter niet wordt meegegeven.

Wat zien we hier bij het bestand stier? Allereerst zie je dat de rechten exact gelijk zijn aan die van het originele bestand. Ook het aantal bytes is gelijk.
Laten we de rechten van stier eens aanpassen:

chmod o-r stier
ls -l
lrwxrwxrwx 1 san san  4 Jun 17 10:51 koe -> rund
-rw-r----- 2 san san 23 Jun 17 10:50 rund
-rw-r----- 2 san san 23 Jun 17 10:50 stier

Vreemd, we veranderen de rechten van stier, maar ook die van rund zijn mee veranderd. Dat komt omdat het twee keer precies hetzelfde bestand betreft.
Als je de eigenaar of groep zou wijzigen van een van deze twee bestanden, zou dat ook voor het andere bestand gewijzigd worden. Het is belangrijk om te onthouden dat het eigenlijk maar een bestand is, met twee verschillende namen. Dus zijn ook alle eigenschappen gelijk, behalve de bestandsnaam dus.
Bedenk dus ook dat de data van beide bestanden slechts een keer op de schijf staat. Het is dus niet hetzelfde als een backup!

We zien nog een ding in de directory listing wat anders is dan anders. Let maar eens op de 2 die direct na het rechten veld staat. Voorheen stond daar een 1. De 2 geeft hier aan dat dit bestand voorzien is van 2 namen. Zou je nog een hard link maken naar een van deze twee bestanden dan wordt die 2 veranderd in een 3. Een leuke oefening om zelf te doen.

Wanneer je een van de twee bestanden wijzigt, zullen beide bestanden dezelfde inhoud krijgen. Een valkuil is er wel. Wanneer je een derde bestand hernoemt naar de naam van een van de twee gelinkte bestanden dan wordt de koppeling verbroken. Het bestand met de nieuwe naam heeft dan de inhoud gekregen van het hernoemde bestand.

touch os
mv os stier
ls -l
lrwxrwxrwx 1 san san 4 Jun 17 10:51 koe -> rund
-rw-r----- 1 san san 23 Jun 17 10:50 rund
-rw-r--r-- 1 san san 0 Jun 17 11:05 stier

Een leuk weetje

Linux partities gaan anders om met bestanden dan Windows computers. Je kunt in Linux een bestand wat iemand nog aan het lezen is gewoon wissen bijvoorbeeld.
Een bestand op een Linux partitie wordt pas gewist wanneer er geen bestandsnamen meer aan gekoppeld zijn en niemand het bestand meer gebruikt. Op die manier kan Linux ook het systeem updaten terwijl het nog draait. Bestanden zijn dan aangepast, maar lopende programma’s gebruiken nog gewoon de oude versie totdat er uitgelogd of herstart wordt bijvoorbeeld.