如何在不使用libfuse的情况下使用FUSE创建用户空间文件系统?

Cor*_*bin 15 linux fuse

我发现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文档.

更新:我注意到人们投票决定关闭此事.别担心,没有必要这样做.我对自己所希望的文档尚不存在感到满意.我将自己编写文档,发布它,然后在接受的答案中链接到它.希望下一个搜索此文档的人不会失望.

Cor*_*bin 13

(我不接受这个,直到它完成.在此期间,欢迎编辑!)

FUSE会话的基本概要:

  • open()被召唤/dev/fuse.我将调用FD称为控制FD.
  • mount() 使用目标安装点调用,文件系统类型"fuse"用于正常模式,或者"fuseblk"用于块设备模式,选项包括"fd = X",其中X是控制FD.
  • 特定于FUSE的结构在控制FD上反复传输.通信的一般模式遵循请求 - 响应模式,其中程序read()的文件系统命令来自控制FD,然后write()是s响应.
  • umount() 使用目标安装点调用.
  • close() 在控制FD上调用.

尽管如此,人们应该注意一些并发症.首先,mount()几乎总是一个特权系统调用,所以你必须是root用户才能安装FUSE文件系统.但是,正如人们可能已经注意到的那样,FUSE程序通常可以作为非root用户启动!怎么样?

有一个帮手/bin/fusermount,安装了setuid.用法完全没有记录,但这就是我在这里的用途.取而代之的open()荷兰国际集团/dev/fuse自己,运行fusermount作为子进程,并传递目标挂载点作为参数,任何额外安装你喜欢的选项-o,以及(关键)与环境变量_FUSE_COMMFD出口,并设置为一个开放的FD,这是我"的ASCII字符串ll调用comm FD.您必须使用eg创建comm FD pipe().fusermount将呼叫open()mount()为您,并使用共享FD的sendmsg()技巧,沿着通信FD共享控制FD .用recvmsg()它来回读.

社论:我真的不明白为什么这个结构太难了.FD由子过程继承; open()在顶级过程中控制FD 会更容易并将其传递给fusermount.确实,有一些混乱的副危险,但fusermount已经安装和setuid和危险.

无论如何!一旦你的主要过程退出,fusermount它将粗暴地守护并负责打电话umount()close()清理.

尚未涵盖的事项:

  • 如何处理对FUSE的非阻塞访问?控制FD能否被踢进非阻塞模式?它实际上是否阻止,或者它是否像普通文件一样,并且在访问时秘密阻止?
  • 结构布局.这些可以或多或少地从C或Go源重新发现,但这不是借口.当我完成了足够的受虐狂时,我会更认真地记录它们.