juicedata/juicefs · error
fuse is not installed. Please install it first
Error message
fuse is not installed. Please install it first
What it means
During Serve, mounting via FUSE failed because executing fusermount produced an exec.Error wrapping an ENOENT PathError on a path containing 'fusermount'. JuiceFS interprets this as the FUSE userland tools not being installed and returns a friendly message asking to install FUSE first.
Source
Thrown at pkg/fuse/fuse.go:527
} else if strings.TrimSpace(n) != "" {
opt.Options = append(opt.Options, strings.TrimSpace(n))
}
}
if !conf.NonDefaultPermission {
opt.Options = append(opt.Options, "default_permissions")
}
if runtime.GOOS == "darwin" {
opt.Options = append(opt.Options, "fssubtype=juicefs")
opt.Options = append(opt.Options, "volname="+conf.Format.Name)
opt.Options = append(opt.Options, "daemon_timeout=60", "iosize=65536", "novncache")
}
fssrv, err := fuse.NewServer(imp, conf.Meta.MountPoint, &opt)
if err != nil {
if execErr, ok := err.(*exec.Error); ok {
if pathErr, ok := execErr.Unwrap().(*os.PathError); ok &&
strings.Contains(pathErr.Path, "fusermount") &&
pathErr.Unwrap() == syscall.ENOENT {
return fmt.Errorf("fuse is not installed. Please install it first")
}
}
return fmt.Errorf("fuse: %s", err)
}
defer func() {
if runtime.GOOS == "darwin" {
_ = fssrv.Unmount()
}
}()
if runtime.GOOS == "linux" {
v.InvalidateEntry = func(parent Ino, name string) syscall.Errno {
return syscall.Errno(fssrv.EntryNotify(uint64(parent), name))
}
}
fsserv = fssrv
fssrv.Serve()View on GitHub (pinned to c9a67b23e8)
Solutions
- Install FUSE: Debian/Ubuntu `apt-get install -y fuse3` (or fuse), RHEL `yum install fuse3`, Alpine `apk add fuse3`, macOS install FUSE-T or macFUSE.
- Ensure fusermount(3) is in PATH for the user running JuiceFS (`which fusermount3 fusermount`).
- In containers, mount with `--privileged` or `--device /dev/fuse --cap-add SYS_ADMIN` and install the fuse package.
- If FUSE is present but PATH-limited, fix PATH in the service unit/environment.
Example fix
// Dockerfile before FROM debian:slim RUN apt-get install -y ca-certificates // after FROM debian:slim RUN apt-get update && apt-get install -y ca-certificates fuse3
Defensive patterns
Strategy: fallback
Validate before calling
// check before mounting
if _, err := exec.LookPath("fusermount3"); err != nil {
if _, err := exec.LookPath("fusermount"); err != nil {
return errors.New("install fuse (fusermount) before mounting")
}
} Try / catch
if err := jfs.Mount(mp, meta, opts); err != nil {
if strings.Contains(err.Error(), "fuse is not installed") {
return installFuseHint() // actionable message to user
}
return err
} Prevention
- Bake fuse3/fuse into container images used for mounting
- Verify `which fusermount3` in entrypoint scripts
- On macOS install FUSE-T/macFUSE before first mount
- Don't strip PATH in systemd units/cron that run juicefs mount
When it happens
Trigger: Running `juicefs mount` (or mountMain) on Linux/macOS where the fusermount/fusermount3 binary is absent from PATH; minimal containers or chroots without the fuse package.
Common situations: Docker images without fuse packages (e.g. alpine/debian slim) attempting a FUSE mount; macOS without FUSE-T/macFUSE installed; PATH stripped in systemd services or cron so fusermount is not found.
Understand the failure class
Background: "X is not installed. Please install it with pip install Y": missing optional dependency errors — ImportError/ValueError raised when a library's optional extra was never installed — this error's family across 22 libraries.
Related errors
AI-assisted analysis of juicedata/juicefs@c9a67b23e8 (2026-09-06).
Data as JSON: /api/errors/07f6a478a4ec3149.
Report an issue: GitHub.