Upgrade Proxmox 8 to 9 Without Breaking Your Homelab

Upgrade Proxmox 8 to 9 safely. Includes real fixes for failed upgrades, apt errors, and GPU passthrough checks.

On this page

Let’s get one thing out of the way:

Proxmox upgrades are not fragile.
People are.

Most guides assume:

  • nothing goes wrong
  • you don’t interrupt anything
  • you don’t get stuck in a pager
  • you don’t panic halfway

That’s not reality.

This guide is based on an actual upgrade — including:

  • interrupted upgrade
  • broken package state
  • lock issues
  • recovery

If you follow this, you’ll finish the upgrade even if things go sideways.

🧭 What This Covers

  • Proxmox VE 8 → 9
  • No-subscription repo
  • Single-node homelab (or small cluster)
  • GPU passthrough setups (Plex, etc.)
  • Recovery from broken upgrades

⚠️ Before You Start (Do Not Skip This)

1. Backup

If your backups are “probably fine”, they are not fine.

  • Backup all VMs and containers
  • Test restore if you’re serious

2. Upgrade to latest Proxmox 8 first

Terminal window
apt update
apt dist-upgrade

3. Run the upgrade checker

Terminal window
pve8to9 --full

You want:

  • ❌ 0 failures
  • ⚠️ warnings are acceptable

Proxmox upgrade pre-check summary

4. Disk space

Terminal window
df -h /

Minimum:

  • 5GB usable
  • 10GB preferred

Here is an example:

Terminal window
root@pve2:~# df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/pve-root 94G 11G 79G 12% /

🛑 Stop Everything (Yes, Everything)

Before touching repositories:

From UI:

Node → Bulk Actions → Bulk Shutdown

This is not optional if you care about stability.

Bulk Shutdown option in Proxmox

Why?

Because during upgrade:

  • networking restarts
  • services reload
  • kernel changes

Running VMs during this:

  • can hang
  • can corrupt writes
  • can behave unpredictably

You gain nothing by keeping them running.

🚀 Phase 1 — Switch Repositories

1. Switch Debian to Trixie

Terminal window
sed -i 's/bookworm/trixie/g' /etc/apt/sources.list

2. Remove old Proxmox repo

Terminal window
rm /etc/apt/sources.list.d/pve-install-repo.list

3. Add Proxmox 9 repo (no-subscription)

Terminal window
cat > /etc/apt/sources.list.d/proxmox.sources << EOF
Types: deb
URIs: http://download.proxmox.com/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF

4. Remove Ceph repo (if unused)

Terminal window
rm /etc/apt/sources.list.d/ceph.list 2>/dev/null
rm /etc/apt/sources.list.d/ceph.sources 2>/dev/null

Here is how it should go as an example:

Terminal window
root@pve2:~# sed -i 's/bookworm/trixie/g' /etc/apt/sources.list
root@pve2:~# rm /etc/apt/sources.list.d/pve-install-repo.list
root@pve2:~# cat > /etc/apt/sources.list.d/proxmox.sources << EOF
Types: deb
URIs: http://download.proxmox.com/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
root@pve2:~# rm /etc/apt/sources.list.d/ceph.list 2>/dev/null
rm /etc/apt/sources.list.d/ceph.sources 2>/dev/null
root@pve2:~#

5. Update

Terminal window
apt update

6. Verify

Terminal window
apt policy

You should NOT see:

  • ❌ bookworm

You SHOULD see:

  • ✅ trixie
  • ✅ pve-no-subscription

Example of the apt policy command:

Package files:
100 /var/lib/dpkg/status
release a=now
500 http://download.proxmox.com/debian/pve trixie/pve-no-subscription amd64 Packages
release o=Proxmox,a=stable,n=trixie,l=Proxmox Debian Repository,c=pve-no-subscription,b=amd64
origin download.proxmox.com
500 https://deb.nodesource.com/node_22.x nodistro/main amd64 Packages
release o=. nodistro,a=nodistro,n=nodistro,l=. nodistro,c=main,b=amd64
origin deb.nodesource.com
500 http://security.debian.org/debian-security trixie-security/main amd64 Packages
release v=13,o=Debian,a=stable-security,n=trixie-security,l=Debian-Security,c=main,b=amd64
origin security.debian.org
500 http://deb.debian.org/debian trixie-updates/main amd64 Packages
release v=13-updates,o=Debian,a=stable-updates,n=trixie-updates,l=Debian,c=main,b=amd64
origin deb.debian.org
500 http://deb.debian.org/debian trixie/contrib amd64 Packages
release v=13.4,o=Debian,a=stable,n=trixie,l=Debian,c=contrib,b=amd64
origin deb.debian.org
500 http://deb.debian.org/debian trixie/main amd64 Packages
release v=13.4,o=Debian,a=stable,n=trixie,l=Debian,c=main,b=amd64
origin deb.debian.org

🔥 Phase 2 — The Upgrade

Terminal window
apt dist-upgrade

This process may show you additional screens. For example the below screen you can either PG DN multiple times, to go to the end or simply press q

Linux terminal output about ping configuration.

⚠️ What Will Trip You Up

Pager screen

You’ll see: lines xx-xx (END)

Press: q

Git update notes: git-daemon security changes.

Config prompts

(Y/I/N/O/D/Z)

If unsure: → press Enter

You may see other screens like this below, just keep the local version if you are not sure:

Grub configuration options

💥 If You Interrupt the Upgrade

Recovery

Terminal window
ps aux | grep apt
kill -9 <PID>
dpkg --configure -a
apt -f install
apt dist-upgrade

Repeat until clean.

✅ Phase 3 — Finalization

Check version

Terminal window
pveversion

This command should output something like this below, note the version number is 9.x.x.

Terminal window
root@pve2:~# pveversion
pve-manager/9.1.7/16b139a017452f16 (running kernel: 6.8.12-20-pve)

Reboot

Terminal window
reboot

Or you can just click on the UI.

Reboot button in a Proxmox interface.

The reboot process will take some time. Once it is done, do not forget to force refresh your web access UI. (usually cmd+R or ctrl+R)

Proxmox Virtual Environment console

Confirm kernel

Terminal window
uname -r

⚠️ Important Change

/etc/sysctl.conf is no longer used

Move configs to: /etc/sysctl.d/

🔍 Post-Upgrade Checks

You should only do this if any of your VM is running plex and uses NVidia card passthrough.

GPU check

Terminal window
nvidia-smi

NVENC check

Terminal window
ffmpeg -encoders | grep nvenc

Real test

Terminal window
ffmpeg -f lavfi -i testsrc=duration=5:size=1280x720:rate=30 \
-c:v h264_nvenc -f null -

🧹 Cleanup

Terminal window
apt autoremove
apt modernize-sources

Example apt autoremove. Press Y to remove:

Terminal window
root@pve2:~# apt autoremove
REMOVING:
libxenmisc4.17 proxmox-kernel-6.8.12-17-pve-signed
Summary:
Upgrading: 0, Installing: 0, Removing: 2, Not Upgrading: 0
Freed space: 579 MB
Continue? [Y/n] Y

Here is the example of apt modernize-sources. Press Y to continue.

Terminal window
root@pve2:~# apt modernize-sources
The following files need modernizing:
- /etc/apt/sources.list
- /etc/apt/sources.list.d/pve-enterprise.list
- /etc/apt/sources.list.d/pvetest-for-beta.list
Modernizing will replace .list files with the new .sources format,
add Signed-By values where they can be determined automatically,
and save the old files into .list.bak files.
This command supports the 'signed-by' and 'trusted' options. If you
have specified other options inside [] brackets, please transfer them
manually to the output files; see sources.list(5) for a mapping.
For a simulation, respond N in the following prompt.
Rewrite 3 sources? [Y/n] Y
Modernizing /etc/apt/sources.list...
- Writing /etc/apt/sources.list.d/debian.sources
Modernizing /etc/apt/sources.list.d/pve-enterprise.list...
Modernizing /etc/apt/sources.list.d/pvetest-for-beta.list...

🤦‍♂️Gotcha - apt modernize-sources

Be careful about the command apt modernize-sources, this will add back the enterprise repo, and that will start to give you errors when running apt-get update command.

Proxmox apt-get update error 401 Unauthorized

Now run these commands.

Terminal window
rm /etc/apt/sources.list.d/pve-enterprise.sources
rm /etc/apt/sources.list.d/pve-enterprise.list 2>/dev/null

Now test the apt update command. And it should be as you see below, without errors.

Terminal window
root@pve2:~# apt update
Hit:1 http://security.debian.org/debian-security trixie-security InRelease
Hit:2 http://deb.debian.org/debian trixie InRelease
Hit:3 http://deb.debian.org/debian trixie-updates InRelease
Hit:4 https://deb.nodesource.com/node_22.x nodistro InRelease
Hit:5 http://download.proxmox.com/debian/pve trixie InRelease
All packages are up to date.

🤦‍♂️Gotcha - Proxmox NAG Screen is Back?

This can happen in some occasion. You will notice the nag screen about Proxmox does not have a subscription notice. In this case use this one liner script from Proxmox Post Install Community Script. It is safe but as usual always inspect the source just to be sure.

Here is the one liner, you must run this inside PVE Shell (not inside a container).

Terminal window
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/pve/post-pve-install.sh)"

Additional Instructions:

It is recommended to answer “yes” (y) to all options presented during the process. But use your best judgement as sometimes not all answer’s needs to be Y.

🧠 Final Thought

You just need to follow the steps, be vigilant and it will be alright. If your upgrade depends on luck instead of control, then you’re doing it wrong 😊.

← All posts

Type to search the published collection.