Fuse(filesystem in userspace),是一個用戶空間的文件系統。通過fuse內核模塊的支持,開發者只需要根據fuse提供的接口實現具體的文件操作時所對應的回調函數,就可以實現一個文件系統。由于其主要實現代碼位于用戶空間中,因此不需要重新編譯內核。
Fuse的運行原理
Fuse包含一個內核模塊和一個用戶空間守護進程(下文稱fuse daemon)。內核模塊加載時被注冊成 Linux 虛擬文件系統的一個 fuse 文件系統驅動。此外,還注冊了一個/dev/fuse的字符設備。
$ ls /dev/fuse -al
crw-rw-rw- 1 root root 10, 229 ?7月 13 12:51 /dev/fuse
該設備作為fuse daemon與內核通信的橋梁,fuse daemon通過/dev/fuse讀取fuse request,處理后將reply寫回/dev/fuse。
用戶空間與內核空間的交互流程是這樣:
1.用戶開發基于libfuse的戶空間文件系統程序,該程序會提供對文件系統操作,比如打開關閉,讀寫操作的回調函數。
2.當有應用程序操作通過fuse掛載的文件系統時,VFS會將這些操作路由至fuse的內核模塊,也就是fuse driver,fuse driver創建了一個fuse request結構體,并把request保存在請求隊列中。此時,執行操作的應用程序進程會被阻塞。
3.fuse daemon通過讀取/dev/fuse將request從內核隊列中取出,根據操作調用步驟1中注冊的相應回調,也就是回調會具體處理對fuse文件系統的操作請求,當處理完請求后,fuse daemon會將reply通過/dev/fuse傳遞給fuse driver,此后fuse daemon把requset標記為completed,最終喚醒用戶進程。