Overview
The Storage Array page (Storage → Array, or via the app drawer) gives you a unified UI on top of either vanilla Linux mdadm software RAID or NoNRAID — the open-source port of Unraid’s parity-protected JBOD driver to mainline kernels. WolfStack auto-detects which backend is running, picks the correct procfs file and userspace tool, and gives you the same dashboard either way.
Available from Homelab tier upwards. NoNRAID support drives the Unraid → Debian migration story; vanilla mdadm users get the same panel for RAID 1/5/6/10.
Production-grade NoNRAID integration
WolfStack speaks NoNRAID natively, verified against the upstream qvr/nonraid kernel source:
- Native
/proc/nmdstatparser — reads themd_nonraidkernel module’s authoritative status surface directly. - Slot-accurate role mapping — P parity on slot 0, Q parity on slot 29, data on slots 1–28. Matches the kernel’s own
MD_SB_Q_IDXconstant so dual-parity arrays render correctly. - Drives
nmdctlfor actions — start, stop, parity check (CORRECT / NOCORRECT), pause, resume, cancel. Legacymdcmdkept as a fallback for commercial Unraid hosts. - Kernel module detection — recognises
md_nonraidplus thenonraid6_pqRAID-6 helper, even withoutnmdctlinstalled. - One-click Diagnose — surfaces every detection signal (binary paths, module state, raw procfs contents, parsed array count) with actionable install hints when something’s missing.
What it shows
Per-array card with:
- State — clean / active / degraded / recovering / resyncing / checking / reshaping / stopped, with a coloured badge.
- Sync progress bar with live percentage and speed (MiB/s) when a check / repair / reshape is running. NoNRAID’s paused-check state (mdResync=0 but mdResyncPos>0) is detected so you don’t lose the position display.
- Per-disk table: physical device (for SMART correlation), virtual array-side device (
/dev/nmd<N>p1for NoNRAID data disks), role (data / parity / parity2 / spare / faulty / missing), state, size, SMART overall status, current temperature, model. - Per-data-disk fill levels for NoNRAID arrays — each data disk has its own filesystem. WolfStack reads
/proc/mountsdirectly so it honours any custom mount prefix you passed tonmdctl mount(the default is/mnt/disk<N>but you can override). - Backend badge in the header so you always know whether you’re looking at
mdadmornonraid.
What you can do
- Start the array —
mdadm --assemble /dev/mdNfor vanilla,nmdctl -u startfor NoNRAID. Confirmation-gated. - Stop the array —
mdadm --stop/nmdctl -u stop. Destructive, hard-confirmed (mounted filesystems become inaccessible). - Trigger a parity check — read-only verify. Writes
checkto/sys/block/mdN/md/sync_actionon mdadm; runsnmdctl -u check NOCORRECTon NoNRAID. The array stays operational at reduced speed during the scan. - Trigger a parity repair —
nmdctl -u check CORRECT. Overwrites mismatches with parity-derived values. Only run when you trust the data more than the parity. - Cancel / pause / resume an in-progress parity operation — one click; the array stays operational either way.
- Schedule recurring parity checks — cron syntax (e.g.
0 3 * * 0for every Sunday at 03:00). Stored at/etc/wolfstack/arrays.json. - Diagnose detection —
GET /api/array/diagnosedumps every signal the detector looks at, plus the raw/proc/nmdstathead. Use this when the UI says “No arrays” but you know one is there.
What it does NOT do: create arrays, add or remove disks. Those need geometry validation and bootloader concerns we’ve scoped out for v1.0. Use mdadm --create / nmdctl create at the CLI; WolfStack picks up the result as soon as it’s assembled.
Drive-health alerts
A background watcher polls every 60 seconds and dispatches an alert the first time it observes any of:
- Array degraded — any disk faulty / missing in a parity-protected array.
- Faulty disk — per-disk transition to faulty / missing.
- SMART failure —
smartctl -Hreports overall FAILED — the most reliable pre-fail signal a drive emits.
Alerts are de-duplicated per condition — a stuck-failed disk doesn’t spam every 60s, only on transitions. Each alert fires three channels (using whatever you’ve configured already):
- Tasks panel in the dashboard — immediate, always on.
- Discord / Slack / Telegram via the webhook URLs you set in Settings → Alerts.
- Email via the SMTP config the AI agent uses for its daily report.
NoNRAID slot convention
Verified against the upstream kernel module source:
| Slot | Role | Kernel constant |
|---|---|---|
| 0 | P parity | MD_SB_P_IDX = 0 |
| 1–28 | Data disks | — |
| 29 | Q parity (dual-parity) | MD_SB_Q_IDX = 29 |
| 30 | Reserved | MD_SB_DISKS = 30 |
Block devices for data slots are /dev/nmd<N>p1 where N is the slot 1–28. The block device class nmd is registered by the kernel module.
Migration story (Unraid → Debian)
- Install Debian, Ubuntu, Fedora, Arch, openSUSE, or Alpine on your Unraid hardware.
- Install the NoNRAID kernel module (DKMS) +
nmdctluserspace tool from the qvr/nonraid project. On Debian/Ubuntu that’s a one-liner:sudo add-apt-repository ppa:qvr/nonraid && sudo apt install nonraid-dkms nonraid-tools. - Install WolfStack via the standard install script.
- Storage → Array picks up the array as soon as it appears in
/proc/nmdstat. Set a parity-check schedule (most homelabs run weekly), and the alert channels you want. - Use the rest of WolfStack — Docker, LXC, VMs, WolfFlow automation — on the same host. The array is just one part of the stack.
Coming from Unraid’s native UI you’ll find: parity-check scheduling, per-disk SMART, drive temperature, faulty-disk alerts. You won’t find: array creation in the UI (CLI for now), share-management on top of the array (use Storage → Shares for that — SMB/NFS sharing is its own feature), VPN tunnels (use WolfNet).
Diagnostic endpoint
If the array page reports “No arrays detected” but you know one is running, click Diagnose in the page header. The endpoint reports:
- Detected backend (mdadm / nonraid)
nmdctlpath +WOLFSTACK_NMDCTLenv override status- Kernel module state (
md_nonraidloaded?nonraid6_pqloaded?) mdadmpath + legacymdcmdpath for commercial-Unraid hosts/proc/nmdstatand/proc/mdstatexistence + first 4 KB of content (so we can see the actual format)- Process
$PATHand every directorywhich()searches - Parsed array count + actionable hints
The hints are computed from the signals — e.g. “md_nonraid loaded but nmdctl not found” produces a concrete install command. Operators with custom-install paths can pin them via Environment=WOLFSTACK_NMDCTL=/full/path/to/nmdctl in /etc/systemd/system/wolfstack.service.
If you ever need to disable NoNRAID detection entirely (last-resort escape hatch), set WOLFSTACK_ARRAY_DISABLE_NONRAID=1 in the same systemd unit and restart.
Required packages
WolfStack never auto-installs system tools. The Storage Array page surfaces what’s missing:
mdadm— vanilla RAID. Almost always pre-installed on RAID-running distros.nmdctl+nonraid-dkms— NoNRAID userspace + kernel module. From theqvr/nonraidPPA on Debian/Ubuntu; the AUR (nonraid-git) on Arch.smartctl(smartmontools) — required for SMART status and temperature. Strongly recommended; without it WolfStack can’t flag pre-fail conditions.lsblk— for disk model / serial display. Pre-installed on every modern Linux.