#fuse #virtio #virtio-fs #client-server #userspace #vhost-fs

fuse-backend-rs

Rust 编写的用于 FUSE(用户空间文件系统)服务器和 virtio-fs 设备的库

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文件系统

Download history 1375/week @ 2024-03-25 1082/week @ 2024-04-01 1189/week @ 2024-04-08 1477/week @ 2024-04-15 1503/week @ 2024-04-22 1147/week @ 2024-04-29 1269/week @ 2024-05-06 1351/week @ 2024-05-13 1510/week @ 2024-05-20 1554/week @ 2024-05-27 1080/week @ 2024-06-03 1518/week @ 2024-06-10 1305/week @ 2024-06-17 1511/week @ 2024-06-24 1589/week @ 2024-07-01 1636/week @ 2024-07-08

6,107 每月下载量
用于 7 个 Crates(6 个直接使用)

Apache-2.0 AND BSD-3-Clause

1MB
21K SLoC

Rust FUSE 库,用于服务器、virtio-fs 和 vhost-user-fs

Crates.io Crates.io

设计

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 设备支持多个文件系统。
  • 一个示例透明文件系统实现,将文件从守护进程传递到客户端。

arch

示例

文件系统驱动程序

FUSE 服务器

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(())
    }
}

许可证

本项目采用

依赖关系

~3–15MB
~142K SLoC