fuse的一些理解 備忘

2021-06-08 13:24:51 字數 2129 閱讀 4665

fuse是filesystem in user space,它是乙個使用者空間的檔案系統框架,通過fuse,程式設計師可以再使用者態實現檔案系統,並且不需要特權使用者的支援。

fuse包括三個模組:核心模組,使用者空間庫以及mount工具。

核心模組實現了乙個完整檔案系統的框架,但具體操作沒有實現(由程式設計師在使用者空間實現);

使用者空間庫給程式設計師提供程式設計介面,程式設計師通過實現fuse提供的fuse_operations或fuse_ll_operations的所有或部分操作來實現檔案系統。

mount工具fusermount用於掛載用fuse實現的檔案系統。

fuse原始碼中提供了幾個簡單的例子,在 src/example目錄下,用以示範如何用fuse開發使用者空間的檔案系統。 

null.c,hello.c: 乙個簡單的使用fuse的例子,演示了使用fuse建立本地使用者空間檔案系統的基本過程

hello_ll.c: 與上述hello.c例項實現的功能一樣,只不過在具體實現**中呼叫了更加低層的fuse函式來完成

fu***mp.c:這個例項實現了用fuse完全掛載本地檔案系統掛載到使用者空間檔案系統的過程,展示了比較完成的fuse的使用過程。

fu***mp_fh.c: 這個例項是上面"./fu***mp"的擴充套件(使得基於fuse的這個檔案系統更加的完善,例如: 增加了"fflush"、"lock"等的支援)

fuse原始碼比較重要的一些檔案:

kernel/inode.c   ---> 主要完成fuse檔案驅動模組的註冊,提供對supper block的維護函式以及其它(驅動的組織開始檔案)

kernel/dev.c     ---> fuse 的(虛擬)裝置驅動

kernel/control.c ---> 提供對於dentry的維護及其它

kernel/dir.c   ---> 主要提供對於目錄inode索引節點的維護

kernel/file.c    ---> 主要提供對於檔案inode索引節點的維護

lib/helper.c  ---> "fuse_main()"呼叫的主入口

lib/fuse_kern_chan.c--->主要實現fuse應用層訪問(讀寫)fuse driver的功能     

lib/mount_util.c --> 提供mount的基礎函式呼叫

lib/mount.c  ---> 主要實現裝置的"mount"、"umount"等掛接操作

lib/mount_bsd.c ---> 「free bsd"下的"mount"、"umount"實現

lib/fuse_mt.c  ---> fuse 的mount管理

lib/fuse.c   ---> lib庫主框架檔案,實現了主要框架及對"使用者實現的檔案系統操作**"的封裝

lib/fuse_lowlevel.c  --> 實現比較底層的函式封裝,供fuse.c等使用

lib/fuse_loop.c ---> fuse lib迴圈監視"fuse driver"的通訊快取

lib/fuse_loop_mt.c ---> 同上

lib/fuse_session.c ---> fuse會話管理

關鍵的結構體說明:

struct fuse_req(fuse_i.h) ---> 發往客戶端的請求

struct fuse_session(fuse_session.c) ---> 客戶端管理會話的結構體,其包含"struct fuse_chan"結構

struct fuse_chan(fuse_session.c) ---> 定義客戶端與fuse核心連線隧道的結構體

特別說明:這裡的連線隧道不是什麼具體的網路連線,而是客戶端通過fuse裝置驅動來讀寫 裝置快取(以與裝置互動的一條概念上的隧道

fusermount 提供一系列掛載選項,如direct_io(跳過頁快取),allow_root(允許root訪問掛載的檔案系統),allow_other(允許其他 使用者訪問掛載的檔案系統),nonempty(允許把檔案系統掛載到非空目錄),big_writes(支援大於4k的寫操作)等

fuse呼叫流程:

JSTL一些備忘

1 tagsupport與bodytagsupport的區別 tagsupport與bodytagsupport的區別主要是標籤處理類是否需要與標籤體互動,如果不需要互動的就用tagsupport,否則如果不需要互動就用bodytagsupport。互動就是標籤處理類是否要讀取標籤體的內容和改變標籤...

一些 命令備忘

set ansi nulls on go set quoted identifier on go 是什麼意思?這些是 sql 92 設定語句,使 sql server 2000 2005 遵從 sql 92 規則。當 set quoted identifier 為 on 時,識別符號可以由雙引號分隔...

git一些備忘

git上傳命令 進入dos介面在專案根目錄路徑下 檢視檔案狀態 git status 在專案目錄下 git add 繼續 git commit m 上傳描述 繼續 git push 本地分支管理 檢視所有分支 git branch a 當前分支與目標分支合併 git merge 目標分支 刪除分支 ...