Proxmox VEIII · Installation & BaselineBoot and root layout
proxmox-boot-tool: ESP synchronisation and kernel pinning
What you'll learn
- Read proxmox-boot-tool status and say which disks this node can actually boot from
- Add a replacement disk to the synced ESP set with format and init
- Pin a known-good kernel after a regression, and test one for a single boot
- Repair the boot path on a node that will not start, from a rescue environment
Prerequisites
Verified against Proxmox VE 9.2.4 · Proxmox Backup Server 4.2.5 · Ceph Squid / Tentacle · Debian 13 (Trixie) · Linux kernel 7.0 (PVE 9.2 default) · 2026-08-12
proxmox-boot-tool exists because a mirrored root protects your data and
not your ability to start the machine. The pool survives a disk failure
by design. The boot path survives it only if somebody kept the second
EFI System Partition current, and nothing in ZFS does that.
This is also the tool you reach for when a kernel upgrade produces a node that boots into something worse than it had before — which is a live concern right now, because PVE 9.2 moved the default kernel from the 6.x series to 7.0.
What it manages
Two things, and understanding that they are separate makes the tool straightforward.
The synced ESP set. A list of partition UUIDs in
/etc/kernel/proxmox-boot-uuids. Every ESP on that list receives an
identical copy of the bootloader configuration, the kernels and the
initramfs images on every refresh.
The kernel selection. Which kernels get copied onto those ESPs, and which one boots by default.
Everything the tool does is one of those two.
Reading the current state
proxmox-boot-tool status# proxmox-boot-tool statusRe-executing '/usr/sbin/proxmox-boot-tool' in new private mount namespace..
System currently booted with uefi
E4C7-9B21 is configured with: uefi (versions: 6.17.2-4-pve, 7.0.2-6-pve)
E4CA-1F03 is configured with: uefi (versions: 6.17.2-4-pve, 7.0.2-6-pve)Illustrative output
Three things to read off that output every time:
How many ESPs are listed. A two-disk mirror showing one ESP is a node with a single point of failure that its owners believe is redundant.
Whether the versions match. Different kernel lists on different ESPs means a refresh did not complete, and the node’s behaviour after a disk failure depends on which disk survived.
uefi versus grub. uefi means systemd-boot. A mix across ESPs on
one node means a partial re-initialisation.
The kernel list is a separate question:
proxmox-boot-tool kernel list
uname -runame -r alongside it is deliberate. The list is what is available;
uname -r is what is running. When those disagree after a reboot, the
node did not boot what you expected.
Adding a replacement disk to the boot set
This is the procedure that gets skipped, and it is the reason nodes end up with one bootable disk.
After zpool replace or zpool attach restores the pool, the new disk
has a vdev member and nothing else. Give it the same three-partition
layout and add its ESP to the synced set.
lsblk -o NAME,SIZE,MODEL,SERIAL,PARTTYPENAME
ls -l /dev/disk/by-id/ | grep -v partHEALTHY=/dev/disk/by-id/ata-SAMSUNG_MZ7L3480_S6WPNE0T123456
NEW=/dev/disk/by-id/ata-SAMSUNG_MZ7L3480_S6WPNE0T654321
sgdisk "$HEALTHY" -R "$NEW"
sgdisk -G "$NEW"
lsblk "$NEW"sgdisk -G assigns new random GUIDs to the copied table. Without it both
disks carry identical partition GUIDs, which confuses anything that
identifies partitions that way — including the boot-uuid list this
procedure is about to write to.
NEW=/dev/disk/by-id/ata-SAMSUNG_MZ7L3480_S6WPNE0T654321
proxmox-boot-tool format "$NEW-part2"
proxmox-boot-tool init "$NEW-part2"On a system using GRUB rather than systemd-boot, pass the mode
explicitly: proxmox-boot-tool init "$NEW-part2" grub. Check
proxmox-boot-tool status first — it tells you which one this node uses.
proxmox-boot-tool statusThe genuinely complete verification is to boot from the new disk once, by selecting it in the firmware boot menu during a scheduled reboot. Nobody does this and it is the only thing that proves the work. On a cluster with HA and a maintenance window it costs one node reboot.
Kernel pinning
Proxmox keeps several kernels available and boots the newest by default. When the newest one is the problem, pinning is how you stay on the one that works.
This is not hypothetical for PVE 9.2. The 6.x-to-7.0 default kernel transition is exactly the kind of change that surfaces a driver or firmware interaction on a subset of hardware — a NIC that stops passing traffic under load, an HBA that resets, a passthrough device that no longer binds — while every other node in the cluster is fine.
proxmox-boot-tool kernel listproxmox-boot-tool kernel pin 6.17.2-4-pve
proxmox-boot-tool kernel list
proxmox-boot-tool statusThe pin persists. New kernels continue to install and appear in the list,
and none of them becomes the default while the pin is set. That is the
desired behaviour during an investigation and a hazard afterwards: a node
pinned in March and forgotten is a node that has not taken a kernel
security fix since March, while apt reports everything as up to date.
Testing a kernel without committing to it
--next-boot applies the pin to exactly one boot. The boot after that
returns to the normal default.
proxmox-boot-tool kernel pin 7.0.2-6-pve --next-boot
rebootThis is the right tool for testing a suspect kernel, and the wrong tool
for a rollback you intend to keep. A one-shot boot that fixes production
is a reprieve: the next reboot — weeks later, during an unrelated
incident — silently returns to the kernel that broke. A rollback you mean
to keep is a plain pin without --next-boot.
proxmox-boot-tool kernel unpin
proxmox-boot-tool kernel listThe rest of the kernel subcommands
kernel add and kernel remove control which versions are copied to the
ESPs, independently of what is installed. kernel remove is the answer to
a full ESP: dropping an old version frees a few hundred megabytes on
every synced partition.
refresh re-copies the current configuration and kernel set to every
ESP. It is what apt triggers automatically after a kernel change, and
it is what you run by hand after editing /etc/kernel/cmdline, because
that file is not consulted at boot — its contents are copied onto the
ESPs, and a change that has not been refreshed has not happened.
cat /etc/kernel/cmdline
# edit the file, then:
proxmox-boot-tool refresh
# after the next reboot, confirm it took:
cat /proc/cmdlineclean removes entries from /etc/kernel/proxmox-boot-uuids whose
partitions no longer exist. Run it after physically removing a disk;
without it, every refresh tries to write to a partition that is gone and
reports errors that look worse than they are.
Common mistakes
- Replacing a disk and stopping at
zpool replace. The pool is redundant; the boot path is not.format,init, then verify. sgdisk -Rwith the arguments reversed. It overwrites the surviving disk’s partition table. Read it aloud first.- Skipping
sgdisk -G. Duplicate partition GUIDs confuse the tools that identify partitions by GUID, including the boot-uuid list. - Editing
/etc/kernel/cmdlinewithoutrefresh. The file changed; the ESPs did not; the node boots with the old parameters. --next-bootused as a rollback. It reverts at the following reboot, weeks later, during something unrelated.- A pin with no review date. The node stops taking kernel security
fixes while
aptreports success. - Never verifying
statusafter a disk operation. It is one read-only command and it is the only evidence the work took. - Assuming SSH will be available. It will not be. Out-of-band console access is the prerequisite.
Key takeaways
proxmox-boot-toolmanages two things: the set of synced ESPs, and which kernels land on them.statusis the first command in any boot investigation. Count the ESPs, compare the version lists, noteuefiversusgrub.- A replaced disk needs
sgdisk -R,sgdisk -G,format,init, thenstatusto verify.zpool replacealone leaves one bootable disk. kernel pinis a persistent rollback;kernel pin --next-bootis a single-boot test. Do not use the second as the first.- A pin needs a ticket with a review date, because nothing else will remind you.
refreshis what makes/etc/kernel/cmdlinetake effect on systemd-boot;cleanremoves ESPs whose disks are gone.- The ESP is 512 MB.
kernel removeis the answer when it fills.
Knowledge check
Knowledge check · 4 questions
Q1. A failed disk in a two-disk ZFS root mirror is replaced and zpool replace completes successfully. proxmox-boot-tool status still lists only one ESP. What is the consequence?
Q2. Editing /etc/kernel/cmdline on a systemd-boot node is enough for the new kernel parameters to apply at the next reboot.
Q3. A kernel upgrade to 7.0 causes a NIC to stop passing traffic under load on one node. Which actions are appropriate? Select all that apply.
Q4. You are copying the partition layout from a surviving disk to a replacement. Which command sequence is correct?
Passing score: 75%. Answers are checked in this browser.