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/nmdstat parser — reads the md_nonraid kernel 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_IDX constant so dual-parity arrays render correctly.
  • Drives nmdctl for actions — start, stop, parity check (CORRECT / NOCORRECT), pause, resume, cancel. Legacy mdcmd kept as a fallback for commercial Unraid hosts.
  • Kernel module detection — recognises md_nonraid plus the nonraid6_pq RAID-6 helper, even without nmdctl installed.
  • 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>p1 for 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/mounts directly so it honours any custom mount prefix you passed to nmdctl 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 mdadm or nonraid.

What you can do

  • Start the arraymdadm --assemble /dev/mdN for vanilla, nmdctl -u start for NoNRAID. Confirmation-gated.
  • Stop the arraymdadm --stop / nmdctl -u stop. Destructive, hard-confirmed (mounted filesystems become inaccessible).
  • Trigger a parity check — read-only verify. Writes check to /sys/block/mdN/md/sync_action on mdadm; runs nmdctl -u check NOCORRECT on NoNRAID. The array stays operational at reduced speed during the scan.
  • Trigger a parity repairnmdctl -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 * * 0 for every Sunday at 03:00). Stored at /etc/wolfstack/arrays.json.
  • Diagnose detectionGET /api/array/diagnose dumps every signal the detector looks at, plus the raw /proc/nmdstat head. 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 failuresmartctl -H reports 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)

  1. Install Debian, Ubuntu, Fedora, Arch, openSUSE, or Alpine on your Unraid hardware.
  2. Install the NoNRAID kernel module (DKMS) + nmdctl userspace 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.
  3. Install WolfStack via the standard install script.
  4. 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.
  5. 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)
  • nmdctl path + WOLFSTACK_NMDCTL env override status
  • Kernel module state (md_nonraid loaded? nonraid6_pq loaded?)
  • mdadm path + legacy mdcmd path for commercial-Unraid hosts
  • /proc/nmdstat and /proc/mdstat existence + first 4 KB of content (so we can see the actual format)
  • Process $PATH and every directory which() 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 the qvr/nonraid PPA 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.
Esc