Quick answer

qm remote-migrate moves a VM to a standalone Proxmox host with an API token made on the target and an explicit --target-storage. It is still experimental in Proxmox VE 9.2, refuses guests with snapshots, and will not copy an offline disk between ZFS and any other storage type. vzdump plus qmrestore crosses any storage.

Contents

qm migrate moves a guest to another node of the same cluster. Between two standalone Proxmox VE hosts there are three routes: qm remote-migrate (or pct remote-migrate) straight to the other host, a backup restored on the new host, or zfs send when both hosts keep guests on ZFS. The table below picks one by downtime, storage type and what each needs. It is written for Proxmox VE 9.2 (released May 21, 2026) against its 9.2.12 manual pages, dated September 18, 2026. (For live migration and high availability inside a cluster, see Proxmox clustering and HA.)

Keep the source until the new copy boots. remote-migrate leaves the source VM stopped and locked unless you pass --delete 1; qm unlock <vmid> gives it back if the move goes wrong. Backup and restore and ZFS send leave the source guest in place.

Which method fits your move

Look up both hosts’ storage type first. Each storage in /etc/pve/storage.cfg starts with a <type>: <STORAGE_ID> line, such as lvmthin: local-lvm or zfspool: local-zfs.

MethodDowntimeStorage it can crossNeedsSources
qm remote-migrate --online, running VMUsually under a second (qm chapter, online migration)Any, for attached disks; TPM-state and unused disks follow the next row7.3+ on both hosts, API token, no snapshots, no ISO, a CPU type the new CPU supportsqm(1), qm chapter, QemuMigrate.pm
qm remote-migrate, stopped VMThe full disk copyZFS only to ZFS; LVM, LVM-thin, directory, NFS, CIFS, BTRFS and Ceph RBD among themselves7.3+ on both hosts, API token, no snapshots, no ISOqm(1), pve-storage
pct remote-migrate --restart, containerShutdown, copy, startThe stopped-VM rule for a raw root disk; a subvolume needs a target that takes subvolumes7.3+ on both hosts, API token, no snapshotspct(1), pct chapter, Migrate.pm
vzdump, then qmrestore or pct restoreShutdown to first boot: backup, copy, restoreAny (--storage)Space for the archive on both hostsvzdump chapter, qmrestore(1)
Restore from Proxmox Backup ServerFinal backup plus restore; final backup plus a boot with --live-restoreAny (--storage)PBS storage on both hosts, same encryption keyqmrestore(1), storage chapter
zfs send and zfs receive, or pve-zsyncOne incremental send after shutdownZFS to ZFS onlyZFS on both hosts, root SSH, the config copied by handzfs-send(8), PVE-zsync

The storage rule comes from pve-storage: a ZFS pool imports only ZFS streams, while LVM, LVM-thin, directory, NFS, CIFS, BTRFS and Ceph RBD storage all exchange raw-format volumes, so a stopped VM, or a container whose root disk is a raw image, can go from local-lvm to a directory storage on the new host but not to local-zfs. A container stored as a subvolume (BTRFS, or a size 0 root disk on directory storage) exports as tar+size, which only storage that takes subvolumes can import; for one of those, back up and restore. Containers never go live. The pct manual lists --online, but the pct chapter says running containers cannot be live-migrated. Offline, the copy time is the downtime. The transfer time calculator opens on a 100 GB disk over gigabit.

Method 1: qm remote-migrate (direct, supports live)

qm remote-migrate arrived in Proxmox VE 7.3 (November 22, 2022), and the 9.2.12 manual still marks it “EXPERIMENTAL feature!”. Proxmox Datacenter Manager, whose first stable release came in December 2025, adds live migration between independent clusters to a web UI.

Syntax (VM):

qm remote-migrate <vmid> [<target-vmid>] <target-endpoint> \
  --target-bridge <bridge> --target-storage <storage> [OPTIONS]

The <target-endpoint> is:

apitoken=PVEAPIToken=user@realm!token=SECRET,host=ADDRESS[,fingerprint=FP][,port=PORT]

Make the token on the target host

pveum user token add root@pam migrate --privsep 0

It prints the secret once. It cannot be shown again. --privsep 0 gives the token root’s full rights. To keep privilege separation on, create it without that flag and grant it a role on /:

pveum acl modify / --tokens 'root@pam!migrate' --roles Administrator

The target’s migration tunnel checks VM.Allocate on /vms/<vmid> and Sys.Incoming on /, and the API reference adds that further checks run during the migration, which is why I would not build a narrow role for a one-off move. In the GUI the token lives under Datacenter → Permissions → API Tokens. Remove it afterwards with pveum user token delete root@pam migrate.

Read the target’s fingerprint on the target:

openssl x509 -fingerprint -sha256 -noout -in /etc/pve/nodes/$(hostname)/pve-ssl.pem

If you installed a custom or Let’s Encrypt certificate, read /etc/pve/local/pveproxy-ssl.pem instead. Leave fingerprint= out and, with the default certificate, the command stops with fingerprint '<value>' not verified, abort!, which hands you the value.

Run it on the source host

Replace <secret> and <fingerprint> with the target’s values, and pick a target VMID that is free there.

qm remote-migrate 134 205 \
  'apitoken=PVEAPIToken=root@pam!migrate=<secret>,host=192.168.1.20,fingerprint=<fingerprint>' \
  --target-bridge vmbr0 --target-storage local-lvm --online

That moves running VM 134 to become VM 205 on 192.168.1.20, with its disks on local-lvm and its network on vmbr0. Keep the single quotes. Inside double quotes an interactive bash reads the ! as history expansion.

Name the storage. One storage ID sends every disk there, and source:target pairs map each one, as in local-lvm:local-zfs,tank:tank. Onto local-zfs, only a running VM’s attached disks make it; see the table. The special value 1 is refused with remote migration requires explicit storage mapping!; qm(1) still documents 1 as a self-map, and the API refuses it for remote migration. --target-bridge 1 is accepted and keeps each bridge name. Other options: --online for a running VM, --delete 1 to remove the source after a successful move, and --bwlimit in KiB/s.

What it refuses:

  • A guest with snapshots: remote migration with snapshots not supported yet. Delete them, or use Method 2.
  • An ISO in the CD drive: local cdrom image. Set the drive to “Do not use any media” first.
  • An offline disk going between ZFS and anything else: no matching import/export format found for storage. Proxmox staff confirmed on July 3, 2025 that the ZFS plugin only accepts volumes exported from ZFS.

Without --delete 1 the source VM stays stopped and locked afterwards. Proxmox staff gave qm unlock as the way out on December 2, 2024.

Containers take the same endpoint, --target-bridge and --target-storage:

pct remote-migrate 120 220 \
  'apitoken=PVEAPIToken=root@pam!migrate=<secret>,host=192.168.1.20,fingerprint=<fingerprint>' \
  --target-bridge vmbr0 --target-storage local-lvm --restart

--restart shuts the container down, kills it if it is still running after --timeout seconds (180 by default), copies it offline and starts it on the target. Because that copy is offline, a container never moves between ZFS and non-ZFS storage this way. Use Method 2 instead.

New hardware is where a live move bites. A VM with CPU type host can stop on arrival if the new CPU lacks a flag it was started with, and the qm chapter gives live migration between Intel and AMD hosts no guarantee. Move such a VM offline, or switch it to a generic type such as x86-64-v2-AES and restart it before the move.

Method 2: vzdump + qmrestore / pct restore (most reliable)

This route works between any two storage types.

Shut the guest down first. The default snapshot mode backs up a running guest while it keeps running, and stop mode starts a VM again as soon as the backup begins. Either way, anything written after that point stays on the old host.

qm shutdown 777
vzdump 777 --compress zstd --dumpdir /var/lib/vz/dump

For a container, pct shutdown 777 comes first. Continue only after shutdown succeeds, and keep the source guest stopped. The file name carries the guest type, VMID and backup time: vzdump-qemu-777-2026_09_26-07_10_00.vma.zst for a VM, .tar.zst for a container. Replace the example archive paths below with the actual file produced by your backup.

Copy it:

rsync -avP /var/lib/vz/dump/vzdump-qemu-777-2026_09_26-07_10_00.vma.zst root@192.168.1.20:/var/lib/vz/dump/

Restore it on the new host, a VM and then a container:

qmrestore /var/lib/vz/dump/vzdump-qemu-777-2026_09_26-07_10_00.vma.zst 500 --storage local-zfs
pct restore 600 /var/lib/vz/dump/vzdump-lxc-777-2026_09_26-07_10_00.tar.zst --storage local-zfs

Always pass --storage here. Without it, qmrestore allocates each disk on the storage named in the backup, which fails when the new host has no storage by that name. Pick a free VMID, or add --force to overwrite one. --unique gives the guest a new random MAC address: use it only if the old copy will run again on the same network, since a DHCP reservation keyed to the old MAC stops matching.

Restoring from Proxmox Backup Server

If both hosts can reach one PBS datastore, add it on the new host (Datacenter → Storage → Add → Proxmox Backup Server) and restore from its backups. There is no file to copy. Shut the source guest down and take a final PBS backup before restoring, then keep the source stopped. For encrypted backups the new host needs the same key, because without it the backups are inaccessible. A VM can start at once with --live-restore (or the GUI checkbox) while the data copies in the background, but reads stay slow until the data arrives and a failed live-restore leaves the VM in an undefined state. With --live-restore, the downtime is that final backup plus a boot.

Method 3: zfs send and zfs receive (ZFS on both hosts)

The full copy runs while the guest is up; the incremental stream after shutdown contains the changes since the first snapshot. On a default ZFS install the local-zfs storage is the rpool/data dataset. The example uses rpool/data/vm-134-disk-0; check the disk names in /etc/pve/qemu-server/134.conf and substitute your actual volumes. Choose a free target VMID and destination volume names that do not already exist.

Send the full copy with the VM running:

zfs snapshot rpool/data/vm-134-disk-0@move1
zfs send rpool/data/vm-134-disk-0@move1 | ssh root@192.168.1.20 zfs receive rpool/data/vm-205-disk-0

Then shut it down and send only what changed:

qm shutdown 134
zfs snapshot rpool/data/vm-134-disk-0@move2
zfs send -i @move1 rpool/data/vm-134-disk-0@move2 | ssh root@192.168.1.20 zfs receive rpool/data/vm-205-disk-0

Do both sends for every disk in /etc/pve/qemu-server/134.conf, EFI and TPM-state disks included. Finish all full sends before shutdown, and take every final snapshot only after shutdown succeeds. Keep the source stopped. An incremental receive needs the target’s newest snapshot to match the stream’s source. Do not touch the received volume in between.

Copy the config across:

scp /etc/pve/qemu-server/134.conf root@192.168.1.20:/root/134.conf

On the target, put it in place:

cp /root/134.conf /etc/pve/qemu-server/205.conf

Edit 205.conf so each disk line names the new volume, for example scsi0: local-zfs:vm-205-disk-0,size=32G, and start it with qm start 205.

pve-zsync runs the same sends from cron, every 15 minutes by default, and keeps the guest config on the target under /var/lib/pve-zsync/. Version 2.4.0 is the Debian 13 build that Proxmox VE 9 uses. Its wiki page was last edited in December 2020. The tool needs IP addresses rather than host names; the guest restores by the same manual steps as above.

The pitfalls that bite

  • ZFS on one side only. A stopped VM, every container and a running VM’s TPM-state disk copy offline, and an offline copy between ZFS and other storage fails. Inside a cluster the same limit reads cannot migrate from storage type 'lvmthin' to 'zfspool'.
  • --target-storage 1. Refused for remote migration. Name the storage.
  • Bridge naming. The new host needs the bridge the guest uses, or map it with --target-bridge. A VM whose bridge is missing does not start, and the task log names the bridge.
  • VMID conflicts. qmrestore and pct restore refuse a VMID that exists unless you add --force.
  • Snapshots and ISOs block remote-migrate. Remove them first.

If you are moving guests off a host so you can rebuild it, read the PVE 8 to 9 upgrade gotchas before you reinstall.

Sources

Read September 26, 2026.

Frequently asked questions

Can you migrate a Proxmox VM without a cluster?
Yes, three ways. qm remote-migrate (pct remote-migrate for containers) copies the guest straight to the other host with an API token made on that host; it is the only Proxmox VE command that moves a running VM live without a cluster. A backup restored on the new host (vzdump plus qmrestore or pct restore, or a Proxmox Backup Server restore) works between any storage types. zfs send and zfs receive work when both hosts keep guests on ZFS. For a one-off move to new hardware I would use backup and restore; for the least downtime on a VM, remote-migrate –online.
What is the qm remote-migrate command syntax?
qm remote-migrate <vmid> [<target-vmid>] <target-endpoint> --target-bridge <bridge> --target-storage <storage> [OPTIONS], where the endpoint is apitoken=PVEAPIToken=user@realm!token=SECRET,host=ADDRESS[,fingerprint=FP][,port=PORT]. --target-storage must name a storage or a list of source:target pairs; the special value 1 is refused with remote migration requires explicit storage mapping! (qm(1) still documents 1 as a self-map; the API refuses it for remote migration). Add --online to move a running VM live and --delete 1 to remove the source afterwards. pct remote-migrate takes the same form; running containers cannot be live-migrated, so use --restart. The Proxmox VE 9.2 manual still marks both EXPERIMENTAL; the feature arrived in 7.3.
Why does my Proxmox migration fail with cannot migrate from storage type 'lvmthin' to 'zfspool'?
That is the qm migrate wording inside a cluster; qm remote-migrate reports the same limit as no matching import/export format found for storage. An offline copy never crosses between ZFS and another storage type, because a ZFS pool only imports ZFS streams; LVM, LVM-thin, directory, NFS, CIFS, BTRFS and Ceph RBD storage exchange raw-format volumes among themselves (a container stored as a subvolume is the exception). A running VM’s attached disks can cross, since they are mirrored while it runs; a TPM-state disk, unused disks and every container copy offline. Otherwise back up and restore with –storage set to the new pool.
How do I move a Proxmox VM with vzdump and qmrestore?
Shut the VM down (qm shutdown <vmid>), then run vzdump <vmid> --compress zstd --dumpdir /var/lib/vz/dump on the source. Copy the .vma.zst file (a container gives a .tar.zst) to the new host with rsync or scp. Restore it with qmrestore <file> <new-vmid> --storage <storage-on-the-new-host>, or pct restore <new-vmid> <file> --storage <storage> for a container. Without –storage, qmrestore puts each disk on the storage named in the backup. Add –unique only if the old copy will run again on the same network.
Do I need an API token to migrate between Proxmox hosts?
Only for qm or pct remote-migrate. Make it on the target host: pveum user token add root@pam migrate --privsep 0 gives it root’s rights and prints the secret once; with privilege separation left on, grant it a role on / with pveum acl modify / --tokens 'root@pam!migrate' --roles Administrator. Read the target’s fingerprint with openssl x509 -fingerprint -sha256 -noout -in /etc/pve/nodes/$(hostname)/pve-ssl.pem, or from /etc/pve/local/pveproxy-ssl.pem if you installed a custom or Let’s Encrypt certificate. Backup and restore and ZFS send need no token.
What’s the safest way to move a Proxmox guest to new hardware?
Back it up and restore it. Shut the guest down first so nothing written later stays behind, restore with –storage pointing at a storage the new host has, and keep the source until the new copy boots and works. A live remote-migrate is faster to cut over, but a VM with CPU type host can stop on arrival if the new CPU lacks one of its flags, and Intel-to-AMD live migration has no guarantee.

Sources and corrections

Last updated
Methodology
See our methodology for research and review standards.
Corrections
Spotted an error or a stale number? Email contact@techfuelhq.com. Confirmed corrections are recorded here with the date and change.

About the author

Written by Lowell K. Wood IV, who builds and runs TechFuelHQ from St. Louis, Missouri.