TrueNAS VM Build And Pool Design
Create the TrueNAS SCALE VM on Proxmox, pass through the LSI 9400 HBA via PCIe IOMMU, and build the RAID-Z1 pool without drifting from validated host commands.
Published December 19, 2024 · Updated September 23, 2026
TrueNAS VM Build And Pool Design
This page covers the mechanical part of the move: configuring PCIe passthrough for the LSI 9400 HBA, building the TrueNAS SCALE virtual machine, and initializing the 3x 8TB drives as a raw RAID-Z1 ZFS array.
By passing through the entire HBA controller rather than individual virtualized disks, TrueNAS gains direct bare-metal access to the drives. This is the industry-standard requirement for ZFS to accurately monitor SMART data, detect silent bit-rot, and perform self-healing scrubs.
Why RAID-Z1 (3 Drives)
With three 8TB NAS drives, RAID-Z1 (single parity) is the optimal topology.
| Topology | Drives | Usable Space | Fault Tolerance |
|---|---|---|---|
| RAID-Z1 | 3 active | ~16 TB | 1 drive failure |
| Mirror + Spare | 2 active + 1 spare | ~8 TB | 1 drive plus automatic recovery |
RAID-Z1 doubles our usable capacity compared to a mirror, while still surviving a complete drive failure. ZFS handles the parity striping automatically.
Phase 0: Resource Reallocation
TrueNAS SCALE relies heavily on memory for ZFS ARC. The EPYC host must allocate sufficient RAM to the VM while ensuring the host itself is not starved.
Limit Host ZFS ARC
Since the massive storage pool will be managed by the TrueNAS VM, the Proxmox host's ZFS ARC only needs enough memory for the root OS pool (rpool).
# Set host ZFS ARC max to 4GB
echo "options zfs zfs_arc_max=4294967296" > /etc/modprobe.d/zfs.conf
# Apply without reboot
echo 4294967296 > /sys/module/zfs/parameters/zfs_arc_max
# Verify
cat /sys/module/zfs/parameters/zfs_arc_maxPhase 1: Physical Install And Pre-Migration
Ensure the LSI 9400 HBA is installed in the EPYC motherboard and flashed to IT mode (Initiator Target mode). IT mode disables any hardware RAID logic on the card, presenting the disks as raw block devices to the OS.
Identify the HBA PCI Address
We need the exact PCI address of the HBA to pass it through to the VM.
# Find the LSI card's PCI address
lspci | grep -i lsi
# Expected output example:
# 04:00.0 Serial Attached SCSI controller: Broadcom / LSI SAS3408 Fusion-MPT Tri-Mode I/O Controller ChipNote the 04:00.0 prefix. This is the IOMMU group ID we will use.
Phase 2: Create The VM & Pass Through The HBA
Download the ISO
cd /var/lib/vz/template/iso/
# Download TrueNAS SCALE ElectricEel
wget https://download.truenas.com/TrueNAS-SCALE-ElectricEel/24.10.2/TrueNAS-SCALE-24.10.2.isoCreate the TrueNAS VM
# Create the VM with 32GB RAM and 4 EPYC cores
qm create 300 \
--name truenas \
--memory 32768 \
--balloon 0 \
--cores 4 \
--cpu host \
--machine q35 \
--bios ovmf \
--efidisk0 local-zfs:1,efitype=4m,pre-enrolled-keys=0 \
--scsihw virtio-scsi-single \
--scsi0 local-zfs:32,discard=on,ssd=1 \
--net0 virtio,bridge=vmbr0 \
--cdrom local:iso/TrueNAS-SCALE-24.10.2.iso \
--boot order=scsi0 \
--onboot 1 \
--startup order=1,up=120PCIe Passthrough (IOMMU)
Instead of passing individual virtual disks, we pass the entire HBA card.
# Map the PCI address identified earlier (e.g., 04:00.0) to the VM
qm set 300 -hostpci0 04:00.0,pcie=1
# Verify VM config
qm config 300 | grep hostpciPhase 3: Install TrueNAS SCALE
Boot the installer
qm start 300Install TrueNAS onto the 32 GB virtio disk (scsi0). The three 8TB drives attached to the HBA will appear in the installer, but do not install the OS onto them.
After the install finishes, remove the ISO from the Proxmox side:
qm set 300 --cdrom noneInitial Settings
Set a static IP in the TrueNAS console menu. Fresh SCALE 24.10 installs use truenas_admin as the default administrative account.
- IP address:
10.0.10.50(VLAN 10 Management) - subnet mask:
255.255.255.0 - default gateway:
10.0.10.1
Phase 4: Create tank As RAID-Z1
Verify the disks inside TrueNAS
In the TrueNAS UI, check Storage -> Disks and confirm all three 8TB drives are visible and expose SMART data. Because we passed through the HBA, TrueNAS has direct hardware communication with the platters.
Create the pool
You can create this via the UI, or via the Shell widget:
# Identify drive IDs
ls -la /dev/disk/by-id/ | grep -v part | grep ata
# Create pool: RAID-Z1 of 3 drives
zpool create -f tank \
raidz1 \
/dev/disk/by-id/ata-WDC_WD80EFAX_<SERIAL1> \
/dev/disk/by-id/ata-WDC_WD80EFAX_<SERIAL2> \
/dev/disk/by-id/ata-WDC_WD80EFAX_<SERIAL3># Enable zstd compression on the pool
zfs set compression=zstd tankCreate datasets with tuned record sizes
# Create standard datasets
zfs create -o recordsize=1M tank/media
zfs create -o recordsize=1M -o quota=2T tank/models
zfs create -o recordsize=128K -o quota=500G tank/docker
zfs create -o recordsize=128K -o quota=500G tank/documentsUse 1M record sizes for large sequential files (LLM models, media). Use 128K for mixed or random I/O workloads (Docker, documents).