簡體   English   中英

如何在不使用libfuse的情況下使用FUSE創建用戶空間文件系統?

[英]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。
  • 特定於FUSE的結構在控制FD上反復傳輸。 通信的一般模式遵循請求 - 響應模式,其中程序從控制FD read() s文件系統命令,然后返回write() s響應。
  • 使用目標安裝點調用umount()
  • 在控制FD上調用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()來清理。

尚未涵蓋的事項:

  • 如何處理對FUSE的非阻塞訪問? 控制FD能否被踢進非阻塞模式? 它實際上是否阻止,或者它是否像普通文件一樣,並且在訪問時秘密阻止?
  • 結構布局。 這些可以或多或少地從C或Go源重新發現,但這不是借口。 當我完成了足夠的受虐狂時,我會更認真地記錄它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM