用户可用来开发用户空间文件系统,实现文件系统功能并导出给Linux内核。项目提供高低级API,支持同步和异步请求处理,包含示例文件系统,适配Linux和BSD平台,广泛应用于各Linux发行版。【此简介由AI生成】
libfuse
关于
FUSE(用户空间文件系统)是一个供用户空间程序向 Linux 内核导出文件系统的接口。FUSE 项目包含两个组件:fuse 内核模块(在常规内核仓库中维护)和 libfuse 用户空间库(在此仓库中维护)。libfuse 提供了与 FUSE 内核模块通信的参考实现。
FUSE 文件系统通常实现为一个独立的应用程序,并与 libfuse 链接。libfuse 提供用于挂载文件系统、卸载文件系统、从内核读取请求以及发送响应的函数。libfuse 提供两种 API:“高级”同步 API 和“低级”异步 API。在这两种情况下,来自内核的传入请求都通过回调函数传递给主程序。使用高级 API 时,回调函数可以处理文件名和路径而非 inode,并且请求的处理在回调函数返回时完成。使用低级 API 时,回调函数必须处理 inode,并且必须使用一组单独的 API 函数显式发送响应。
开发状态
libfuse 已被所有主要的 Linux 发行版采用,并已在各种系统上投入生产使用多年。然而,目前 libfuse 没有任何活跃的、定期的贡献者。当前维护者会继续处理拉取请求并进行定期发布,但遗憾的是,除了解决高影响问题外,没有能力进行任何开发工作。报告错误时,请注意,除非您附带拉取请求或报告的是严重问题,否则您可能不会收到回复。如果您正在使用 libfuse,请考虑为该项目做出贡献。
支持的平台
- Linux(完全支持)
- BSD(大部分支持/尽力支持)
- 对于 OS-X,请使用 OSXFUSE
安装
您可以从 https://github.com/libfuse/libfuse/releases 下载 libfuse。要构建和安装,您必须使用 Meson 和 Ninja。下载 tarball 和 .sig 文件后,使用 signify 进行验证:
signify -V -m fuse-X.Y.Z.tar.gz -p fuse-X.Y.pub
fuse-X.Y.pub 文件包含签名密钥,需要从可信来源获取。每个 libfuse 版本的 signify 目录中都包含下一个版本的签名密钥,因此您在首次安装 libfuse 时只需手动获取一次此文件。
验证 tarball 后,解压缩它,创建一个(临时)构建目录并运行 Meson:
$ tar xzf fuse-X.Y.Z.tar.gz; cd fuse-X.Y.Z $ mkdir build; cd build $ meson setup ..
通常,默认的构建选项工作正常。如果您仍想调整它们,可以使用 meson configure 命令:
$ meson configure # 列出选项 $ meson configure -D disable-mtab=true # 设置一个选项
$ # 确保所有 meson 选项都应用于最终的构建系统
$ meson setup --reconfigure ../
然后,使用 Ninja 构建、测试和安装 libfuse:
$ ninja $ sudo python3 -m pytest test/ $ sudo ninja install
运行测试需要 py.test Python 模块。如果先将 util/fusermount3 设置为 setuid root,大多数测试也可以以普通用户身份运行,而无需以 root 身份运行:
$ sudo chown root:root util/fusermount3 $ sudo chmod 4755 util/fusermount3 $ python3 -m pytest test/
安全影响
fusermount3 程序以 setuid root 权限安装。这样做是为了允许普通用户挂载他们自己的文件系统实现。
为了限制恶意用户通过这种方式可能造成的危害,fusermount3 实施了以下限制:
-
用户只能在其拥有写入权限的挂载点上进行挂载
-
挂载点不能是不属于用户的粘性目录(如通常情况下的 /tmp)
-
其他任何用户(包括 root)都无法访问已挂载文件系统的内容(不过,通过在 /etc/fuse.conf 中允许使用 allow_other 和 allow_root 挂载选项,可以放宽此限制)
-
如果您打算使用 allow_other 挂载选项,请注意 FUSE 存在一个未解决的安全漏洞:如果未使用 default_permissions 挂载选项,文件系统对某个目录项执行的首次权限检查结果,将在该访问项的 inode 存在于内核缓存期间被重复用于后续访问——即使此后权限已发生更改,即使后续访问是由不同用户发起的。如果文件系统仅对挂载用户可访问(该用户无论如何都对文件系统拥有完全访问权限),则此问题影响不大,但当允许其他用户访问文件系统时,这就变成了一个安全问题(因为他们可以利用此漏洞对文件系统执行其实际并不具备权限的操作)。
此漏洞需要在 Linux 内核中修复,自 2006 年起就已为人所知,但遗憾的是至今尚未应用任何修复程序。如果您的 FUSE 文件系统依赖于正确的权限处理,唯一的解决方法是使用 default_permissions(目前不支持 ACL),或者完全禁用目录项属性的缓存。
构建您自己的文件系统
FUSE 在 example 目录中附带了多个示例文件系统。例如,passthrough 示例会将根目录的内容镜像到挂载点下。您可以从此类示例入手并对代码进行改编!
API 函数和必要回调的文档主要包含在 include/fuse.h 文件(针对高级 API)和 include/fuse_lowlevel.h 文件(针对低级 API)中。API 的自动生成 HTML 版本可在 doc/html 目录中找到,也可通过 http://libfuse.github.io/doxygen 在线访问。
获取帮助
如果您需要帮助,请通过邮件列表 <fuse-devel@lists.sourceforge.net> 提问(订阅地址:https://lists.sourceforge.net/lists/listinfo/fuse-devel)。
如发现任何缺陷,请在 GitHub 问题跟踪器(地址:https://github.com/libfuse/libfuse/issues)上报告。