docs/fuse-troubleshooting.md
FUSE Troubleshooting
Common mount errors, diagnosis order, and recovery commands.
This page maps the most common errors you'll see when running agent-fs mount to their root cause and fix.
Input/output error (EIO)
Symptom: A write returns cat: foo.md: Input/output error or close: EIO.
Diagnosis order (do these in sequence):
- Check daemon-link status:
``bash cat /mnt/agent-fs/.agent-fs/status ` Look for daemon: "down" or daemon: "auth_error". If the daemon is down, restart it: `bash agent-fs daemon start `` The FUSE process stays alive across daemon restarts — you don't need to remount.
- Read the most recent error:
``bash tail -1 /mnt/agent-fs/.agent-fs/errors.ndjson ` This is a JSON object with { ts, path, op, http_status, error }. The http_status` tells you whether it was a 4xx (auth / validation), a 409 (conflict), or a 5xx (server / S3).
- For conflicts, look at
conflicts.ndjson:
``bash tail -1 /mnt/agent-fs/.agent-fs/conflicts.ndjson ` EIO after a conflict is *expected* — exactly one of N concurrent writers gets it. The winner's bytes are on disk and a new version is recorded; the losers get EIO. Use --expected-version` on the CLI for explicit OCC.
- For unexplained `EIO`, check the mount log:
``bash tail -50 ~/.agent-fs/mount.log ` The helper logs one line per FUSE callback. Look for the op=` line that immediately precedes your error and the HTTP status it returned.
fusermount: mount failed: Operation not permitted
Cause: The container or sandbox lacks SYS_ADMIN and/or /dev/fuse.
Fix: Add the capability and device flag (Docker example):
docker run \ --cap-add SYS_ADMIN \ --device /dev/fuse \ --security-opt apparmor=unconfined \ ...See `fuse-compat.md` for per-runtime incantations. If you're in a sandbox that blocks FUSE entirely (gVisor / GitHub Codespaces hosted / Fly Machines / Modal), fall back to the CLI / MCP / HTTP API path — they always work.
Transport endpoint is not connected
Cause: The daemon stopped (or crashed) while the mount was up. The kernel still has the FUSE FS in its mount table but there's nobody on the other end of the socket.
Fix:
- Restart the daemon:
``bash agent-fs daemon start ``
- The mount usually auto-recovers on next operation. If not, unmount and remount:
``bash agent-fs umount /mnt/agent-fs agent-fs mount /mnt/agent-fs ``
If agent-fs umount itself fails with "transport endpoint is not connected", use the kernel-level escape hatch:
fusermount3 -u /mnt/agent-fs# or, as last resort:sudo umount -l /mnt/agent-fs # lazy unmountagent-fs-fuse: command not found
Cause: The helper binary wasn't installed or isn't on PATH. The main npm package resolves it from optionalDependencies (per-platform sub-package); on non-Linux platforms it's intentionally absent.
Fix (in order of preference):
- Confirm you're on Linux:
uname -sshould sayLinux. macOS / Windows have no FUSE helper in v1.
- Reinstall the main package so the right optional dependency is resolved. Prefer Bun's installer —
npm install -gagainst stock Ubuntu/Debian Node 18.x aborts on a transitive dep's postinstall (SyntaxError: Unexpected token 'with') before the binary lands:
``bash bun install -g @desplega.ai/agent-fs # Check the sub-package landed: ls "$(bun pm -g bin)/../install/global/node_modules/@desplega.ai/agent-fs-fuse-linux-"*/bin/agent-fs-fuse ` With npm (Node 20+ required): ls $(npm root -g)/@desplega.ai/agent-fs-fuse-linux-*/bin/agent-fs-fuse`
- Use the `AGENT_FS_FUSE_BIN` env override for local dev or unusual install layouts:
``bash export AGENT_FS_FUSE_BIN="$HOME/code/agent-fs/packages/fuse-helper/target/release/agent-fs-fuse" agent-fs mount /mnt/agent-fs ``
- Check the SHA-256 manifest if the binary exists but the daemon refuses to spawn it: a tampered binary will fail the integrity check. Reinstall the sub-package or contact us if you suspect a supply-chain issue.
Mount succeeds but ls /mnt/agent-fs/ is empty
Cause: The API key the daemon is using has no drives accessible.
Fix:
agent-fs auth whoami # confirm you're logged inagent-fs drive list # confirm you have at least one driveIf drive list is empty, you need to register/onboard:
agent-fs onboard -yEROFS: Read-only file system when creating a directory at the mount root
Expected. The mount root is read-only. Drives are managed via the CLI:
agent-fs drive create new-drivels /mnt/agent-fs/ # the new drive appears on next readdirFunction not implemented from flock or fcntl
Expected. POSIX file locks are not implemented in v1 (ENOSYS). For optimistic concurrency, use --expected-version on the CLI:
agent-fs write config.json --content '{}' --expected-version 3Mount works, but mv across drives fails
Expected. mv across drives requires a server-side copy + delete (different S3 prefixes). In v1 the mount returns EXDEV for cross-drive renames, which is the standard POSIX signal for "you need to fall back to cp + rm". Most mv implementations (GNU coreutils, busybox) handle EXDEV automatically by switching to copy mode.
Performance: large directory listings are slow
The mount caches readdir results for 30 seconds. A first-time ls on a directory with thousands of entries can take a few hundred ms while the helper fetches metadata. Subsequent lses within the TTL are served from cache.
If you need a faster first listing, use agent-fs ls --json directly — the CLI uses the same underlying op but skips the FUSE layer.
Reporting bugs
If you hit something not covered here, please include:
agent-fs --version(and the helper version:agent-fs-fuse --version)- Kernel + distro:
uname -aandcat /etc/os-release - The container runtime + flags (the
docker runline, the Pod spec, etc.) tail -200 ~/.agent-fs/mount.logandcat /mnt/agent-fs/.agent-fs/status- The exact command that triggered the error and the full error text
Open an issue at <https://github.com/desplega-ai/agent-fs>.
See also
- `fuse-mount.md` — how the mount works conceptually
- `fuse-compat.md` — sandbox compatibility per runtime