當從程序中要求的保險絲管理目錄打電話給open
系統調用,創建一個空文件(O_WRONLY | O_CREAT | O_TRUNC
),從我的FUSE文件系統實現以下功能被執行:FUSE開放的系統調用機制
getattr
(返回錯誤,因爲文件不存在)create
fgetattr
我的問題是:
這些函數調用對於Linux中的所有文件系統(包括本機文件系統,如ext4)通用,還是FUSE內部行爲?
當strace
- 在程序中,我只能看到一個open
系統調用。
當從程序中要求的保險絲管理目錄打電話給open
系統調用,創建一個空文件(O_WRONLY | O_CREAT | O_TRUNC
),從我的FUSE文件系統實現以下功能被執行:FUSE開放的系統調用機制
getattr
(返回錯誤,因爲文件不存在)create
fgetattr
我的問題是:
這些函數調用對於Linux中的所有文件系統(包括本機文件系統,如ext4)通用,還是FUSE內部行爲?
當strace
- 在程序中,我只能看到一個open
系統調用。
經過幾天的研究和盯着Linux內核和FUSE源代碼,我瞭解到發生了什麼。
首先,我要說的是,release
fgetattr
後未執行open
系統調用時調用close
時執行,但是。所以我編輯了我的問題刪除它。
那麼,我的主要問題是,strace
顯示我打電話給open
系統調用,但我的FUSE程序日誌顯示三個函數被執行。因此我對其他文件系統的問題。
在Linux kernel documentation我們可以看到內核VFS詳細解釋:
要查找一個inode要求VFS調用的 父目錄inode的lookup()方法。這個方法是由inode所在的特定的 文件系統實現安裝的。一旦VFS具有 所需的dentry(以及因此inode),我們就可以完成所有那些無聊的事情,如open(2)文件或stat( 2)
即,在文件系統FUSE,指lookup
呼叫在低電平API,或在高水平API一個getattr
(因爲i節點路徑平移由libfuse處理)。用戶級代碼。其他系統調用,如mkdir
或open
與O_CREAT
標誌,也需要一個lookup
,在這種情況下確認負分區之前做任何事情。點1解決。
你得到的dentry不應該有一個inode(即它應該是一個負dentry)。
實現到內核中的文件系統,如ext4,也執行它們的功能,以lookup
。但你不能從常見的工具(如strace
)(你需要像kernelshark,awesome stuff之類的東西)看到它們。
見ext4 lookup function(我運行一個Linux內核3.13)
點3的fgetattr
函數調用更關係到libfuse內部。我不知道確切的原因,但在執行如mkdir
或create
之類的函數後,由libfuse執行lookup
。請記住,在高級API中,lookup
是getattr
(或fgetattr
,用於創建的文件)。我認爲這是由於文件/目錄屬性檢查。
您可以在libfuse source code的行動中看到它的創建功能。
加分:請記住,FUSE使用文件屬性(和條目)緩存。如果您將-o attr_timeout
安裝選項設置爲0秒,某些調用如stat
會將兩個getattr
提升到高級API。