1 个稳定版本
1.4.0 | 2022年2月7日 |
---|---|
1.3.0 |
|
#790 in 文件系统
645KB
13K SLoC
Rust FUSE 库,用于服务器、virtio-fs 和 vhost-user-fs
设计
fuse-backend-rs 包是一个 Rust 库,用于基于 Linux FUSE 设备 (/dev/fuse) 或 virtiofs 草案规范实现 Fuse 守护进程。
Linux FUSE 是一个用户空间文件系统框架,/dev/fuse 设备节点是用户空间文件系统守护进程与内核中 fuse 驱动程序通信的接口。
而 virtio-fs 规范将 FUSE 框架扩展到虚拟化领域,它使用 Virtio 协议在 FUSE 客户端和服务器之间传输 FUSE 请求和响应。有了 virtio-fs,FUSE 客户端在客户机内核中运行,而 FUSE 服务器在主机用户空间或硬件上运行。
因此,fuse-rs 包是一个与 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 许可证
依赖
~2.6–3.5MB
~70K SLoC