Tips en Trucs 2018

Harde en zachte koppelingen

Linux bestandssystemen kennen twee soorten koppelingen: harde (hard) en zachte (soft). Ze verschillen sterk van elkaar, maar lossen beiden gelijkaardige problemen op. Beiden zorgen ze voor verschillende bestandsnamen voor een enkel bestand. Koppelingen zijn belangrijk voor Linux bestandssystemen, want ze maken ze krachtig en flexibel. En in Linux is alles een bestand (everything is a file).

Zo gebruiken sommige programma's een bepaalde versie van een bibliotheek (library). Bij het opwaarderen worden oude bibliotheken soms vervangen door recentere versies. Daardoor wordt het programma afgebroken met een foutmelding met een verwijzing naar de oude bibliotheek. Met wat geluk werkt het programma ook met de recentere bibliotheek. Door eenvoudig een koppeling met de naam van de oude bibliotheek te leggen naar de recente bibliotheek werkt het programma terug. Gamers passen deze truck toe om oudere spellen toch op hun recente Linux distributie te kunnen spelen.

dany@pindabook:~> ls -l /lib64/
totaal 8736
-rwxr-xr-x 1 root root  180056 26 okt 14:22 ld-2.26.so
lrwxrwxrwx 1 root root      10 26 okt 14:20 ld-linux-x86-64.so.2 -> ld-2.26.so
lrwxrwxrwx 1 root root      20 26 okt 14:22 ld-lsb-x86-64.so.3 -> ld-linux-x86-64.so.2
lrwxrwxrwx 1 root root      18 12 mei 23:13 libacl.so.1 -> libacl.so.1.1.2253
-rwxr-xr-x 1 root root   35424 12 mei 23:13 libacl.so.1.1.2253
lrwxrwxrwx 1 root root      15 19 feb  2018 libaio.so.1 -> libaio.so.1.0.1
-rwxr-xr-x 1 root root    5608 19 feb  2018 libaio.so.1.0.1
...
lrwxrwxrwx 1 root root      16 12 mei 23:13 libwrap.so.0 -> libwrap.so.0.7.6
-rwxr-xr-x 1 root root   40904 12 mei 23:13 libwrap.so.0.7.6
lrwxrwxrwx 1 root root      14 25 sep 12:14 libz.so.1 -> libz.so.1.2.11
-rwxr-xr-x 1 root root   92216 25 sep 12:14 libz.so.1.2.11
drwxr-xr-x 2 root root    4096 27 mei 19:48 multipath
drwxr-xr-x 2 root root    4096 27 okt 18:44 noelision
drwxr-xr-x 3 root root    4096 17 aug 19:58 security

De gedetailleerde (long) inhoud (listing) van de map /lib64 toont aan de hand van de letter l in de eerste kolom met de bestandskenmerken de zachte koppelingen (soft links). Deze worden ook wel symbolische koppelingen (symbolic links) genoemd.

De praktijk voorbereiden

Om veilig te experimenteren met koppelingen maken we in de Persoonlijke map een tijdelijke oefenmap aan:

dany@pindabook:~> mkdir Tijdelijk

Open de tijdelijke oefenmap:

dany@pindabook:~> cd Tijdelijk/

Om koppelingen naar een bestand te kunnen leggen maken we in de tijdelijke map een bestand met inhoud aan:

dany@pindabook:~/Tijdelijk> du -h > hoofd.bestand.txt

We controleren de aanmaak van het bestand met het opvragen van de gedetailleerde inhoud van de map:

dany@pindabook:~/Tijdelijk> ls -l
totaal 4
-rw-r--r-- 1 dany users 7  2 nov 19:37 hoofd.bestand.txt

Let op de grootte van het bestand (in het voorbeeld 7 bytes). In de tweede kolom vinden we het aantal harde koppelingen, voorlopig 1 want er zijn nog geen extra koppelingen naar het bestand aangemaakt.

Harde koppelingen

Harde koppelingen (hard links) zijn items in een map die dezelfde ruimte als een ander bestand gebruiken, m.a.w. naar dezelfde inhoud verwijzen. Om een harde koppeling naar het bestand hoofd.bestand.txt aan te maken, gebruik je de opdracht:

dany@pindabook:~/Tijdelijk> ln hoofd.bestand.txt koppeling1.bestand.txt
dany@pindabook:~/Tijdelijk> ls -l
totaal 8
-rw-r--r-- 2 dany users 7  2 nov 19:37 hoofd.bestand.txt
-rw-r--r-- 2 dany users 7  2 nov 19:37 koppeling1.bestand.txt

Elk bestand heeft 2 koppelingen en zijn identiek hetzelfde. In feite is het één bestand met twee bestandsnamen. Om nog een koppeling aan te maken, kan je als basis zowel hoofd.bestand.txt als koppeling1.bestand.txt gebruiken:

dany@pindabook:~/Tijdelijk> ln koppeling1.bestand.txt koppeling2.bestand.txt 
dany@pindabook:~/Tijdelijk> ls -l
totaal 12
-rw-r--r-- 3 dany users 7  2 nov 19:37 hoofd.bestand.txt
-rw-r--r-- 3 dany users 7  2 nov 19:37 koppeling1.bestand.txt
-rw-r--r-- 3 dany users 7  2 nov 19:37 koppeling2.bestand.txt

Twee dezelfde bestandsnamen in één map kan echter niet:

dany@pindabook:~/Tijdelijk> ln hoofd.bestand.txt koppeling2.bestand.txt 
ln: kan geen harde koppeling 'koppeling2.bestand.txt' aanmaken: Bestand bestaat al

Tot nu toe werkten we in één map, maar een koppeling mag ook in een andere map staan, bijvoorbeeld in de Persoonlijke map:

dany@pindabook:~/Tijdelijk> ln hoofd.bestand.txt ../hoofd.bestand.txt
dany@pindabook:~/Tijdelijk> ls -l ../hoofd*
-rw-r--r-- 4 dany users 7  2 nov 19:37 ../hoofd.bestand.txt

Zolang de originele naam nog niet in deze map voorkomt, mag je deze gebruiken. De koppelingen wijzen dus allemaal naar hetzelfde bestand. Al deze koppelingen zijn in feite één bestand met verschillende bestandsnamen, ook als deze in een andere map staan. Om het verschil met een klassiek bestand nog duidelijker te demonstreren, maken we een klassiek bestand aan:

dany@pindabook:~/Tijdelijk> touch geen.koppeling.bestand
dany@pindabook:~/Tijdelijk> ls -l
totaal 12
-rw-r--r-- 1 dany users 0  3 nov 17:55 geen.koppeling.bestand
-rw-r--r-- 4 dany users 7  2 nov 19:37 hoofd.bestand.txt
-rw-r--r-- 4 dany users 7  2 nov 19:37 koppeling1.bestand.txt
-rw-r--r-- 4 dany users 7  2 nov 19:37 koppeling2.bestand.txt

Als we de plaats op de schijf opvragen (inode number) met de -i optie, zien we nog beter het verschil:

dany@pindabook:~/Tijdelijk> ls -li
totaal 12
3677359 -rw-r--r-- 1 dany users 0  3 nov 17:55 geen.koppeling.bestand
3689956 -rw-r--r-- 4 dany users 7  2 nov 19:37 hoofd.bestand.txt
3689956 -rw-r--r-- 4 dany users 7  2 nov 19:37 koppeling1.bestand.txt
3689956 -rw-r--r-- 4 dany users 7  2 nov 19:37 koppeling2.bestand.txt

Het getal 3689956 is de positie op de schijf (inode number) en is voor de koppelingen identiek. M.a.w. je kunt het bestand op positie 3689956 op de schijf via 4 harde koppelingen benaderen. Het klassieke bestand heeft een andere positie en is dus een ander bestand. De posities op uw systeem zullen vanzelfsprekend afwijken van het voorbeeld.

Laten we gegevens aan een harde koppeling toevoegen:

dany@pindabook:~/Tijdelijk> df -h >> koppeling2.bestand.txt
dany@pindabook:~/Tijdelijk> ls -li
totaal 12
3677359 -rw-r--r-- 1 dany users   0  3 nov 17:55 geen.koppeling.bestand
3689956 -rw-r--r-- 4 dany users 500  3 nov 18:05 hoofd.bestand.txt
3689956 -rw-r--r-- 4 dany users 500  3 nov 18:05 koppeling1.bestand.txt
3689956 -rw-r--r-- 4 dany users 500  3 nov 18:05 koppeling2.bestand.txt

Alle harde koppelingen zijn groter geworden, wat duidelijk bewijst dat de harde koppelingen in feite één bestand zijn.

Harde koppelingen gebruiken steeds eenzelfde positie op de schijf, of beter partitie of volume. Dit heeft als gevolg dat je enkel harde koppelingen kunt aanmaken naar bestanden die op dezelfde partitie staan. Zo staat de map Documenten bij mij op een afzonderlijke partitie, wat eenvoudiger is om reservekopieën te maken. Hetzelfde geldt voor het maken van harde koppelingen naar bestanden op een USB-stick en vice versa.

dany@pindabook:~/Tijdelijk> ln hoofd.bestand.txt ~/Documenten/koppeling3.bestand.txt
ln: kan geen harde koppeling '/home/dany/Documenten/koppeling3.bestand.txt' naar 'hoofd.bestand.txt' aanmaken: Ongeldige koppeling tussen apparaten

Om alle harde koppelingen op te sporen die op een bekende positie staan, gebruik je de find opdracht:

dany@pindabook:~/Tijdelijk> find . -inum 3689956
./koppeling1.bestand.txt
./koppeling2.bestand.txt
./hoofd.bestand.txt

De find opdracht vond niet alle harde koppelingen, omdat enkel de huidige map werd doorzocht. Met de volgende opdracht zoeken we alle harde koppelingen, vanuit de Persoonlijke map (~):

dany@pindabook:~/Tijdelijk> find ~ -samefile hoofd.bestand.txt 
/home/dany/Tijdelijk/koppeling1.bestand.txt
/home/dany/Tijdelijk/koppeling2.bestand.txt
/home/dany/Tijdelijk/hoofd.bestand.txt
/home/dany/hoofd.bestand.txt

Zachte koppelingen

Zachte koppelingen (snelkoppelingen of symbolische koppelingen) kunnen wel naar bestanden op andere partities (of volumes) verwijzen. Je kunt ze dus inzetten op de plaats waar je geen harde koppelingen kunt gebruiken. Laten we een zachte koppeling in onze tijdelijke map aanmaken:

dany@pindabook:~/Tijdelijk> ln -s koppeling2.bestand.txt koppeling3.bestand.txt 
dany@pindabook:~/Tijdelijk> ls -li
totaal 12
3677359 -rw-r--r-- 1 dany users   0  3 nov 17:55 geen.koppeling.bestand
3689956 -rw-r--r-- 4 dany users 500  3 nov 18:05 hoofd.bestand.txt
3689956 -rw-r--r-- 4 dany users 500  3 nov 18:05 koppeling1.bestand.txt
3689956 -rw-r--r-- 4 dany users 500  3 nov 18:05 koppeling2.bestand.txt
3689952 lrwxrwxrwx 1 dany users  22  3 nov 18:31 koppeling3.bestand.txt -> koppeling2.bestand.txt

De positie op de schijf van een zachte koppeling verschilt van het originele bestand. De zachte koppeling herken je aan de l als eerste teken in de tweede kolom. Bekijk je de inhoud van de zachte koppeling en het originele bestand, dan merk je dat deze dezelfde inhoud bevatten. De grootte van de zachte koppeling bedraagt 22 bytes, exact de lengte van de bestandsnaam van het originele bestand (koppeling2.bestand.txt). Een zachte koppeling verwijst dus niet naar een positie op de schijf, maar naar een ander bestand. En dit werkt ook als het bestand of de zachte koppeling op een andere partitie, volume of apparaat staat:

dany@pindabook:~/Tijdelijk> ln -s hoofd.bestand.txt ~/Documenten/koppeling3.bestand.txt
dany@pindabook:~/Tijdelijk> ls -l ~/Documenten/koppeling*
lrwxrwxrwx 1 dany users 17  3 nov 18:41 /home/dany/Documenten/koppeling3.bestand.txt -> hoofd.bestand.txt

Koppelingen verwijderen

We beginnen met het verwijderen van de harde koppeling hoofd.bestand.txt. Elke bestandnaam die naar een positie op de schijf verwijst is namelijk een harde koppeling.

dany@pindabook:~/Tijdelijk> rm hoofd.bestand.txt
dany@pindabook:~/Tijdelijk> ls -li
totaal 8
3677359 -rw-r--r-- 1 dany users   0  3 nov 17:55 geen.koppeling.bestand
3689956 -rw-r--r-- 3 dany users 500  3 nov 18:05 koppeling1.bestand.txt
3689956 -rw-r--r-- 3 dany users 500  3 nov 18:05 koppeling2.bestand.txt
3689952 lrwxrwxrwx 1 dany users  22  3 nov 18:31 koppeling3.bestand.txt -> koppeling2.bestand.txt

Deze harde koppeling werd aangemaakt tijdens de aanmaak van het bestand. Door deze te verwijderen blijft het originele bestand echter bestaan, dankzij de overblijvende harde koppelingen. Om het bestand effectief te verwijderen, moet je dus alle harde koppelingen verwijderen.

We verwijderen koppeling2.bestand.txt:

dany@pindabook:~/Tijdelijk> rm koppeling2.bestand.txt
dany@pindabook:~/Tijdelijk> ls -li
totaal 4
3677359 -rw-r--r-- 1 dany users   0  3 nov 17:55 geen.koppeling.bestand
3689956 -rw-r--r-- 2 dany users 500  3 nov 18:05 koppeling1.bestand.txt
3689952 lrwxrwxrwx 1 dany users  22  3 nov 18:31 koppeling3.bestand.txt -> koppeling2.bestand.txt

Merk op dat het verwijderen van deze harde koppeling ervoor zorgt dat de zachte koppeling naar een onbestaand bestand verwijst (gebroken koppeling).

dany@pindabook:~/Tijdelijk> cat koppeling3.bestand.txt 
cat: koppeling3.bestand.txt: Bestand of map bestaat niet

Zachte koppelingen die verwijzen naar niet meer aanwezige bestanden, verwijder je best ook. Om een koppeling te verwijderen, kan je ook gebruik maken van de unlink opdracht, deze opdracht heeft geen opties en verwijdert eveneens de koppeling. De unlink opdracht weerspiegelt beter wat er zich juist afspeelt.

dany@pindabook:~/Tijdelijk> unlink koppeling3.bestand.txt 
dany@pindabook:~/Tijdelijk> ls -li
totaal 4
3677359 -rw-r--r-- 1 dany users   0  3 nov 17:55 geen.koppeling.bestand
3689956 -rw-r--r-- 2 dany users 500  3 nov 18:05 koppeling1.bestand.txt

Harde of zachte koppelingen

Door harde en zachte koppelingen in de praktijk te gebruiken, leer je hun mogelijkheden en beperkingen kennen.

Koppelingen