Hårda länkar är filnamn som pekar på en inode. Mjuka länkar är en speciell filtyp som pekar på hårda länkar, eller andra mjuk läknar. En inode i sin tur innehåller metadata om filen, samt information om var den faktiska datan finns lagrad på disken.

CAD Bild: Tom (analogicus)

I Linux och andra Unix-liknande system finns något som heter hårda länkar och mjuka länkar. Kommer man från andra operativsystem kan de hårda länkarna vara nytt och främmande. De mjuka länkarna kan däremot jämföras med exempelvis genvägar i Microsoft Windows.

En hård länk är egentligen bara ett filnamn. Det filnamnet pekar på inode. Det är inoden som innehåller information om själva datan eller filen. Detta är exempelvis information som datum och klockslag när filen skapades, senast öppnades, senast ändrades och så vidare. Det finns också information om filens ägare och rättigheter, samt hur stor filen är och var filens alla data finns på hårddisken.

Hårda länkar

En och samma inode kan ha flera filnamn (hårda länkar). Alla filnamnen är likvärdiga. Det spelar således ingen roll vilken av filnamnen som skapades först. Själva filen på disken försvinner inte förrän alla filnamnen är raderade, även om man raderar det första namnet.

Med hjälp av stat-kommandot kan vi se information om inodes. Här kan vi även se hur många filnamn – hårda länkar – som pekar på samma inode. Nya filnamn skapas med ln-kommandot.

$> echo "Hejsan svejsan alla glada" > fil1.txt
$> stat fil1.txt
  File: fil1.txt
  Size: 26              Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d      Inode: 10224269    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    jake)   Gid: ( 1000/    jake)
Access: 2022-05-05 20:37:19.310362484 +0200
Modify: 2022-05-05 20:37:19.310362484 +0200
Change: 2022-05-05 20:37:19.310362484 +0200
 Birth: 2022-05-05 20:37:19.310362484 +0200

Det intressanta här är storleken på 26 byte, inode-numret och antalet hårda länkar – links – till filen. Just nu har denna inode en enda länk som pekar på den. Vi skapar ytterligare en hård länk med ln-kommandot:

$> ln fil1.txt fil2.txt

Det nya filnamnet, fil2.txt, pekar nu på samma inode. Detta kan vi bekräfta på två sätt. Dels genom att skriva ut innehållet i filen, dels genom att köra stat-kommandot på det nya filnamnet:

$> cat fil2.txt
Hejsan svejsan alla glada
$> stat fil2.txt
  File: fil2.txt
  Size: 26              Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d      Inode: 10224269    Links: 2
Access: (0644/-rw-r--r--)  Uid: ( 1000/    jake)   Gid: ( 1000/    jake)
Access: 2022-05-05 20:37:19.310362484 +0200
Modify: 2022-05-05 20:37:19.310362484 +0200
Change: 2022-05-05 20:41:39.026475291 +0200
 Birth: 2022-05-05 20:37:19.310362484 +0200

Det nya filnamnet pekar på samma inode-nummer som det första. Det visar också samma storlek och klockslag för filen. Lägg också märke till att antalet länkar har ökat till två.

ANNONS FÖR VÅRA EGNA BÖCKER Demonerna på internet

Det båda filerna ser ut som vilka andra filer som helst med ls-kommandot. Det beror på att det är just det – helt vanliga filer. Alla “filer” vi ser i systemet är hårda länkar som pekar på en inode.

$> ls -l
total 8
-rw-r--r-- 2 jake jake 26 maj  5 20:37 fil1.txt
-rw-r--r-- 2 jake jake 26 maj  5 20:37 fil2.txt

Man kan således säga att en fil egentligen består av tre delar: filnamnet som pekar på inoden; inoden som innehåller metadata om filen; filens data eller block på disken.

Om vi nu lägger till en ny textrad till någon av dessa filnamn kommer klockslaget att uppdateras för båda namnen – det är ju trots alla samma fil:

$> echo "En ny rad" >> fil2.txt
$> ls -l
total 8
-rw-r--r-- 2 jake jake 36 maj  5 20:46 fil1.txt
-rw-r--r-- 2 jake jake 36 maj  5 20:46 fil2.txt

Vi kan också prova att radera det första filnamnet. Det nya filnamnet pekar fortfarnade på samma fil. Det enda som ändras är antalet länkar till inoden:

$> rm fil1.txt
$> cat fil2.txt
Hejsan svejsan alla glada
En ny rad
$> stat fil2.txt
  File: fil2.txt
  Size: 36              Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d      Inode: 10224269    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    jake)   Gid: ( 1000/    jake)
Access: 2022-05-05 20:37:19.310362484 +0200
Modify: 2022-05-05 20:46:16.310595509 +0200
Change: 2022-05-05 20:53:23.138649800 +0200
 Birth: 2022-05-05 20:37:19.310362484 +0200

Innan vi går vidare skapar vi två nya filnamn till filen. Vi kontrollerar så att antalet länkar har ökat till tre:

$> ln fil2.txt kalle.txt
$> ln fil2.txt lisa.txt
$> stat fil2.txt
  File: fil2.txt
  Size: 36              Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d      Inode: 10224269    Links: 3
Access: (0644/-rw-r--r--)  Uid: ( 1000/    jake)   Gid: ( 1000/    jake)
Access: 2022-05-05 20:37:19.310362484 +0200
Modify: 2022-05-05 20:46:16.310595509 +0200
Change: 2022-05-05 20:56:06.050684839 +0200
 Birth: 2022-05-05 20:37:19.310362484 +0200

Mjuka länkar

En hård länk är helt enkelt ett filnamn. Det finns inget speciellt med en hård länk. En mjuk länk å andra sidan är en egen filtyp. Mjuka länkar kallas också symboliska länkar. När vi skapar en mjuk (symbolisk) länk blir det även en helt egen fil med en egen inode.

Även mjuka länkar skapas med ln-kommandot, fast vi lägger till flaggan -s för symbolic eller soft:

$> ln -s fil2.txt mjukis.txt
$> ls -l
total 12
-rw-r--r-- 3 jake jake 36 maj  5 20:46 fil2.txt
-rw-r--r-- 3 jake jake 36 maj  5 20:46 kalle.txt
-rw-r--r-- 3 jake jake 36 maj  5 20:46 lisa.txt
lrwxrwxrwx 1 jake jake  8 maj  5 20:59 mjukis.txt -> fil2.txt

Här ser vi att den mjuka länken, mjukis.txt, är en egen filtyp som betecknas med bokstaven l (första tecknet till vänster). Vi ser också att klockslaget och filrättigheterna inte stämmer överns med de hårda länkarna, samt att den mjuka länken pekar på den hårda länken fil2.txt. Den mjuka länken räknas inte heller in i inodens länkantal. Om vi kontrollerar den hårda länken igen med stat-kommandot ser vi att den fortfarande visar tre länkar:

$> stat fil2.txt
  File: fil2.txt
  Size: 36              Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d      Inode: 10224269    Links: 3
Access: (0644/-rw-r--r--)  Uid: ( 1000/    jake)   Gid: ( 1000/    jake)
Access: 2022-05-05 20:37:19.310362484 +0200
Modify: 2022-05-05 20:46:16.310595509 +0200
Change: 2022-05-05 20:56:06.050684839 +0200
 Birth: 2022-05-05 20:37:19.310362484 +0200

Om vi kontrollerar den mjuka länken med stat ser vi att det är helt ny fil med ett nytt inode-nummer. Den visar också bara en enda länk; den har egentligen inget med de hårda länkarna att göra, mer än att den pekar på en av dem. Det kan således jämföras med en genväg i exempelvis Microsoft Windows. Med stat-kommandot ser vi också att det är en speciell filtyp med namnet symbolic link.

$> stat mjukis.txt
  File: mjukis.txt -> fil2.txt
  Size: 8               Blocks: 0          IO Block: 4096   symbolic link
Device: 801h/2049d      Inode: 10224429    Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/    jake)   Gid: ( 1000/    jake)
Access: 2022-05-05 20:59:24.450736175 +0200
Modify: 2022-05-05 20:59:24.450736175 +0200
Change: 2022-05-05 20:59:24.450736175 +0200
 Birth: 2022-05-05 20:59:24.450736175 +0200

En mjuk länk kan också peka på en annan mjuk länk:

$> ln -s mjukis.txt mjukis2.txt
$> ls -l
-rw-r--r-- 3 jake jake 36 maj  5 20:46 fil2.txt
-rw-r--r-- 3 jake jake 36 maj  5 20:46 kalle.txt
-rw-r--r-- 3 jake jake 36 maj  5 20:46 lisa.txt
lrwxrwxrwx 1 jake jake 10 maj  5 21:00 mjukis2.txt -> mjukis.txt
lrwxrwxrwx 1 jake jake  8 maj  5 20:59 mjukis.txt -> fil2.txt

Nu pekar mjukis2.txtmjukis.txt, som i sin tur på pekar på fil2.txt. Det filnamnet pekar i sin stur på inoden som innehåller information om filens innehåll.

$> cat mjukis2.txt
Hejsan svejsan alla glada
En ny rad

Bra att känna till

Mjuka länkar kan peka på filer som finns lagrade på andra enheter eller filsystem. Men hårda länkar kan bara peka på inodes som finns på samma enhet.

$> ln -s /mnt/red/Downloads/testfil.pdf test.pdf
$> ls -l
total 12
-rw-r--r-- 3 jake jake 36 maj  5 20:46 fil2.txt
-rw-r--r-- 3 jake jake 36 maj  5 20:46 kalle.txt
-rw-r--r-- 3 jake jake 36 maj  5 20:46 lisa.txt
lrwxrwxrwx 1 jake jake 10 maj  5 21:00 mjukis2.txt -> mjukis.txt
lrwxrwxrwx 1 jake jake  8 maj  5 20:59 mjukis.txt -> fil2.txt
lrwxrwxrwx 1 jake jake 30 maj  5 21:30 test.pdf -> /mnt/red/Downloads/testfil.pdf

$> ln /mnt/red/Downloads/testfil.pdf test2.pdf
ln: failed to create hard link 'test2.pdf' => '/mnt/red/Downloads/testfil.pdf': Invalid cross-device link

Anledning är logisk. En mjuk länk är bara en länk till en annan fil. Om enheten avmonteras bryts bara länken. Filnamnet och inoden finns fortfarnade kvar på den avmonterade enheten.

Men en hård länk är å andra sidan filnamnet som pekar på en inode. Det är således själva filen i vardagligt tal. Om då enheten avmonteras där inoden finns försvinner filen. Om inget filnamn pekar på inoden går den inte längre att nå. Därför kan vi inte heller separera inoden och de hårda länkarna på olika enheter.


Nyhetsbrev
Nyhetsuppdateringar från tidningen direkt till din inkorg, helt kostnadsfritt. Avsluta när du vill.

Kommentarer

Kommentarsfältet är modererat. Det innebär att alla kommentarer granskas av ansvarig utgivare före publicering.

Du väljer själv om du vill ange ditt riktiga namn, en pseudonym eller vara helt anonym. Ingen registrering behövs.