FUSE分析總結 (

http://blog.chinaunix.net/uid-8350672-id-2031703.html
>> FUSE
簡介及原理


    FUSEFilesystem in Userspace)是sourceforge上的一個開源項目,它可以爲用戶提供編寫用戶態文件系統的接口。使用FUSE,用戶可以不必熟悉Kernel代碼,使用標準C庫、FUSE庫以及GNU C庫便可設計出自己需要的文件系統。

FUSE由三個部分組成:FUSE內核模塊、FUSE庫以及一些掛載工具。

FUSE內核模塊實現了和VFS的對接,它看起來像一個普通的文件系統模塊;另外,FUSE內核模塊實現了一個可以被用戶空間進程打開的設備,當VFS發來文件操作請求之後,它將該請求轉化爲特定格式,並通過設備傳遞給用戶空間進程,用戶空間進程在處理完請求後,將結果返回給FUSE內核模塊,內核模塊再將其還原爲Linux kernel需要的格式,並返回給VFS。如下圖所示:

1.0 FUSE內核模塊


FUSE庫負責和內核空間的通信,它接收來自/dev/fuse的請求,並將其轉化爲一系列的函數調用,並將結果寫回到/dev/fuse

掛載工具用以實現對用戶態文件系統的掛載。

FUSE的作用可通過下面兩幅圖說明:

1.1 Ext4文件系統的文件操作流程


上圖爲Ext4文件系統的文件操作流程,當系統用戶在輸入ls /home/kelvin命令之後,最終會調用到Ext4文件系統內的相關函數來對文件進行處理,並將結果返回。

1.2 用戶態文件系統的文件操作流程


上圖是基於FUSE所寫的一個用戶態文件系統tfs的文件操作流程,系統用戶在該文件系統(/tmp/fusetfs的掛載點)內所執行的ls –l /tmp/fuse命令通過FUSE最終會調用到tfs裏所寫的鉤子函數。這樣,通過FUSE,可以在用戶態設計並實現自己的文件系統,而不必瞭解kernel的代碼編寫規範。


>> FUSE代碼編寫規範


FUSE給用戶提供了fuse_operations結構體,用戶可實現具體的鉤子函數,然後將這些鉤子函數掛載到該結構體。main()函數只需調用fuse_main()就可以了,其他的工作交給FUSE去做。

1.3 用戶態文件系統代碼編寫框架





>> fuse_main()的處理流程


1.4 fuse_main()函數的處理流程


fuse_main()被調用後,它調用fuse_mount(),創建新的進程fusermount,來檢查FUSE內核模塊是否加載,並返回文件描述符給fuse_main()fuse_new()爲文件系統分配數據空間。fuse_loop()/dev/fuse 讀取文件系統調用,調用fuse_operations結構中的處理函數,返回調用結果給/dev/fuse



>> 使用FUSE的注意事項

#FUSE的作用在於使用戶能夠繞開內核代碼來編寫文件系統,可文件系統如果要實現對具體的設備的操作的話必須要使用設備驅動提供的接口,而設備驅動位於內核空間,FUSE便無法將文件系統掛載到具體設備上去。所以,基於FUSE所寫的文件系統通常是將文件當做虛擬的磁盤,並使用C所提供的文件操作接口;或者是映射一個目錄到文件系統。

#FUSE給各鉤子函數傳遞的path參數的/指的是文件系統的/目錄。


更詳細的分析 參考 http://wenku.baidu.com/view/21caa7fb770bf78a652954ea.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章