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


A rust library for Fuse(filesystem in userspace) servers and virtio-fs devices

21 releases

0.12.0 Mar 12, 2024
0.11.0 Oct 31, 2023
0.10.5 Aug 3, 2023
0.10.4 Jun 16, 2023
0.1.1 Feb 13, 2021

#55 in Filesystem

Download history 1151/week @ 2023-12-24 855/week @ 2023-12-31 1011/week @ 2024-01-07 1139/week @ 2024-01-14 1204/week @ 2024-01-21 1665/week @ 2024-01-28 1567/week @ 2024-02-04 791/week @ 2024-02-11 1507/week @ 2024-02-18 1815/week @ 2024-02-25 1578/week @ 2024-03-03 1598/week @ 2024-03-10 1637/week @ 2024-03-17 1330/week @ 2024-03-24 1130/week @ 2024-03-31 997/week @ 2024-04-07

5,170 downloads per month
Used in 7 crates (6 directly)

Apache-2.0 AND BSD-3-Clause

21K SLoC

Rust FUSE library for server, virtio-fs and vhost-user-fs

Crates.io Crates.io


The fuse-backend-rs crate is an rust library to implement Fuse daemons based on the Linux FUSE device (/dev/fuse) or the virtiofs draft specification.

Linux FUSE is an userspace filesystem framework, and the /dev/fuse device node is the interface for userspace filesystem daemons to communicate with the in-kernel fuse driver.

And the virito-fs specification extends the FUSE framework into the virtualization world, which uses the Virtio protocol to transfer FUSE requests and responses between the Fuse client and server. With virtio-fs, the Fuse client runs within the guest kernel and the Fuse server runs on the host userspace or hardware.

So the fuse-rs crate is a library to communicate with the Linux FUSE clients, which includes:

  • ABI layer, which defines all data structures shared between linux Fuse framework and Fuse daemons.
  • API layer, defines the interfaces for Fuse daemons to implement a userspace file system.
  • Transport layer, which supports both the Linux Fuse device and virtio-fs protocol.
  • VFS/pseudo_fs, an abstraction layer to support multiple file systems by a single virtio-fs device.
  • A sample passthrough file system implementation, which passes through files from daemons to clients.



Filesystem Drivers

Fuse Servers

Fuse Server and Main Service Loop

A sample fuse server based on the Linux Fuse device (/dev/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
                .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) => {
              _ => {
                error!("Handling fuse message failed");
        } else {
          info!("fuse server exits");


This project is licensed under


~143K SLoC