Skip to main content
RunBook Academy

Proxmox VEIII · Installation & BaselineBoot and root layout

Boot and root layout: ZFS root, systemd-boot and GRUB

Advanced⏱ ~28 minlsblkproxmox-boot-tool

What you'll learn

  • Describe the three-partition layout the installer writes to every selected disk
  • Predict which bootloader an install will use from the filesystem and firmware
  • Choose between ZFS root and LVM on ext4 or xfs against a stated requirement
  • Identify which install-time choices are irreversible and plan around them

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.

Two screens of the Proxmox installer decide things you cannot change afterwards without reinstalling: the root filesystem, and the disks it spans. Everything else on a Proxmox node is adjustable in production. This is not.

The decision is usually made in about forty seconds, and it is usually made by picking the option someone remembers from a blog post. This lesson is about making it on purpose.

What the installer writes to disk

The installer creates three partitions on every disk it selects, regardless of filesystem:

#SizeTypePurpose
11 MBEF02BIOS boot partition, for GRUB on legacy BIOS
2512 MBEF00EFI System Partition (ESP)
3remainder, or hdsizeThe actual data: LVM PV or ZFS vdev member

Both boot partitions are created on every disk whatever the firmware mode, which is why a node installed under UEFI can still be booted after being moved to a legacy-BIOS chassis, and why every disk in a mirrored root has its own bootable ESP rather than only the first.

That last property is the one that matters operationally: a two-disk ZFS mirror has two ESPs, and keeping them identical is a job someone has to do. That job is proxmox-boot-tool, and it is the subject of the next lesson.

hdsize limits partition 3 so the rest of the disk is left free. On the answer-file path it is a key under [disk-setup.zfs] or [disk-setup.lvm]; interactively it is under Advanced Options.

The bootloader is derived, not chosen

There is no bootloader selection in the installer. It falls out of two facts about the machine:

Root filesystemFirmwareSecure BootBootloader
ZFSUEFIoffsystemd-boot
ZFSUEFIonGRUB
ZFSlegacy BIOSGRUB
ext4 / xfsanyanyGRUB

Two readings of that table are worth having.

ZFS root plus UEFI without Secure Boot is the only path to systemd-boot. Everything else lands on GRUB.

Enabling Secure Boot changes the bootloader on a ZFS-root system. It is not a firmware setting with no consequences above it. Deciding to turn Secure Boot on after installation means the machine boots by a different mechanism than it was installed with, and the ESP contents that mechanism expects are different.

ZFS root or LVM

This is the real decision. Both are supported, both are used in production, and they are good at different things.

ZFS rootLVM on ext4 or xfs
Redundancy for the OSBuilt in: mirror or raidz across the selected disksNone from the installer; needs hardware RAID
Bit-rot detectionChecksummed, and repaired from a good copy on scrubUndetected
Snapshots of the host OSYes, cheap, and rollback-capableNo
Guest storage on the same poolYes, with snapshots and replicationLVM-Thin, snapshots but no replication
Built-in ZFS replication between nodesYesNo
Host RAM costARC — significant, and must be boundedNegligible
Behaviour with a RAID controller in frontActively harmfulExpected
Boot complexityTwo or more ESPs to keep in syncUsually one

Choose ZFS root when the node has direct-attached disks in HBA or IT mode, you want the OS itself to survive a disk failure without a hardware RAID controller, and you intend to use ZFS features — snapshots, zfs send replication, checksums — for guests as well.

Choose LVM on ext4 when there is a battery-backed hardware RAID controller you cannot or should not reconfigure, when host RAM is tight enough that ARC is a real cost, or when guest storage lives somewhere else entirely — Ceph, a SAN, an NFS array — and the local disks only need to hold the OS.

If you choose ZFS, bound the ARC

The single most common ZFS-root misconfiguration on a hypervisor is an unbounded ARC. Left alone, ZFS will grow its cache using memory the guests need, and the reclaim path under memory pressure is slower than the guest allocations competing with it.

Set it at install time — arc-max in the answer file, in MiB — or immediately after:

Configuration changebound the ARC persistently
ARC_MAX_BYTES=17179869184

echo "options zfs zfs_arc_max=$ARC_MAX_BYTES" \
> /etc/modprobe.d/zfs.conf
update-initramfs -u -k all

echo "$ARC_MAX_BYTES" > /sys/module/zfs/parameters/zfs_arc_max
cat /sys/module/zfs/parameters/zfs_arc_max

The update-initramfs step is not optional on a ZFS-root system: the pool is imported from the initramfs, so the parameter has to be present there to apply from the first moment ZFS is active.

RAID level for the root pool

raid1 across two disks is the default answer and the right one for most nodes. The OS is small, the redundancy requirement is “survive one disk”, and rebuild time is minutes.

raid10 is worth it when guest storage shares the pool and you want the IOPS. raidz-1 and raidz-2 on a boot pool are a poorer trade than they look: write amplification is higher, and resilver on a raidz vdev is slower and heavier than on a mirror, which matters most when you are already down a disk.

Inspecting what you actually got

Read-only / Safethe layout as installed
lsblk -o NAME,SIZE,FSTYPE,PARTTYPENAME,MOUNTPOINT

proxmox-boot-tool status

findmnt /
[ -d /sys/firmware/efi ] && echo 'booted in UEFI mode' || echo 'booted in legacy BIOS mode'
Read-only / Safea two-disk ZFS mirror on UEFI without Secure Boot
# 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: 7.0.2-6-pve)
E4CA-1F03 is configured with: uefi (versions: 7.0.2-6-pve)

Illustrative output

uefi in that output means systemd-boot. A GRUB-managed ESP reports grub instead, and a system with grub on some ESPs and uefi on others is a node that has been partially re-initialised — worth investigating before the next kernel upgrade.

What is reversible and what is not

ChoiceChange later?
Root filesystem (ZFS / ext4 / xfs)No. Reinstall.
Which disks the root spansNo for the vdev geometry; you can add a mirror to a ZFS vdev, not convert raidz
ZFS ashiftNo. Pool-creation only.
Swap size, maxroot, maxvz on LVMPartly — LVM volumes can be resized within the VG
ARC maximumYes, any time
ZFS compressionYes, but only applies to newly written blocks
BootloaderOnly by re-initialising the ESPs
Secure BootFirmware toggle, but it changes the expected bootloader on ZFS root
Hostname and IPYes, with care

The three genuinely irreversible ones — filesystem, vdev geometry, ashift — are all decided on the same installer screen, in the same forty seconds. That asymmetry is the argument for the answer file: it turns those forty seconds into a reviewed document.

Common mistakes

  • ZFS behind a RAID controller. ZFS cannot repair what it cannot see, and the failure surfaces long after the cause. HBA or IT mode.
  • Unbounded ARC on a hypervisor. It competes with guest memory. Set arc-max at install time, and remember update-initramfs on ZFS root.
  • ashift = 9 copied from an old guide. Permanent write amplification, fixable only by recreating the pool.
  • Assuming /boot is authoritative on ZFS root. The booting kernels live on the ESPs.
  • Adding a mirror disk and stopping after zpool attach. The pool is redundant; the boot path is not.
  • Enabling Secure Boot after a ZFS-root install. It changes the expected bootloader.
  • Editing /etc/default/grub on a systemd-boot system. The change appears to have been made and does nothing.

Key takeaways

  • The installer writes three partitions to every selected disk: 1 MB BIOS boot, 512 MB ESP, and the remainder.
  • The bootloader is derived: systemd-boot only on ZFS root under UEFI without Secure Boot; GRUB in every other combination.
  • ZFS root buys OS redundancy, checksums, snapshots and replication, at the cost of ARC memory and two ESPs to keep in sync. It requires HBA/IT mode.
  • LVM on ext4 is the right answer behind a hardware RAID controller, or when guest storage lives elsewhere.
  • Filesystem, vdev geometry and ashift are decided once and are not changeable afterwards.
  • On ZFS root the ESPs hold the kernels, /boot does not, and the 512 MB size is a real limit.

Knowledge check

Knowledge check · 4 questions

  1. Q1. A node is installed with ZFS root on UEFI firmware with Secure Boot disabled. Which bootloader will it use, and why?

  2. Q2. On a ZFS-root node using systemd-boot, you add an IOMMU parameter to GRUB_CMDLINE_LINUX_DEFAULT in /etc/default/grub and run update-grub. After a reboot the parameter is absent from /proc/cmdline. Why?

  3. Q3. Which of these choices cannot be changed after installation without rebuilding the pool or reinstalling? Select all that apply.

  4. Q4. Running zpool attach to convert a single-disk ZFS root into a mirror makes the data redundant but still leaves the node unbootable if the original disk fails.

Passing score: 75%. Answers are checked in this browser.