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.

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

inode

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.

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void sigHandler(int sig);

FILE *fp;
int main(void)
{
    fp=fopen("test.txt", "a");
    char x[]="Hejsan\n";

    signal(SIGTERM, sigHandler);
    signal(SIGINT, sigHandler);

    for(;;)	
    {
        fwrite(x, sizeof(x[0]), sizeof(x)/sizeof(x[0]), fp);
        printf("%ld\n", ftell(fp));
        fflush(fp);
        sleep(1);
    }
    return 0;
}

void sigHandler(int sig)
{
    fclose(fp);
    exit(0);
}

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.

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.