It’s about that time. There’s a new1 version of Proxmox VE in town and it has had a couple of months to “stabilize”. Now is the time to bump up the version of that homelab.
I’ve pulled the trigger and did the upgrade. The following is my experience with doing this update. I’ve run into some issues, which all got solved and I didn’t break my server.
Prerequisites
-
You must be on PVE 8.4.1 or newer before upgrading. Check with:
1pveversion -
Make sure all your VMs and containers have verified backups in PBS before starting. It’d suck to lose those…
Step 1: Run the Pre-flight Checker
Proxmox provides an official checker script that identifies issues before you touch anything:
|
|
Run this, fix every FAIL, then run it again. Don’t proceed until you have 0 failures. Warnings are acceptable but worth addressing.
Step 2: Fix Issues
I cannot go through all possible issues you might encounter, like I stated above: this is my experience of the process. I’ll address the issues I ran into.
FAIL: systemd-boot meta-package installed
The wiki2 has the solution to this: I first checked whether I’m actually using systemd-boot or if it’s just an orphaned package:
|
|
The output said systemd-boot not installed in ESP and shows GRUB in the EFI variables, so it’s safe to remove:
|
|
FAIL: Resolved node IP not configured
The checker resolves your hostname and checks whether that IP is active on an interface. I remember messing around with my network and the IP addresses of devices on it, trying to have a standard. I may have forgotten to update the IP here, so I first checked my actual IP:
|
|
Then I opened /etc/hosts directly in a text editor:
|
|
I found the line with my node’s hostname and updated the IP to match what ip addr show had reported. Save and quit.
WARN: Less than 5 GB free on root
This is a weird one. My drive is absolutely large enough and I have not used all space on it with my Proxmox system. Let’s start with a cleanup:
|
|
That wasn’t enough, so I looked for what was eating space:
|
|
(The -x flag is important as it keeps the scan on the root filesystem only and won’t cross into other mounts).
This pointed me to /cctv, which turned out to be the issue. Frigate had been writing footage there, but the dedicated CCTV SSD wasn’t actually mounted. Somehow the mount had gotten lost. Instead of writing to the SSD, everything had been going straight to the root NVMe. I verified this with:
|
|
I remounted the SSD and added it back to /etc/fstab to make it persistent:
|
|
After that I cleared out the footage that had accumulated on root, which freed up lots of space to continue the upgrade. How did I miss this? Good question. Turns out I am not a professional IT administrator.
NOTICE: LVM autoactivation
LVM autoactivation means that logical volumes (the virtual disks your VMs and containers use) are automatically made available by the system at boot. In PVE 8 this was the default behavior, but it can cause problems on shared storage setups where multiple nodes might try to activate the same volume simultaneously. PVE 9 disables autoactivation for all newly created volumes and lets Proxmox handle activation itself when a guest actually needs it. The migration script takes care of bringing the existing volumes in line with this new behavior.
As noted in the Proxmox upgrade documentation3, running the script is optional if your volumes are on local storage only, but still recommended. I ran it anyway:
|
|
I confirmed with y when prompted.
Step 3: Stop All Guests
Stopping all guests before upgrading reduces the risk of filesystem or database corruption mid-upgrade.
|
|
Verify everything is stopped:
|
|
Step 4: Update Repositories and Upgrade
I then replaced bookworm with trixie in apt sources:
|
|
Next I updated and verified the new repos resolve without errors:
|
|
You should see Debian trixie, trixie-security, trixie-updates, and Proxmox trixie all resolving cleanly. Then I ran the upgrade:
|
|
Step 5: Answer Config File Prompts
You’ll be asked about several config files during the upgrade. Here’s what I answered for each:
| File | Answer | Reason |
|---|---|---|
/etc/issue |
N | Keep your current version |
/etc/lvm/lvm.conf |
Y | Take the maintainer’s updated version |
/etc/ssh/sshd_config |
Y | If unmodified |
/etc/default/grub |
N | Keep your current version |
/etc/chrony/chrony.conf |
Y | Take the maintainer’s updated version |
| Keyboard layout | Pick your layout | Physical keyboard preference |
| Restart services automatically | Yes | Guests are stopped anyway |
Step 6: Reboot
|
|
After rebooting, verify the upgrade succeeded:
|
|
You should see pve-manager/9.x.x/....
Step 7: Start Guests Back Up
|
|
Check the web UI to confirm everything looks right.
Post-Upgrade Cleanup
-
Remove any packages you no longer use. I noticed I still had Zabbix on there I was no longer using.
1 2apt purge zabbix-agent2 apt autoremove -
Verify all your mounts are correct with
findmnt -
Check that all storages show as active in the Proxmox web UI under Datacenter → Storage
-
Confirm backup jobs are still configured under Datacenter → Backup
-
Restart any long-running jobs that were interrupted (e.g. media library scans)
Conclusion
And that was it. Pretty painless to be honest. Unfortunately I decided to use the second NVMe slot I wasn’t using to set up a ZFS pool with the NVMe that was running Proxmox. That way when one fails, I won’t lose my Proxmox setup and had some redundancy. Alas it’s impossible to switch an LVM to a ZFS pool on a running Proxmox instance. You’ll have to do a fresh install… which I did a day after doing this upgrade. At least I can say I’ve had the experience, I suppose.