Hello and I hope this finds you well. Today I wanted to make a guide to help with a problem I am guessing most have likely solved at this point. I, however, chose to wait to upgrade my Proxmox cluster until after the last minute because it felt a bit intimidating. I finally did it though using the official guide, a walkthrough that missed a couple things at the end for me, a pretty decent youtube video, and a touch of AI. In the end, over the course of about 5 hours I was able to upgrade my 4 node cluster to version 9 with no downtime, so I am calling this a success. Anyway this is to help anyone who might have put off their upgrade the way I did.

Upgrading a multi-node Proxmox Virtual Environment (PVE) cluster with an integrated Ceph storage backend requires a strict order of operations. This guide covers upgrading Ceph from Reef to Squid, transitioning package files to the modern DEB822 format, and mitigating the common aes256k cipher security errors.

Proxmox upgrade from 8 to 9 official guide

Upgrade Proxmox VE 8 to 9 in Cluster with Ceph | Full Step-by-Step Guide 2025 - syncbricks youtube guide

Proxmox VE 8 to 9 Upgrade Guide: Step-by-Step - Paolo Valsecchi web guide


⚠️ Prerequisites & Precautions

  • Backup Everything: Ensure all VMs and containers have verified, external backups.
  • Maintain Quorum: Upgrade nodes one at a time. Never reboot or stop services on multiple nodes simultaneously.
  • No-Subscription Focus: This guide is tailored for standard environments utilizing free no-subscription repositories.
  • Ensure you are on the latest version of proxmox 8.
  • Before working on a node ensure to migrate the VMs off of that node to ensure uptime and no issues while updating.

🗒 Phase 1: Ceph Upgrade (Reef to Squid)

Before upgrading the underlying operating system to Proxmox VE 9 (Debian Trixie), you must first upgrade your Ceph storage layer to Ceph Squid while still running Proxmox VE 8.

Perform these steps on Node 1, then repeat sequentially for Node 2, Node 3, and Node 4.

Step 1: Set Storage Protection Flags

Prevent Ceph from attempting to rebalance or heal data pools while services are restarting:

ceph osd set noout

Step 2: Switch the Ceph Repository URL

Update the legacy repository file configuration to target the newer version release:

sed -i 's/reef/squid/' /etc/apt/sources.list.d/ceph.list

Step 3: Fetch and Install Packages

Refresh your index database maps and pull down the modern binaries:

apt update && apt upgrade -y

Verify the installation by validating the running binary metadata details:

ceph --version

Step 4: Restart Core Monitors & Managers

Gracefully reload your monitor cluster daemons to force them to run the newer release code:

systemctl restart ceph-mon.target

Verify the monitor health ring status before proceeding:

ceph -s
ceph mon dump | grep min_mon_release

Once the monitors register cleanly, restart the primary manager daemons:

systemctl restart ceph-mgr.target
ceph -s

🗒 Phase 2: Proxmox VE 8 to 9 Distribution Upgrade

Once all nodes are happily running Ceph Squid, begin upgrading the operating system layer. Perform these steps one node at a time.

Step 1: Put the Node into Maintenance Mode

Gracefully clear running tasks and notify the cluster high-availability tracker:

ha-manager crm-command node-maintenance enable PVENX

(Replace PVENX with your specific node hostname, e.g., PVEN1)

Step 2: Protect and Check Pre-flight Readiness

Set your storage protection flags again to guard your active disks during the OS transition:

ceph osd set noout

Run the official Proxmox configuration analyzer utility to catch layout issues:

pve8to9 --full

Note: Make sure to correct any errors, warnings were ok for me. If using standard UEFI boot layouts, clean out legacy boot blocks to avoid conflicts:

apt remove systemd-boot -y

Step 3: Modernize Repositories to DEB822 Standard

Proxmox 9 drops support for legacy .list configuration rows in favor of structured .sources blocks. To prevent critical meta-package removal safety prompts (proxmox-ve), you must clean out old system configurations and generate fresh files targeting Debian Trixie.

First, scrub historical baseline rows out of your directory path maps:

# Clear out traditional file locations completely
rm -f /etc/apt/sources.list
rm -f /etc/apt/sources.list.d/ceph.list

Next, deploy your clean, modern .sources components:

  1. Create the Main Proxmox No-Subscription Source:
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
  1. Create the Free Ceph Squid Source:
cat > /etc/apt/sources.list.d/ceph.sources << EOF
Types: deb
URIs: http://download.proxmox.com/debian/ceph-squid
Suites: trixie
Components: no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
  1. Create the Core Debian Trixie Base OS Source:
cat > /etc/apt/sources.list.d/debian.sources << EOF
Types: deb
URIs: http://ftp.debian.org/debian
Suites: trixie trixie-updates
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Types: deb
URIs: http://security.debian.org/debian-security
Suites: trixie-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF
  1. Disable Ghost Enterprise Files:
    If stray enterprise trackers are lingering on your file grid, rename them out of sight to block 401 Unauthorized errors during synchronization:
mv /etc/apt/sources.list.d/pve-enterprise.sources /etc/apt/sources.list.d/pve-enterprise.sources.bak 2>/dev/null

Step 4: Execute the Distribution Upgrade

Clear the internal cache storage folder completely and kick off your core upgrade procedure:

rm -rf /var/lib/apt/lists/*
apt update
apt dist-upgrade -y

There will be an apt-listchanges: News page that comes up, just hit q to quit, or read it, up to you. During configuration file prompts, press N (keep local version) unless you have highly specific manual custom system configuration parameters to re-inject.

Step 5: Reboot and Verify Cluster State

Bring the host back up on the modern Proxmox 9 system kernel:

reboot

Once the machine initializes and rejoins your network console, run your operational validation checks:

pveversion
pvecm status

Step 6: Bring the Node Back Online

Take the node out of standby and resume storage traffic:

ha-manager crm-command node-maintenance disable PVENX
ceph osd unset noout
ceph -s

🗒 Phase 3: Mitigating Ceph Security Key Errors (aes256k)

After completing your upgrades, Ceph Squid will trigger critical dashboard security alerts (AUTH_INSECURE_CLIENT_KEY_TYPE). This is because it requires legacy authentication tokens to be rotated over to stronger aes256k ciphers.

Run these final repair routines from your primary cluster node shell (Node 1):

Step 1: Rotate Cluster Service Keys

Rotate your underlying daemon and system connection keyrings securely:

/usr/share/pve-manager/migrations/pve-cephx-rotate-service-keys --rotate-cluster-keys --apply

Step 2: Stage the New Admin Key

Stage an upgraded secret for your global administrator account. This runs concurrently with the old key so active connections do not get terminated:

/usr/share/pve-manager/migrations/pve-cephx-rotate-service-keys --rotate-admin-key --apply

Step 3: Refresh Active Virtual Machine Client Sessions

Running VMs hold onto the old session keys in memory. To move them to the modern cipher, you must force them to reconnect to storage.

  • Zero Downtime Method: Go to your cluster GUI and live-migrate your running VMs across different hardware nodes. The live handoff drops old sessions and picks up the fresh key format seamlessly.
  • Alternative Method: Perform a clean stop-and-start reboot cycle on your hosted guest machines.

Step 4: Confirm Key Migrations & Lock Down Ciphers

Once all active clients are holding the updated credentials, commit the tracking changes permanently:

/usr/share/pve-manager/migrations/pve-cephx-rotate-service-keys --confirm-all-clients-refreshed --apply

Finally, restrict your system monitors from acknowledging weak encryption attempts moving forward:

/usr/share/pve-manager/migrations/pve-cephx-rotate-service-keys --apply --restrict-ciphers

Note: The remaining transient tracking alerts (AUTH_INSECURE_ROTATING_SERVICE_KEY_TYPE) will clear off your main dashboard metrics view entirely within a few hours as remaining temporary cache tickets reach their expiration limits.