ホームページ >よくある問題 >Linuxヒューズとは何ですか

Linuxヒューズとは何ですか

青灯夜游
青灯夜游オリジナル
2023-02-28 09:59:242946ブラウズ

Linux では、fuse はユーザー空間ファイル システムを指します。これは、ユーザー空間ファイル システムをサポートするために使用されるカーネル モジュールです。fuse は、ユーザー空間に実装されたファイル システム フレームワークです。 FUSE カーネル モジュール、使用 作成者は、ファイル システムを実装するために、fuse によって提供されるインターフェイスに従って特定のファイル操作を実装するだけで済みます。

Linuxヒューズとは何ですか

#このチュートリアルの動作環境: linux7.3 システム、Dell G3 コンピューター。

ヒューズの説明

Linux ヒューズとは

Linux がユーザー空間ファイル システムをサポートするために使用するカーネル モジュールは、次のように呼ばれます。 FUSE 、FUSE という用語は、特に Linux のユーザー空間ファイル システムを指す場合があります。

は、一般的なオペレーティング システムの重要な部分です。オペレーティング システムは従来、カーネル レベルでファイル システムのサポートを提供してきました。一般に、カーネル モード コードはデバッグが難しく、生産性が低くなります。

Linux は、バージョン 2.6.14 以降、FUSE モジュールを介してユーザー空間でのファイル システムの実装をサポートします。

ユーザー空間にファイル システムを実装すると、生産性が大幅に向上し、オペレーティング システムに新しいファイル システムを提供する作業負荷が簡素化されます。特に、さまざまな仮想ファイル システムやネットワーク ファイル システムに適しています。前述の ZFS と glusterfs は、どちらもネットワーク ファイル システムです。ただし、ファイル システムをユーザー モードで実装すると、カーネル モードとユーザー モードの切り替えによって必然的に追加のオーバーヘッドが発生し、パフォーマンスに一定の影響を及ぼします。

fuse の主な機能: ファイルまたはフォルダー内の変更を監視し、他のプロセスがこのフォルダーまたはファイルに書き込むか読み取る内容にカスタム情報を追加します。

概要:

FUSE (ユーザー モード ファイル システム) は、ユーザー空間に実装されたファイル システム フレームワークです。FUSE カーネル モジュールのサポートにより、ユーザーは次のことを行うだけで済みます。 Fuse によって提供されるインターフェイスは、ファイル システムを実装するための特定のファイル操作を実装します。

fuse の構成と機能実装

FUSE は、FUSE カーネル モジュール、FUSE ライブラリ、およびいくつかのハング ツールの 3 つの部分で構成されます。 FUSE カーネル モジュールは、VFS とのドッキングを実装します。通常のファイル システム モジュールのように見えます。さらに、FUSE カーネル モジュールは、ユーザー空間プロセスによって開くことができるデバイスを実装します。VFS がファイル操作リクエストを送信すると、それを変換します。リクエストを処理した後、ユーザー空間プロセスは結果を FUSE カーネル モジュールに返し、カーネル モジュールはそれを Linux カーネルが必要とする形式に復元して返します。それをVFSに転送します。

Linuxヒューズとは何ですか

## FUSE ライブラリはカーネル空間との通信を担当し、/dev/fuse からリクエストを受け取り、それらを一連の関数呼び出しに変換し、結果を に書き込みます。 /dev/ヒューズ。

FUSE オペレーション構造図

Linuxヒューズとは何ですか

ヒューズ ライブラリ インターフェイス

struct furuse_operations {

int (*getattr) (const char *, struct stat *, struct furuse_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 *);

int ( *rename) (const char *, const char *, unsigned int);

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

int (*chmod) (const char *, mode_t, struct furuse_file_info *fi);

int (*chown) (const char *, uid_t, gid_t, struct furuse_file_info *fi);

int (*truncate) (const char *, off_t, struct furuse_file_info *fi);

int (*open) (const char *, struct furuse_file_info *);

int (*read) (const char *, char * 、size_t、off_t、struct furuse_file_info *);

int (*write) (const char *、const char *、size_t、off_t、struct furuse_file_info *);

int (*statfs) (const char *, struct statvfs *);

int (*flush) (const char *, struct furuse_file_info *);

int (*release) (const char *, struct furuse_file_info *);

int (*fsync) (const char *, int, struct furuse_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 furuse_file_info *);

int (*readdir) (const char *, void *, furuse_fill_dir_t, off_t,

struct furuse_file_info *, enum furuse_readdir_flags);

int (*リリースir) (const char *, struct furuse_file_info *);

int (*fsyncdir) (const char *, int, struct furuse_file_info *);

void (init) (struct furuse_conn_info *conn,structfusion_config *cfg);

void (*destroy) (void *);

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

int (*create) (const char *, mode_t, struct furuse_file_info *);

int (*lock) (const char *, struct furuse_file_info *, int cmd, struct flock *);

int (*utimens) (const char *, const struct timespec tv[2], struct furuse_file_info *fi);

int (*bmap) (const char * 、size_t ブロックサイズ、uint64_t *idx);

int (*ioctl) (const char *, int cmd, void *arg,

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

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

struct furuse_pollhandle *ph, unsigned *reventsp);

int (*write_buf) (const char *, struct furuse_bufvec *buf, off_t off,struct furuse_file_info *);

int (*read_buf) (const char *, struct furuse_bufvec **bufp,

size_t サイズ, off_t off, structfusion_file_info *);

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

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

};

fuse库译

1.取り付け:

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

(2)make

(3)make install

2.加下驱动

加下fuse.ko模块” modprobeヒューズ」、その後、例目录の下にあるfusexmp.c

内核源コード解析

内核源コード在:内核源コード/fs/fuse

Linuxヒューズとは何ですか

1.fuse 内部コア モジュールが追加されると、次の初期化手順が使用され、fuse_init 関数 が使用されます。

(1)fuse_fs_init();注:fuse 文ファイル システム、構築fuse_inode 高速保存。

(2)fuse_dev_init(); fuse_req 高速保存を確立し、ヒューズ デバイスの駆動を追加し、ユーザー空間と内部コア空間の間で情報を交換するために使用します。 /sys/fs 項目の下に fuse ポイントを追加し、fuse ポイントの下に接続ポイントを追加します。

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

2.fuse内核モジュール块の卸売時、実行对应の清理工作、见fuse_exit関数

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

(2)fuse_sysfs_cleanup();ヒューズ、接続ポイントを削除します。

(3)fuse_fs_cleanup();注销fuse 文ファイル システム、释放fuse_inode高速保存。

(4)fuse_dev_cleanup();注销fuse デバイス制御プログラム、解放fuse_req高速保存。

3. furuse_conn はヒューズ接続を表します。この構造はユーザー ファイル システムがマウントされるときに生成され、ファイル システムがアンマウントされるときに解放されます。主に各リクエスト キューを管理するために使用されます。カーネルはすべてマウントされたファイル システムは、fuse_conn リンク リストを維持します (fuse ファイル システムは複数回マウントされる可能性があります)。

4. furuse_conn の Connected フィールドは、接続のステータスを示すために使用されます。正常にマウントされた後は 1 になります。ファイル システムがアンマウントされるか、接続が中断されるか、デバイス ドライバーが解放されると、このフィールドはは 0 です。現時点では、この接続 (マウントされたファイル システム) は通常のサービスを提供できません。このフィールドは、fuse_request_send でチェックされ、通常のヒューズ ファイル システムが接続されている場合にのみリクエストが送信されます。

5. Fuse_req & lt; furuse_i.h & gt; の各リクエスト内の Fuse_req & LT; furuse_i.h.h & gt;

6. 各ヒューズの入力パラメータと出力パラメータは 3 つのパラメータをサポートしています。fuse_in およびfusion_out 構造体 の定義を参照してください。パラメータは、 の形式で渡されます。 .fuse_req 構造体を埋めるときは、リクエスト タイプとリクエスト パラメータに応じて、fuse_in のパラメータ数 (numargs) を設定し、パラメータを args 配列に埋め、fuse_out 出力パラメータの数を設定し、出力のアドレスを格納します。 result (ローカル変数 outarg) が args 配列に格納されます。

7. ヒューズ ファイル システムがリクエストの入力パラメータと出力パラメータを設定した後、すべてのインターフェイスは最終的に fuse_request_send を呼び出して、このリクエストを表すfusion_req 構造体のステータス フラグを FUSE_REQ_PENDING に設定し、リクエストを保留中のリンクに追加します。 furuse_conn のリストを参照し、 request_wait_answer を呼び出してリクエストが完了するのを待ちます (待機キューが起動された後、リクエストのステータスが FUSE_REQ_FINISHED かどうかを確認する必要があります)。このリクエストに応答すると、結果はローカル変数 outarg に格納されており、fuse は対応する処理を行って結果を上位層に返します。

8. 各リクエストの furuse_req 構造体には、wait_queue_head_t の waitq フィールドが含まれています。各リクエストが発行されると、まず、fuse_conn の waitq 待機キューを起動し、リクエストが到着したことをユーザー モード デーモンに伝えます。 wait_event_interruptible は、req の waitq でスリープし、FUSE_REQ_FINISHED 条件が true になるまで待機するために呼び出されます。

9. ヒューズ デバイス ドライバーは単純なブロック デバイス ドライバーであり、ユーザー モードとカーネル モードの間でデータを交換するためにヒューズによって使用されます。ヒューズには、ループ内で実行されるユーザー空間デーモンが含まれています。その主なタスクは Call です。 read は、ヒューズ デバイスからのリクエストを読み取ります。リクエストがない場合は、スリープして、fuse_conn の waitq で待機します (前の段落でリクエストが発行された後に、fuse_conn の waitq 待機キューをウェイクアップすることに対応します)。がリクエストの場合は、fuse_conn の保留キューから待機します。最初のリクエスト (前の段落のリクエストの後に、fuse_conn に追加された保留中のリンク リストに対応します) を取り出し、リクエストを処理キューに移動します。関数は、fuse_req の関連情報をユーザー ステートに読み込み、要求に応じてユーザーを呼び出します。ステートで実装されたコールバック関数。その結果を、fuse_dev_write を通じてヒューズ デバイス ドライバーに書き込みます。ユーザー ステート リクエストが完了した後、対応する関数を見つけます。処理キューからfusion_reqを取り出し、その結果をfuse_reqのoutパラメータにコピーし、fuse_reqの状態をFUSE_REQ_FINISHEDに設定してから、fuse_reqのwaitqをウェイクアップします。この時点で、fuse_req が処理され、fuse ファイル システムは上位層に戻ります。

関連する推奨事項: 「Linux ビデオ チュートリアル

以上がLinuxヒューズとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。