How to Upgrade Proxmox VE 8 to 9 Without Breaking Your Nodes
Proxmox VE 9.0 dropped on August 5, 2025, and if you’re running a homelab or small production node, you’re probably wondering: “Should I upgrade now, and how much pain will it be?”
The good news: it’s not rocket science. The bad news: there are enough gotchas that if you wing it, you can easily brick your bootloader or end up with mixed repositories that make apt
cry. This guide walks you through the exact steps I ran on two standalone nodes—one AMD, one Intel—along with the real-world errors and fixes I hit.
Plan for about an hour of downtime per node. Make sure you have adequate backups of all your VMs before you start. You’ll hit multiple reboots, some microcode installs, and a bit of repo cleanup. The payoff? Debian 13 “trixie,” kernel 6.14, cleaner repos, and all the PVE 9 platform updates.
Why bother upgrading?
- New Debian 13 base for longer-term security updates
- Kernel 6.14 with better hardware support
- Updated QEMU, LXC, and ZFS builds
- SDN “Fabrics” and LVM snapshot improvements
- Refreshed mobile UI and node metrics
Before you start
- Node is already running Proxmox VE 8 on Debian 12
- You have root console or SSH access
- Internet access to Debian and Proxmox repositories
- Maintenance window of ~60 minutes per node
- Non-free repositories enabled for microcode updates
Step 1: Run the upgrade checker
This is where you find out what’s going to break before it actually breaks.
pve8to9 --full
On our AMD box (PVE1): bootloader warning, missing amd64-microcode
, transient scheduler fail, old VM machine type.
On our Intel box (PVE2): hostname/IP mismatch, systemd-boot installed, removable bootloader warning, missing intel-microcode
.
Step 2: Sort the bootloader
You need to know what you’re actually booting with before you remove anything.
proxmox-boot-tool status 2>/dev/null || echo "no pbt"
bootctl is-installed || echo "sd-boot not installed/used"
efibootmgr -v | egrep -i 'BootCurrent|BootOrder|debian|grub|Linux Boot Manager'
If you see GRUB and no systemd-boot, you’re safe to purge systemd-boot:
apt purge -y systemd-boot
apt autoremove --purge -y
For “removable bootloader” warnings, force GRUB to update the removable path:
echo 'grub-efi-amd64 grub2/force_efi_extra_removable boolean true' | debconf-set-selections -v -u
apt install --reinstall -y grub-efi-amd64
update-grub
Step 3: Fix hostname/IP mismatches
If the checker says your hostname doesn’t match the node IP, fix /etc/hosts
:
sed -i 's/^10.12.22.238\s\+pve1.local\s\+pve1$/10.66.2.99 pve1.local pve1/' /etc/hosts
getent hosts pve1
Expected: your node name resolves to the actual management IP.
Step 4: Install the right microcode
First we need to add the non-free-firmware repos
sed -i 's/main contrib/main contrib non-free non-free-firmware/g' /etc/apt/sources.list
apt update
AMD CPUs:
apt install -y amd64-microcode
Intel CPUs:
apt install -y intel-microcode
Re-run the checker and confirm PASS for microcode.
Step 5: Switch repositories to trixie
sed -i 's/bookworm/trixie/g' /etc/apt/sources.list /etc/apt/sources.list.d/*.list
echo "deb http://download.proxmox.com/debian/pve trixie pve-no-subscription" > /etc/apt/sources.list.d/pve-no-sub.list
If you get “configured multiple times” warnings, disable the duplicates:
mv /etc/apt/sources.list.d/pve-no-subscription.list /etc/apt/sources.list.d/pve-no-subscription.list.disabled
Step 6: Disable enterprise and stale repos
mv /etc/apt/sources.list.d/pve-enterprise.sources /etc/apt/sources.list.d/pve-enterprise.sources.disabled
[ -f /etc/apt/sources.list.d/pvetest-for-beta.list ] && mv /etc/apt/sources.list.d/pvetest-for-beta.list{,.disabled}
[ -f /etc/apt/sources.list.d/pve-install-repo.list ] && mv /etc/apt/sources.list.d/pve-install-repo.list{,.disabled}
[ -f /etc/apt/sources.list.d/azlux.list ] && mv /etc/apt/sources.list.d/azlux.list{,.disabled}
Step 7: Optional – disable IPv6
If you want IPv6 gone, add a sysctl config:
cat >/etc/sysctl.d/99-disable-ipv6.conf <<EOF
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
EOF
sysctl --system
Append ipv6.disable=1
to GRUB_CMDLINE_LINUX_DEFAULT
, update GRUB, reboot, and verify with:
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
Expected: 1
.
Step 8: Upgrade
apt update
apt dist-upgrade -y
reboot
Verification
uname -r
→6.14.8-2-pve
pveversion
→ 9.xpve8to9 --full
→ zero FAIL, only benign WARN (LVM autoactivation, legacy VM machine type if applicable)
Gotchas I hit
- Duplicate PVE repo definitions caused apt warnings—keep one file.
- Enterprise repo lives in a
.sources
file even if the.list
is gone. - Mixed suites error means a repo is still pointing at bookworm—disable or update it.
- Hostname/IP mismatches fail the checker until fixed in
/etc/hosts
. - Microcode packages are CPU vendor specific.
- Removable bootloader warnings go away after forcing GRUB EFI extra removable.
Both our AMD and Intel nodes now run Proxmox VE 9 on Debian 13 “trixie” with clean repos, stable bootloaders, and microcode in place. IPv6 is gone on the Intel node by choice.
If you run a cluster, follow Proxmox’s official multi-node upgrade process. For standalone boxes, this guide should get you to PVE 9 without any surprises.