Symbolische links en hard links

Op deze pagina:

Er zijn 2 soorten links, harde links (hard links) en zachte links (soft links). Zachte links worden ook wel symbolische links (symbolic links) of symlinks genoemd. Een harde link verwijst rechtstreeks naar een plek in het bestandsysteem, de inode. Een zachte link is een verwijzing (snelkoppeling) naar een bestand of directory. Zachte links worden meer gebruikt als harde links, bij het gebruik van ln om links te maken zijn harde links echter de default, je moet de optie -s (van soft) gebruiken om een zachte link te maken.

Zachte links lijken op de snelkoppelingen die je in Windows ook tegenkomt, ze verwijzen naar een bestand of map. Als dit bestand of deze map wordt verwijderd of van naam veranderd wordt, dan hou je een zachte link over die nergens meer naar verwijst en dus ongeldig is.

Een harde link (hard link) verwijst naar een inode en is daarmee een andere naam voor het bestand. Als het oorspronkelijke bestand wordt verwijderd, wordt in feite alleen één naam van het bestand verwijderd, het bestand of de map bestaat dan nog steeds, maar nu alleen met de naam of namen van de nog overgebleven harde link(s), totdat de laatste harde link die verwijst naar die inode ook wordt verwijderd. Je kunt niet zonder meer een harde link naar een map aanmaken, je moet daarvoor root zijn en de -d optie gebruiken.

In het kort:

hard link = harde link : extra naam voor een bestand

soft link = symbolic link = symlink = symbolische link = zachte link : verwijzing naar een bestand of map

Een reden om symlinks te gebruiken

Als een applicatie bestanden in een bepaalde map verwacht, kun je, in plaats van die bestanden naar die map te kopiëren, links naar die bestanden plaatsen in die map, dat bespaard dan schijfruimte.

Gebroken symlinks opsporen en repareren met symlinks

Als het bestand waar een symlink naar verwijst wordt verwijderd, verplaatst of hernoemd, dan heb je symlink die niet meer naar een geldig bestand verwijst, een gebroken symlink. Om gebroken symlinks op te sporen kun je symlinks gebruiken. Als dit programma nog niet op je systeem staat, dan moet je het eerst installeren:


# Debian, Ubuntu en Linux Mint:
sudo apt install symlinks

De opties voor de symlinks applicatie:

  • -c = convert. Zet absolute links om naar relatieve links en past 'vuile' links aan door overbodige slashes en punten te verwijderen. Als ook de -s optie wordt gebruikt, dan zullen lange links worden ingekort. In de uitvoer zullen aangepaste links worden aangegeven met 'changed'.
  • -d = dangling links verwijderen. dangling links zijn links die nergens meer heen verwijzen, bijvoorbeeld omdat het doelbestand is verwijderd.
  • -o = other filessystems. Hiermee worden ook links gerepareerd op andere bestandssystemen bij recursief werken.
  • -r = recursively. Recursief werken in de subdirectories van hetzelfde bestandssysteem.
  • -s = signal lengthy links. Detecteerd lange links.
  • -t = test. Geeft aan wat er zou gebeuren als je de -c optie gebruikt zonder daadwerkelijk iets te veranderen (droogzwemmen).
  • -v = verbose. Toon alle links, ook relatieve links die anders niet getoond worden.

In de uitvoer van symlinks wordt bij elke link aangegeven om wat voor soort link het gaat:

  • relative : links met een pad dat relatief is aan de map waarin de link staat.
  • absolute : links met een absoluut pad (beginnend met een slash: /).
  • dangling : links die verwijzen naar een bestand dat er niet meer is, een verweesde link dus.
  • messy : links met onnodige slashes of punten in het pad.
  • lengthy : links zijn links die te lang zijn door te veel "../" in hun pad.
  • other_fs : links die naar een bestand op een ander bestandssysteem verwijzen.

Het gebruik van symlinks:


# symlinks opsporen (verander 'mapnaam' in de map die je wilt doorzoeken):
symlinks -v mapnaam

# symlinks recursief opsporen, dus ook in de onderliggende mappen:
symlinks -rv mapnaam

# symlinks repareren:
symlinks -cds mapnaam

# eerst testen wat de -c optie zou doen:
symlinks -t mapnaam

Een zachte link maken

ln -s maakt een zachte link naar een bestand of map.


ln -s doel_van_de_zachte_link naam_voor_de_zachte_link

doel_van_de_zachte_link = waar de link naar toe moet verwijzen, deze moet al bestaan.

naam_voor_de_zachte_link = de zachte link die met deze opdracht zal worden aangemaakt.

Een harde link aanmaken

ln maakt een harde link naar een bestand of map.


ln doel_van_de_harde_link naam_voor_de_harde_link

Een zachte link maken naar een map op een andere locatie

In dit voorbeeld bestaat de map /var/www/html en gaat deze verwijzen naar /home/kees/www.

Eerst het origineel hernoemen van html naar html2 zodat het origineel (met de eventuele inhoud) ook bewaard blijft:


# Naar de www map gaan
cd /var/www

# De map html hernoemen naar html2
sudo mv html html2

# De zachte link aanmaken
sudo ln -s /home/kees/www html

Zachte links opvragen

De directory-entries van zachte (symbolische) links beginnen met een 'l' (dat is de letter l van Link), dus je kan het volgende gebruiken:


ls -lrt | grep '^l'

Je krijgt dan een lijst met uitsluitend zachte (symbolische) links, bijvoorbeeld:


lrwxrwxrwx 1 root root   16 okt 24  2018 html -> /home/kees/www

De link 'html' verwijst hier naar de map '/home/kees/www'.

Een andere mogelijkheid om zachte (symbolische) links op te sporen is de find opdracht:


find . -type l -ls

# resultaat (gestart vanuit de '~/www' map):
9306121     0 lrwxrwxrwx   1 kees  kees      22 okt  8  2019 ./www-test -> /home/kees/www-test/

De punt geeft aan dat vanuit de huidige map gezocht moet worden. Er wordt nu naar zachte links gezocht in de huidige map en alle onderliggende mappen. De uitvoer geeft uitgebreide informatie over de zachte links.

Als je alleen de zachte links wil zien met waar deze heen verwijzen zonder andere informatie, dan kun je dit gebruiken:


find . -type l -printf '%p -> %l\n'

# resultaat (gestart vanuit de '~/www' map):
./www-test -> /home/kees/www-test/

Voorbeeld van het aanmaken van zowel een zachte als een harde link

In dit voorbeeld wordt een harde link aangemaakt met als naam 'andere-naam-voor-mijntekst.txt' en er wordt een zachte link aangemaakt met als naam 'verwijzing-naar-mijntekst.txt'.


# Een tekstbestand aanmaken
touch mijntekst.txt
# Een map aanmaken
mkdir nieuw
# Naar de nieuw aangemaakte map gaan
cd nieuw
# Harde link maken
ln ../mijntekst.txt andere-naam-voor-mijntekst.txt
# Zachte link malen
ln -s ../mijntekst.txt verwijzing-naar-mijntekst.txt
# Inhoud opvragen
ls -l

# Resultaat:
totaal 0
-rw-rw-r-- 2 kees kees  0 jun 19 14:57 andere-naam-voor-mijntekst.txt
lrwxrwxrwx 1 kees kees 16 jun 19 15:02 verwijzing-naar-mijntekst.txt -> ../mijntekst.txt

De harde link (andere-naam-voor-mijntekst.txt) heeft 0 als grootte en een 2 als linkteller.

De zachte link (verwijzing-naar-mijntekst.txt) heeft een verwijzing naar het originele bestand staan (-> ../mijntekst.txt) waar deze naar verwijst.

 

Verwante artikelen