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.
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.
Relaterade artiklar
-
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.
-
Det nya Docker Compose
Sedan i mitten av förra året har det gamla Python-baserade
docker-compose
-kommandot sakta ersatts av det nyare Go-baseradedocker compose
. Det nya kommandot är ett plugin till Docker istället för ett fristående kommando som tidigare.
Senaste nyheterna och inläggen
-
Skapa fristående binärer av Python-skript
Docker har blivit det nya sättet att paketera och köra Python-skript, även när skripten körs från exempelvis ett cronjob. Men ibland behöver vi inte en hel Docker-miljö med den overhead det innebär för väldigt små skript. Då är det smidigare att göra om skriptet till en körbar binärfil. Då kan vi även enkelt flytta filen mellan olika Linuxsystem.
-
Demonerna på internet är här
Nu har Demonerna på internet anlänt från tryckeriet – en lättsam och kort bok om TCP/IP-protokoll, internet och säkerhet.
-
Demonerna på internet
Efter många månaders arbete är boken Demonerna på internet klar. Planerad utgivning är i mitten av juni.
-
Ny utgåva av Docker från grunden
Docker från grunden utkommit i en ny utgåva. Den största skillnaden är uppdateringen till Docker Compose version 2. Även andra mindre uppdateringar har gjorts för att hålla boken aktuell.
-
PGP-krypterat formulär
Jag blev inspirerad av Tutanotas Secure Connect – ett säkert webbformulär som skickar uppgifterna krypterat direkt till inkorgen. Skulle det inte gå att bygga något liknande med PGP? Det gick, och det var dessutom förvånansvärt enkelt då det redan finns ett GnuPG-bibliotek för PHP.
Utvalda artiklar
-
Poliser satte dit oskyldig
Två poliser dömdes i juni till vardera ett års fängelse av Lunds tingsrätt för att ha misshandlat och gripit en oskyldig man i hans bostad i Landskrona. Händelsen ägde rum en natt i mars förra året och spelades in av en övervakningskamera i mannens bostad.
-
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.
-
Stort deltagande på årets Gubbdata
I helgen var det Gubbdata i Lund – ett av Sveriges största demoparty. På plats fanns cirka ett hundra deltagare, alla med en passion för retrodatorer.
-
Kapad identitet
I mitten av september förra året blev Kristina utsatt för ett id-kapningsförsök. Någon hade ansökt om ett lån på 250 000 kr i hennes namn. Låneansökan gick ut till ett 20-tal banker.
-
Amiga-scenen lever än
I en villa mellan Ljungskile och Stenungsund den 27 november träffades de igen, ett gäng glada Amiga-entusiaster. Man träffas för att prata, titta på demos, spela och ha allmänt trevligt.
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.