#fuse #virtio #virtio-fs #linux-kernel #client-server #vhost-fs

my-test-app-bergwolf

A Rust 库,用于实现 Fuse(用户空间文件系统)服务器和 virtio-fs 设备

1 个稳定版本

1.4.0 2022年2月7日
1.3.0 2022年2月7日

#790 in 文件系统

Apache-2.0 AND BSD-3-Clause

645KB
13K SLoC

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

Crates.io Crates.io

设计

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 服务器

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

许可证

本项目采用以下许可证

依赖

~2.6–3.5MB
~70K SLoC