Inodes och filpekare
Vad är det här med inode och filpekare egentligen? Och hur kommer det sig
att man inte kan rotera en öppen loggfil enbart genom att döpa om den gamla
filen med mv
?
Här tänkte jag reda ut just detta.
Det hela handlar om två fundamentala delar i hur Linux och andra UNIX-system är uppbyggda.
Inode
Det första är att ett filnamn inte är själva filen i sig. Ett filnamn är bara en pekare till en inode på systemet. Denna inode i sin tur innehåller information om var den faktiska datan finns på disken. Den innehåller också information om när filen skapades, senast ändrades, dess ägare och rättigheter med mera. En inode kan dessutom ha flera filnamn. Med andra ord kan en och samma “fil” ha flera filnamn. Detta är något som kallas för hårda länkar.
$> echo "Hej hopp" > minfil.txt
$> ln minfil.txt nyttnamn.txt
$> cat nyttnamn.txt
Hej hopp
$> cat minfil.txt
Hej hopp
$> ls -l minfil.txt
-rw-r--r-- 2 jake jake 9 maj 10 20:22 minfil.txt
$> ls -l nyttnamn.txt
-rw-r--r-- 2 jake jake 9 maj 10 20:22 nyttnamn.txt
$> stat minfil.txt
File: minfil.txt
Size: 9 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 8532330 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 1000/ jake) Gid: ( 1000/
jake)
Access: 2020-05-10 20:22:01.272346903 +0200
Modify: 2020-05-10 20:22:01.272346903 +0200
Change: 2020-05-10 20:22:14.416338142 +0200
Birth: -
De båda filnamnen är alltså likvärdiga. Filnamnet nyttnamn.txt länkar alltså
inte till filnamnet minfil.txt, utan båda filnamnen länkar istället direkt
till inoden med nummer 8532330. Lägg märke till att det står Links: 2 i
utdatan från stat
. Detta betyder att det finns två filnamn – eller två hårda
länkar – som pekar på just den inoden. Jag kan ta bort minfil.txt och datan
går fortfarande att nå via nyttnamn.txt.
$> rm minfil.txt
$> cat nyttnamn.txt
Hej hopp
Om jag däremot även tar bort nyttnamn.txt kan jag inte längre nå datan. Datan kommer säkerligen finnas kvar på disken ett tag, men det finns inget sätt att nå den på.
$> rm nyttnamn.txt
$> sudo debugfs -R "stat <8532330>" /dev/sda1
[sudo] password for jake:
Inode: 8532330 Type: regular Mode: 0644 Flags: 0x80000
Generation: 900306715 Version: 0x00000000:00000001
User: 1000 Group: 1000 Project: 0 Size: 0
File ACL: 0
Links: 0 Blockcount: 0
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x5eb849ce:cff716cc -- Sun May 10 20:37:02 2020
atime: 0x5eb84649:40eebc5c -- Sun May 10 20:22:01 2020
mtime: 0x5eb849ce:cff716cc -- Sun May 10 20:37:02 2020
crtime: 0x5eb84649:40eebc5c -- Sun May 10 20:22:01 2020
dtime: 0x5eb849ce:(cff716cc) -- Sun May 10 20:37:02 2020
Size of extra inode fields: 32
Inode checksum: 0xaff1a49a
EXTENTS:
Lägg märke till att det här står Links: 0. Det finns således inga filnamn kvar till den aktuella inoden.
Det finns även mjuka länkar, men dessa är inte samma sak. En mjuk länk är en
egen filtyp och räknas inte i Links i stat
-kommandot.
Bilden nedan visar hur filnamn och inode hänger samman.
Filpekare
Den andra fundamentala delen är att program som skriver till filer på disken gör så via filpekare. En öppen filpekare i ett program klamrar sig fast vid inoden, inte dess filnamn (kom ihåg att filnamnet bara är en länk till en inode).
Demonstration
För att visa dessa koncept kan vi använda ett enkelt C-program som visas nedan.
Programmet skriver ut ordet “Hejsan” en gång varje sekund till filen test.txt. Samtidigt visar programmet hur många byte som har skrivits till filen så att man ser att programmet fungerar.
I demonstrationen nedan visar jag att det går att döpa om filen, då det fortfarande är samma fil, eller rättare sagt inode. Jag testar också att radera filen, men ingen ny fil skapas av programmet. Jag testar också att skapa en ny fil med samma filnamn, men det hjälper inte eftersom det blir en ny inode. Programmen skriver fortfarande till den gamla inoden, vilket jag visar mot slutet av videon där vi ser att tiden uppdateras.
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.