[英]How can I get more detailed filesystem information on FUSE filesystems?
[英]How can I create a userspace filesystem with FUSE without using libfuse?
我發現FUSE用戶空間庫和內核接口已經從Linux開始,移植到許多其他系統,並提供了一個相對穩定的API,具有可能的小表面積。 如果我想在用戶空間中創建文件系統,而我不在計划9或赫德,我會認為FUSE是我的最佳選擇。
但是,我不打算使用libfuse。 這部分是因為實用主義; 使用C很難用我選擇的語言(Monte)。 這也是因為我對編寫C支持代碼完全不感興趣,並且libfuse的推薦用法與Monte哲學不兼容。 這應該不是問題,因為C不是神奇的,並且可以使用標准系統調用打開/ dev / fuse。
然而,要找文件,我找不到。 我沒有找到/ dev / fuse ABI / API的文檔,也沒有其他人使用相同的非C-bound路由的故事。 令人沮喪。
是否有任何類型的文檔存在如何與語言無關的方式與/ dev / fuse和內核的FUSE子系統進行交互? 如果是這樣,你能指點我嗎? 謝謝!
更新:存在go-fuse ,它在Go中,是一種比C更易讀的語言。但是,它也不包含任何ABI / API文檔。
更新:我注意到人們投票決定關閉此事。 別擔心,沒有必要這樣做。 我對自己所希望的文檔尚不存在感到滿意。 我將自己編寫文檔,發布它,然后在接受的答案中鏈接到它。 希望下一個搜索此文檔的人不會失望。
(我不接受這個,直到它完成。在此期間,歡迎編輯!)
FUSE會話的基本概要:
/dev/fuse
上調用open()
。 我將調用FD稱為控制FD 。 mount()
用目標安裝點調用,文件系統類型為“fuse”用於正常模式或“fuseblk”用於塊設備模式,選項包括“fd = X”,其中X是控制FD。 read()
s文件系統命令,然后返回write()
s響應。 umount()
。 close()
。 盡管如此,人們應該注意一些並發症。 首先, mount()
幾乎總是特權系統調用,因此您必須是root用戶才能安裝FUSE文件系統。 但是,正如人們可能已經注意到的那樣,FUSE程序通常可以作為非root用戶啟動! 怎么樣?
有一個幫手, /bin/fusermount
,安裝了setuid。 用法完全沒有記錄,但這就是我在這里的用途。 不要open()
/dev/fuse
自己, fusermount
作為子fusermount
運行,將目標掛載點作為參數傳遞,使用-o
任何額外的掛載選項,並且(至關重要)將環境變量_FUSE_COMMFD
導出並設置為打開FD的ASCII字符串,我將其稱為comm FD 。 您必須使用例如pipe()
自己創建comm FD。 fusermount
將為您調用open()
和mount()
,並使用sendmsg()
技巧共享FD,從而沿着comm FD共享控制FD。 使用recvmsg()
將其讀回。
社論:我真的不明白為什么這個結構太難了。 FD由子過程繼承; open()
頂部過程中的控制FD並將其傳遞到fusermount
。 確實,有一些混亂的副危險,但fusermount
已經安裝和setuid和危險。
無論如何! 一旦主進程退出, fusermount
將粗略地守護並負責調用umount()
和close()
來清理。
尚未涵蓋的事項:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.