Remote migration with shared storage not working is almost always NFS permissions. The Proxmox logs show a generic error, but the real problem is TrueNAS rejecting the write. Fix the mapping and it works.

What the error actually says
You try to migrate a VM and get something like storage migration failed: error with cfs-locked 'storage-...' or can't migrate VM with local disk. That second one is misleading. It means Proxmox doesn’t see the shared storage as shared, so it thinks the disk is local to the source node.
Check the obvious first
On both Proxmox nodes, run pvesm status. The shared storage should show as active on both. If it’s only active on one, the other node can’t mount the NFS export. That’s your problem.
Now check /etc/pve/storage.cfg. The storage definition must have shared 1 and the same path on both nodes. If the path differs, Proxmox treats it as local storage and refuses remote migration.

NFS permissions on TrueNAS
This is where it usually goes wrong. TrueNAS defaults to root squash, which means Proxmox’s root user gets mapped to nobody. That breaks migration because Proxmox needs to write as root to the shared dataset.
On TrueNAS, edit the NFS share and set Maproot User to root and Maproot Group to wheel. If you’re using an unprivileged LXC, you’ll also need to map the container’s root to an unprivileged user on the NAS. I wrote about that headache in proxmox backup skips bind-mounted NAS datasets in unprivileged LXC containers.
After changing the maproot, restart the NFS service on TrueNAS. On Proxmox, remount the storage: umount /mnt/pve/nas-share && mount /mnt/pve/nas-share. Then test with touch /mnt/pve/nas-share/testfile as root. If that works, migration should too.
One more thing: the storage name
Proxmox matches storage by name, not by path. If you added the NFS share with different names on each node (like nas1 on one and nas2 on the other), remote migration fails silently. Rename them so they match exactly in storage.cfg.
This is the kind of thing that wastes an evening. The fix is simple once you see it, but the error message points you nowhere. Check permissions, check the path, check the name. One of those is wrong.