SKYHOUSE.dev Journal

Maintaining the Cloud Fortress

DAS Failure & Partial-Stack Recovery (plex1 offline)

Why: The server had been falling over for days — couldn't reboot, then hung opening Docker containers, then hung on Plex, then stopped responding entirely. Damien pulled the DAS to get a stable boot before a trip; on return we sat down to find the actual failing hardware and bring the box back to life in a durable way.

The symptom Damien saw — hangs at boot/shutdown with systemd-udevd/modprobe timeouts and a dead local keyboard/mouse — had a working hypothesis: a failing drive inside the USB DAS array was crashing the motherboard's USB controller at POST, and Linux then booted blind to the whole storage pool, cascading into fstab/Docker/Plex mount hangs. The firsthand log evidence refined that picture in one important way and let us fix it cleanly.

1. What the logs actually said

The box had been stable for 3+ days on the current boot (DAS unplugged since it left). The boot list told the story: a two-week-stable boot ended the evening of Jul 1, followed by eleven short boots in ~2 hours — the crash storm.

So there were two independent USB-storage faults: the JMS583/UAS DAS (crash storm, already disconnected) and a dying My Passport (still wedging the running kernel).

2. Isolating the hardware

Damien physically pulled the WD My Passport; the kernel's hung sde host cleared instantly (no software echo 1 > .../delete needed). The Sabrent toaster drives (plex3 / plex3_backup) were already disconnected from when the DAS was added, so nothing else was left to remove. The DAS stays unplugged pending a deliberate test session.

3. Bringing back a partial stack without plex1

/media/plex1 lived on the now-disconnected DAS, so it no longer mounts. Both docker.service and plexmediaserver.service carry RequiresMountsFor=/media/plex1 /media/plex2 drop-ins, which left both services stuck inactive waiting on the missing mount. We chose a partial restore: run everything that only needs plex2, keep the plex1-dependent services down.

Running (plex2-safe): sonarr, rdtclient, prowlarr, flaresolverr, plus homeassistant, music-assistant, npm, portainer, vaultwarden, uptime-kuma and the rest. Held down (need plex1): radarr, rdtclient-movies, immich.

4. Reviving smartd

smartd (unit smartmontools.service) was dead — it exits with status 16 the moment a listed non-removable device is absent, and its config still named the DAS Seagate plex1 (ata-ST14000NM001G...ZL2BG3W8). So the box had zero disk-health monitoring.

5. Home Assistant's HubZ stick (cp210x)

homeassistant exited 255 on start: its /dev/serial/by-id/usb-Silicon_Labs_HubZ_... device paths were missing. Root cause: the cp210x driver never loaded (only bare usbserial was present), so no /dev/ttyUSB* nodes existed for the already-enumerated HubZ controller (10c4:8a2a) — udev almost certainly missed the modalias autoload during the USB-controller instability.

6. On the fstab "nofail" armor

All /media/plex1|2|3 (and backups) already carry nofail — that next-step was already done. Worth recording though: nofail did not prevent this outage. The failure wasn't a mount timeout; it was the USB controller crashing at POST plus the UAS storage layer hanging — both upstream of anything fstab/systemd can armor against. The real fix was removing the bad drive. A soft reboot does not clear a crashed USB controller; only a full cold boot (pull power, hold power button ~10s to drain caps) does.

7. DAS recovery — UAS quirk + reseating the drives (same session)

With hands on the machine we brought the DAS back the safe way. The root fix for the crash-flooding was to force the JMS583 bridge out of UAS and onto plain usb-storage:

8. Operating model — DAS is a post-boot hotplug (never boot with it attached)

Because a POST-stage USB crash is unrecoverable even over SSH (Linux never boots, so ssh -p 2222 can't save us), the DAS is treated as a deliberate post-boot attach, never present at cold boot. Docker and Plex are kept requiring only /media/plex2 (both drop-ins) so the box always boots clean without the DAS; the plex1 containers are kept restart=no so a DAS-less boot doesn't crash-loop them against the guarded empty mountpoint (/media/plex1 stays chattr +i — harmless while the real drive is mounted over it, protective when it isn't).

9. Retiring the "no-boot" rule — hardening for always-attached

The post-boot-hotplug model in section 8 was a conservative default while the failure was still unexplained. But a NAS should survive a power-loss cold boot with no human in the loop, and a sub-month-old enclosure shouldn't need permanent workarounds — both fair points from Damien. Since the two most likely POST/early-boot USB-controller killers are now gone (the dead My Passport that hung enumeration, and UAS flooding), we hardened for the DAS staying attached across reboots:

Net effect: the box is fully back — Plex, the complete media stack, immich, smart-home, web and monitoring all live off a now-stable DAS in mass-storage mode; disk-health monitoring across all six present drives; and the DAS is being promoted from "hotplug-only workaround" to a normal always-attached device via an early-boot UAS quirk + mount-bound auto-start, gated on one physically-present validation reboot.

← Back to Admin Hub