This release adds NVMe over Fabrics (TCP) as a third storage protocol alongside
NFS and iSCSI — higher-performance, lower-latency block storage backed by ZFS ZVOLs.
Requires TrueNAS SCALE 25.10.0 or newer. The driver verifies the server's
advertised API versions on startup and fails fast on older releases.
🚀 NVMe-oF/TCP
Select it per-StorageClass with parameters.protocol: nvmeof.
- Block and filesystem volume modes (ext4 / xfs)
- Volume expansion, snapshots, and clones — full parity with iSCSI
- DH-CHAP authentication — per-StorageClass
nvmeof.hostNQN+nvmeof.dhchapKey,
with optional mutual auth (nvmeof.dhchapCtrlKey) and hash / DH-group overrides.
Subsystems with auth are created withallow_any_host=false; without it, the
posture matches iSCSI-without-ACLs. - Shared TCP listener per portal (
:4420) and a sharednvmet.hostper StorageClass
with reference-counted cleanup; controller restarts reconstruct NVMe-oF volumes and
disambiguate them from iSCSI ZVOLs - Examples:
examples/storageclass-nvmeof.yaml,examples/storageclass-nvmeof-dhchap.yaml
Prerequisites: enable the NVMe-oF service on TrueNAS (Services → NVMe-oF). The node
DaemonSet loads nvme_tcp / nvme_fabrics on the host. Set the portal via
TRUENAS_NVMEOF_PORTAL (or nvmeofPortal in the operator CR); it defaults to the
TrueNAS host on port 4420.
⚠️ Note for existing deployments
Pool-based node topology (topology.truenas.io/pool) has been removed so Pods using
volumes from multiple pools schedule correctly (#29). PersistentVolumes created before
v1.1.0 keep their stale pool nodeAffinity — they still schedule on existing nodes, but
recreate the PV (or remove the affinity) to drop the constraint.
📦 Images
| Image | Reference |
|---|---|
| Driver (Alpine, multi-arch) | ghcr.io/truenas/truenas-csi:v1.1.0
|
| Driver (UBI, OpenShift) | quay.io/truenas_solutions/truenas-csi:v1.1.0
|
| Operator (UBI, OpenShift) | quay.io/truenas_solutions/truenas-csi-operator:v1.1.0
|
Full Changelog: v1.0.0...v1.1.0