2017-12-19 11 views
0

Ich bin neu in FUSE und c und FSs und ich bin mit passthrough FS Beispiel, das im libfuse-Paket gegeben ist. Kann jemand einen Hinweis geben, wo im Code es heißt, dass FUSE mein Wurzelverzeichnis spiegelt, bitte? Denn ich fand die beiden Basisfunktionen - * xmp_init() und main() - ziemlich lakonisch.FUSE lib passthrough.c Beispiel. Wo ist es spiegelt meine/genau?

Hier sind sie:

static void *xmp_init(struct fuse_conn_info *conn, 
       struct fuse_config *cfg) 
{ 
    (void) conn; 
    cfg->use_ino = 1; 
    cfg->entry_timeout = 0; 
    cfg->attr_timeout = 0; 
    cfg->negative_timeout = 0; 

    return NULL; 
} 

int main(int argc, char *argv[]) 
{ 
    umask(0); 
    return fuse_main(argc, argv, &xmp_oper, NULL); 
} 

und andere Funktionen sind gerade, wie, Implementierungen von libfuse Schnittstelle ... Zeug. Ich muss mein eigenes verkrüppeltes FS machen, ich muss passenhrough.c so ändern, dass montiertes FS ein weißes Blatt wäre und ich konnte implementierte Funktionen verwenden und Akten und Sachen handhaben.

Vielen Dank im Voraus!

Antwort

0

Versuchen Sie im Beispiel die Implementierung einer Sicherungsoperation zu lesen, und Sie werden es sehen. Es gibt keinen einzigen Ort, an dem diese speziellen Details zum Spiegeln eines Root-Dateisystems verborgen sind.

Zum Beispiel überprüfen wir getattr fuse operation, die stat(2) Systemaufruf ähnelt, und wird erwartet, über eine Stat-Struktur der angegebenen Datei (über Zeiger) zurückzukehren.

Wenn auf eine Datei in einem Fuse-Dateisystem zugegriffen wird, wird zuerst eine Funktion aufgerufen, die die gettattr-Operation implementiert, wodurch die Implementierung dieser Operation obligatorisch wird.

Mit Blick auf the implementation in the example:

static int xmp_getattr(const char *path, struct stat *stbuf, 
      struct fuse_file_info *fi) 
{ 
    (void) fi; 
    int res; 

    res = lstat(path, stbuf); 
    if (res == -1) 
     return -errno; 

    return 0; 
} 

wir sehen, dass all dieser Code tut, ist, dass es nur Anrufe lstat(2) mit den gleichen Argumenten.

Also, wenn Sie montieren dieses Beispiel Dateisystem wie folgt aus:

$ ./passthrough /tmp/example 

und dann versuchen, Dateien dort zur Liste:

$ ls /tmp/example/ 

fuselib xmp_getattr() mit Pfad nennen "/", weil Sie die Wurzel zugreifen das Fuse-Dateisystem. Dann ruft der Code in xmp_getattr() nur gewöhnliche syscall für die ähnliche Sache, so dass das Root-Dateisystem in /tmp/example Mountpoint gespiegelt aussieht.