Proxmox System Update
Wrapper that detects the running Proxmox major version and delegates to the matching worker (PVE 8 or PVE 9). Repos are cleaned up, the no-subscription source is enabled, all packages are upgraded, conflicting packages are removed, and the system is cleaned up afterwards. A reboot prompt fires only when the kernel was actually updated.
What this does
The official Proxmox recommendation
Proxmox's own upgrade guidance for a running host (within the same major version) is to run:
apt update && apt full-upgrade -yThat one line is the official command on any current Proxmox release. The hard part isn't the upgrade itself; it's making sure the repositories are clean, the right ones are enabled, and the host is in a sensible state afterwards.
What ProxMenux runs on top — verified against the script
This option runs exactly the apt command above, wrapped with the repo hygiene and post-upgrade cleanup the official upgrade guide also recommends. The list below maps 1:1 to scripts/utilities/proxmox_update.sh and the per-version worker scripts — nothing implied, every step is in the code:
- Detects the PVE major version (
pveversion | grep -oP 'pve-manager/\K[0-9]+') and dispatches toupdate-pve8.shorupdate-pve9_2.shso the right codename and repo URLs are used. - Cleans up repositories before touching apt: disables the enterprise source (which 401s without a subscription), removes legacy repo files, and writes a clean no-subscription source for the host's codename.
- Runs the upgrade non-interactively with
DEBIAN_FRONTEND=noninteractiveand--force-confdef --force-confold— meaning if a configuration file you already modified also changed upstream, your version stays in place. No silent overwrites of custom configs. - Installs essential Proxmox packages if any are missing (
zfsutils-linux,proxmox-backup-restore-image,chrony). - LVM metadata sanity check against stray PV headers from passthrough disks (warn-only, no automatic fix).
- Cleans up afterwards:
apt-get autoremove -y+apt-get autoclean -y. - Reboot prompt only if the kernel actually changed (
/var/run/reboot-requiredpresent orlinux-imagein the upgrade log).
In one sentence
Confirmation dialog
Selecting the option opens a summary of what the worker will do, requiring an explicit confirmation:

How the wrapper routes
What the worker does
Both workers (scripts/global/update-pve8.sh for PVE 8 and scripts/global/update-pve9_2.sh for PVE 9) follow the same outline, with version-appropriate repo URLs and package names:
- Repo hygiene. Removes duplicate entries from
/etc/apt/sources.listand/etc/apt/sources.list.d/. Comments out the enterprise repo if the host has no subscription and writes / enables the no-subscription source. - Apt update + full-upgrade. Pulls the latest package lists and applies all available upgrades for the current major version, running with
DEBIAN_FRONTEND=noninteractiveand--force-confdef --force-confoldso any configuration file you customised keeps its current contents when upstream also changed it. - Essential packages check. Installs
zfsutils-linux,chrony,ifupdown2and a few others if the host is missing them. - LVM / storage sanity check. Repairs missing PV headers if detected.
- Conflicting package removal. Drops packages known to clash on Proxmox (e.g. some time-sync daemons that fight chrony).
Post-update cleanup & reboot
After the worker exits, the wrapper runs:
apt-get autoremove -y # drop unused dependencies pulled in by old packages apt-get autoclean # drop downloaded .deb files no longer in the index
Then it checks whether a reboot is needed. Two signals trigger the prompt:
/var/run/reboot-requiredexists (created by the kernel package post-install hook)- The update log contains
linux-imageentries (kernel was actually upgraded)
If either is true, a whiptail dialog asks "Some changes require a reboot to take effect. Do you want to restart now?". Decline to keep running on the old kernel until you choose to reboot manually (e.g. during a planned maintenance window).
What you see at the end
When the worker finishes, the terminal shows the cleanup output and (if the kernel changed) the reboot prompt:

Decline reboot only if you know why
linux-image-* means you're on a half-upgraded system: userspace is new, kernel is old. Most of the time things work, but ZFS modules, IOMMU groups, KSMBD and any out-of-tree drivers will only match the kernel they were built for — a mismatch produces obscure failures. Reboot at the earliest sensible moment.When the no-subscription switch happens
Proxmox ships hosts with the enterprise repo enabled by default. Without a paid subscription, that repo returns 401 on apt-get update. The worker detects this and:
- Comments out (or disables)
/etc/apt/sources.list.d/pve-enterprise.list(or the deb822 equivalent) - Writes
/etc/apt/sources.list.d/pve-no-subscription.list(or the deb822proxmox.sourcesfor PVE 9) with the matching codename (bookwormfor PVE 8,trixiefor PVE 9) - Re-runs
apt-get update
If you have a paid subscription, comment out the no-subscription source and uncomment the enterprise one before running this option.
Cluster considerations
On clusters: update one node at a time
What it doesn't do
- Major-version upgrade. 8 → 9 is a separate operation — see Upgrade PVE 8 to PVE 9.
- Backup. No snapshots, no rollback. Apt operations are not transactional. Combine with your normal backup discipline (PBS, vzdump, ZFS snapshots).
- Container / VM updates. Only the host is upgraded; guests are left alone.
- Firmware updates. CPU microcode, NIC firmware, BIOS — out of scope.
Troubleshooting
apt update fails with 401 Unauthorized
/etc/apt/sources.list.d/pve-enterprise.list (or set Enabled: false in the deb822 pve-enterprise.sources) and re-run.dist-upgrade hangs at "Configuring grub-pc"
--force-confold for config files but boot-loader install is a separate prompt. Use Tab + Space to select all your boot disks, then OK. Best avoided by selecting the boot disks once with dpkg-reconfigure grub-pc beforehand.Kernel upgraded but the new modules are missing for an out-of-tree driver
dkms status. If something is missing: dkms autoinstall.The reboot prompt didn't appear but I'm sure the kernel changed
/var/run/reboot-required and linux-image in the upgrade log). If the marker file was cleared but the log is being parsed wrong, reboot manually with shutdown -r now. To confirm a kernel upgrade happened: grep linux-image /var/log/apt/history.log.Files involved
scripts/utilities/proxmox_update.sh # this script (wrapper) scripts/global/update-pve8.sh # worker for PVE 8 hosts scripts/global/update-pve9_2.sh # worker for PVE 9 hosts scripts/global/common-functions.sh # cleanup_duplicate_repos used by workers /etc/apt/sources.list # may be edited /etc/apt/sources.list.d/* # may be edited / created /var/run/reboot-required # read to decide on reboot prompt /var/log/apt/history.log # read to detect kernel changes
Related
- Upgrade PVE 8 to PVE 9 — for the major-version upgrade (different tool, different safety model).
- System Utilities Installer — to install the CLI tools you want around updates (htop / btop / ncdu).
- Utilities overview — back to the section overview.