{ "meta": { "title": "Proxmox System Update | ProxMenux Documentation", "description": "Runs the official Proxmox upgrade sequence (apt update + apt full-upgrade -y) and adds the repo hygiene, essential-package check, LVM sanity scan, autoremove/autoclean and reboot prompt that the upgrade guide also recommends. Detects the running major version automatically.", "ogTitle": "Proxmox System Update | ProxMenux Documentation", "ogDescription": "Official apt full-upgrade / dist-upgrade wrapped with repo hygiene, autoremove and a smart reboot prompt." }, "header": { "title": "Proxmox System Update", "description": "Wrapper that delegates to a single safe worker (update-pve-safe.sh) which detects the running Proxmox major version by itself. The configured repositories are read through the Proxmox API and kept as they are; a host with no active subscription whose only Proxmox repository is Enterprise is asked before switching to no-subscription. All packages are upgraded, ProxMenux-managed DKMS drivers are rebuilt if a new kernel landed, and the reboot prompt fires only when the kernel actually changed. Also launchable from the Update Now button in the ProxMenux Monitor dashboard header when pending updates are detected.", "section": "Utilities" }, "calloutWhat": { "title": "What this does", "body": "Brings the host to the latest patch level of its current major version. Does not upgrade across major versions — for PVE 8 → PVE 9 see Upgrade PVE 8 to PVE 9." }, "official": { "heading": "The official Proxmox recommendation", "intro": "Proxmox's own upgrade guidance for a running host (within the same major version) is to run:", "code": "apt update && apt full-upgrade -y", "outro": "That 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." }, "onTop": { "heading": "What ProxMenux runs on top — verified against the script", "intro": "This option runs exactly the apt command above, wrapped with the repo hygiene, DKMS rebuild for ProxMenux-managed drivers and post-upgrade cleanup the official upgrade guide also recommends. Everything below maps 1:1 to scripts/utilities/proxmox_update.sh and the single safe worker scripts/global/update-pve-safe.sh — nothing implied, every step is in the code:", "items": [ "Detects the PVE major version from inside the worker (pveversion | grep -oP ''pve-manager/\\K[0-9]+'') and adapts the base Proxmox / Debian repo URLs (bookworm on PVE 8, trixie on PVE 9). There is no fan-out to per-version worker scripts — a single safe worker handles both.", "Keeps the configured repositories. ensure_repositories reads the repositories through the Proxmox repository API, together with the subscription status. A host with an active subscription, or one that already uses the no-subscription or test repository, is left unchanged. A host with no active subscription whose only Proxmox repository is Enterprise is asked whether to switch to no-subscription; declining stops the update with no source changed.", "Runs the upgrade non-interactively with DEBIAN_FRONTEND=noninteractive and --force-confdef --force-confold — if a configuration file you already modified also changed upstream, your version stays in place. No silent overwrites of custom configs.", "Skips forcing optional utilities. The safe worker does not push zfsutils-linux, chrony, ifupdown2 or similar packages onto the host — a Proxmox install that opted out of any of them keeps its choice. Missing packages are surfaced by the higher-level installer flows, not by the update path.", "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.", "DKMS rebuild before the reboot prompt. When the upgrade staged a new kernel, the wrapper calls pmx_rebuild_dkms_after_kernel to rebuild every driver that ProxMenux installed via DKMS against the incoming kernel version — so the modules are ready before the box comes back up. Reboot detection uses /var/run/reboot-required when needrestart is present, and falls back to a dpkg-query comparison between the running kernel and the newest installed proxmox-kernel-*-pve-signed / pve-kernel-*-pve package when it isn't — a signal that survives the many Proxmox hosts that ship without needrestart." ] }, "calloutOneSentence": { "title": "In one sentence", "body": "Same upgrade Proxmox tells you to run, plus the repo cleanup, the essential-package check, the LVM sanity scan, the autoremove/autoclean afterwards, and a reboot prompt only when it matters." }, "confirm": { "heading": "Confirmation dialog", "intro": "Selecting the option opens a summary of what the worker will do, requiring an explicit confirmation:", "imageAlt": "Proxmox System Update confirmation dialog listing repo hygiene, package updates, cleanup" }, "routes": { "heading": "How the wrapper routes", "nodes": { "source": { "label": "proxmox_update.sh", "detail": "pveversion |\ngrep -oP ''pve-manager/\\K[0-9]+''" }, "bridge": { "label": "Single safe worker", "detail": "update-pve-safe.sh\n(detects PVE 8 / 9\ninternally)" }, "target": { "label": "Post-update", "detail": "apt-get autoremove\napt-get autoclean\nReboot prompt if needed" } } }, "worker": { "heading": "What the worker does", "intro": "A single worker (scripts/global/update-pve-safe.sh) handles both PVE 8 and PVE 9. It detects the major version internally and uses the version-appropriate codename (bookworm or trixie) for its base sources. The stages are:", "items": [ "Sanity checks. Verifies at least ~1 GB free in /var/cache/apt/archives. Aborts early with a clear message when it fails, so the run doesn't die in the middle of an apt transaction.", "Repository check. ensure_repositories reads the repositories and the subscription status. On a host with a usable Proxmox repository it changes nothing; on a host with no active subscription and only the Enterprise repository it asks before switching to no-subscription, and stops the update when the answer is no.", "Apt update with GPG auto-recovery. On NO_PUBKEY for any repo (yours or a third-party one) the worker imports the missing key and retries automatically before failing.", "Pending upgrades + security count. Reports how many packages will change and how many of those come from the security suite, so the confirmation dialog has real numbers to show.", "Confirmation dialog. The wrapper asks for an explicit yes before touching apt.", "apt full-upgrade. Runs with DEBIAN_FRONTEND=noninteractive and --force-confdef --force-confold so any configuration file you customised keeps its current contents when upstream also changed it. Never overwrites operator-edited configs silently.", "LVM sanity check. lvm_repair_check refreshes VG metadata when disks passed through to guest VMs (DSM, TrueNAS, storage appliances) come back with old PV headers.", "DKMS rebuild for ProxMenux-managed drivers. When the upgrade staged a new kernel, pmx_rebuild_dkms_after_kernel reads components_status.json for the drivers ProxMenux installed (currently nvidia_driver → module nvidia, coral_driver → module gasket), installs the matching kernel headers (proxmox-headers-<newkver> when available, else pve-headers-<newkver>) and runs dkms autoinstall -k <newkver>. If dkms status then doesn't show the modules built against the new kernel, the worker falls back to re-running each installer with --auto-reinstall. Any failure is logged but does not abort the update — you land on the reboot prompt in every case.", "Post-cleanup. apt-get autoremove + apt-get autoclean before returning control to the wrapper." ] }, "post": { "heading": "Post-update cleanup & reboot", "intro": "After the worker exits, the wrapper runs:", "code": "apt-get autoremove -y # drop unused dependencies pulled in by old packages\napt-get autoclean # drop downloaded .deb files no longer in the index", "afterCode": "Then it checks whether a reboot is needed. Two signals trigger the prompt:", "items": [ "/var/run/reboot-required exists (created by the kernel package post-install hook)", "The update log contains linux-image entries (kernel was actually upgraded)" ], "outro": "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)." }, "end": { "heading": "What you see at the end", "intro": "When the worker finishes, the terminal shows the cleanup output and (if the kernel changed) the reboot prompt:", "imageAlt": "Proxmox System Update completion summary with cleanup output and reboot prompt" }, "calloutDeclineReboot": { "title": "Decline reboot only if you know why", "body": "Running on an old kernel after upgrading 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." }, "noSub": { "heading": "How the safe worker treats the Enterprise repository", "intro": "Proxmox ships hosts with the Enterprise repository enabled by default. Without an active subscription, that repository returns 401 on apt-get update. The safe worker changes the repositories only in that case, only after asking, and through the Proxmox repository API — the same one behind Node → Updates → Repositories. What happens in each case:", "items": [ "With an active subscription, the repositories are left unchanged and Enterprise drives the upgrade.", "With the no-subscription or test repository already enabled, the repositories are left unchanged, whatever else is configured beside them.", "With no active subscription and only the Enterprise repository, a dialog offers the switch. Accepting disables the Enterprise source, enables the no-subscription one and refreshes the package lists; the change is recorded in the Changes view of Audit & Report. Declining stops the update with no source changed.", "Enterprise Ceph sources, when present, are disabled in the same switch without choosing another Ceph channel; a host that uses Ceph has its channel configured separately.", "When the run has no terminal to ask in, no source is changed and the update stops with a message that points to Node → Updates → Repositories." ], "outro": "The Debian sources and every other repository file are never edited by the update path. A source that mixes Enterprise with other components in the same entry is not switched: the update stops and asks for it to be split from the Proxmox repository view." }, "cluster": { "heading": "Cluster considerations", "calloutTitle": "On clusters: update one node at a time", "calloutBody": "On a Proxmox cluster, run this option on one node at a time and wait for the reboot to complete before moving to the next. Migrate guests off the node first to avoid cluster-wide service disruption. Mixed minor versions (e.g. 8.4.1 and 8.4.5) work fine for hours; mixed running kernels can produce unexpected behaviour for HA-managed guests." }, "doesnt": { "heading": "What it doesn't do", "items": [ "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": { "heading": "Troubleshooting", "items": [ { "title": "apt update fails with 401 Unauthorized", "body": "The Enterprise repository is enabled and the host has no active subscription. The worker offers the switch to no-subscription before apt-get update; when it was declined, run the update again and accept it, or disable the Enterprise source in Node → Updates → Repositories and enable the no-subscription one." }, { "title": "dist-upgrade hangs at \"Configuring grub-pc\"", "body": "A dpkg prompt is asking which device(s) to install GRUB to. The wrapper passes --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." }, { "title": "Kernel upgraded but the new modules are missing for an out-of-tree driver", "body": "The drivers ProxMenux installed via DKMS (currently nvidia_driver and coral_driver) are rebuilt automatically at the end of the upgrade against the incoming kernel version, using dkms autoinstall -k <newkver> and, when needed, a fallback to each installer with --auto-reinstall. Confirm with dkms status. Third-party out-of-tree modules that aren't in ProxMenux's components_status.json registry (custom NIC drivers, hand-installed DKMS packages, …) still need a manual dkms autoinstall — the safe worker only touches what it originally installed." }, { "title": "The reboot prompt didn't appear but I'm sure the kernel changed", "body": "Two signals must agree (/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": { "heading": "Files involved", "code": "scripts/utilities/proxmox_update.sh # this script (wrapper)\nscripts/global/update-pve-safe.sh # single safe worker (PVE 8 + PVE 9)\nscripts/global/repository-functions.sh # ensure_repositories\nscripts/global/repository_policy.py # reads and switches repositories through the Proxmox API\nscripts/global/utils-install-functions.sh # pmx_rebuild_dkms_after_kernel\n/usr/local/share/proxmenux/components_status.json # ProxMenux-managed DKMS driver registry\n/etc/apt/sources.list.d/proxmox.sources # no-subscription source, written by Proxmox when the switch is accepted\n/var/run/reboot-required # read to decide on reboot prompt\n# Reboot fallback when needrestart isn't installed:\n# dpkg-query -W 'proxmox-kernel-*-pve-signed' 'pve-kernel-*-pve' vs. uname -r" }, "related": { "heading": "Related", "items": [ { "href": "/docs/utils/upgrade-pve8-pve9", "label": "Upgrade PVE 8 to PVE 9", "tail": " — for the major-version upgrade (different tool, different safety model)." }, { "href": "/docs/utils/system-utils", "label": "System Utilities Installer", "tail": " — to install the CLI tools you want around updates (htop / btop / ncdu)." }, { "href": "/docs/utils", "label": "Utilities overview", "tail": " — back to the section overview." } ] } }