FUSE (Filesystem in Userspace) for Rust
FUSE-Rust does not just provide bindings, it is a rewrite of the original FUSE C library to fully take advantage of Rust's architecture.
This library was originally forked from the
fuse crate with the intention
of continuing development. In particular adding features from ABIs after 7.19
A working FUSE filesystem consists of three parts:
- The kernel driver that registers as a filesystem and forwards operations into a communication channel to a userspace process that handles them.
- The userspace library (libfuse) that helps the userspace process to establish and run communication with the kernel driver.
- The userspace implementation that actually processes the filesystem operations.
The kernel driver is provided by the FUSE project, the userspace implementation needs to be provided by the developer. FUSE-Rust provides a replacement for the libfuse userspace library between these two. This way, a developer can fully take advantage of the Rust type interface and runtime features when building a FUSE filesystem in Rust.
Except for a single setup (mount) function call and a final teardown (umount) function call to libfuse, everything runs in Rust, and on Linux these calls to libfuse are optional. They can be removed by building without the "libfuse" feature flag.
FUSE must be installed to build or run programs that use FUSE-Rust (i.e. kernel driver and libraries. Some platforms may also require userland utils like
fusermount). A default installation of FUSE is usually sufficient.
To build FUSE-Rust or any program that depends on it,
pkg-config needs to be installed as well.
FUSE for Linux is available in most Linux distributions and usually called
fuse3 (this crate is compatible with both). To install on a Debian based system:
Install on CentOS:
To build, FUSE libraries and headers are required. The package is usually called
pkg-config is required for locating libraries and headers.
Installer packages can be downloaded from the FUSE for macOS homepage. This is the kernel part that needs to be installed always.
To install using Homebrew
To install using Nix
pkg-config (required for building):
nix it is required that you specify
PKG_CONFIG_PATH environment variable to point at where
osxfuse is installed:
Put this in your
To create a new filesystem, implement the trait
fuser::Filesystem. See the documentation for details or the
examples directory for some basic examples.
Most features of libfuse up to 3.10.3 are implemented. Feel free to contribute. See the list of issues on GitHub and search the source files for comments containing "
TODO" or "
FIXME" to see what's still missing.
Licensed under MIT License, except for those files in
examples/ that explicitly contain a different license.
Fork, hack, submit pull request. Make sure to make it useful for the target audience, keep the project's philosophy and Rust coding standards in mind. For larger or essential changes, you may want to open an issue for discussion first. Also remember to update the Changelog if your changes are relevant to the users.