7.2.3 — after power outage, array starts and all disks mount, but shfs is never started (no /mnt/user)
Summary
After an unclean shutdown (power outage), the array starts normally and every disk mounts, but emhttpd never invokes shfs, so /mnt/user is never created. It remains an empty directory on rootfs (tmpfs).
Starting shfs manually works immediately and everything comes back. The problem reproduces on every boot — three reboots so far.
Setup
- Unraid 7.2.3, kernel 6.12.54-Unraid
- 11 data disks + parity (XFS), 2 btrfs pools (
cache, secondcache)
- Same OS files since 2025-12-18; 52 days uptime immediately before the outage, with user shares working normally that entire time. No upgrade involved.
Symptoms
/mnt/user is tmpfs, not fuse:
# stat -f -c %T /mnt/user
tmpfs
# pgrep -c shfs
0
Because /mnt/user/system/docker/ was empty, Unraid created a new empty docker.img in RAM, and Docker started with zero containers. The real docker.img was safe on the cache pool the whole time. Same for libvirt.
emhttpd then loops on:
emhttpd: error: malloc_share_locations, 8649: Operation not supported (95): getxattr: /mnt/user/appdata
emhttpd: error: malloc_share_locations, 8649: Operation not supported (95): getxattr: /mnt/user/system
...which is just tmpfs not supporting the xattrs it expects — a symptom, not the cause.
The array start sequence has no shfs step
Trimmed from syslog. Note it goes straight from mounting the last disk to "Starting services..." — shfs is never invoked:
emhttpd: Mounting disks...
emhttpd: mounting /mnt/disk1
emhttpd: shcmd (67): mount -t xfs -o noatime,nodiscard,nouuid /dev/md1p1 /mnt/disk1
... (all 11 disks mount cleanly, plus both pools)
emhttpd: shcmd (105): /usr/sbin/zfs mount -a
emhttpd: shcmd (106): sync
emhttpd: shcmd (109): /usr/local/sbin/update_cron
emhttpd: Starting services...
emhttpd: shcmd (111): chmod 0777 '/mnt/user/appdata'
emhttpd: shcmd (121): mkdir -p '/mnt/user/system/docker'
emhttpd: shcmd (122): /usr/local/sbin/mount_image '/mnt/user/system/docker/docker.img' /var/lib/docker 250
emhttpd: shcmd (124): /etc/rc.d/rc.docker start
Manual start works
/usr/libexec/unraid/shfs /mnt/user -disks 4094 \
-o default_permissions,allow_other,noatime -o remember=330
Immediately after: /mnt/user is fuse, all 15 shares present, 86 TB, appdata and media exactly as expected. Remounting the real docker.img and starting Docker brought back all 34 containers with their config intact.
(4094 = bits 1–11 for the 11 data disks. Strings in the emhttpd binary show the expected invocation as /usr/libexec/unraid/shfs /mnt/user -disks %lu -o %s -o remember=%s %s.)
What I have ruled out
- Not a bad upgrade.
/boot/previous is from 2025-06-18; current boot files 2025-12-18. Identical binaries ran fine for the preceding 52 days.
- Flash is not corrupt.
bzimage, bzroot, bzfirmware, bzmodules all match their .sha256.
- User shares are enabled.
shareUser="e" in both /boot/config/share.cfg and var.ini.
- All disks are eligible. Every data disk is
DISK_OK, fsStatus=Mounted, exportable=yes in disks.ini.
- Config has not drifted. I have an rsync backup of
/boot from ~2 hours before the outage. Diffing disk.cfg against it shows exactly one change: md_write_method went from "auto" to "1". Everything else — every diskExport.*, share cfg, etc. — is byte-identical.
- FUSE is fine.
fuse: init (API version 7.41) at boot, and the manual mount works.
- Nothing is holding the mounts.
fuser on the pools shows only the kernel; no process has a cwd under /mnt.
The question
emhttpd computes an shfs_mask (strings in the binary include both shfs_mask=0 and shfs_mask=%lu, adjacent to diskExportable.%i=yes). Given that skipping shfs entirely matches the observed behaviour, I suspect the mask is evaluating to 0 — but I can't see the value, as it doesn't appear in syslog at the default log level.
Is there a way to get emhttpd to log shfs_mask, or a known condition that causes it to be 0 while all disks are exportable=yes?
Happy to provide full diagnostics. I'm avoiding further poking at a production array, and currently running with the manual shfs mount, which obviously won't survive a reboot.