Heim >häufiges Problem >Was ist Linux Fuse?

Was ist Linux Fuse?

青灯夜游
青灯夜游Original
2023-02-28 09:59:243000Durchsuche

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.

Was ist Linux Fuse?

Die Betriebsumgebung dieses Tutorials: Linux7.3-System, Dell G3-Computer.

fuse-Beschreibung

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

FUSE besteht aus drei Teilen: dem FUSE-Kernelmodul, der FUSE-Bibliothek und einigen hängenden Tools. Das FUSE-Kernelmodul implementiert das Andocken an VFS. Darüber hinaus implementiert das FUSE-Kernelmodul ein Gerät, das von einem Benutzerraumprozess geöffnet werden kann in ein bestimmtes Format umwandeln und über das Gerät an den User-Space-Prozess übergeben. Nach der Verarbeitung der Anforderung gibt der User-Space-Prozess das Ergebnis an das FUSE-Kernelmodul zurück. Das Kernelmodul stellt es dann in dem vom Linux-Kernel benötigten Format wieder her es an VFS.

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. Was ist Linux Fuse?

FUSE-Operationsstrukturdiagramm

Was ist Linux Fuse?Schnittstelle der Sicherungsbibliothek

struct Fuse_operations {

int (*getattr) (const char *, struct stat *, struct Fuse_file_info *fi);

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函数

        (1)fuse_fs_init();

        (2)fuse_dev_init(); 创建fuse_req速缓存,加载fuse设备驱动,用于用户空间与内核空间交换信息。

        (3)fuse_sysfs_init(); 在/sys/fs目录下增加fuse节点, 在fuse节点下增加connections节点.

        (4)fuse_ctl_init(); 注册fuse控制文件系统

        2.sicherung

        (1)fuse_ctl_cleanup(); 注销fuse控制文件系统

        (2)fuse_sysfs_cleanup(); 移除fuse、connections节点.

        (3)fuse_fs_cleanup(); 注销fuse文件系统,释放fuse_inode高速缓存。

        (4)fuse_dev_cleanup(); 注销fuse设备驱动程序,释放fuse_req高速缓存.

    3. Fuse_conn stellt eine Sicherungsverbindung dar. Diese Struktur wird beim Mounten des Benutzerdateisystems generiert und freigegeben, wenn das Dateisystem nicht gemountet wird. Sie wird hauptsächlich zum Verwalten jeder Anforderungswarteschlange verwendet Das gemountete Dateisystem verwaltet eine mit Fuse_conn verknüpfte Liste (das Fuse-Dateisystem kann mehrmals gemountet werden).

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-Struktur dargestellt, die die Eingabe- und Ausgabeparameter der Fuse-Anfrage, den Inode, die Datei usw. enthält . des Anforderungsobjekts.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn