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.
Tyckte du om den här artikeln? Då kanske du även tycker om någon av våra böcker.
Relaterat
-
Drifta din egen molnlagring med Seafile
Seafile är ett program med öppen källkod för att synkronisera och lagra filer. Det kan liknas med ett privat Dropbox. Seafile har både en webbklient och klienter för Linux, Windows, macOS, Android och iPad/iPhone.
-
QCAD – ett prisvänligt CAD-program
AutoCAD är det mest populära och välkända CAD-programmet, men det har en stor prislapp. Cirka 21 700 kr inklusive moms per år. Men det finns alternativ. QCAD är ett av dem och kostar cirka 430 kr i engångssumma.
-
Blandade säkerhetstips
Här hittar du alla artiklarna i serien Blandade säkerhetstips. Listan fylls på efterhand som fler artiklar skrivs. Tipsen i denna artikelserie gäller främst för Linux och andra Unixsystem.
-
Blandade säkerhetstips, del 4 – reverse shell
Reverse shell är precis vad det låter som, ett omvänt skal. Istället för att angriparen ansluter till offrets dator, ansluter ett reverse shell istället från offret till angriparens dator. Detta gör att brandväggen som vi ofta förlitar oss på inte hjälper särskilt mycket här. Anslutningen går ju ut mot internet, inte in till offrets dator. Dessutom lyssnar angriparen ofta på en vanlig port, exempelvis 80 eller 443, för att inte bli blockerad eller upptäckas.
Senaste nyheterna och inläggen
-
Fortsatt låga IPv6-siffror i Sverige
Det är fortfarande knappt fem procent av internetanvändarna som har tillgång till IPv6. Det visar Post- och telestyrelsens senaste kartläggning. Samtidigt ökar andelen internetoperatörer som använder adressöversättning.
-
Drifta din egen molnlagring med Seafile
Seafile är ett program med öppen källkod för att synkronisera och lagra filer. Det kan liknas med ett privat Dropbox. Seafile har både en webbklient och klienter för Linux, Windows, macOS, Android och iPad/iPhone.
-
Ditt gamla telefonnummer är en säkerhetsrisk
Telefonnummer som inte längre är i bruk återanvänds. Det innebär att nästa person som får ditt gamla telefonnummer kan använda det för att ta sig in på dina onlinekonton, exempelvis Facebook.
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.