Skip to main content
  1. Concetti/

Filesystem Architecture Inodes

·5 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

Concetto Core: In Linux, una directory non è un semplice "contenitore", ma un file speciale che funge da indice. Al suo interno risiedono voci che associano il nome di ogni elemento al suo numero di inode. L'inode è la struttura dati che contiene i metadati e i puntatori ai blocchi fisici sul disco.


🏗️ Analogia Tecnica (Low-Level)
#

1. La Directory come Indice (Lista di Record)
#

Puoi immaginare la directory come una tabella o un array di record dove ogni "cella" contiene:

  • Nome del file (stringa)
  • Numero di Inode (valore intero/puntatore logico)

2. L'Inode come Struct
#

L'inode è simile a una struct C che definisce l'oggetto file prima ancora dei suoi dati:

struct FileInode {
    int    owner_uid;    // UID del proprietario
    int    group_gid;    // GID del gruppo
    int    permissions;  // rwxrwxrwx
    int    size;         // Dimensione in byte
    long   timestamp;    // Ultimo accesso/modifica
    void  *blocks[12];   // Array di puntatori ai blocchi dati su disco
};

🏗️ L'Analogia del Programmatore
#

Possiamo visualizzare il rapporto tra Directory e File come una struttura dati complessa:

ComponenteAnalogia InformaticaRuolo Tecnico
DirectoryArray / Hash MapUn file "lista" che associa nomi di file a numeri di Inode.
File NameKey- chiave testuale che individua una voce nella directory (nome → inode)
Inode- Struct / Record- struttura che contiene metadati e puntatori ai blocchi dat
DatiValueI byte effettivi scritti sui blocchi del disco.

📝 Side-Note: La Directory come Tabella di Puntatori (Array di Riferimenti)
#

Se preferisci i puntatori alle struct, immagina la directory come un Array di Coppie (Stringa, Indirizzo).

  • L'Indice della Directory: È un array dove ogni elemento è (char *name, uint32_t inode_ptr).
  • Il Numero di Inode: Non è altro che un Offset o un Puntatore Logico. Quando il Kernel legge il numero di inode 101, lo usa come indice per saltare all'indirizzo di memoria (o settore del disco) dove risiedono i metadati di quel file.
  • Dereferenziazione (*): Il permesso Execute (x) sulla directory è l'operatore di dereferenziazione.
    • Senza x, hai l'indirizzo (vedi che il file esiste nell'indice), ma il Kernel ti impedisce di fare *ptr. Non puoi "seguire" il puntatore per arrivare ai dati.

📝 Side-Note: Differenza tra Puntatori e Array (nel contesto Filesystem)
#

Sebbene spesso usati come sinonimi nel linguaggio parlato, in C e nel Kernel Linux hanno distinzioni semantiche precise che si riflettono nel filesystem:

ConcettoArray (La Directory) 📁Puntatore (L'Inode/File) 📄
NaturaUna struttura a dimensione variabile che alloca spazio per contenere "nomi".Una variabile che contiene l'indirizzo dei dati reali.
AccessoAccedere a un elemento dell'array (ls) non significa aver letto il valore puntato.Leggere il puntatore (cat) carica i dati dalla memoria/disco.
RilocazioneSe rinomini un file (mv), cambi solo l'etichetta nell'array. L'indirizzo puntato resta identico.Se sposti i dati su un altro disco, il valore del puntatore (numero di inode) deve cambiare.

In breve:

  • L'Array è la mappa stradale (nomi e direzioni).
  • Il Puntatore è la coordinata GPS specifica che ti porta alla casa (i dati).

🔑 Cosa abilitano i Bit (Context-Aware)
#

📁 Sulla Directory (L'Indice)
#

  • [r] Read: Permette di leggere la lista dei nomi nell'indice (ls).
  • [w] Write: Permette di manipolare l'indice: aggiungere record (touch), rimuoverli (rm) o rinominarli (mv).
  • [x] Execute: Permette la Dereferenziazione. Senza questo bit, non puoi usare il "numero di inode" per raggiungere la struct del file.

📄 Sul File (La Struct/Dati)
#

  • [r] Read: Permette di accedere ai puntatori dei blocchi dati per leggerne il contenuto.
  • [w] Write: Permette di modificare i dati nei blocchi puntati dall'inode.
  • [x] Execute: Indica al Kernel che i dati nei blocchi possono essere caricati nello spazio di indirizzamento di un processo.

Quindi se hai permessi della cartella posso vedere il contenuto della cartella e fare operazioni sulla cartella. Se non ho i permessi sul puntatore non posso esplorare i file che sono presenti in quella cartella



📌 Lo Sticky Bit (Il Filtro "If" di Sicurezza)
#

Lo Sticky Bit (t) è una condizione logica aggiuntiva che protegge l'integrità dell'Array in ambienti multi-utente (es: /tmp). Rappresenta un "lucchetto" per le operazioni di cancellazione.

Logica di Cancellazione (rm):

IF (utente_ha_W_su_directory AND (utente == proprietario_file OR utente == root)) 
THEN ALLOW DELETE
ELSE DENY ACCESS
  • Ottale: Si indica con un 1 davanti (es. 1777).
  • Simbolico: Appare come una t finale (es. drwxrwxrwt).

🎨 Diagramma ASCII: Flusso di Accesso
#

DIRECTORY (L'Array)              INODE TABLE (I Metadati)       DISCO (I Dati)
+-----------------------+        +-----------------------+      +---------------+
| NOME       | INODE #  |        | INODE #101            |      | [ 01010110 ]  |
|------------|----------|        |-----------------------|      | [ 11101010 ]  |
| file.txt   |  101  ---|------->| - Owner: bandit1      |----->| [ CONTENUTO]  |
| script.sh  |  205  ---|        | - Perms: rwx          |      | [ REALE    ]  |
+-----------------------+        +-----------------------+      +---------------+
      ^              ^
      |              |
 PERMESSI [w]    PERMESSI [x]
 (Modifica       (Segui il
  Array)          Puntatore)

COMANDO: cat /home/user/file.txt

  1. [ / ] Inode Indice -> Cerca "home" -> Ottieni Inode #10
  2. [ home/ ] Inode Indice -> Cerca "user" -> Ottieni Inode #20 (Richiede 'x')
  3. [ user/ ] Inode Indice -> Cerca "file.txt" -> Ottieni Inode #50 (Richiede 'x')
  4. [ Inode #50 ] Leggi Struct -> Controlla Permessi 'r' -> Accedi ai blocchi dati.

🛠️ Comandi di Gestione (The Trinity)
#

  • chmod: Modifica i bit (es. chmod 755 o chmod +t).
  • chown: Cambia il proprietario (User/UID).
  • chgrp: Cambia il gruppo (Group/GID).

Vedi anche:

Related