In Linux bezieht sich Fuse auf das User-Space-Dateisystem, ein Kernelmodul zur Unterstützung von User-Space-Dateisystemen. Fuse ist ein im User-Space implementiertes Dateisystem-Framework. Benutzer müssen nur die von Fuse bereitgestellte Schnittstelle verwenden, um ein Dateisystem zu implementieren, indem sie bestimmte Dateivorgänge implementieren.
Die Betriebsumgebung dieses Tutorials: Linux7.3-System, Dell G3-Computer.
linux Was ist Fuse? Das von Linux zur Unterstützung des User-Space-Dateisystems verwendete Kernelmodul heißt FUSE. Der Begriff FUSE bezieht sich manchmal speziell auf das User-Space-Dateisystem unter Linux.
ist ein wichtiger Bestandteil eines allgemeinen Betriebssystems. Betriebssysteme bieten traditionell Unterstützung für Dateisysteme auf Kernel-Ebene. Im Allgemeinen ist Kernel-Modus-Code schwer zu debuggen und weist eine geringe Produktivität auf. Linux unterstützt die Implementierung von Dateisystemen im Benutzerbereich durch das FUSE-Modul ab Version 2.6.14. Die Implementierung von Dateisystemen im Benutzerbereich kann die Produktivität erheblich verbessern und den Arbeitsaufwand für die Bereitstellung neuer Dateisysteme für das Betriebssystem vereinfachen. Es eignet sich besonders für verschiedene virtuelle Dateisysteme und Netzwerkdateisysteme. Das oben erwähnte ZFS und Glusterfs sind beide Netzwerkdateisysteme. Die Implementierung eines Dateisystems im Benutzermodus führt jedoch zwangsläufig zu einem zusätzlichen Overhead, der durch den Wechsel zwischen Kernelmodus und Benutzermodus verursacht wird, was sich in gewisser Weise auf die Leistung auswirkt.Die Hauptfunktionen von Fuse:
Überwachen Sie Änderungen in einer Datei oder einem Ordner und fügen Sie benutzerdefinierte Informationen zu dem hinzu, was andere Prozesse in diesen Ordner oder diese Datei schreiben oder lesen.Zusammenfassung:
FUSE (Benutzermodus-Dateisystem) ist ein im Benutzerbereich implementiertes Dateisystem-Framework. Mit der Unterstützung des FUSE-Kernelmoduls müssen Benutzer nur bestimmte Dateivorgänge gemäß der von Fuse bereitgestellten Schnittstelle implementieren. Ein Dateisystem.
Zusammensetzung und Funktionsimplementierung von Fuse
Die FUSE-Bibliothek ist für die Kommunikation mit dem Kernel-Space verantwortlich. Sie empfängt Anfragen von /dev/fuse, wandelt sie in eine Reihe von Funktionsaufrufen um und schreibt die Ergebnisse zurück nach /dev/fuse.
FUSE-Operationsstrukturdiagramm
Schnittstelle der Sicherungsbibliothek
int (* readlink) (const char *, char *, size_t); int (*mknod) (const char *, mode_t, dev_t); int (*mkdir) (const char *, mode_t); int (* unlink) (const char *); int (*rmdir) (const char *); int (*symlink) (const char *, const char *); unsigned int); int (*link) (const char *, const char *); int (*chmod) (const char *, mode_t, struct Fuse_file_info *fi); int (* chown) (const char *, uid_t, gid_t, struct Fuse_file_info *fi); int (*truncate) (const char *, off_t, struct Fuse_file_info *fi); int (*open) (const char *, struct Fuse_file_info *); int (*read) (const char *, char *, size_t, off_t, struct Fuse_file_info *); int (*write) (const char *, const char *, size_t, off_t, struct Fuse_file_info *);
int (*statfs) (const char *, struct statvfs *); int (*flush) (const char *, struct Fuse_file_info *);
int (*release) (const char *, struct Fuse_file_info *);
int (*fsync) (const char *, int, struct Fuse_file_info *);
int (*setxattr) (const char *, const char * , const char *, size_t, int);
int (*getxattr) (const char *, const char *, char *, size_t);
int (*listxattr) (const char *, char *, size_t);
# , off_t,
struct Fuse_file_info *, enum Fuse_readdir_flags);
int (*releasedir) (const char *, struct Fuse_file_info *);
int (*fsyncdir) (const char *, int, struct Fuse_file_info * );
& *create) (const char *, mode_t, struct Fuse_file_info *);
int (*lock) (const char *, struct Fuse_file_info *, int cmd,struct flock *);
int (*utimens) (const char * , const struct timespec tv[2], struct Fuse_file_info *fi); int (*bmap) (const char *, size_t blocksize, uint64_t *idx);
int (*ioctl) (const char *, int cmd, void *arg int (*write_buf) (const char *, struct Fuse_bufvec *buf, off_t off,struct Fuse_file_info *);
int (*read_buf) (const char *, struct Fuse_bufvec **bufp,
size_t size, off_t off, struct Fuse_file_info *) 1驱动
加载Sicherung .ko模块„modprobe Fuse“ ,内核源码/fs/fuse
1.fuse内核模块被加载时, 以下初始化例程会被调用,见fuse_init函数 3. Fuse_conn
4. Das verbundene Feld von „fuse_conn“ wird verwendet, um den Status der Verbindung anzuzeigen. Nach erfolgreicher Bereitstellung ist das Dateisystem aufgehoben, die Verbindung unterbrochen oder der Gerätetreiber freigegeben Dieses Mal kann die Verbindung (das geladene Dateisystem) keine normalen Dienste bereitstellen. Dieses Feld wird in Fuse_request_send überprüft und die Anforderung wird nur gesendet, wenn das normale Fuse-Dateisystem verbunden ist.
5. Jede Anfrage in Fuse wird durch eine Fuse_req
6. Die Eingabe- und Ausgabeparameter jeder Sicherung unterstützen drei Parameter. Die Parameter werden in der Form übergeben Struktur „fuse_req“. Legen Sie entsprechend dem Anforderungstyp und den Anforderungsparametern die Anzahl der Parameter von „fuse_in“ (Numargs) fest und füllen Sie die Parameter in das Array „args“ ein. Legen Sie gleichzeitig die Anzahl der Ausgabeparameter von „fuse_out“ fest Adresse (lokale Variable outarg), an der die Ausgabeergebnisse im args-Array gespeichert werden.
7. Nachdem das Sicherungsdateisystem die Eingabe- und Ausgabeparameter der Anforderung festgelegt hat, rufen alle Schnittstellen schließlich „fuse_request_send“ auf, um das Statusflag der Struktur „fuse_req“, die diese Anforderung darstellt, auf „FUSE_REQ_PENDING“ zu setzen, die Anforderung zur ausstehenden verknüpften Liste von „fuse_conn“ hinzuzufügen und call request_wait_answer Warten Sie, bis die Anforderung abgeschlossen ist (nachdem die Warteschlange aktiviert wurde, müssen Sie überprüfen, ob der Anforderungsstatus FUSE_REQ_FINISHED ist). Wenn auf diese Anfrage geantwortet wird, wurde das Ergebnis in der lokalen Variablen outarg gespeichert und Fuse führt eine entsprechende Verarbeitung durch, um das Ergebnis an die obere Schicht zurückzugeben.
8. Jede Anforderungsstruktur „fuse_req“ enthält ein waitq-Feld von „wait_queue_head_t“. Nachdem jede Anforderung ausgegeben wurde, wird zunächst die Warteschlange „waitq“ von „fuse_conn“ aktiviert und dem Benutzermodus-Daemon mitgeteilt, dass eine Anforderung eingetroffen ist Ruhen Sie auf reqs waitq und warten Sie, bis die Bedingung FUSE_REQ_FINISHED wahr wird.
9. Der Fuse-Gerätetreiber ist ein einfacher Blockgerätetreiber, der von Fuse zum Austausch von Daten zwischen Benutzermodus und Kernelmodus verwendet wird. Fuse enthält einen User-Space-Daemon, der in einer Schleife ausgeführt wird. Seine Hauptaufgabe besteht darin, „Read from Fuse“ aufzurufen Wenn keine Anforderung vorliegt, wird das Gerät in den Ruhezustand versetzt und wartet auf die Warteschlange „waitq“ von „fuse_conn“, die nach der Ausgabe der Anforderung im vorherigen Absatz aktiviert wird Bei der Anforderung wird die erste Anforderung aus der ausstehenden Warteschlange von Fuse_conn entnommen (entsprechend der ausstehenden verknüpften Liste, die nach der Ausgabe der Anforderung im vorherigen Absatz hinzugefügt wurde) und in die Verarbeitungswarteschlange verschoben Liest die relevanten Informationen von „fuse_req“ in den Benutzerstatus, ruft den im Benutzerstatus implementierten Rückruf auf und schreibt das Ergebnis über „fuse_dev_write“ in den Fuse-Gerätetreiber. Suchen Sie nach Abschluss der Benutzermodusanforderung die entsprechende „fuse_req“. Kopieren Sie das Ergebnis aus der Verarbeitungswarteschlange in den Out-Parameter von Fuse_Req, setzen Sie den Status von Fuse_Req auf FUSE_REQ_FINISHED und aktivieren Sie dann Fuse_Req. Das Waitq. Zu diesem Zeitpunkt wird Fuse_req verarbeitet und das Fuse-Dateisystem kehrt zur oberen Ebene zurück.
Verwandte Empfehlungen: „Linux-Video-Tutorial“
Das obige ist der detaillierte Inhalt vonWas ist Linux Fuse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!