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:
| Componente | Analogia Informatica | Ruolo Tecnico |
|---|---|---|
| Directory | Array / Hash Map | Un file "lista" che associa nomi di file a numeri di Inode. |
| File Name | Key | - chiave testuale che individua una voce nella directory (nome → inode) |
| Inode | - Struct / Record | - struttura che contiene metadati e puntatori ai blocchi dat |
| Dati | Value | I 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.
- Senza
📝 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:
| Concetto | Array (La Directory) 📁 | Puntatore (L'Inode/File) 📄 |
|---|---|---|
| Natura | Una struttura a dimensione variabile che alloca spazio per contenere "nomi". | Una variabile che contiene l'indirizzo dei dati reali. |
| Accesso | Accedere a un elemento dell'array (ls) non significa aver letto il valore puntato. | Leggere il puntatore (cat) carica i dati dalla memoria/disco. |
| Rilocazione | Se 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
tfinale (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
- [ / ] Inode Indice -> Cerca "home" -> Ottieni Inode #10
- [ home/ ] Inode Indice -> Cerca "user" -> Ottieni Inode #20 (Richiede 'x')
- [ user/ ] Inode Indice -> Cerca "file.txt" -> Ottieni Inode #50 (Richiede 'x')
- [ Inode #50 ] Leggi Struct -> Controlla Permessi 'r' -> Accedi ai blocchi dati.
🛠️ Comandi di Gestione (The Trinity)#
- chmod: Modifica i bit (es.
chmod 755ochmod +t). - chown: Cambia il proprietario (User/UID).
- chgrp: Cambia il gruppo (Group/GID).
Vedi anche:


