在Linux中,fuse是指用戶態檔案系統,是用於支援用戶空間檔案系統的核心模組;fuse是實現在用戶空間的檔案系統框架,透過FUSE核心模組的支持,使用者只需要根據fuse提供的介面實作具體的檔案操作就可以實作一個檔案系統。
本教學操作環境:linux7.3系統、Dell G3電腦。
linux fuse是什麼
Linux用來支援使用者空間檔案系統的核心模組名叫FUSE ,FUSE一詞有時特指Linux下的使用者空間檔案系統。
是一個通用作業系統重要的組成部分。傳統上作業系統在核心層面上對檔案系統提供支援。而通常內核態的程式碼難以調試,生產率較低。
Linux從2.6.14版本開始透過FUSE模組支援在使用者空間實作檔案系統。
在使用者空間實現檔案系統能夠大幅提高生產率,簡化了為作業系統提供新的檔案系統的工作量,特別適用於各種虛擬檔案系統和網路檔案系統。上述ZFS和glusterfs都屬於網路檔案系統。但是,在使用者態實作檔案系統必然會引入額外的核心態/使用者態切換所帶來的開銷,對效能會產生一定影響。
fuse主要作用:監控某個檔案或資料夾的變化,可以對其他行程在此資料夾或檔案中寫入或讀取的東西增加自訂資訊。
總結:
FUSE (使用者狀態檔案系統)是實作在使用者空間的檔案系統框架,透過FUSE核心模組的支持,使用者只需要根據fuse 提供的介面實作具體的檔案操作就可以實作一個檔案系統。
FUSE 由三個部分組成,FUSE 核心模組,FUSE 函式庫以及一些掛在工具。 FUSE 核心模組實現了和VFS 的對接,它看起來像一個普通的檔案系統模組,另外FUSE 核心模組實現了一個可以被用戶空間進程打開的設備,當VFS 發來檔案操作請求之後,它將該請求轉換為特定格式,並透過裝置傳遞給使用者空間進程,使用者空間進程在處理完請求後,將結果傳回給FUSE 核心模組,核心模組再還原為Linux Kernel 所需的格式,並傳回VFS。
FUSE 庫負責和內核空間的通信,它接收來自/dev/fuse 的請求,並將其轉化為一系列的函數調用,並將結果寫回到/dev/fuse。
struct fuse_operations {
int (*getattr) (const char *, struct stat *, struct fuse_file_info *fi);
int (*readlink) (
# int (*readlink) (const#charsize), *#chart,int (*mknod) (const char *, mode_t, dev_t);
int (*mkd. char *);
int (*rmdir) (const char *);
int (*symlink) (con *rename) (const char *, const char *, unsigned int);
int (*link) (const char *, const char *);
## char *, mode_t, struct fuse_file_info *fi); int (*chown) (const char *, uid_t, gid_t, struct fuse_file_info *fi);##> char *, off_t, struct fuse_file_info *fi); int (*open) (const char *, struct fuse_file_info *);## char. , size_t, off_t, struct fuse_file_info *);
int (*write) (const char *, const char *, size_o, . (const char *, struct statvfs *);
int (*flush) (const char *, struct fuse_file_info *);
int (*release) (const char *, struct fusion_file_info *);
int (*fsync) (const char *, int, structstruct 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 (*removex attr) (const char, con int (*removex attr) (const char, constst char); (const char *, struct fusion_file_info *);# int (*readdir) (const char *, void *, fusion_fill_int (*releasedir) (const char *, struct fusion_file_info *); int (*fsyncdir) (const char *, int, struct fusion_file_info *); void
(
init) (struct fusion_conn_info *conn,struct fusion_config *cfg); void (*destroy) (void *. , int); int (*create) (const char *, mode_t, struct fusion_file_info *);## struct farm *); int (*utimens) (const char *, const struct timespec tv[2], struct fusion_file_info *fi);
st , size_t 區塊大小, uint64_t *idx); int (*ioctl) (const char *, int cmd, void *arg .# ) ; int (*poll) (const char *, struct fusion_file_info *,## ( const char *, struct fusion_bufvec *buf, off_t off,struct fusion_file_info *);
int (*read_buf) (const. off , struct fusion_file_info *);
int (*flock) (const char *, struct fusion_file_info *, int op);
## , c . off_t ,struct fusion_file_info *);};#fuse函式庫編譯
##1.安裝:
#(1). / configure --prefix=/usr
(2)make
(3)make install
2.載入驅動程式
## 載入fuse.ko模組“ modprobe fusion”,然後在切換到example目錄下編譯fusexmp.c#內核源碼解析
內核原始碼在:內核源碼/fs/fuse 1.fuse核心模組載入時,下列初始化範例程式會被調用,請參閱fuse_init函數
o) ;註冊fuse檔案系統,建立fuse_inode快取。
(2)fuse_dev_init();建立fuse_req快取,載入fuse裝置驅動,用於使用者空間與核心空間交換資訊。
(3)fuse_sysfs_init();在/sys/fs目錄下增加fuse節點,在fuse節點下增加connections節點。
(4)fuse_ctl_init();註冊fuse控制檔案系統
2.fuse核心模組卸載時,執行對應的清理工作,請參閱fuse_exit函數
(3)fuse_fs_cleanup();註銷fuse檔案系統,釋放fuse_inode快取。
(4)fuse_dev_cleanup();註銷fuse設備驅動程序,釋放fuse_req高速緩存。
3. fuse_conn
4.fuse_conn的connected欄位用於表示連線的狀態,成功掛載後為1,當檔案系統被卸載,連線中斷或是裝置驅動被釋放後,此欄位為0,此時這個connection(掛載的檔案系統)不能提供正常服務。在fuse_request_send中會檢查該字段,只有連接正常fuse檔案系統才會發送請求。
5.fuse中每個請求以一個fuse_req
6.每個fuse的輸入、輸出參數都支援三個參數,請參閱fuse_in、fuse_out結構的定義
7.當fuse文件系統設置好請求輸入輸出參數之後,所有接口最後都會調用fuse_request_send將代表本次請求的fuse_req結構的狀態標誌設置為FUSE_REQ_PENDING,將請求加到fuse_conn的pending鍊錶中,並呼叫request_wait_answer等待請求完成(等待佇列被喚醒後,需要檢查請求狀態是否為FUSE_REQ_FINISHED)。當本次請求被回應後,結果已經被存放在局部變數outarg中,fuse進行對應的處理即可向上層傳回結果。
8.在每個請求fuse_req結構中包含一個wait_queue_head_t的waitq字段,每個請求在發出之後,它首先會喚醒fuse_conn的waitq等待隊列,告訴用戶態守護程序有請求達到;然後其會呼叫wait_event_interruptible在req的waitq上睡眠等待FUSE_REQ_FINISHED條件變成真。
9.fuse裝置驅動程式是簡單區塊裝置驅動程序,用於fuse在使用者態和核心態之間交換數據,fuse包含一個使用者空間的守護程序,其一直循環運行,主要任務是呼叫read從fuse設備上讀取請求,當沒有請求時,它會在fuse_conn的waitq上睡眠等待(對應上一段中請求發出後喚醒fuse_conn的waitq等待隊列),當有請求是其從fuse_conn的pengding隊列中取出最前面的一個請求(對應上一段中請求發出後加到fuse_conn的pending鍊錶),並將該請求移動到processing隊列中,守護程序將fuse_req的相關信息讀到用戶態後,根據請求表示調用用戶態實現的回呼函數,並將結果透過fuse_dev_write寫到fuse裝置驅動,用戶態請求完成後,從processing佇列中找到對應的fuse_req,將結果拷貝到fuse_req的out參數中,並將fuse_req的state設為FUSE_REQ_FINISHED ,然後喚醒fuse_req的waitq。此時,fuse_req被處理完畢,fuse檔案系統向上層返回。
相關推薦:《Linux影片教學》
以上是linux fuse是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!