I CLAUDIUS FABULOUS SPEAK!
Source doc for video script. Why shfs broke my NFS workflow, and why TrueNAS fixes it.
CLAUDIUS FABULOUS
UGREEN DXP6800 Pro running Unraid as the NAS
Ubuntu Server clients on a fast data path (10G+, dual ASUS Ascent GX10 Sparks)
AI agent workflow: multiple agents (Claude Code, Codex) reading/writing a shared git repo over NFSv4, all day, every day
Mount: 192.168.4.72:/mnt/user/ai → /mnt/ai
This is not a media-server workload. It’s constant small reads, writes, git operations, and file watches from multiple machines simultaneously. That distinction is the whole story.
Daily — sometimes multiple times a day — clients would hit:
Stale file handle
VS Codium sessions died mid-work. Claude Code crashed. The fix became a ritual:
sudo umount -l /mnt/ai && sudo mount /mnt/ai
A lazy unmount and remount, every day, sometimes mid-task. Workable for a hobbyist checking Plex. Not workable when AI agents depend on that mount being stable for hours of unattended work.
Unraid’s signature feature — the “user share” — is what breaks this.
How Unraid presents storage: Unraid doesn’t pool drives at the filesystem level. Each data drive is an independent filesystem (XFS/BTRFS). The unified view at /mnt/user/ is synthesized by shfs, a proprietary FUSE (userspace) filesystem that merges the individual disks into one virtual tree.
Why that murders NFS: NFS is built on file handles — opaque, persistent identifiers the server hands clients so they can reference a file across requests without re-walking the path. NFS assumes file handles are stable: same file, same handle, across time and server restarts.
shfs can’t honor that contract:
FUSE handles aren’t durable. A FUSE filesystem generates its file identifiers in userspace. When the shfs process restarts, rebalances, or the mover shifts a file between disks, the identifiers underneath the NFS export change.
The file “moves” without moving. Unraid’s mover relocates files from cache to array disks. To shfs the path is unchanged; to the NFS layer, the underlying inode just teleported to a different filesystem. The handle the client holds now points at nothing → stale file handle.
Two abstraction layers, one contract. NFS exports normally sit directly on a kernel filesystem with stable inodes. Unraid stacks NFS on top of a userspace merge layer. Every assumption NFS makes about the layer beneath it is violated by design.
This isn’t a bug Unraid can patch. It’s architectural. The forums are a decade deep in “NFS stale file handle” threads with the same non-answers: use SMB instead, set fsid, disable hard links, tune cache settings. They reduce frequency. None fix it, because shfs is the product.
Casual workloads tolerate it. A Plex client that re-opens a file recovers silently. The failure surfaces when:
Clients hold mounts open for hours (dev tools, agents, watchers)
Workloads are metadata-heavy (git, build systems, many small files)
Reconnect-and-retry isn’t automatic (NFS hard mounts hang; soft mounts corrupt)
Run Linux clients doing real work over NFS, and you will meet shfs.
TrueNAS SCALE exports NFS directly from OpenZFS, a kernel filesystem:
One layer. NFS sits on ZFS. No FUSE, no userspace merge, no synthetic file tree.
Stable inodes. ZFS object IDs are persistent. The file handle a client gets today is valid tomorrow, after a reboot, after a scrub.
No mover. ZFS pools all disks at the block level (RAIDZ). Files don’t migrate between filesystems behind the export’s back, because there’s only one filesystem.
The class of failure doesn’t exist on this architecture. That’s the trade Unraid makes and rarely advertises: mixed-size drive flexibility, purchased with a FUSE layer that breaks the oldest network filesystem contract in Unix.
Fair is fair:
Mixed drive sizes — ZFS vdevs want uniform disks; Unraid takes whatever’s in the junk drawer
Single-drive power spin-up — Unraid reads spin one disk; RAIDZ reads spin the stripe
Add-one-drive expansion — ZFS is better than it was (RAIDZ expansion landed), but Unraid is still simpler here
Paid license you already bought
If your workload is media storage with occasional access, Unraid is genuinely fine. If your NAS is infrastructure that other machines work against — keep reading, this video was for you.
Vet new drives (full SMART burn-in)
rsync everything to a spare disk — then verify with a dry-run: zero delta or you don’t proceed
Pull the backup disk out of the chassis
Install TrueNAS to the internal boot device (UGOS/Unraid replaced)
Build the pool: RAIDZ2 spinners + mirrored NVMe special metadata vdev
Restore from the backup disk over direct USB
Re-point clients at the new NFSv4 export — and never type umount -l again
Claudius Fabulous — Leathery Tendons Studios — own the compute, own the storage, own the keys.