Hårda och mjuka länkar i Linux
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.
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å.
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.txt
på mjukis.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.
Relaterade artiklar
-
Avlyssna trafik på servern med Wireshark och TShark
Wireshark är ett ovärderligt verktyg för att felsöka nätverkskonfigurationer, applikationer, API:er, demoner och mycket annat. I kombination med
tshark
kan vi dessutom avlyssna trafiken på en server i realtid. -
Var försiktig med att curl:a skript som root
Att installera program i Linux genom att omdirigera utdata från Curl till skalet är snabbt och smidigt. Men det är ack så farligt om du inte känner till programmet eller dess ursprung.
-
Vidarebefordran av SSH-agenten
SSH agent forwarding, eller vidarebefordran av SSH-agenten, innebär att man kan vidarebefordra SSH-agenten till ett fjärrsystem. På så sätt behöver man inte kopiera sin privata SSH-nyckel till fjärrsystemet, eller skapa flera nycklar för olika system. Men det finns risker med det.
-
Jenkins som ett alternativ till Ansible Tower
Ansible Tower kommer med en stor prislapp, speciellt för ett mindre företag eller en privatperson. AWX å andra sidan är helt fritt, men kräver numera Kubernetes. För den som vill automatisera sina Ansible Playbooks går det dock bra att använda Jenkins som en ersättning för Tower och AWX.
-
Hämta data från API:er med cURL och jq
Med cURL och jq går det att extrahera data från API:er direkt från kommandoraden. Jq är en JSON-tolkare och beskrivs av utvecklarna som sed och awk för JSON.
Senaste nyheterna och inläggen
-
Avlyssna trafik på servern med Wireshark och TShark
Wireshark är ett ovärderligt verktyg för att felsöka nätverkskonfigurationer, applikationer, API:er, demoner och mycket annat. I kombination med
tshark
kan vi dessutom avlyssna trafiken på en server i realtid. -
Mysig stämning på sommarens första demoparty
I helgen var det Reunion 2024 i Kvidinge Folkets hus, sommarens första skånska demoparty. Partyt organiserades av Jesper “Skuggan” Klingvall. På plats fanns ett 30-tal besökare.
-
Sommarens skånska demopartyn
Årets sommar bjuder på två skånska demopartyn. Först ut är Reunion i Kvidinge den 28–30 juni. Därefter är det Pågadata i Örtofta den 9–11 augusti.
-
Riskerna med BankID som ingen pratar om
BankID är ett säkert och smidigt sätt att identifiera sig online. Men i takt med dess ökade popularitet och användning har det blivit en svag länk – en single point of failure – på mer än ett sätt.
-
Polisernas fängelsedomar står fast
Efter tre år är målet mot de två poliser som olovligen tog sig in i en berusad mans bostad i Landskrona och misshandlade honom klart. Högsta domstolen beslutade den sjätte mars att avvisa överklagan. Fängelsedomarna för poliserna står därmed fast.
Utvalda artiklar
-
Mysig stämning på sommarens första demoparty
I helgen var det Reunion 2024 i Kvidinge Folkets hus, sommarens första skånska demoparty. Partyt organiserades av Jesper “Skuggan” Klingvall. På plats fanns ett 30-tal besökare.
-
Datorparty i Landskrona
I helgen höll Syntax Society sitt årliga sommarparty. Platsen var en källarlokal i Landskrona där ett femtontal personer medverkade.
-
Det första Pågadata har ägt rum
I helgen ägde det första Pågadata rum – uppföljaren till Gubbdata. Platsen var Folkets Hus i Kvidinge. Organisatör av partyt var Johan “z-nexx” Osvaldsson med hjälp från Jesper “Skuggan” Klingvall. Partyt hade över 100 anmälda deltagare.
-
Även hovrätten fäller poliserna för att ha satt dit oskyldig
Hovrätten fastställer straffet för de två poliser som förra året dömdes till vardera ett års fängelse av Lunds tingsrätt för att ha misshandlat och satt dit en oskyldig man. De båda poliserna ska även betala skadestånd till mannen.
-
Retroloppis i Påarp
Idag var det retroloppis hos Andreas Nilsson i Påarp. På baksidan av huset fanns hundratals spel uppradade på långa bord. Trots friska vindar och sval temperatur var loppisen välbesökt.
CyberInfo Sverige är ett it- och medieföretag i nordvästra Skåne som tillhandahåller böcker, utbildningar, nyheter och konsulttjänster inom Linux, säkerhet och programmering.
CyberInfo Sverige är godkänd för F-skatt, är momsregistrerat och innehar
utgivningsbevis för webbplatsen www.cyberinfo.se.