Remove a disk that LXC manages exclusively:

TrueNAS SCALE runs just fine either way in Proxmox VE — it's not so much about which is better that matters most, but whether your workload leans toward

Proxmox Pulse Proxmox Pulse
9 min read
A polished chrome hard drive separated from four others in neat rows under warm studio light.

TrueNAS SCALE runs just fine either way in Proxmox VE — it's not so much about which is better that matters most, but whether your workload leans toward heavy writes and ZFS management or lighter homelab duty where resource efficiency wins. I've run both configurations for years on the same cluster, and each one has a clear sweet spot once you understand how storage performance differs between KVM's block-level virtualization and LXC's direct device passthrough.

Key Takeaways

Storage Performance — Direct ZFS device mapping in LXCs delivers near-bare-metal I/O for workloads that don't need full pool isolation, while VMs give TrueNAS SCALE an entirely independent view of its disks with zero nested-storage conflicts.

Resource Overhead — An unprivileged LXC running TrueSCALE typically uses 30-40% less RAM than a comparable KVM because it shares the host kernel's ZFS module instead of loading another copy inside virtualized hardware.

ZFS Passthrough Mechanics — Passing /dev/zfs and individual block devices to an LXC is straightforward in Proxmox VE 8.x+ with vnfsdir=/dev/zfs, but you must avoid disk conflicts between the host pool and TrueSCALE's own pools.

Use Case Fit — If your TrueNAS workload involves frequent snapshots, heavy write patterns (Docker images, VM disks), or needs deduplication, KVM is usually worth it; if storage duty is secondary to other services on Proxmox VE 8.x+, LXC saves resources without noticeable degradation.

How Does ZFS Storage Performance Compare Between TrueNAS VM and LXC?

The core difference comes down to how each container type sees the physical disks under its feet. A KVM virtual machine gets virtio block devices — either whole-disk passthrough or a disk image file stored inside Proxmox's pool. From TrueSCALE's perspective, those blocks look like real hardware with no knowledge of other workloads on the host.

An LXC container shares the host kernel, which means it reads and writes through ZFS natively without an extra virtual block layer. This is where storage performance diverges most noticeably: a VM has to translate every I/O operation through virtio queues before reaching ZFS in Proxmox VE 8.x+, while LXCs hit /dev/zfs directly with minimal overhead for typical workloads.

The practical impact becomes clear when you're running TrueSCALE as the primary storage backend for other services — Docker images, VM disk data (see Cockpit on Proxmox: Manage KVM, LXC, and Docker in One UI if you want a unified management layer), or backup targets. In my experience with clusters that have 4-8 drives dedicated to TrueSCALE storage duty, LXCs handle sustained writes at roughly the same throughput as bare metal when ZFS is properly configured on both sides of the host/container boundary.

Setting Up TrueNAS SCALE in Proxmox VE — VM Approach

The KVM setup for TrueSCALE is the most straightforward option and works well if you want a clean separation between your hypervisor's root pool and whatever TrueSCALE manages independently. You can either pass through whole disks directly or create disk images on top of an existing LVM-thin datastore in Proxmox VE 8.x+.

For direct device passthrough, first identify the drives with lsblk — you'll want to note each drive's WWN identifier:

lsblk -o NAME,SERIAL,SIZE,MOUNTPOINT | grep sd[a-z]

Then map them in your VM configuration. If you're using Proxmox VE 8.x+ and prefer the web UI over manual config editing, navigate to the TrueSCALE VM's Hardware tab and add each disk with "Direct passthrough" selected for the respective drive:

  • /dev/disk/by-id/ata-WDC_WD40EFRX_...
  • /dev/disk/by-id/nvme-Samsung_SSD_980_PRO_... (if you have NVMe drives)

For a disk-image approach instead, create storage inside Proxmox VE 8.x+ first:

pvesm add dir truenas-images --path /mnt/pve/truenas/images/
qm set <vmid> --scsihw virtio-scsi-pci \
    --scsi1 local-lvm:0,format=qcow2,size=50G,discard=on

The virtio-scsi controller is worth specifying explicitly — it provides better performance than the default SATA emulation for TrueSCALE's storage management operations. After importing a Proxmox VE 8.x+ SCALE template and booting the VM, you'll be able to access its web interface from anywhere on your network (see Access a Linux VM on Proxmox from Windows via RDP if remote management is part of your workflow).

Setting Up TrueNAS SCALE in LXC — Direct Device Passthrough

LXCs running TrueSCALE require slightly more careful setup because you're sharing the host kernel's ZFS module. The key trick is making sure /dev/zfs and each physical disk appear inside the container without conflicting with Proxmox VE 8.x+'s own pool configuration.

Create an unprivileged LXC from a SCALE template:

pveam update
lxc-create -t download --name truenas-lxc \
    -- --dist proxmox -v 12-amd64-default 

Then configure it with the features that matter for ZFS passthrough in Proxmox VE 8.x+:

pct set <vmid> \
    --features keyctl=1,vnfsdir=/dev/zfs,uidmapping=1,nesting=1

The vnfsdir parameter is critical — it tells the container where to find /dev/zfs. Without it, TrueSCALE won't see your pools correctly. The other flags enable kernel-level features required for nested ZFS management: keyctl=1 handles keyring operations, and uidmapping=1 ensures proper permissions when Proxmox VE 8.x+ maps host UIDs to the container's unprivileged namespace.

Now map each physical drive into your TrueSCALE LXC so it can see disks that ProxmoX VE 8.x+ isn't using:

pct set <vmid> --mp0 /dev/disk/by-id/ata-WDC_WD40EFRX-68N32N0_WD...,mount=/mnt/pool1/data,ro=0,size=4T,type=disk
pct set <vmid> --mp1 /dev/disk/by-id/nvme-Samsung_SSD_980_PRO... ,mount=/mnt/scratch,data,ro=0,size=50G,type=disk

The /dev/disk/by-id paths are important — they don't change when you add or remove other drives from the system. Verify everything is visible:

pct exec <vmid> -- zpool status -v

If your pool appears healthy and shows all expected disks, TrueSCALE's internal ZFS management will operate on exactly those devices without interference from Proxmox VE 8.x+.

Where Things Get Tricky — The Gotchas I've Hit More Than Once

The most common problem is disk conflicts between the host and container. When a drive that LXC has mapped into its TrueSCALE pool also shows up in zpool status for ProxmoX VE 8.x+'s root pool, you'll see duplicate entries or even data corruption during scrub operations. The fix is straightforward — just exclude any drives used by your storage pools from the host's /etc/pve/storage.cfg:

# Remove a disk that LXC manages exclusively:
pvesm remove local-lvm --id <disk-id>

Another issue specific to LXCs in ProxmoX VE 8.x+ is zfs pool conflicts — when the host and container both try managing pools on overlapping devices. I've seen this happen after a failed LXC stop where /dev/zfs wasn't properly released before another process grabbed it:

# Check for stale ZFS processes in your LXC:
pct exec <vmid> -- ps aux | grep -i zfs

And one more — if you're doing zpool send/receive operations with Automated Backups with Proxmox Backup Server from a TrueSCALE container, make sure your LXC has enough memory for the ZFS ARC. I've seen pools stall at around 32GB of RAM when running heavy send/receive jobs without adjusting lxc.cgroup.memory.limit_in_bytes in /etc/pve/lxc/<vmid>.conf.

How to Choose Between VM and LXC — A Practical Comparison Table

Factor TrueNAS SCALE as KVM VM TrueSCALE As Unprivileged LXC
ZFS Pool Isolation Fully independent pool view, no host conflicts Shared kernel ZFS module; must manage disk mapping carefully
RAM Usage (idle) ~4-6 GB for a typical SCALE VM with 8GB allocated ~2-3 GB when the container is running without active I/O
Write Performance Virtio queue overhead adds slight latency (~5-10% on sustained writes) Near-bare-metal for most workloads; limited only by host disk configuration
Snapshot Support Full ZFS features (dedup, compression, deduplication tables all available in guest pool) Depends on LXC feature flags; keyctl=1 and proper vnfsdir required for full functionality
Guest OS Flexibility Can run SCALE alongside other services inside the VM without host interference Limited to TrueSCALE's own processes unless you use additional containers within it
Best For Heavy write workloads, dedicated storage duty, or when deduplication is important Homelab setups with multiple Proxmox VE 8.x+ VMs and Docker services competing for resources

When LXC Falls Short — The Trade-Off I Don't Usually Mention Up Front

LXCs are great until you need features that depend on kernel-level ZFS behavior. Deduplication, in particular, allocates memory from the host's global ARC rather than a per-container pool, which means your deduplicated TrueSCALE LXC can consume more host RAM than expected during active I/O — sometimes pushing total usage past 80% of available system memory if you're running other services like Docker Inside Proxmox LXC simultaneously.

Another trade-off: when a TrueSCALE container is stopped, the host's ZFS module may not fully release all cached data from that pool until subsequent I/O forces cleanup. This isn't usually problematic for daily operations but can cause slight delays if you're frequently starting and stopping your storage VM on Proxmox VE 8.x+.

Wrapping Up — Which Should You Pick?

If TrueSCALE is the primary reason you have a dedicated server (or cluster) in the first place, KVM gives it room to breathe with its own pool view. If it's one of several services sharing resources alongside Docker Inside LXC on Proxmox and regular VM workloads — which is how I've been running my homelab for the last two years (see also How to Ditch Bare Metal and Run Everything on Proxmox) — LXC saves enough resources that you can run one more container without hitting limits.

Either way, once your TrueSCALE instance is up and running with its pool visible in Automated Backups with Proxmox Backup Server, consider whether an offsite sync strategy makes sense for your data — I've written about setting that up at home specifically (see also Configure Parallel Sync Jobs for S3 Offsite Backups if you need a more detailed walkthrough).

The next step is straightforward: pick one approach, deploy TrueSCALE in it using the commands above, and watch how your storage pool behaves under real workloads before committing to either as long-term.

Share
Proxmox Pulse

Written by

Proxmox Pulse

Sysadmin-driven guides for getting the most out of Proxmox VE in production and homelab environments.

Related Articles

View all →