<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>NFSv4 on Wojciech Marusiak IT Blog</title>
        <link>https://www.wojcieh.net/tags/nfsv4/</link>
        <description>Recent content in NFSv4 on Wojciech Marusiak IT Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Tue, 03 Nov 2026 10:00:00 +0100</lastBuildDate><atom:link href="https://www.wojcieh.net/tags/nfsv4/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Retiring the QNAP TS-873: How I Built a Silent 92TB Unraid 7 NAS with 10GbE &amp; Local AI</title>
        <link>https://www.wojcieh.net/retiring-qnap-ts-873-custom-92tb-unraid-7-nas-10gbe-local-ai/</link>
        <pubDate>Tue, 03 Nov 2026 10:00:00 +0100</pubDate>
        
        <guid>https://www.wojcieh.net/retiring-qnap-ts-873-custom-92tb-unraid-7-nas-10gbe-local-ai/</guid>
        <category>Unraid</category>
        <category>NAS</category>
        <category>QNAP</category>
        <category>10GbE</category>
        <category>ZFS</category>
        <category>NFSv4</category>
        <category>Jellyfin</category>
        <category>Home Assistant</category>
        <category>KVM</category>
        <category>NVIDIA</category>
        <category>Homelab</category>
        <category>Hardware &amp; HomeLab</category>
        <category>Storage &amp; Virtualization</category>
        <description>&lt;p&gt;&lt;img src=&#34;https://www.wojcieh.net/images/uploads/2026/11/custom-unraid-nas-qnap-migration.webp?v=6&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Retiring the QNAP TS-873: How I Built a Silent 92TB Unraid 7 NAS with 10GbE and Local AI&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;For several years, my 8-bay &lt;strong&gt;QNAP TS-873&lt;/strong&gt; handled everything I threw at it: NFS shares, Time Machine backups, Jellyfin media, and a Home Assistant virtual machine. Eventually, the hardware hit a wall. The embedded AMD RX-421BD quad-core CPU choked during heavy I/O, QTS firmware updates took twenty minutes to reboot, all eight 3.5-inch drive bays were full, and the proprietary chassis had neither the physical clearance nor the PCIe power delivery to host a full-height NVIDIA GPU for local AI workloads.&lt;/p&gt;
&lt;p&gt;In today&amp;rsquo;s post, I will walk you through how I reused the &lt;strong&gt;AMD Ryzen 7 5800X&lt;/strong&gt;, &lt;strong&gt;ASUS ROG STRIX B550-E GAMING&lt;/strong&gt; motherboard, and &lt;strong&gt;32 GB of DDR4-3600 RAM&lt;/strong&gt; left over from my recent AM5 workstation upgrade to build a silent, 12-drive &lt;strong&gt;Unraid OS 7&lt;/strong&gt; server with a 4 TB ZFS SSD mirror, 10GbE networking, KVM virtualization, and an NVIDIA RTX 3060 12GB for local CUDA inference.&lt;/p&gt;
&lt;h2 id=&#34;step-1-hardware-architecture--pcie-slot-layout&#34;&gt;Step 1: Hardware Architecture &amp;amp; PCIe Slot Layout
&lt;/h2&gt;&lt;p&gt;Repurposing desktop components into a 24/7 storage server works well only if you plan your PCIe lanes, SATA controllers, and power delivery ahead of time.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;Component&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;Model / Specification&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;Role in the NAS&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Chassis&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Fractal Design Define 7 PCGH Edition&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Sound-dampened full tower supporting up to 14× 3.5&amp;quot; HDD trays&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;CPU&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;AMD Ryzen 7 5800X (8C / 16T, Zen 3)&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Compute for ZFS, KVM (HAOS), and high-speed parity calculations&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;CPU Cooler&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Noctua NH Tower Cooler&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Near-silent thermal dissipation under continuous load&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Motherboard&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;ASUS ROG STRIX B550-E GAMING&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Splits CPU lanes into &lt;strong&gt;PCIe 4.0 x8 / x8&lt;/strong&gt; across Slots 1 &amp;amp; 2&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;32 GB (2× 16 GB) DDR4-3600&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Host OS, ZFS ARC cache, KVM VM, and RAM transcoding&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;GPU (Slot 1)&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;NVIDIA GeForce RTX 3060 12GB (Dual-Slot)&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Local AI inference (&lt;code&gt;Ollama&lt;/code&gt;, Wyoming &lt;code&gt;Whisper&lt;/code&gt; STT &amp;amp; &lt;code&gt;Piper&lt;/code&gt; TTS)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;10GbE NIC (Slot 2)&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Intel X540-AT2 Dual-Port 10GBase-T&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;10GbE uplink to the core switch&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;SATA HBA (Slot 4)&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;ASM1166 6-Port SATA III 6Gb/s (PCIe x4)&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Expands onboard 6× SATA to &lt;strong&gt;12× SATA 6Gb/s ports&lt;/strong&gt; (all 12 populated)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;ZFS Cache Pool&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;2× SanDisk Ultra 3D 4 TB SSD&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;4 TB ZFS Mirror&lt;/strong&gt; (&lt;code&gt;/mnt/cache&lt;/code&gt;) for &lt;code&gt;appdata&lt;/code&gt;, KVM &lt;code&gt;domains&lt;/code&gt;, and &lt;code&gt;system&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Hard Drives&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;10× 3.5&amp;quot; HDDs (&lt;code&gt;4× 16 TB&lt;/code&gt;, &lt;code&gt;4× 12 TB&lt;/code&gt;, &lt;code&gt;1× 8 TB&lt;/code&gt;, &lt;code&gt;1× 4 TB&lt;/code&gt;)&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;92 TB&lt;/strong&gt; usable XFS data array (8 data drives) + &lt;strong&gt;Dual 16 TB Parity&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Power Supply&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;be quiet! Pure Power 12 750W 80+ Gold (ATX 3.0)&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Single high-current &lt;code&gt;+12V&lt;/code&gt; rail for 10+ HDD spin-up surges + GPU&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;UPS&lt;/strong&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;APC Back-UPS BX1200MI (1200 VA / 650 W)&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;USB &lt;code&gt;apcupsd&lt;/code&gt; master protecting NAS, UDM Pro router, and MS-01 host&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src=&#34;https://www.wojcieh.net/images/uploads/2026/11/fractal-define-7-storage-layout-hdd-trays.webp&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Fractal Design Define 7 PCGH in Storage Layout with stacked 3.5-inch HDD trays&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;fitting-both-a-gpu-and-a-10gbe-card-on-a-b550-motherboard&#34;&gt;Fitting Both a GPU and a 10GbE Card on a B550 Motherboard
&lt;/h3&gt;&lt;p&gt;Running a dedicated GPU alongside a 10GbE network card and a 6-port SATA expander on a consumer AM4 board requires careful attention to how the motherboard routes PCIe lanes. Cheap B550 motherboards wire the primary slot (&lt;code&gt;PCIEX16_1&lt;/code&gt;) to the CPU at &lt;code&gt;x16&lt;/code&gt; and route the second full-length slot (&lt;code&gt;PCIEX16_2&lt;/code&gt;) through the B550 chipset at &lt;code&gt;PCIe 3.0 x4&lt;/code&gt;, which often disables onboard SATA ports or the second M.2 slot when populated. The &lt;strong&gt;ASUS ROG STRIX B550-E GAMING&lt;/strong&gt; avoids this by splitting the 16 PCIe 4.0 lanes from the Ryzen 7 5800X directly into &lt;strong&gt;PCIe 4.0 x8 (&lt;code&gt;PCIEX16_1&lt;/code&gt;) + PCIe 4.0 x8 (&lt;code&gt;PCIEX16_2&lt;/code&gt;)&lt;/strong&gt;. That gives the RTX 3060 12GB PCIe 4.0 x8 bandwidth in Slot 1 while giving the Intel X540-AT2 10GbE card dedicated CPU lanes in Slot 2 without touching chipset I/O.&lt;/p&gt;
&lt;p&gt;The bottom full-length slot (&lt;code&gt;PCIEX16_3&lt;/code&gt;, wired to the chipset at PCIe 3.0 x4) hosts the &lt;strong&gt;ASM1166 6-port SATA controller&lt;/strong&gt;. Unlike older enterprise SAS HBAs such as the LSI 9211-8i that burn 12–15W at idle and block deeper PCIe ASPM power states, the ASM1166 draws under 2W and works out of the box with the Linux &lt;code&gt;ahci&lt;/code&gt; driver.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Gotcha:&lt;/strong&gt; Check the physical thickness of your GPU before buying! On the B550-E, &lt;code&gt;PCIEX16_1&lt;/code&gt; and &lt;code&gt;PCIEX16_2&lt;/code&gt; sit three slots apart. A 2.5-slot or 3-slot gaming GPU physically covers the second x16 slot, leaving nowhere to plug in the 10GbE card. Stick to a strict &lt;strong&gt;2.0-slot&lt;/strong&gt; card, and mount an auxiliary fan across the lower PCIe zone because server NICs like the Intel X540-AT2 expect rackmount airflow and run very hot in a silent tower case.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://www.wojcieh.net/images/uploads/2026/11/asus-b550e-noctua-10gbe-sata-hba-layout.webp&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;ASUS ROG STRIX B550-E GAMING with Noctua push-pull cooler, Intel X540-AT2 10GbE NIC in Slot 2, and ASM1166 6-port SATA HBA in Slot 4 before dropping in the Dual-Slot RTX 3060&#34;
	
	
&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-2-storage-layout--the-parity-last-migration-strategy&#34;&gt;Step 2: Storage Layout &amp;amp; The &amp;ldquo;Parity-Last&amp;rdquo; Migration Strategy
&lt;/h2&gt;&lt;p&gt;Moving away from QNAP&amp;rsquo;s rigid RAID groups to Unraid 7 let me combine all 10 hard drives (&lt;code&gt;4× 16 TB&lt;/code&gt;, &lt;code&gt;4× 12 TB&lt;/code&gt;, &lt;code&gt;1× 8 TB&lt;/code&gt;, and &lt;code&gt;1× 4 TB&lt;/code&gt;) into a single pool protected by Dual Parity, backed by a 4 TB ZFS cache mirror (&lt;code&gt;2× SanDisk 4 TB SSD&lt;/code&gt;) across all 12 SATA ports:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.wojcieh.net/images/uploads/2026/11/unraid-7-main-array-zfs-cache-pool.webp&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Unraid 7.3.4 Main tab showing the 10-drive XFS array with Dual 16TB Parity and the 2x SanDisk 4TB ZFS Mirror cache pool&#34;
	
	
&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;┌──────────────────────────────────────────────────────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│                        UNRAID 7.3.4 STORAGE ARCHITECTURE                     │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├──────────────────────────────┬───────────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│ TIER / POOL                  │ CONFIGURATION &amp;amp; WORKLOADS                     │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├──────────────────────────────┼───────────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│ Cache Pool (/mnt/cache)      │ 2× SanDisk 4 TB SSD (4 TB ZFS Mirror)         │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├─ /mnt/user/appdata       │ Docker container configs &amp;amp; databases          │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├─ /mnt/user/domains       │ KVM Virtual Machines (Home Assistant OS qcow2)│
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └─ /mnt/user/system        │ Docker vDisk &amp;amp; libvirt images                 │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├──────────────────────────────┼───────────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│ Main Data Array (/mnt/user)  │ 8× XFS Data Drives (92 TB Usable, High Water) │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├─ Parity 1 + Parity 2     │ 2× 16 TB WD Red Pro (Dual Parity Protection)  │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └─ Data Disks 1 .. 8       │ 2× 16 TB, 4× 12 TB, 1× 8 TB, 1× 4 TB HDDs     │
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└──────────────────────────────┴───────────────────────────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;migrate-your-bulk-data-before-assigning-parity-drives&#34;&gt;Migrate Your Bulk Data &lt;em&gt;Before&lt;/em&gt; Assigning Parity Drives
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Do not assign &lt;code&gt;Parity 1&lt;/code&gt; and &lt;code&gt;Parity 2&lt;/code&gt; before your initial data migration! If you enable parity on day one and start copying 60+ TB of data into the Unraid array, every write triggers a read-modify-write parity calculation across the spinning disks and throttles your transfer speeds to 60–90 MB/s.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Instead, run the migration in two steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Stage 1 (Unprotected Bulk Ingest):&lt;/strong&gt; Assign only the 8 XFS data drives (&lt;code&gt;Disk 1&lt;/code&gt; through &lt;code&gt;Disk 8&lt;/code&gt;) with no parity drives installed. Run background &lt;code&gt;rsync&lt;/code&gt; jobs over the 10GbE network from the old QNAP NAS and from external USB 3.2 staging drives (&lt;code&gt;22 TB Seagate Exos&lt;/code&gt; + &lt;code&gt;14 TB WD Red Pro&lt;/code&gt; mounted via the &lt;em&gt;Unassigned Devices&lt;/em&gt; plugin):
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rsync -avh --no-inc-recursive --info&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;progress2 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  /mnt/disks/USB_Staging_22TB/Media/ /mnt/user/Media/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;Without parity overhead, writes saturate the native mechanical speed of each target drive (&lt;code&gt;180–240 MB/s&lt;/code&gt; per disk).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stage 2 (Enable Dual Parity):&lt;/strong&gt; Once the initial multi-terabyte ingest finishes, stop the array, assign both &lt;strong&gt;16 TB WD Red Pro&lt;/strong&gt; drives to &lt;code&gt;Parity 1&lt;/code&gt; and &lt;code&gt;Parity 2&lt;/code&gt;, and start the array. Unraid builds Dual Parity sequentially from outer to inner cylinders at &lt;code&gt;210+ MB/s&lt;/code&gt; in a single pass.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-3-10gbe-networking--fixing-nfsv42-stale-file-handle-errors&#34;&gt;Step 3: 10GbE Networking &amp;amp; Fixing NFSv4.2 &lt;code&gt;Stale File Handle&lt;/code&gt; Errors
&lt;/h2&gt;&lt;p&gt;My compute layer runs on a separate &lt;strong&gt;Minisforum MS-01&lt;/strong&gt; server (&lt;code&gt;Intel Core i9&lt;/code&gt;, 96 GB RAM, CachyOS) hosting 70+ Docker containers, while bulk media and backups live on the Unraid NAS. Both servers connect via 10GbE (&lt;code&gt;Intel X710-DA2&lt;/code&gt; on the MS-01 and &lt;code&gt;Intel X540-AT2&lt;/code&gt; on Unraid) into the core 10GbE switch.&lt;/p&gt;
&lt;p&gt;Sequential disk benchmarks over NFSv4.2 confirmed the storage stack was performing at full speed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 1. Direct NFSv4.2 Sequential Write (Bypassing RAM Cache)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ dd if=/dev/zero of=/mnt/nas_share/test_10g.bin bs=1M count=4096 oflag=direct
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;4294967296 bytes (4.3 GB, 4.0 GiB) copied, 6.96091 s, 617 MB/s
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 2. Cached Read Throughput (Linux Page Cache + ZFS ARC)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ dd if=/mnt/nas_share/test_10g.bin of=/dev/null bs=1M
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;4294967296 bytes (4.3 GB, 4.0 GiB) copied, 0.394112 s, 10.9 GB/s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;fixing-estale-errno--116--io-freezes-under-heavy-load&#34;&gt;Fixing &lt;code&gt;ESTALE&lt;/code&gt; (&lt;code&gt;errno -116&lt;/code&gt;) &amp;amp; I/O Freezes Under Heavy Load
&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;dd&lt;/code&gt; numbers looked great right until I ran a multi-terabyte background &lt;code&gt;rsync&lt;/code&gt; while &lt;strong&gt;Immich&lt;/strong&gt; was generating machine-learning thumbnails and &lt;strong&gt;Jellyfin&lt;/strong&gt; and &lt;strong&gt;Sonarr&lt;/strong&gt; were scanning libraries over NFSv4.2 from the MS-01 Docker host. Containers started crashing with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OSError: [Errno 116] Stale file handle
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;At the same time, directory listings (&lt;code&gt;ls /mnt/nas_share&lt;/code&gt;) on the Docker host would freeze for 15–20 seconds. I spent several hours digging through Unraid (&lt;code&gt;6.12 LTS&lt;/code&gt; kernel) and &lt;code&gt;shfs&lt;/code&gt; behaviour to track down all three root causes so you don&amp;rsquo;t have to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Unraid &lt;code&gt;shfs&lt;/code&gt; inode eviction (&lt;code&gt;fuse_remember=330&lt;/code&gt;):&lt;/strong&gt; When you export &lt;code&gt;/mnt/user/&amp;lt;share&amp;gt;&lt;/code&gt; over NFS, clients talk to &lt;code&gt;rpc.nfsd&lt;/code&gt; on top of Unraid&amp;rsquo;s FUSE filesystem (&lt;code&gt;/usr/libexec/unraid/shfs&lt;/code&gt;). By default, &lt;code&gt;shfs&lt;/code&gt; caches inode mappings in RAM for only &lt;strong&gt;330 seconds&lt;/strong&gt; (&lt;code&gt;-o remember=330&lt;/code&gt;). Under heavy file-scanning load from Immich and Jellyfin, &lt;code&gt;shfs&lt;/code&gt; evicts older inode entries from memory. The moment a remote NFSv4.2 client references an evicted file handle, &lt;code&gt;shfs&lt;/code&gt; fails to resolve the inode and returns &lt;code&gt;ESTALE&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linux dirty page writeback stalls (&lt;code&gt;vm.dirty_ratio=20&lt;/code&gt;):&lt;/strong&gt; On a server with 32 GB of RAM, Linux&amp;rsquo;s default &lt;code&gt;vm.dirty_ratio=20&lt;/code&gt; and &lt;code&gt;vm.dirty_background_ratio=10&lt;/code&gt; allow the kernel to buffer up to &lt;strong&gt;6.4 GB of uncommitted writes&lt;/strong&gt; in RAM during an &lt;code&gt;rsync&lt;/code&gt; job before forcing synchronous writeback. Flooding mechanical HDDs with a 6.4 GB flush blocks &lt;code&gt;shfs&lt;/code&gt; and &lt;code&gt;nfsd&lt;/code&gt; worker threads for 20+ seconds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client-side &lt;code&gt;actimeo=1800&lt;/code&gt; caching:&lt;/strong&gt; Many homelab guides suggest adding &lt;code&gt;actimeo=1800&lt;/code&gt; to &lt;code&gt;/etc/fstab&lt;/code&gt; to reduce metadata lookups. On a media server, caching directory attributes for 30 minutes means Sonarr, Radarr, and Jellyfin cannot see newly downloaded files created on the NAS for half an hour.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;the-4-step-fix&#34;&gt;The 4-Step Fix
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Disable &lt;code&gt;shfs&lt;/code&gt; Inode Eviction &amp;amp; Enable Exclusive Shares:&lt;/strong&gt;
In &lt;code&gt;/boot/config/share.cfg&lt;/code&gt; on the Unraid USB flash drive, set &lt;code&gt;fuse_remember&lt;/code&gt; to &lt;code&gt;-1&lt;/code&gt; (never evict cached inodes until array stop), raise the file descriptor limit for &lt;code&gt;shfs&lt;/code&gt; to &lt;code&gt;524288&lt;/code&gt;, and enable &lt;strong&gt;Exclusive Shares&lt;/strong&gt;. Cache-only ZFS shares (&lt;code&gt;appdata&lt;/code&gt;, &lt;code&gt;domains&lt;/code&gt;, &lt;code&gt;isos&lt;/code&gt;, &lt;code&gt;system&lt;/code&gt;, &lt;code&gt;backup&lt;/code&gt;) then use direct kernel symlinks (&lt;code&gt;/mnt/user/appdata -&amp;gt; /mnt/cache/appdata&lt;/code&gt;, shown as &lt;code&gt;▸ Cache&lt;/code&gt; in the Unraid UI) and bypass FUSE completely, while bulk media and backup shares (&lt;code&gt;Cache ➔ Array&lt;/code&gt;) stage incoming writes on the ZFS SSD pool before the nightly Mover flushes them to the XFS array:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.wojcieh.net/images/uploads/2026/11/unraid-7-user-shares-cache-to-array-exclusive.webp&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Unraid 7.3.4 User Shares showing Exclusive Shares (▸ Cache) for appdata, domains, and system alongside Cache -&amp;gt; Array staging for NFS media shares&#34;
	
	
&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# /boot/config/share.cfg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;shareUserExclusive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;yes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;shareFuseRemember&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;-1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;shareNOFILE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;524288&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;After restarting the array, verify that &lt;code&gt;shfs&lt;/code&gt; is running with &lt;code&gt;-o remember=-1&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root@NAS:~# ps aux &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep shfs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root  &lt;span class=&#34;m&#34;&gt;14210&lt;/span&gt;  2.1  0.4 &lt;span class=&#34;m&#34;&gt;845120&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;148200&lt;/span&gt; ?  Ssl 12:14  0:42 /usr/libexec/unraid/shfs /mnt/user -disks &lt;span class=&#34;m&#34;&gt;255&lt;/span&gt; -o default_permissions,allow_other,noatime -o &lt;span class=&#34;nv&#34;&gt;remember&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;-1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Clamp Kernel Dirty Page Writeback in &lt;code&gt;/boot/config/go&lt;/code&gt;:&lt;/strong&gt;
To force the Linux kernel to flush writes continuously in smaller batches (~600 MB background, ~1.2 GB hard ceiling) instead of stalling the bus with multi-gigabyte flushes, persist &lt;code&gt;sysctl&lt;/code&gt; rules in &lt;code&gt;/boot/config/go&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Start the Management Utility&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/usr/local/sbin/emhttp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Tune Linux writeback cache for smooth NFSv4.2 / shfs latency&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sysctl -w vm.dirty_background_ratio&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sysctl -w vm.dirty_ratio&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automate Unraid 7 Settings via &lt;code&gt;/var/run/emhttpd.socket&lt;/code&gt;:&lt;/strong&gt;
If you manage your server via SSH or Ansible, trying to &lt;code&gt;POST&lt;/code&gt; configuration changes to Unraid&amp;rsquo;s Nginx web interface (&lt;code&gt;http://localhost/update.htm&lt;/code&gt;) fails unless you scrape session cookies and CSRF tokens. In Unraid 7, &lt;code&gt;emhttpd&lt;/code&gt; listens directly on a local Unix domain socket at &lt;code&gt;/var/run/emhttpd.socket&lt;/code&gt;. You can apply system changes or trigger array actions from the CLI with &lt;code&gt;curl --unix-socket&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Programmatically updating a share or system setting via emhttpd Unix socket&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl --unix-socket /var/run/emhttpd.socket &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  http://localhost/update.htm &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s2&#34;&gt;&amp;#34;shareFuseRemember=-1&amp;amp;shareUserExclusive=yes&amp;amp;changeShare=Apply&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure Clean Client &lt;code&gt;/etc/fstab&lt;/code&gt; Mount Options on the Docker Host:&lt;/strong&gt;
On the Minisforum MS-01 Docker host, mount the Unraid exports using &lt;strong&gt;NFSv4.2&lt;/strong&gt; with 1 MB read/write blocks (&lt;code&gt;1048576&lt;/code&gt;), &lt;code&gt;async&lt;/code&gt;, &lt;code&gt;hard&lt;/code&gt;, &lt;code&gt;noatime&lt;/code&gt;, and without &lt;code&gt;actimeo&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# /etc/fstab on Docker Host (MS-01)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;10.10.255.50:/mnt/user/Media   /mnt/nas_media   nfs4  nfsvers=4.2,rw,async,hard,intr,noatime,rsize=1048576,wsize=1048576,_netdev  0  0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;10.10.255.50:/mnt/user/Backup  /mnt/nas_backup  nfs4  nfsvers=4.2,rw,async,hard,intr,noatime,rsize=1048576,wsize=1048576,_netdev  0  0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Verify the active kernel mount flags with &lt;code&gt;nfsstat -m&lt;/code&gt; to confirm &lt;code&gt;vers=4.2,rsize=1048576,wsize=1048576&lt;/code&gt; are negotiated. Since applying these four changes, I haven&amp;rsquo;t seen a single &lt;code&gt;Stale file handle&lt;/code&gt; error, even during simultaneous 10GbE &lt;code&gt;rsync&lt;/code&gt; migrations and Immich ML indexing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-4-home-assistant-os-on-kvm-live-fsfreeze-backups--offsite-cloud-sync&#34;&gt;Step 4: Home Assistant OS on KVM, Live &lt;code&gt;fsfreeze&lt;/code&gt; Backups &amp;amp; Offsite Cloud Sync
&lt;/h2&gt;&lt;p&gt;On the old QNAP TS-873, my &lt;strong&gt;Home Assistant OS (HAOS)&lt;/strong&gt; virtual machine ran inside QNAP Virtualization Station with noticeable UI lag during database purges. Migrating it to Unraid took less than fifteen minutes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Copied the &lt;code&gt;qcow2&lt;/code&gt; disk image directly onto the &lt;strong&gt;4 TB ZFS Cache Mirror&lt;/strong&gt; (&lt;code&gt;/mnt/cache/domains/haos/vdisk1.qcow2&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Created a KVM virtual machine (&lt;code&gt;OVMF&lt;/code&gt; UEFI, VirtIO network bound to &lt;code&gt;br0&lt;/code&gt; with its static VLAN IP, and USB passthrough for the &lt;strong&gt;Sonoff Zigbee 3.0 USB Dongle Plus&lt;/strong&gt; &lt;code&gt;10c4:ea60&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Paired with local &lt;strong&gt;RTX 3060 12GB&lt;/strong&gt; containers on Unraid (&lt;code&gt;wyoming-whisper&lt;/code&gt; for speech-to-text, &lt;code&gt;wyoming-piper&lt;/code&gt; for text-to-speech, and &lt;code&gt;ollama&lt;/code&gt; for local LLM intent processing), Home Assistant voice pipelines now respond in milliseconds while the VM idles at a load average of &lt;code&gt;0.08&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://www.wojcieh.net/images/uploads/2026/11/unraid-7-haos-kvm-virtual-machine.webp&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Home Assistant OS (haos) KVM virtual machine running on the Unraid 7.3.4 ZFS cache pool&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;zero-downtime-vm-backups-18-gb-in-102-seconds&#34;&gt;Zero-Downtime VM Backups (18 GB in 102 Seconds)
&lt;/h3&gt;&lt;p&gt;Instead of shutting down Home Assistant every week to back up its virtual disk, I configured the &lt;strong&gt;VM Backup&lt;/strong&gt; plugin to use the &lt;strong&gt;QEMU Guest Agent (&lt;code&gt;fsfreeze&lt;/code&gt;)&lt;/strong&gt; and &lt;code&gt;zstd&lt;/code&gt; multithreaded compression:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Before copying the vDisk, &lt;code&gt;libvirt&lt;/code&gt; instructs the QEMU Guest Agent inside HAOS to freeze filesystem writes (&lt;code&gt;fsfreeze-freeze&lt;/code&gt;), flushing SQLite and MariaDB transactions cleanly to disk.&lt;/li&gt;
&lt;li&gt;Unraid streams and compresses the &lt;strong&gt;18 GB &lt;code&gt;qcow2&lt;/code&gt; image&lt;/strong&gt; using &lt;code&gt;zstd&lt;/code&gt; in &lt;strong&gt;1 minute 42 seconds&lt;/strong&gt; (&lt;code&gt;102s&lt;/code&gt;), then immediately thaws the filesystem (&lt;code&gt;fsfreeze-thaw&lt;/code&gt;). Home Assistant stays online the entire time without dropping a Zigbee or MQTT packet.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;nightly-offsite-sync-to-google-cloud-storage-rclone---size-only&#34;&gt;Nightly Offsite Sync to Google Cloud Storage (&lt;code&gt;rclone --size-only&lt;/code&gt;)
&lt;/h3&gt;&lt;p&gt;For offsite backups, an Unraid &lt;strong&gt;User Script&lt;/strong&gt; runs every night at &lt;code&gt;03:30&lt;/code&gt; to sync critical shares (&lt;code&gt;Photos&lt;/code&gt;, &lt;code&gt;Documents&lt;/code&gt;, &lt;code&gt;Music&lt;/code&gt;, and encrypted archives) to a &lt;strong&gt;Google Cloud Storage (GCS)&lt;/strong&gt; bucket protected by customer-managed encryption keys (CMEK):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Unraid User Script: Nightly Offsite Sync to GCS (03:30)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rclone sync /mnt/user/Photos gcs-offsite:homelab-backup-archive/Photos &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --size-only &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --transfers&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --checkers&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;16&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --bwlimit&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;50M &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --log-file&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/var/log/rclone-gcs-nightly.log &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --log-level&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;INFO
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;By default, &lt;code&gt;rclone&lt;/code&gt; compares checksums or modification timestamps, which can force local disk reads or slow metadata comparisons across hundreds of thousands of photo files. Passing &lt;code&gt;--size-only&lt;/code&gt; cut the nightly pre-sync check from hours to a few seconds.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;step-5-the-shared-apc-ups-setting-that-almost-killed-my-router-killdelay-0&#34;&gt;Step 5: The Shared APC UPS Setting That Almost Killed My Router (&lt;code&gt;KILLDELAY 0&lt;/code&gt;)
&lt;/h2&gt;&lt;p&gt;During UPS failover testing, one setting in Unraid nearly took down my entire network. My &lt;strong&gt;APC Back-UPS BX1200MI&lt;/strong&gt; powers three devices:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;UniFi Dream Machine Pro (UDM Pro)&lt;/strong&gt; and core PoE switches&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minisforum MS-01&lt;/strong&gt; Docker host&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Unraid NAS&lt;/strong&gt; (connected to the UPS via USB cable as the &lt;code&gt;apcupsd&lt;/code&gt; master)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Because the Unraid NAS spins 10 mechanical hard drives, I configured it to start a clean shutdown early in a power outage, as soon as battery runtime drops below &lt;strong&gt;15 minutes&lt;/strong&gt; or battery charge hits &lt;strong&gt;35%&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Gotcha:&lt;/strong&gt; In Unraid&amp;rsquo;s &lt;strong&gt;Settings -&amp;gt; UPS Settings&lt;/strong&gt;, watch out for &lt;strong&gt;&amp;ldquo;Turn off UPS after shutdown&amp;rdquo;&lt;/strong&gt;. If you leave it set to &lt;strong&gt;Yes&lt;/strong&gt;, Unraid instructs the APC UPS to cut AC output power (&lt;code&gt;killpower&lt;/code&gt;) right after the NAS finishes shutting down. Because my UDM Pro and Minisforum MS-01 share that same UPS and draw far less power than 10 hard drives, sending &lt;code&gt;killpower&lt;/code&gt; from Unraid cuts power to the router and Docker host while the battery still has 35% charge left! Always set &lt;strong&gt;Turn off UPS after shutdown: &lt;code&gt;No&lt;/code&gt;&lt;/strong&gt; (which writes &lt;code&gt;KILLDELAY 0&lt;/code&gt; in &lt;code&gt;/etc/apcupsd/apcupsd.conf&lt;/code&gt;) when your NAS shares a UPS with network gear.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;To sum it up, moving from the QNAP TS-873 to this custom Unraid 7 build solved every storage, noise, and compute bottleneck in my homelab. With all 10 drives mounted in the sound-dampened Fractal Define 7 PCGH and cooled by Noctua fans, the array sits at &lt;code&gt;37–39 °C&lt;/code&gt; and the SanDisk ZFS pool runs at &lt;code&gt;28–31 °C&lt;/code&gt; while remaining practically silent in the office.&lt;/p&gt;
&lt;p&gt;Best of all, when the &lt;code&gt;92 TB&lt;/code&gt; array eventually fills up, I don&amp;rsquo;t need to rebuild a RAID group or buy a new appliance: I can just swap out the smallest disk (&lt;code&gt;4 TB&lt;/code&gt; or &lt;code&gt;8 TB&lt;/code&gt;) for another &lt;code&gt;16 TB&lt;/code&gt; drive and let Unraid expand the filesystem in place.&lt;/p&gt;</description>
        </item>
        
    </channel>
</rss>
