The Decision That Wasn’t a Decision
When I started this homelab, I didn’t just pick Proxmox because someone on Reddit said so. I researched what OS would give me VMs, containers, and native ZFS — all on consumer hardware. Proxmox was the only one that checked every box.
Six months later, I can tell you exactly why the others would have failed for me. Not because they’re bad — because they didn’t fit the constraints I didn’t know I had.
The Contenders
| Option | What It Is | Why I Considered It |
|---|---|---|
| Proxmox VE | Debian-based hypervisor (KVM + LXC) | Free, ZFS native, VMs + containers |
| TrueNAS SCALE | Debian-based NAS OS (KVM + Docker apps) | ZFS-first, beautiful UI, "apps" for Docker |
| Unraid | Proprietary OS (KVM + Docker) | Parity array, great Docker UX, GPU passthrough |
| OpenMediaVault | Debian + web UI for NAS services | Familiar, runs on bare metal |
| Bare Metal Debian + Docker | Just Linux, no hypervisor | Simplest, maximum performance |
TrueNAS SCALE: The One I Evaluated Later (And Almost Switched To)
I wanted this to work. The UI is gorgeous. ZFS is first-class. The "Apps" catalog (Docker containers with pre-built configs) would have saved me weeks of Portainer stack writing.
The problem: By the time I evaluated TrueNAS, I already had Proxmox installed with ZFS running on the host (/tank — 3×2 TB RAID-Z).
To run TrueNAS, I had two options:
Option A: TrueNAS as VM on Proxmox (ZFS-on-ZFS)
Proxmox Host (ZFS /tank)
└── TrueNAS VM (virtual disk on /tank)
└── TrueNAS creates ITS OWN ZFS pool inside the virtual disk
Problems:
- Double ARC — both Proxmox and TrueNAS cache the same data in RAM
- Double checksumming — CPU overhead for zero gain
- I/O latency — virtual disk → Proxmox ZFS → physical disk
- No direct disk access — TrueNAS can’t manage SMART, can’t spin down drives
- Complexity — two ZFS layers, two snapshot systems, two send/receive configs
I tested this. fio benchmarks showed 30–40% write latency increase. For a NAS, that’s unacceptable.
Option B: TrueNAS Bare Metal (Pass Through Disks)
TrueNAS Host (ZFS /tank)
└── Proxmox VM (for other workloads)
Problem: TrueNAS SCALE’s VM management (via libvirt/KVM) is… functional but not Proxmox. No LXC. No integrated backup. No HA. GPU passthrough works but feels bolted on.
The real issue: I need Proxmox for the other workloads (Home Assistant, AdGuard, Docmost, Immich, n8n). Running Proxmox inside TrueNAS defeats the purpose.
Unraid: The Parity Temptation
Unraid’s "parity drive + data drives" model is brilliant for mixed drive sizes. Add a 4 TB drive to a 2 TB array? No rebalancing. Just works.
Why not:
- Proprietary — $129+ for Plus/Pro, license tied to USB stick
- No native ZFS — ZFS support is via plugin (Unraid 6.12+), not first-class
- Community toxicity — question the license model on forums, see what happens
- LXC? No. Only KVM VMs + Docker. Home Assistant in a VM is heavier than LXC.
- Single parity drive = single point of failure during rebuild. RAID-Z1 survives one drive death; Unraid parity survives one… but rebuild is all remaining drives reading at once.
For a homelab with mixed drive sizes and growth plans, Unraid makes sense. For my 3×2 TB identical drives? RAID-Z is cleaner.
OpenMediaVault: The Familiar Stranger
OMV runs on bare metal Debian. Web UI for Samba, NFS, Docker (via Compose plugin), users, disks.
Why I tried it: I know Debian. I know Samba. It should "just work."
What broke me:
- ZFS plugin is abandoned — doesn’t support ZFS 2.2 features, no RAID-Z expansion, no native encryption UI
- Docker Compose plugin — works but feels like "Portainer lite" without the polish
- No VM management — need separate libvirt/virt-manager setup
- Permission model — the
sharedfoldersabstraction fights with direct bind mounts
I spent three days on OMV ZFS permissions. Switched to plain Debian + Webmin + Samba. Never looked back.
Bare Metal Debian + Docker: The Purist Path
Debian 12 (bare metal)
├── ZFS (kernel module)
├── Samba
├── Docker + Portainer
└── Everything else (Docker)
Pros:
- Maximum performance (no hypervisor overhead)
- One OS to patch
- Simple mental model
Cons (for me):
- No VM isolation — Home Assistant must run as a VM (Home Assistant OS), not a container. What about a Windows VM for that one tool? Or a test TrueNAS VM? Or a GPU-passthrough VM for AI experiments?
- No snapshots of the OS — Proxmox backs up the entire VM (disk + config). Bare metal =
taryour/etcand hope. - Kernel updates = reboot everything — With Proxmox, VMs keep running during host kernel updates (mostly).
- GPU passthrough to Docker — works but
nvidia-container-toolkit+ Docker runtime config is fiddlier than Proxmox’s "PCI Device → VM" checkbox.
Why Proxmox Won (The Actual Decision Matrix)
| Criterion | Proxmox | TrueNAS SCALE | Unraid | OMV | Bare Metal |
|---|---|---|---|---|---|
| ZFS native | ✅ Host-level | ✅ Host-level | ⚠️ Plugin | ⚠️ Plugin | ✅ Kernel module |
| VM + LXC | ✅ Both | ✅ VM only | ✅ VM only | ❌ | ❌ |
| GPU passthrough | ✅ Checkbox | ✅ Config | ✅ Config | ⚠️ Manual | ⚠️ Manual |
| Backup (VM-level) | ✅ Built-in | ⚠️ Manual | ⚠️ Manual | ❌ | ❌ |
| HA / Clustering | ✅ Native | ⚠️ Limited | ❌ | ❌ | ❌ |
| Cost | Free | Free | $129+ | Free | Free |
| Learning curve | Medium | Low | Medium | Low | Low |
| My use case fit | ✅ Best | ❌ ZFS-on-ZFS | ❌ Proprietary | ❌ ZFS plugin | ❌ No VMs |
The Architecture I Landed On
Proxmox Host (bare metal) — Infra Node
├── ZFS Pool: /tank (3×2 TB RAID-Z) ← STORAGE LAYER
│ ├── /tank/data → bind mount → Samba VM
│ ├── /tank/media → NFS export → Smart Node (media stack)
│ ├── /tank/services → bind mount → Docker VM (Portainer)
│ └── /tank/temp → bind mount → Docker VM (downloads)
│
├── VM: Samba + Webmin (Debian 12) ← NAS layer
│ └── Mounts /tank/data, /tank/media via VirtIO-FS
│
├── VM: Home Assistant (Debian 12) ← Automation
│ └── Zigbee/Z-Wave USB passed through
│
└── VM: Docker/Portainer (Debian 12) ← App runtime
├── AdGuard, Docmost, Immich, n8n, Twingate connector, Cloudflare Tunnel (containers)
└── Mounts /tank/services, /tank/temp via bind mount
Smart Node (bare metal Debian 12) — separate physical machine
├── Docker + Portainer
│ ├── Media stack (*Arr, qBittorrent, Plex)
│ ├── Ollama + local LLMs
│ └── GPU transcoding (GTX 1060 NVENC/NVDEC)
│
└── NFS mount: /tank/media from Infra Node
Key insight: Proxmox host = storage layer. ZFS lives once, on the Infra Node host. VMs consume storage via bind mounts, NFS, or VirtIO-FS. No ZFS-on-ZFS. No double caching. Single source of truth.
The mp0 Bind Mount Trap
Proxmox has mp0 (mount point 0) for bind-mounting host paths into VMs. Documentation says "works for QEMU VMs."
It doesn’t. mp0 only works for LXC containers (they share the host kernel). For QEMU VMs, the mount happens inside the guest — but the guest kernel doesn’t see the host path.
I wasted an evening on:
# Proxmox host
mp0: /tank/data,mp=/mnt/data
Inside Debian VM: mount | grep mnt/data → nothing. systemd fails. fstab fails.
Solution: VirtIO-FS for VMs, bind mounts only for LXC.
# Proxmox VM config (via GUI or /etc/pve/qemu-server/100.conf)
virtiofs0: source=/tank/data,target=data
virtiofs1: source=/tank/media,target=media
Inside VM:
# /etc/fstab
data /mnt/data virtiofs defaults 0 0
media /mnt/media virtiofs defaults 0 0
Works. But: VirtIO-FS requires QEMU 6.0+ and kernel 5.10+ — fine for Debian 12, not for older distros.
The Honest Summary
Proxmox won because it was the only option that gave me:
- Host-level ZFS (no double-caching)
- Both VMs and LXCs
- Native backup of entire VMs
- Free, no license drama
- GPU passthrough via checkbox
It didn’t win because it’s perfect. The ZFS management is CLI-first. The VM backup is slow for large disks. The clustering is LAN-only. The UI shows "No subscription" nag on login.
But for a homelab with mixed workloads (NAS + AI + media + automation + HA) on consumer hardware in a single location — it’s the least-wrong choice.
Next Week
"Building My Automated Media Stack — The Plex Pass Journey and the Hardlink Lie" — the *Arr stack, qBittorrent, Plex, the Plex Pass journey from CPU to GPU transcoding, the hardlink dilemma over NFS, and why the title is a confession.
Currently running: Infra Node (Proxmox 8.2, ZFS 2.2, 6 TB RAID-Z, 16 GB RAM) + Smart Node (Debian 12, Docker, GTX 1060, 32 GB RAM, Ollama, Hermes Agent). Zero cloud subscriptions.