CategoriesGuides & Hacks

Upgrade Proxmox VE 8 to 9 on Standalone Nodes: Real-World Runbook with Fixes

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 -r6.14.8-2-pve
  • pveversion → 9.x
  • pve8to9 --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.

Oh hi there 👋
It’s nice to meet you.

Sign up to receive awesome content in your inbox

We don’t spam! Read our privacy policy for more info.

Leave a Reply

Your email address will not be published. Required fields are marked *