La struttura interna delle directory dipende dal filesystem in uso. Se vuoi sapere esattamente cosa succede, dai un'occhiata alle implementazioni del filesystem.
Fondamentalmente, nella maggior parte dei filesystem, una directory è un array associativo tra nomi di file (chiavi) e numeri di inode (valori). Qualcosa del genere¹:
1167010 .
1158721 ..
1167626 subdir
132651 barfile
132650 bazfile
Questo elenco è codificato in modo più o meno efficiente all'interno di una catena di blocchi (solitamente) 4KB. Si noti che il contenuto dei file normali è archiviato in modo simile. Nel caso delle directory, non ha senso sapere quale dimensione viene effettivamente utilizzata all'interno di questi blocchi. Ecco perché le dimensioni delle directory riportate du
sono multipli di 4KB.
Gli Inodi sono lì per unire i blocchi, formando una singola entità, vale a dire un "file" in senso generale. Sono identificati da un numero che è una sorta di indirizzo e ognuno è di solito memorizzato come un singolo blocco speciale.
La gestione di tutto ciò avviene in modalità kernel. Il software richiede solo la creazione di una directory con una funzione denominata che int mkdir(const char *pathname, mode_t mode);
porta a una chiamata di sistema e tutto il resto viene eseguito dietro le quinte.
Informazioni sulla struttura dei collegamenti:
Un hard link non è un file, è solo una nuova voce di directory (cioè un nome - associazione numero di inode ) che fa riferimento a un'entità inode preesistente². Ciò significa che è possibile accedere allo stesso inode da percorsi diversi. In particolare, poiché le metadate (autorizzazioni, proprietà, timestamp ...) sono archiviate nell'inode, sono uniche e indipendenti dal percorso scelto per accedere al file.
Un collegamento simbolico è un file ed è distinto dal suo obiettivo. Ciò significa che ha un proprio inode. In passato veniva gestito come un normale file: il percorso di destinazione era archiviato in un blocco dati. Ma ora, per motivi di efficienza nei recenti filesystem ext , i percorsi più brevi di 60 byte sono memorizzati all'interno dell'inode stesso (usando i campi che normalmente verrebbero utilizzati per memorizzare i puntatori in blocchi di dati).
-
1. questo è stato ottenuto usando ls -ai1 testdir
.
2. il cui tipo deve essere diverso da 'directory' al giorno d'oggi.