21 个版本
0.12.0 | 2024 年 3 月 12 日 |
---|---|
0.11.0 | 2023 年 10 月 31 日 |
0.10.5 | 2023 年 8 月 3 日 |
0.10.4 | 2023 年 6 月 16 日 |
0.1.1 | 2021 年 2 月 13 日 |
62 在 文件系统 中
6,107 每月下载量
用于 7 个 Crates(6 个直接使用)
1MB
21K SLoC
Rust FUSE 库,用于服务器、virtio-fs 和 vhost-user-fs
设计
fuse-backend-rs crate 是一个 Rust 库,用于实现基于 Linux FUSE 设备 (/dev/fuse) 或 virtiofs 草案规范的 Fuse 守护进程。
Linux FUSE 是一个用户空间文件系统框架,/dev/fuse 设备节点是用户空间文件系统守护进程与内核中 FUSE 驱动程序通信的接口。
virtio-fs 规范将 FUSE 框架扩展到虚拟化世界,它使用 Virtio 协议在 FUSE 客户端和服务器之间传输 FUSE 请求和响应。借助 virtio-fs,FUSE 客户端在虚拟机内核中运行,而 FUSE 服务器在主机用户空间或硬件上运行。
因此,fuse-rs crate 是一个用于与 Linux FUSE 客户端通信的库,包括
- ABI 层,定义了 Linux FUSE 框架和 Fuse 守护进程之间共享的所有数据结构。
- API 层,定义了 Fuse 守护进程实现用户空间文件系统的接口。
- 传输层,支持 Linux FUSE 设备和 virtio-fs 协议。
- VFS/pseudo_fs,一个抽象层,用于通过单个 virtio-fs 设备支持多个文件系统。
- 一个示例透明文件系统实现,将文件从守护进程传递到客户端。
示例
文件系统驱动程序
FUSE 服务器
- Dragonfly 图像服务 fusedev 服务器,以 fuse-backend-rs 包为例实现基于 FUSE 服务器的示例。
- Dragonfly 图像服务 vhost-user-fs 服务器,以 fuse-backend-rs 包为例实现基于 vhost-user-fs 服务器。
FUSE 服务器和主服务循环
基于 Linux FUSE 设备 (/dev/fuse) 的示例 FUSE 服务器
use fuse_backend_rs::api::{server::Server, Vfs, VfsOptions};
use fuse_backend_rs::transport::fusedev::{FuseSession, FuseChannel};
struct FuseServer {
server: Arc<Server<Arc<Vfs>>>,
ch: FuseChannel,
}
impl FuseServer {
fn svc_loop(&self) -> Result<()> {
// Given error EBADF, it means kernel has shut down this session.
let _ebadf = std::io::Error::from_raw_os_error(libc::EBADF);
loop {
if let Some((reader, writer)) = self
.ch
.get_request()
.map_err(|_| std::io::Error::from_raw_os_error(libc::EINVAL))?
{
if let Err(e) = self.server.handle_message(reader, writer, None, None) {
match e {
fuse_backend_rs::Error::EncodeMessage(_ebadf) => {
break;
}
_ => {
error!("Handling fuse message failed");
continue;
}
}
}
} else {
info!("fuse server exits");
break;
}
}
Ok(())
}
}
许可证
本项目采用
- Apache 许可证,版本 2.0
- BSD-3-Clause 许可证
依赖关系
~3–15MB
~142K SLoC