Come vengono implementate le directory nei filesystem Unix?


19

La mia domanda è: come vengono implementate le directory? Posso credere a una struttura di dati come una variabile, ad esempio tabella, matrice o simile. Dato che UNIX è Open Source, posso vedere nel sorgente cosa fa il programma quando ha creato una nuova directory. Puoi dirmi dove cercare o approfondire l'argomento? Che una directory "è" un file che potrei capire ed è davvero una directory un file? Non sono sicuro che sia vero che i file sono memorizzati "in" file mentre sono ancora in modo che tu possa dire il file di parole su quasi tutto e non sono sicuro di ciò che assolutamente non è un file poiché potresti chiamare anche una variabile a file. Ad esempio un collegamento non è certamente un file e un collegamento è come una directory, ma ciò viola una directory come file?


1
Sei interessato a qualche particolare filesystem (s)?
Ignacio Vazquez-Abrams,

3
In UNIX, tutto è un file (saggezza storica). Ma non tutti gli UNIX sono Open Source. Gnu non è Unix, lo sai? Open Solaris è un Unix Open Source, mentre Linux è solo un sistema operativo unixoid. :) E sì - filesystem - Reiserfs? Ext2-3-4? XFS? NFS?
utente sconosciuto

2
Un collegamento è in realtà anche un file.
Mattdm,

5
Un collegamento simbolico è un file. Un hard link è un vantaggio nel grafico del filesystem.
dmckee,

3
Pubblicità: potresti essere interessato alla proposta del sito per lo sviluppo di sistemi operativi .
Gilles 'SO- smetti di essere malvagio' il

Risposte:


22

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 dusono 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.


Grazie per l'elaborazione in modo che io possa capire la differenza tra directory e file a livello programmatico.
Niklas,

12

Per espandere il post da Stéphane Gimenez, la creazione di una nuova directory è il processo di creazione di un nuovo inode con il valore st_mode di S_IFDIR (con la modalità autorizzazioni), creando due voci nel primo blocco di dati del nuovo inode con il collegamento ( 2) chiamata di sistema: '.' che punta a questo nuovo inode e '..' che punta alla directory padre, quindi creando una voce nella directory padre con l'inode e il nome della nuova directory - la prima e l'ultima parte sono fatte dalla chiamata di sistema mknod ( 2). Inoltre, solo root può usare mknod (2) in questi giorni per le attività di cui stiamo parlando.

Ad esempio, mkdir("/home/larry.user/xyzzy", 0666)è essenzialmente il seguente (questo era il codice C dei giorni SysV [1]):

int mode = 0666;
char newdir[] = "/home/larry.user/xyzzy";
char path1[NAMESZ+4, path2[NAMESZ+4], *p;
mknod(newdir, S_IFDIR|mode);
strcpy(path1, newdir);
strcat(path1, "/."); /* "." link */
link(newdir, path1);
strcat(path1, ".");  /* ".." link */
strcpy(path2, newdir);
if ((p = strrchr(path2, '/') == (char *)0) /* root directory */
    link(".", path1);
else {
    *p = '\0';
    link(path2, path1);
}
  1. Haviland & Salama, "Programmazione del sistema UNIX", 1987, pp69-71.

Questo era troppo soggetto a errori (e uno dei motivi principali per fsck), quindi è stata creata una chiamata di sistema mkdir (2) per poterlo fare per te.

Si noti che l'oggetto file system amy potrebbe essere creato con mknod (2): file normale, directory, file dispositivo, collegamento simbolico, ecc. Quindi, per rispondere a una delle domande dell'OP, sì, una directory è un file, il che significa dire " è un oggetto, rappresentato da un inode, residente in un filesystem che si comporta con un'interfaccia i / o ".


Grazie per la risposta molto interessante. Capisco e penso di poter anche cercare nella fonte il programma touchche crea un file vuoto e vedere cosa fa.
Niklas,

2

se ti piace avere maggiori informazioni sui filesystem Unix / Linux, ti consiglio 2 libri Comprensione del kernel Linux e dello sviluppo del kernel Linux . Questi sono i libri migliori per comprendere il kernel Linux.

Nei sistemi Unix "Common File Model", ogni directory è considerata un file, che contiene un elenco di file e directory.

Nel VFS (Virtual File Systems), le directory sono rappresentate in una struttura chiamata dentry. Il dentry è una struttura di C con un nome di stringa ( d_name ), un puntatore ad un inode ( d_inode ) e un puntatore al dentry genitore ( d_parent ). Un inode è una struttura per la gestione delle informazioni su un file nel filesystem. Ad esempio, se si dispone della directory /tmp/test/foo, VFS creerà un oggetto dentry per ogni componente nel percorso. Quindi, creerà un oggetto dentry per /, un secondo oggetto dentry per l' testimmissione della directory radice e un terzo oggetto dentry per l' fooimmissione della directory test.


Grazie Dimitri. Voglio capire perché alcuni progetti hanno scelto una particolare struttura di dati come un B-Tree, un albero binario, un trie o un array associativo. Penso che sia importante scegliere un modello di dati / struttura dei dati adatto. Conoscere le diverse implementazioni fornisce i dettagli che sto cercando.
Niklas,

1

Puoi iniziare leggendo http://www.freebsd.org/doc/en/books/design-44bsd/book.html#OVERVIEW-FILESYSTEM . Per maggiori dettagli ottenere l'eccellente libro classico "La progettazione e l'implementazione del sistema operativo 4.4 BSD".


Grazie per il link Capisco che entrambi i file sono directory in pratica sono array che vengono interpretati come file o directory. Per favore, correggimi se sbaglio ..
Niklas,

1
Le directory sono tradizionalmente solo file appositamente formattati, ma non è più vero: en.wikipedia.org/wiki/ReiserFS#Design In ReiserFS e in alcuni altri, le directory sono voci in un database. Le directory possono fungere da array, ma questa è solo l'astrazione della programmazione.
Bruce Ediger,

Grazie mille per aver sottolineato i dettagli. Ora penso di capire di più su come funzionano i filesystem chiedendosi ancora come e perché il programma funzioni locatee come questo sia correlato all'aggiornamento del programma di individuazione eseguendo updatedb(specifica che uso PC-BSD, DragonflyBSD e Ubuntu Natty avviando da Live CD e confrontando diverse installazioni e interfacce)
Niklas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.