Skip to main content
RunBook Academy

Proxmox VEIII · Installation & BaselineBoot and root layout

proxmox-boot-tool: ESP synchronisation and kernel pinning

Expert⏱ ~30 min🧪 Lab requiredproxmox-boot-toolsgdisklsblk

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

Not yet marked complete on this device.

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

Read-only / Safethe first command in any boot investigation
proxmox-boot-tool status
Read-only / Safea healthy two-disk mirror
# proxmox-boot-tool status
Re-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:

Read-only / Safewhich kernels are managed, and is one pinned?
proxmox-boot-tool kernel list
uname -r

uname -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.

Read-only / Safestep 1 — identify both disks unambiguously
lsblk -o NAME,SIZE,MODEL,SERIAL,PARTTYPENAME
ls -l /dev/disk/by-id/ | grep -v part
Destructivestep 2 — copy the partition layout to the new disk
HEALTHY=/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.

Destructivestep 3 — format and initialise the new ESP
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.

Read-only / Safestep 4 — verify, and do not skip this
proxmox-boot-tool status

The 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.

Read-only / Safewhat can be pinned?
proxmox-boot-tool kernel list
Configuration changepin a known-good kernel
proxmox-boot-tool kernel pin 6.17.2-4-pve

proxmox-boot-tool kernel list
proxmox-boot-tool status

The 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.

Configuration changetry a kernel for one boot only
proxmox-boot-tool kernel pin 7.0.2-6-pve --next-boot

reboot

This 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.

Configuration changerelease the pin
proxmox-boot-tool kernel unpin

proxmox-boot-tool kernel list

The 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.

Configuration changechange the kernel command line on a systemd-boot system
cat /etc/kernel/cmdline
# edit the file, then:
proxmox-boot-tool refresh

# after the next reboot, confirm it took:
cat /proc/cmdline

clean 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 -R with 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/cmdline without refresh. The file changed; the ESPs did not; the node boots with the old parameters.
  • --next-boot used 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 apt reports success.
  • Never verifying status after 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-tool manages two things: the set of synced ESPs, and which kernels land on them.
  • status is the first command in any boot investigation. Count the ESPs, compare the version lists, note uefi versus grub.
  • A replaced disk needs sgdisk -R, sgdisk -G, format, init, then status to verify. zpool replace alone leaves one bootable disk.
  • kernel pin is a persistent rollback; kernel pin --next-boot is 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.
  • refresh is what makes /etc/kernel/cmdline take effect on systemd-boot; clean removes ESPs whose disks are gone.
  • The ESP is 512 MB. kernel remove is the answer when it fills.

Knowledge check

Knowledge check · 4 questions

  1. 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?

  2. Q2. Editing /etc/kernel/cmdline on a systemd-boot node is enough for the new kernel parameters to apply at the next reboot.

  3. 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.

  4. 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.