2010-02-03 19 views
7

Come progetto di un college, è necessario implementare un file system di base all'interno di un file. Quindi, come faccio a fare questo? Quali sono le cose che avrei bisogno di sapere? I requisiti includono avere un processo demone in background. Anche le applicazioni che utilizzano questo sistema hanno bisogno di connettersi al server utilizzando un socket di dominio UnixImplementazione del file system di base

Il file system dovrebbe avere le seguenti funzionalità:

  1. Elenca i file memorizzati insieme con le loro dimensioni.
  2. Creare file
  3. Consentire modifiche ai file
  4. Elimina file
+0

Qui possiamo fare alcune ipotesi: Non stiamo facendo un vero filesystem: cioè, non ci aspettiamo di usare i normali comandi ls o dir per vedere le cose. Invece stiamo implementando un servizio che espone i file attraverso un'interfaccia personalizzata su un socket. Stiamo scrivendo sia il server che le librerie client. I dati per il server sono memorizzati all'interno di un singolo file. È corretto? –

+0

Simile domanda leggermente più generica: http://stackoverflow.com/questions/4714056/how-to-implement-a-very-simple-filesystem –

risposta

0

Il modo più semplice per farlo sarebbe quello di creare un modello per la memorizzazione dei dati e analizzare i file in ram, naturalmente, questo non è il più efficiente.

Qualcosa di simile ...

ALCUNI/POSIZIONE/Nome file >>> contenuto del file qui, bla bla bla < < < ALCUNI/Altro/POSIZIONE/File2Name >>> contenuti di un altro il file qui < < <

poi di elencare una directory, utilizzando espressioni regolari trovare tutte le righe che terminano in >>>, quindi analizzare fino alla barra X (in base al numero di barre nella cartella cercata), e fareun caso (in) ricerca sensibile, in base al fatto che si desideri distinguere tra maiuscole e minuscole. Naturalmente, come ho detto caricandolo in memoria, è possibile cercare un hashmap key-> value, che probabilmente sarebbe molto più semplice.

1

Un file system è essenzialmente un database per i file. La cosa principale di cui hai bisogno è una tabella di ricerca per la memorizzazione di offset di byte e lunghezze di file. I nomi dei file possono anche essere memorizzati nella tabella oppure possono essere memorizzati nei primi pochi byte a ogni offset. Sarà molto più facile per te se rendi il tuo file system di dimensioni fisse.

Questo sarebbe simile a come funziona il file system FAT.

Si può anche dare un'occhiata a http://en.wikipedia.org/wiki/Database_storage_structures poiché ai livelli più bassi i file system e i database sono molto simili.

3

Ecco an example di un'implementazione FUSE molto semplice, supportata da un segmento di memoria condivisa glorificato (xenstore). È un fork del sistema di file FUSE xenstore originale che mantengo.

Troverete anche del codice per mostrare come rendere Valgrind più utile durante il debug delle implementazioni di FUSE.

si scrivono funzioni per aprire/creare/leggere/scrivere/troncare/getattr/etc e passano loro di fondere (numeri di riga sono dall'esempio collegato):

343 static struct fuse_operations const xsfs_ops = { 
    344 .getattr = xsfs_getattr, 
    345 .mknod = xsfs_mknod, 
    346 .mkdir = xsfs_mkdir, 
    347 .unlink = xsfs_rm, 
    348 .rmdir = xsfs_rmdir, 
    349 .truncate = xsfs_truncate, 
    350 .open = xsfs_open, 
    351 .read = xsfs_read, 
    352 .write = xsfs_write, 
    353 .readdir = xsfs_readdir, 
    354 .create = xsfs_create, 
    355 .destroy = xsfs_destroy, 
    356 .utime = xsfs_utime, 
    357 .symlink = xsfs_symlink, 
    358 .init = (void *)xsfs_init 
    359 }; 

Come si può vedere, la sua estrema auto esplicativo. Un po 'di ricerca risulterebbe nel trovare molti esempi base di file con le implementazioni di FUSE.

Consiglio vivamente di farlo interamente nello spazio utente, a meno che non si abbia abbastanza tempo per acquisire familiarità con il kernel.

Problemi correlati