Maison > Problème commun > qu'est-ce que le fusible Linux

qu'est-ce que le fusible Linux

青灯夜游
Libérer: 2023-02-28 09:59:24
original
2995 Les gens l'ont consulté

Sous Linux, fuse fait référence au système de fichiers de l'espace utilisateur, qui est un module de noyau utilisé pour prendre en charge les systèmes de fichiers de l'espace utilisateur ; fuse est un cadre de système de fichiers implémenté dans l'espace utilisateur avec la prise en charge du module de noyau FUSE. les utilisateurs n'ont qu'à L'interface fournie par fuse peut implémenter un système de fichiers en implémentant des opérations de fichiers spécifiques.

qu'est-ce que le fusible Linux

L'environnement d'exploitation de ce tutoriel : système linux7.3, ordinateur Dell G3.

description du fusible

linux Qu'est-ce que fuse

Le module du noyau utilisé par Linux pour prendre en charge le système de fichiers de l'espace utilisateur est appelé FUSE. Le terme FUSE fait parfois référence spécifiquement au système de fichiers de l'espace utilisateur sous Linux.

est une partie importante d'un système d'exploitation général. Les systèmes d'exploitation assurent traditionnellement la prise en charge des systèmes de fichiers au niveau du noyau. Généralement, le code en mode noyau est difficile à déboguer et a une faible productivité.

Linux prend en charge l'implémentation de systèmes de fichiers dans l'espace utilisateur via le module FUSE à partir de la version 2.6.14.

La mise en œuvre de systèmes de fichiers dans l'espace utilisateur peut considérablement améliorer la productivité et simplifier la charge de travail liée à la fourniture de nouveaux systèmes de fichiers pour le système d'exploitation. Elle est particulièrement adaptée à divers systèmes de fichiers virtuels et systèmes de fichiers réseau. Les ZFS et glusterfs mentionnés ci-dessus sont tous deux des systèmes de fichiers réseau. Cependant, l'implémentation d'un système de fichiers en mode utilisateur introduira inévitablement une surcharge supplémentaire causée par le changement de mode noyau/mode utilisateur, ce qui aura un certain impact sur les performances.

Les principales fonctions de fuse : Surveiller les modifications dans un fichier ou un dossier et ajouter des informations personnalisées à ce que les autres processus écrivent ou lisent dans ce dossier ou ce fichier.

Résumé :

FUSE (système de fichiers en mode utilisateur) est un cadre de système de fichiers implémenté dans l'espace utilisateur Avec la prise en charge du module du noyau FUSE, les utilisateurs n'ont qu'à implémenter des opérations de fichiers spécifiques en fonction de l'interface fournie par fuse. Un système de fichiers.

Composition et implémentation des fonctions de fuse

FUSE se compose de trois parties, le module du noyau FUSE, la bibliothèque FUSE et quelques outils suspendus. Le module du noyau FUSE implémente l'amarrage avec VFS. Il ressemble à un module de système de fichiers ordinaire. De plus, le module du noyau FUSE implémente un périphérique qui peut être ouvert par un processus de l'espace utilisateur. Lorsque VFS envoie une demande d'opération de fichier, il le convertit. dans un format spécifique et transmettez-le au processus de l'espace utilisateur via le périphérique. Après avoir traité la demande, le processus de l'espace utilisateur renvoie le résultat au module du noyau FUSE. Le module du noyau le restaure ensuite au format requis par le noyau Linux et le renvoie. à VFS.

quest-ce que le fusible Linux

La bibliothèque FUSE est responsable de la communication avec l'espace noyau. Elle reçoit les requêtes de /dev/fuse, les convertit en une série d'appels de fonction et écrit les résultats dans /dev/fuse.

Schéma de la structure des opérations FUSE

quest-ce que le fusible Linux

interface de la bibliothèque de fusibles

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);

        int (*removexattr) (const char *, const char *);

        int (*opendir) (const char *, struct fuse_file_info *);

        int (*readdir) (const char *, void *, fuse_fill_dir_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 *);

        void (init) (struct fuse_conn_info *conn,struct fuse_config *cfg);

        void (*destroy) (void *);

        int (*access) (const char *,

        int ( *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,

        struct fuse_file_info *, unsigned int flags, void *data);

        int (*poll) (const char *, struct fuse_file_info *,

       struct fuse_pollhandle *ph, unsigned *reventsp);

        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 *);

        int (*flock) (const char *, struct fuse_file_info *, int op);

        int (*fallocate) (const char *, int, off_t, off_t,struct fuse_file_info *);

};

fuse库编译

1.安装:

(1)./configure --prefix=/usr

(2)make

(3)make install

2.加载驱动

 加载fusible .ko模块« fusible modprobe »内核源码/fs/fuse

     1.fuse内核模块被加载时,以下初始化例程会被调用,见fuse_init函数

        (1)fuse_fs_init(); Si vous utilisez fuse_inode, utilisez-le également.

quest-ce que le fusible Linux        (2)fuse_dev_init(); Il y a un fusible_req, un fusible, un fusible, un fusible. init(); Il y a/sys/fs pour fuse_ctl_init(); 2. Fuse t;

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

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

        (3)fuse_fs_cleanup(); Il s'agit de fuse_inode.

        (4)fuse_dev_cleanup(); Il n'y a pas de problème avec fuse_req.

    3. fuse_conn représente une connexion fusible. Cette structure est générée lorsque le système de fichiers utilisateur est monté et est libérée lorsque le système de fichiers est démonté. Elle est principalement utilisée pour gérer chaque file d'attente de requêtes, et le noyau le fera. Le système de fichiers monté maintient une liste chaînée fuse_conn (le système de fichiers fuse peut être monté plusieurs fois).

4. Le champ connecté de fuse_conn est utilisé pour indiquer l'état de la connexion. Il est 1 après un montage réussi, lorsque le système de fichiers est démonté, la connexion est interrompue ou le pilote de périphérique est libéré, le champ est 0. cette fois, la connexion (bloquée) Le système de fichiers chargé) ne peut pas fournir de services normaux. Ce champ sera vérifié dans fuse_request_send et la demande ne sera envoyée que lorsque le système de fichiers fuse normal sera connecté. ​​​​​​​

​​​​​ 5. Chaque requête dans fuse est représentée par une structure fuse_req, qui contient les paramètres d'entrée et de sortie de la requête fuse, l'inode, le fichier, etc. . de l'objet de la requête.

6. Les paramètres d'entrée et de sortie de chaque fusible prennent en charge trois paramètres. Voir la définition des structures fuse_in et fuse_out . Les paramètres sont transmis sous la forme . structure fuse_req., en fonction du type de demande et des paramètres de demande, définissez le nombre de paramètres de fuse_in (numargs) et remplissez les paramètres dans le tableau args. En même temps, définissez le nombre de paramètres de sortie fuse_out et remplissez le champ. adresse (variable locale outarg) où les résultats de sortie sont stockés dans le tableau args.

7. Une fois que le système de fichiers fuse a défini les paramètres d'entrée et de sortie de la requête, toutes les interfaces appelleront enfin fuse_request_send pour définir l'indicateur d'état de la structure fuse_req représentant cette requête sur FUSE_REQ_PENDING, ajouteront la requête à la liste chaînée en attente de fuse_conn, et call request_wait_answer Attendez que la demande soit terminée (une fois la file d'attente réveillée, vous devez vérifier si le statut de la demande est FUSE_REQ_FINISHED). Lorsque cette demande reçoit une réponse, le résultat a été stocké dans la variable locale outarg et fuse effectue le traitement correspondant pour renvoyer le résultat à la couche supérieure.

8. Chaque structure de requête fuse_req contient un champ waitq de wait_queue_head_t. Après que chaque requête soit émise, elle réveillera d'abord la file d'attente waitq de fuse_conn et indiquera au démon du mode utilisateur qu'une requête est arrivée, puis elle appellera wait_event_interruptible ; Dormez sur waitq de req et attendez que la condition FUSE_REQ_FINISHED devienne vraie.

9. Le pilote de périphérique Fuse est un simple pilote de périphérique en bloc, utilisé par Fuse pour échanger des données entre le mode utilisateur et le mode noyau. Fuse contient un démon d'espace utilisateur, qui s'exécute en boucle. Sa tâche principale est d'appeler read from fuse. Lisez la requête sur l'appareil. Lorsqu'il n'y a pas de requête, il se mettra en veille et attendra le waitq de fuse_conn (correspondant à la file d'attente waitq de fuse_conn qui se réveille après l'émission de la requête dans le paragraphe précédent). requête, il retire la première de la file d'attente en attente de fuse_conn. Une requête (correspondant à la liste liée en attente ajoutée à fuse_conn après l'émission de la requête dans le paragraphe précédent) et déplace la requête vers la file d'attente de traitement après le démon. lit les informations pertinentes de fuse_req dans l'état utilisateur, il appelle le rappel implémenté dans l'état utilisateur en fonction de la fonction de requête et écrit le résultat dans le pilote de périphérique fuse via fuse_dev_write. Une fois la requête en mode utilisateur terminée, recherchez le fuse_req correspondant. à partir de la file d'attente de traitement, copiez le résultat dans le paramètre out de fuse_req, définissez l'état de fuse_req sur FUSE_REQ_FINISHED, puis réveillez fuse_req Le waitq. À ce stade, fuse_req est traité et le système de fichiers fuse revient à la couche supérieure.

Recommandations associées : "Tutoriel vidéo Linux"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal