3 个版本

使用旧 Rust 2015

0.4.2-alpha2019年1月3日
0.4.1-alpha2019年1月3日
0.4.0-alpha2019年1月3日

文件系统 中排名第 1520

每月下载量 21

MIT 许可证

99KB
1.5K SLoC

Rust FUSE - 用户空间文件系统

Build Status Crates.io MIT License

关于

Rust 库,用于轻松实现 FUSE 文件系统。

该库不仅提供绑定,而且实际上是对原始 FUSE C 库的改进重写,以充分利用 Rust 的架构。

文档

Rust-FUSE 参考

详情

一个工作的 FUSE 文件系统由三部分组成

  1. 注册为文件系统并将操作转发到处理它们的用户空间进程的通信通道的内核驱动程序。
  2. 帮助用户空间进程建立和运行与内核驱动程序的通信的用户空间库 (libfuse)。
  3. 实际处理文件系统操作的用户空间实现。

内核驱动程序由 FUSE 项目提供,用户空间实现需要由开发者提供。这个 Rust 库在两个之间提供了一个 libfuse 用户空间库的替代品。这样,开发者可以在 Rust 中构建 FUSE 文件系统时充分利用 Rust 的类型接口和运行时功能。

除了对 libfuse 的单个设置(挂载)函数调用和一个最终的拆卸(卸载)函数调用之外,所有操作都在 Rust 中运行。

依赖项

要运行挂载 FUSE 文件系统的程序,目标系统需要正确安装 FUSE(macOS 上的 OSXFUSE)。这意味着内核驱动程序和库。某些平台可能还需要用户空间工具,如 fusermount。Linux 上 fuse 软件包的默认安装、FreeBSD 上的 fusefs-libs 或 macOS 上的 OSXFUSE 通常足够。

要构建,主机系统需要安装 FUSE 库和头文件。在 Linux 上,头文件包通常称为 libfuse-dev。在 FreeBSD 和 macOS 上,fusefs-libs/OSXFUSE 安装了所需的所有内容。构建过程还需要 pkg-config 来定位头文件和库。

用法

将以下内容放入您的 Cargo.toml

[dependencies]
fuse = "0.3"

并在您的 crate 根目录中

extern crate fuse;

要创建一个新的文件系统,实现Filesystem特质。内核的文件系统操作会被调度到Filesystem特质的相应方法中。大多数方法都有一个reply参数,必须使用它来最终回答请求。所有方法都有默认实现,以中性答案回复,所以如果您根本不实现任何方法,仍然会得到一个什么也不做的可挂载文件系统。

要实际挂载文件系统,将实现Filesystem的对象以及挂载点的路径传递给mount函数。mount函数将一直返回,直到文件系统被卸载。

要挂载文件系统并继续运行其他代码,请使用spawn_mount而不是mountspawn_mount会启动一个后台线程来处理文件系统挂载时的操作。它返回一个句柄,应该存储以引用挂载的文件系统。如果句柄被丢弃,文件系统将被卸载。

要卸载文件系统,使用您操作系统中的任意卸载/弹出方法。

请参阅示例目录以获取一些基本示例。

待办事项

还有很多事情要做。请随时贡献。

  • 尚未处理中断文件系统操作。
  • 还需要一个额外的更高级的API。它应该提供路径名而不是inode号,并自动处理并发和中断(如FUSE C库的高级API)。

一般来说,请参阅GitHub上的问题列表,并在源文件中搜索包含"TODO"或"FIXME"注释的内容,以了解仍有哪些缺失。

兼容性

在macOS上使用OSXFUSE和Linux上使用FUSE开发和测试,使用稳定、测试版和夜间Rust版本(详细信息请参阅Travis CI)。

FreeBSD也可以工作,但在CI中未进行测试。

依赖项

~0.8–1.2MB
~18K SLoC