Backing Up and Migrating Proxmox VMs and LXCs to NFS

After building my new three-node Proxmox cluster, I needed a practical way to protect the virtual machines and LXC containers stored on each node’s local LVM-Thin storage.

My goal was simple:

Proxmox node
    ↓
Full vzdump backup
    ↓
Shared TrueNAS NFS storage
    ↓
Restore on any cluster node

The TrueNAS dataset, NFS user, permission mapping and export configuration are already covered in my earlier article:

TrueNAS NFS on Proxmox — Mounting a Share and Passing it into LXC Containers

This follow-up focuses on the Proxmox side: adding the backup storage, choosing the correct backup mode, configuring notes and retention, restoring guests, and using backup and restore as a migration method.


The backup design

My Proxmox nodes use local storage for active workloads:

local-lvm

The backup files are written to a separate NFS share:

TN-NFS-BU

The resulting layout is:

pve-hp01 ─┐
pve-hp02 ─┼── Full backups ──> TrueNAS NFS
pve-hp03 ─┘                    └── dump/

This provides one shared backup location that can be accessed by all cluster nodes.

It is important to understand that this is not high availability. A failed guest does not restart automatically from its backup. The backup must first be restored onto an available node.


Adding the NFS backup storage to Proxmox

Once the TrueNAS NFS export has been prepared, open:

Datacenter
└── Storage
    └── Add
        └── NFS

Example configuration:

ID:       TN-NFS-BU
Server:   192.1.178.5
Export:   /mnt/WD16TB/pve-backups
Content:  Backup
Enabled:  Yes

I selected only the content type:

Backup

This prevents active VM disks, containers, ISO images or templates from being placed accidentally on a storage target intended only for backups.

The resulting storage configuration looks similar to:

nfs: TN-NFS-BU
        export /mnt/WD16TB/pve-backups
        path /mnt/pve/TN-NFS-BU
        server 192.1.178.5
        content backup

Because Proxmox stores this definition in /etc/pve/storage.cfg, it is distributed automatically across the cluster. However, every node still mounts the NFS export independently, so the TrueNAS share must authorize every Proxmox node that uses it.


Verify the storage

Run this on each Proxmox node:

pvesm status

The storage should report:

TN-NFS-BU    nfs    active

Proxmox mounts it under:

/mnt/pve/TN-NFS-BU

For backup content, Proxmox creates the normal directory:

/mnt/pve/TN-NFS-BU/dump

A quick write test is:

touch /mnt/pve/TN-NFS-BU/write-test
rm /mnt/pve/TN-NFS-BU/write-test

If Proxmox reports that it cannot create the dump directory, the problem is normally on the TrueNAS side: the mapped NFS account does not have write permission on the dataset. The dataset ownership and Mapall configuration are explained in the earlier TrueNAS NFS article.


Creating a manual backup

Select a VM or LXC in the Proxmox interface:

Guest
└── Backup
    └── Backup now

Choose:

Storage:      TN-NFS-BU
Mode:         Snapshot or Stop
Compression:  ZSTD

An LXC backup produces a file such as:

vzdump-lxc-201-2026_08_05-09_04_07.tar.zst

A VM backup produces a file such as:

vzdump-qemu-301-2026_08_05-10_15_00.vma.zst

The filename identifies:

  • the guest type
  • the VMID
  • the date
  • the time

The guest name is stored as metadata rather than included in the filename.


Snapshot versus stop mode

Snapshot mode

Snapshot mode keeps the guest running while Proxmox creates the backup.

Use it for normal scheduled backups where downtime should be avoided.

Advantages:

  • no planned shutdown
  • suitable for most routine backups
  • the resulting archive is independently restorable

The backup represents a running system. Applications such as databases may therefore need to replay journals or transaction logs after a restore, similar to recovering from an unexpected restart.

Stop mode

Stop mode shuts down the guest, creates the backup and starts it again afterward.

Use it when:

  • downtime is acceptable
  • maximum consistency is more important than availability
  • creating the final backup before a migration
  • preparing to delete or reinstall the source node

The disadvantage is that the guest remains offline for the duration of the backup.

Practical choice

For my setup:

Normal scheduled backup     → Snapshot
Final migration backup      → Stop
Important pre-upgrade copy  → Stop

For databases, a Proxmox backup should ideally be complemented by an application-native backup such as pg_dump or mariadb-dump.


Snapshot mode still creates a full backup

The term snapshot describes how Proxmox reads the guest while creating the backup.

It does not mean incremental.

With normal NFS storage, both of these are full backups:

Snapshot mode → Full vzdump archive
Stop mode     → Full vzdump archive

Each backup file is self-contained and can be restored independently.

For example:

Monday     vzdump-lxc-201-....tar.zst
Tuesday    vzdump-lxc-201-....tar.zst
Wednesday  vzdump-lxc-201-....tar.zst

The Wednesday backup does not require the Monday or Tuesday file.

Incremental and deduplicated backups require Proxmox Backup Server. Traditional vzdump files written to NFS are full backups.


What is included?

An LXC backup normally includes:

  • container configuration
  • root filesystem
  • installed packages
  • application configuration
  • container users and permissions
  • included Proxmox-managed volumes

A VM backup normally includes:

  • VM configuration
  • included virtual disks
  • EFI and TPM state disks where configured
  • cloud-init disk where relevant

External data is different.

For example:

LXC
├── /etc
├── /var/lib/application
└── /mnt/media  → TrueNAS bind mount

The container backup includes the container-owned data, but not the content of the external TrueNAS bind mount.

The mount definition may remain in the container configuration, but the actual files must be protected through TrueNAS snapshots, replication or another backup method. This behaviour is also described in the earlier NFS and LXC article.


Add useful backup notes

The standard filename does not include the guest name:

vzdump-lxc-201-2026_08_05-09_04_07.tar.zst

Use the Notes template field instead:

{{guestname}} - {{node}} - VMID {{vmid}}

Example result:

LXC-Ansible - pve-hp01 - VMID 201

This keeps the standard filename while making the backup easy to identify in the Proxmox GUI.

Avoid manually renaming the archive because Proxmox expects the normal vzdump naming format.


What does Protected mean?

A backup marked as Protected is excluded from normal Proxmox deletion and pruning.

Useful examples include:

  • the final backup before a migration
  • a known-good baseline
  • a backup before a major upgrade
  • the last copy before removing a node

Protected does not mean that the backup is:

  • encrypted
  • immutable on TrueNAS
  • replicated
  • safe from manual deletion outside Proxmox

It only prevents routine removal through Proxmox until the protection flag is removed.


Configure retention

Full backups consume storage quickly, so retention should be configured from the beginning.

A simple policy is:

Keep last: 7

A more balanced policy could be:

Keep last:     3
Keep daily:    7
Keep weekly:   4
Keep monthly:  6

Retention can be configured at the storage level or inside an individual backup job.

For test guests, a small policy such as keep-last=3 may be enough. More important services can retain daily, weekly and monthly restore points.

Protected backups are kept separately from the normal pruning rotation.


Scheduled backup job

Open:

Datacenter
└── Backup
    └── Add

Example:

Node:            All
Storage:         TN-NFS-BU
Schedule:        03:00
Selection mode:  All
Mode:            Snapshot
Compression:     ZSTD
Retention:       Keep last 7

For larger environments, stagger the jobs to avoid every node reading local disks and writing to TrueNAS at the same time.

For example:

01:00  Infrastructure LXCs
02:00  Application LXCs
03:00  Virtual machines

Restoring an LXC or VM

Open the backup storage:

Datacenter
└── TN-NFS-BU
    └── Backups

Select a backup and click:

Restore

Choose:

Target node:     pve-hp01, pve-hp02 or pve-hp03
Target storage:  local-lvm
VMID:            Original or new ID

Using a new VMID is useful for testing:

Original guest:  201
Test restore:    901

Before starting the restored guest, check:

  • IP address
  • hostname
  • MAC address
  • network bridge
  • external mounts
  • bind-mount source paths
  • passthrough devices
  • application ports

Do not start the original and restored guest simultaneously if they use the same network identity.


Using backup and restore for migration

Backup and restore is also a practical migration method, especially when the guests use local LVM-Thin storage.

Although each node has storage named:

local-lvm

these are separate physical thin pools:

pve-hp01/local-lvm
≠
pve-hp02/local-lvm
≠
pve-hp03/local-lvm

This is why a cross-node clone may fail with:

can't clone CT to node 'pve-hp03'
CT uses local storage

The reliable migration workflow is:

Source guest
    ↓
Stop-mode backup to TN-NFS-BU
    ↓
Restore on target node
    ↓
Verify application
    ↓
Remove original guest

Migration procedure

  1. Shut down or use Stop mode for the final backup.
  2. Store the backup on TN-NFS-BU.
  3. Restore it onto the target node and local-lvm.
  4. Verify network settings and external mounts.
  5. Start and test the restored guest.
  6. Keep the backup until the migrated guest has operated successfully.
  7. Remove the old guest only after verification.

The same-cluster Migrate function may also copy a guest between local storages. However, migration moves the workload; it does not create a retained recovery copy.

I therefore prefer to create a backup before any direct migration.


Backup versus migration

Backup and restoreDirect migration
Creates a retained recovery copyDoes not create a backup
Works well between local storagesCopies storage directly
Can restore onto another node laterIntended to move the current guest
Makes test restores easyUsually faster
Suitable across independent hostsNormally used inside one cluster
Usually more downtimeMay reduce downtime

For my initial cluster migration, backup and restore was slower but easier to verify and provided a rollback copy at the same time.


Final checks

After creating the backup system, verify:

pvesm status

Then perform at least one test restore.

A successful backup task confirms that an archive was created.

A successful restore confirms that the backup is useful.


Final design

Proxmox cluster
├── pve-hp01
├── pve-hp02
└── pve-hp03
        │
        │ Full vzdump backups
        ▼
TrueNAS NFS
└── pve-backups
    └── dump/

The active guest disks remain on each node’s local LVM-Thin storage. TrueNAS provides a shared backup location from which any guest can be restored onto any cluster node.

The most important lessons were:

  • NFS vzdump backups are full backups.
  • Snapshot mode does not mean incremental.
  • Stop mode is useful for a final migration copy.
  • External bind-mounted data is not included automatically.
  • Backup notes are better than changing archive filenames.
  • Protected backups are excluded from routine pruning.
  • Retention should be configured before storage fills up.
  • Migration is not a replacement for backup.
  • The backup process should always be tested with a real restore.