worklog Custom NAS #2: Hardware list
$ link: https://hisilo.me/logs/nas-zfs-2/
$ series: Custom NAS on ZFS and MSI B250M PRO-VD #2 ← #1→
The build
Core
| # | Part | Model | Price CHF | Where | Condition | Bought | Installed |
|---|---|---|---|---|---|---|---|
| 1 | Motherboard | MSI B250M PRO-VD | 57.19 | AliExpress | refurbished | 29.12.2024 | 28.04.2025 |
| 2 | CPU | Intel Core i5-6600T | 32.59 | AliExpress | refurbished | 02.03.2025 | 28.04.2025 |
| 3 | CPU cooler | Xilence I250PWM | 12.70 | Galaxus.ch | new | 13.03.2025 | 28.04.2025 |
| 4 | RAM | Corsair CMK32GX4M2A2666C16R | 30 | Ricardo.ch | new | 27.03.2025 | 28.04.2025 |
| 5 | NVMe boot #1 | Samsung PM9B1 2230 256 GB | 55.51 | AliExpress | new | 03.03.2025 | 10.10.2026 |
| 6 | NVMe boot #2 | Samsung PM9B1 2230 256 GB | 42.59 | AliExpress | new | 11.10.2026 | - |
| 7 | PCIe x1 #1 | ASM1182e (PCIe x1 → 2x M.2) | 10.09 | AliExpress | new | 27.09.2026 | 10.10.2026 |
| 8 | PCIe x16 | ASM2824 (PCIe x16 → 4x M.2) | 74.52 | AliExpress | new | 27.09.2026 | - |
| 9 | M.2 | Intel JL82599EN (M.2 → SFP+) | 31.39 | AliExpress | new | 26.09.2026 | - |
| 10 | PSU | be quiet! Pure Power 12 M 550 W | 68.45 | Galaxus.ch | used | 08.10.2026 | - |
| 11 | Case | Thermaltake Divider 200 TG Air | 65 | Ricardo.ch | new | 01.03.2025 | 28.04.2025 |
Total: CHF 480
Utilities
| # | Part | Model | Price CHF | Where |
|---|---|---|---|---|
| U1 | Cable | SFP+ DAC Cable, 3 m | 11.23 | AliExpress |
| U2 | Adapter | Molex → SATA | - | had it |
| U3 | Cable | SATA, 5 pcs | 6.80 | AliExpress |
| U4 | Mount | Steel three-storey cage for 3.5" SATA | 10.59 | AliExpress |
| U5 | Splitter | 4-pin 1→2 on SYS_FAN | 1.70 | AliExpress |
| U6 | Mount | 50x M3x5 / 6-32 flat-head screws | 2.75 | AliExpress |
| U7 | Pads | Self-adhesive silicone pads, 10x2 mm, 50 pcs | 1.49 | AliExpress |
| U8 | Cable ties | Self-locking nylon cable ties | 1.54 | AliExpress |
Total: CHF 36
Data drives
| # | Part | Model | Price CHF | Where | Condition | Bought | Installed |
|---|---|---|---|---|---|---|---|
| S1 | NVMe fast #1 | Samsung PM9A1 1 TB | - | had it | used | - | - |
| S2 | NVMe fast #2 | Samsung PM981a 1 TB | - | had it | used | - | - |
| S3 | HDD tank #1 | Seagate IronWolf 6 TB | 200.99 | AliExpress | new | 26.09.2026 | - |
| S4 | HDD tank #2–3 | 2x Seagate IronWolf 6 TB | 2x 202.39 | AliExpress | new | 30.09.2026 | - |
| S5 | HDD backup #1 | Seagate Barracuda 6 TB | - | had it | used | - | - |
| S6 | HDD backup #2 | Seagate Barracuda 6 TB | 139.12 | Amazon.fr | new | 24.03.2025 | - |
Total: CHF 745
Build total: CHF 1 261
Not in the build
Debugging gear
Bought for bring-up and troubleshooting; not part of the final build.
| # | Part | Model | Price CHF | Where |
|---|---|---|---|---|
| D1 | USB expansion card | 4-port USB 3.0 PCIe | 6.87 | AliExpress |
| D2 | Keyboard adapter | PS/2 male → USB-A female | 2.36 | AliExpress |
| D3 | Front-panel adapter | USB 2.0 9-pin → USB-C (Type-E) | 2.48 | AliExpress |
| D4 | Video adapter | VGA → HDMI | 7.60 | Amazon.fr |
Total: CHF 19
Failures
Parts that died in service and were replaced.
| # | Part | Model | Price CHF | Where | Condition | Bought | Installed | Replaced | Cause |
|---|---|---|---|---|---|---|---|---|---|
| F1 | PSU | LC-Power LC420-12 | 31.90 | Galaxus.ch | new | 13.03.2025 | 28.04.2025 | 12.10.2026 | A short circuit made it unstable |
Total: CHF 31.90
Note: everything below describes the final configuration, not the current one: 4x NVMe on the ASM2824;
tankas 6x 6 TB IronWolf raidz1 on the onboard SATA ports; warm backup (18 TB + 2x 6 TB) in an external box with its own power supply, attached through the free PCIe x1 slot.
Layout
| Pool | Drives | Role |
|---|---|---|
rpool | 2x NVMe 256 GB, mirror (PCIe x1 → ASM1182e) | OS |
fast | 4x NVMe 1 TB, two mirrors (ASM2824), ~1.8 TiB usable | Jellyfin, TorrServer, Nix cache, etc. |
tank | 6x IronWolf 6 TB, raidz1, ~27 TiB usable | main storage |
backup | 1x 18 TB CMR + 2x Barracuda SMR 6 TB, stripe, ~27 TiB usable (external box) | warm backup of tank |
Failure model and tiers
| Event | What saves you | What you lose |
|---|---|---|
1 drive in tank | resilver | nothing, pool degraded but alive |
| 2nd drive during resilver | warm backup | data since the last zfs send |
| drive in warm backup | tank | nothing, send it again |
| everything at once (PSU, lightning, ransomware, fire) | nothing | everything outside the partial cold copy |
Cold, partial: documents, KeePass databases and 2FA exports on a Kingston IronKey; photo archive on an external HDD.
Appendix A: rebuild time after a drive swap
Ranges from Synology and TrueNAS forum reports plus arithmetic on average HDD throughput (~140 MB/s for 6 TB CMR). Conditions: idle array, CMR drives, raidz1 ~70 % full.
| Array | RAID5 (mdadm, Synology) | SHR-1 | raidz1 (ZFS) |
|---|---|---|---|
| 6x 6 TB | 10–16 h | 10–18 h | 5–9 h |
| 6x 10 TB | 16–28 h | 18–30 h | 9–15 h |
| 6x 16 TB | 24–40 h | 26–45 h | 14–24 h |
(Multiply times: ×3–5 for SMR drives, ×1.5 if the array is under load during rebuild.)
Legend:
- RAID5/SHR read the whole disk, time does not depend on fill. raidz1 resilvers only allocated blocks: an empty pool takes minutes, a full one is RAID5.
- DSM throttles rebuild speed by default ("Balanced"/"Low impact"); in "Low impact" 6 TB stretches to 2–3 days.
- A read error on a surviving drive mid-rebuild: mdadm kicks the drive and the array collapses; ZFS marks one file as damaged and carries on.
Our tank (6x 6 TB, ~70 %): ~4 TB of data per drive, resilver 6–8 h.
Sources:
- https://sraidcalculator.com/blog/synology-nas-rebuild-time
- https://community.synology.com/enu/forum/1/post/140325
- https://forums.truenas.com/t/long-resilver-time-tl-dr/29218
- https://www.truenas.com/community/threads/drive-size-and-resilvering-times.95917
- https://louwrentius.com/zfs-resilver-performance-of-various-raid-schemas.html
Appendix B: power draw and running cost
Estimate from component datasheets. Wall figures assume ~87 % PSU efficiency at 10–20 % load (80+ Gold).
| Component | Idle | Load |
|---|---|---|
| i5-6600T + B250M + 2x DDR4 | 14 W | 45 W |
6x IronWolf 6 TB (tank, spinning / standby) | 24 W / 5 W | 32 W |
| 4x NVMe | 2.5 W | 8 W |
| ASM2824 switch | 5 W | 6 W |
| ASM1182e adapter | 1.5 W | 1.5 W |
| ASM1166 (PCIe x1 → eSATA, warm box) | 2 W | 2 W |
| 82599EN + DAC | 6 W | 6 W |
| Fans (200 + 120 + CPU) | 3 W | 4 W |
| DC total | ~58 W (tank standby: ~39 W) | ~105 W |
| At the wall | ~67 W (tank standby: ~45 W) | ~121 W |
| Warm box, own PSU (18 TB + 2x 6 TB), at the wall | ~2 W (standby, pool exported) | ~25 W (during zfs recv) |
(Measured figures with a wall meter: separate worklog after the build.)
Load = scrub or nightly zfs send; runs a few hours a day at most. Scenarios include the warm box: standby except 2 h of nightly send, ~4 W average. tank spins down after inactivity (planned, timeout to be tuned against spin-up count in SMART).
SIG tariff 2026, Profil Simple, Électricité Vitale Vert 10 % (reference product), VAT included:
| Item | ct/kWh |
|---|---|
| Energy | 11.24 |
| Grid use | 11.35 |
| Cantonal levy (13.2 % of grid use) | 1.50 |
| Federal renewable surcharge | 2.49 |
| Federal electricity reserve | 0.44 |
| Solidarity costs | 0.05 |
| Total | 27.1 |
Meter fee (CHF 7.24/month) is fixed per household and not attributed to the NAS.
| Scenario | Average draw | kWh/year | CHF/year | CHF/month |
|---|---|---|---|---|
Idle 24/7, tank spinning | 71 W | 622 | 169 | 14.0 |
Idle 24/7, tank standby | 49 W | 429 | 116 | 9.7 |
| 14 h standby + 8 h spinning + 2 h load | 63 W | 552 | 150 | 12.5 |
| Load 24/7 (upper bound) | 146 W | 1279 | 347 | 28.9 |
Source: https://media.sig-ge.ch/documents/tarifs_reglements/electricite/tarifs/tarifs_electricite_tous_clients.pdf
Appendix C: deferred to the next build
Each needs different hardware or does not pay off at this size.
| Feature | What it solves | Why not now | What it takes |
|---|---|---|---|
| ECC RAM | Bit flips in RAM before ZFS checksums the block; ZFS cannot detect these | B250M / i5-6600T do not support ECC | W680 or C246 board + Xeon E / i3 with ECC, or AM4/AM5 board with ECC UDIMM validated (ASRock Rack); ECC UDIMM |
ZFS special vdev on its own NVMe mirror | Metadata and small blocks on SSD: directory listings, find, rsync scans, small-file datasets stop touching HDD | Media-heavy pool at 30 TB, ARC 32 GB covers hot metadata; losing special loses the pool, so it must be a mirror, and all four M.2 slots on the ASM2824 are taken by fast | 2x NVMe (~1 % of pool size, 256–512 GB) on a dedicated mirror; special_small_blocks per dataset |
| Hot plugging | Swap a failed drive without powering down; no resilver interruption from a reboot | Divider 200 has fixed cages, no backplane; drives are cabled directly | Case with hot-swap bays and SATA backplane (or a 5-in-3 cage), AHCI hot-plug enabled in BIOS, zpool replace by /dev/disk/by-id |
Cold backup of tank | Full offline copy in another building: fire, theft, ransomware, operator error | Partial cold only: KeePass DBs + 2FA export on Kingston IronKey, photo archive on an external HDD | 2x 18 TB or a second NAS at another site; rotate monthly; zfs send to it, then export and unplug |
| UPS | Clean shutdown on power loss; no interrupted resilver or scrub; HDD heads park under power, not on a crash | ZFS itself survives a power cut (transactional, copy-on-write); the remaining risk is mechanical and a mid-resilver cut on raidz1 | 600–900 VA line-interactive (APC Back-UPS, Eaton Ellipse), USB, NUT on NixOS with services.ups; ~CHF 150–250 |
| L2ARC | Second-level read cache on NVMe when the working set does not fit in ARC | ARC 32 GB is not saturated by a media workload; L2ARC only helps once ARC hit rate drops; L2ARC headers consume ARC | One NVMe (no mirror needed, loss is harmless), zpool add tank cache, persistent since ZFS 2.0; add after seeing arcstat hit rate < 90 % |