TrueNAS Services
| Service | Protocol | Used for |
|---|---|---|
| TFTP | tftpd-hpa (community app) |
PXE boot — bootloaders + iPXE menu; see DHCP & PXE Boot |
| NFS | NFS 4.1 | Unix/Linux clients, and the truenas-nfs VMware datastore mounted across the ESXi cluster |
| SMB | SMB | Windows clients |
| FTP | FTP | Camera/NVR recording file transfer |
| AFP | Apple Filing Protocol | Apple clients |
| iSCSI | iSCSI (software initiator on ESXi) | VMFS datastores backing VMware VMs (vsphere-k8s-gold, truenas-iscsi) |
| rsync | rsync | Sync between truenas and truenas-dr |
| UPS | NUT | Power-loss monitoring / graceful shutdown |
| Docker/Apps | — | truenas-dr only: Vault unsealer container, self-hosted ADO agent, a Ubuntu-based UniFi controller VM |
Notes worth keeping
- iSCSI portal binding matters. The portal should listen on the storage VLAN
address specifically (e.g.
10.10.20.3), not0.0.0.0— a portal on0.0.0.0advertises every address the box has, and ESXi will happily open a second session across the wrong VLAN, reintroducing the exact asymmetric-routing failure the PBR fix exists to prevent. - ATS heartbeat. TrueNAS iSCSI targets mishandle ATS-based VMFS heartbeats;
VMFS3.UseATSForHBOnVMFS5 = 0is set on ESXi hosts as a standard TrueNAS+ESXi pairing practice. - Docker/Apps containers are subject to the same PBR gap as native services when they try to reach a service on their own host — see Networking Gotchas.
- SMB execute permission after a TrueNAS SCALE upgrade. An upgrade can reset
smb_options, causing.exelaunches from an SMB share to fail with a permissions error (read/copy still work) because Samba maps NT-execute from the Unix execute bit. Fix:midclt call smb.update '{"smb_options": "acl allow execute always = True"}'then restart thecifsservice. - NFS export ACLs must match the current subnet, not a historical one. An export's
allowed-network list is scoped to whatever subnet existed when it was configured — if
a client's subnet changes (e.g. across a network redesign, or a VM landing on a
different VLAN than expected), the mount fails with what looks like a client-side
script bug but is actually the server denying that source network entirely. Check
showmount -e <truenas-host>from the actual client subnet before debugging the mount command itself. - NFSv4 root-mapping (
maproot) has a client-side caching trap. A Kubernetes StatefulSet'schown/initdb-style init container can fail withEINVALif a share'smaproot_user/maproot_groupare unset (root-squashed) — but NFSv4 also ignores per-sharemaprootentirely unless the global NFS service flag "Map Root User to root" (v4_v3owner) is enabled. Even after fixing both settings server-side, an already-mounted Linux NFS client won't pick up the change: it caches "server doesn't accept raw uid/gids" in a struct shared across every mount to that server (visible indmesgasNFS: v4 server ... does not accept raw uid/gids), so it only gets rechecked once every mount to that server drops — a full node reboot (or unmounting everything to that server), not just deleting the affected pod.