Hi all,
Firstly, I apologise for the sterile reading. Its chatgpt sanitised as I am poo at typing stuff that is readable!
After running into (and nearly falling victim to) a risky upgrade path while moving from Proxmox VE 8.3 to 8.4, I wanted to share a fully worked-out solution and explanation to save others time, stress, and potentially a full reinstall.
Important:
This problem mainly occurs if you installed Proxmox VE on top of Debian (rather than via the official Proxmox ISO). If you did a clean install with the ISO, you are unlikely to encounter these issues.
For Debian installs, removing Debian kernels and pinning firmware-linux-free is critical to avoid conflicts with Proxmox’s kernel and firmware packages.
When upgrading via:
Instead, it installs:
This breaks the Proxmox kernel stack. If blindly accepted, it can remove critical functionality — I had to recover a node in the past due to exactly this scenario.
rm -rf /var/lib/apt/lists/*
apt update
This step prevents apt from removing essential Proxmox packages.
Note: Avoid using apt upgrade alone in this context, as it does not handle removals required for dependency changes. Use apt full-upgrade or apt-get dist-upgrade which handle this properly.
Features:
The provided bash scripts are designed to help recover or safely upgrade existing clusters affected by these conflicts. They are not recommended to be run blindly on fresh installations. Always verify your system state, presence of proxmox-ve, and repository configuration before use.
For regular nodes: proxmox-upgrade-node.sh
For the final node: proxmox-upgrade-final.sh
Pin firmware, reinstall proxmox-ve, always use apt full-upgrade.
Always ensure proxmox-ve is installed and never allowed to be removed — your system depends on it
Firstly, I apologise for the sterile reading. Its chatgpt sanitised as I am poo at typing stuff that is readable!
After running into (and nearly falling victim to) a risky upgrade path while moving from Proxmox VE 8.3 to 8.4, I wanted to share a fully worked-out solution and explanation to save others time, stress, and potentially a full reinstall.
Important:
This problem mainly occurs if you installed Proxmox VE on top of Debian (rather than via the official Proxmox ISO). If you did a clean install with the ISO, you are unlikely to encounter these issues.
For Debian installs, removing Debian kernels and pinning firmware-linux-free is critical to avoid conflicts with Proxmox’s kernel and firmware packages.
The Problem: GUI or CLI Upgrades May Attempt to Remove
When upgrading via:
- The GUI “Upgrade” button, or
- Running apt-get dist-upgrade or apt full-upgrade manually
- proxmox-ve (meta-package)
- pve-firmware
- proxmox-kernel-6.8
- proxmox-default-kernel
Instead, it installs:
- firmware-linux-free (Debian firmware package)
- linux-image-6.1.x (Debian generic kernel)
This breaks the Proxmox kernel stack. If blindly accepted, it can remove critical functionality — I had to recover a node in the past due to exactly this scenario.
Why This Happens
Thanks to excellent insights from community contributors like @dietmar and @aaron, we now know:- pve-firmware is specific to Proxmox
- Debian’s firmware-linux-free conflicts with it
- Installing the Debian firmware forces apt to remove the entire kernel chain
- GUI and apt-get dist-upgrade do not handle this well
- pve-apt-hook throws a warning — but many users don’t know how to interpret or resolve it
The Definitive Fix (Consolidated)
1. Prevent Debian firmware from being installed or upgraded
echo -e "Package: firmware-linux-free\nPin: release *\nPin-Priority: -1" > /etc/apt/preferences.d/no-debian-firmware2. Clean and refresh APT
apt cleanrm -rf /var/lib/apt/lists/*
apt update
3. Reinstall the correct Proxmox meta-packages (important!)
The proxmox-ve package is the core meta-package that ensures all essential Proxmox components and kernels remain installed and up-to-date.
apt install --reinstall proxmox-ve proxmox-kernel-6.8 proxmox-kernel-helperThis step prevents apt from removing essential Proxmox packages.
4. Now do a safe upgrade
apt full-upgradeNote: Avoid using apt upgrade alone in this context, as it does not handle removals required for dependency changes. Use apt full-upgrade or apt-get dist-upgrade which handle this properly.
Safe, Repeatable Upgrade Scripts
To help others avoid this completely, I created and tested two bash scripts (I have a three node Cluster):proxmox-upgrade-node.sh — for regular cluster nodes
proxmox-upgrade-final.sh — for the last node in the cluster
Includes quorum checks and reboot prompts
Features:
- Logs to /root/proxmox-upgrade-*.log
- Verifies proxmox-ve is present
- Pins firmware packages
- Prompts before reboots
- Allows --noreboot flag for staging upgrades
The provided bash scripts are designed to help recover or safely upgrade existing clusters affected by these conflicts. They are not recommended to be run blindly on fresh installations. Always verify your system state, presence of proxmox-ve, and repository configuration before use.
For regular nodes: proxmox-upgrade-node.sh
Bash:
#!/bin/bash
LOGFILE="/root/proxmox-upgrade-$(date +%Y%m%d-%H%M%S).log"
REBOOT=true
# Optional: --noreboot
while [[ "$#" -gt 0 ]]; do
case $1 in
--noreboot) REBOOT=false ;;
esac
shift
done
echo "Logging to $LOGFILE"
exec > >(tee -a "$LOGFILE") 2>&1
set -e
if ! dpkg -l | grep -q '^ii.*proxmox-ve'; then
echo "ERROR: proxmox-ve is not installed. Aborting."
exit 1
fi
echo "=== STEP 1: Clean APT ==="
apt clean
rm -rf /var/lib/apt/lists/*
apt update
echo "=== STEP 2: Block firmware-linux-free ==="
echo -e "Package: firmware-linux-free\nPin: release *\nPin-Priority: -1" > /etc/apt/preferences.d/no-debian-firmware
apt update
echo "=== STEP 3: Reinstall Proxmox meta-packages ==="
apt install --reinstall proxmox-ve proxmox-kernel-6.8 proxmox-kernel-helper
echo "=== STEP 4: Full upgrade ==="
apt full-upgrade
if $REBOOT; then
echo "=== Rebooting now ==="
reboot
else
echo "=== SKIPPED REBOOT. Please reboot manually later. ==="
fi
For the final node: proxmox-upgrade-final.sh
Bash:
#!/bin/bash
LOGFILE="/root/proxmox-upgrade-final-$(date +%Y%m%d-%H%M%S).log"
REBOOT=true
while [[ "$#" -gt 0 ]]; do
case $1 in
--noreboot) REBOOT=false ;;
esac
shift
done
echo "Logging to $LOGFILE"
exec > >(tee -a "$LOGFILE") 2>&1
set -e
if ! dpkg -l | grep -q '^ii.*proxmox-ve'; then
echo "ERROR: proxmox-ve is not installed. Aborting."
exit 1
fi
# Check for quorum
echo "Checking cluster quorum..."
QUORUM=$(pvecm status | awk '/Quorate:/ {print $2}')
if [[ "$QUORUM" != "Yes" && "$QUORUM" != "yes" ]]; then
echo "⚠️ WARNING: This node reports no quorum."
read -p "Are you ABSOLUTELY sure this is the last node? [y/N] " confirm
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
echo "Aborting upgrade for safety."
exit 1
fi
fi
echo "=== STEP 1: Clean APT ==="
apt clean
rm -rf /var/lib/apt/lists/*
apt update
echo "=== STEP 2: Block firmware-linux-free ==="
echo -e "Package: firmware-linux-free\nPin: release *\nPin-Priority: -1" > /etc/apt/preferences.d/no-debian-firmware
apt update
echo "=== STEP 3: Reinstall core packages ==="
apt install --reinstall proxmox-ve proxmox-kernel-6.8 proxmox-kernel-helper
echo "=== STEP 4: Full upgrade ==="
apt full-upgrade
if $REBOOT; then
echo "=== STEP 5: Prompting for final node reboot ==="
read -p "Reboot this final node now? [y/N] " confirm
if [[ "$confirm" =~ ^[Yy]$ ]]; then
reboot
else
echo "Reboot skipped. Please do it manually when ready."
fi
else
echo "=== SKIPPED REBOOT. Manual reboot still required. ==="
fi
Why I didn't Use the GUI?
- I did previously (a year ago) and ended up having to completely rebuild my entire cluster from scratch. At the time I suspected it was related to CEPH but it was actually due to kernel/firmware conflicts.
- The Proxmox GUI upgrade currently uses apt-get dist-upgrade which behaves similarly to full-upgrade but does not handle package conflicts or warn about firmware package pinning.
- It also does not provide clear feedback about pve-apt-hook errors, which are crucial for diagnosing these problems.
- Until the GUI logic is improved, using CLI with explicit package pinning and apt full-upgrade is safer and smarter.
TL;DR
Pin firmware, reinstall proxmox-ve, always use apt full-upgrade.Always ensure proxmox-ve is installed and never allowed to be removed — your system depends on it
Last edited: