Proxmox VEIII · Installation & BaselineBoot and root layout
Boot and root layout: ZFS root, systemd-boot and GRUB
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
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:
| # | Size | Type | Purpose |
|---|---|---|---|
| 1 | 1 MB | EF02 | BIOS boot partition, for GRUB on legacy BIOS |
| 2 | 512 MB | EF00 | EFI System Partition (ESP) |
| 3 | remainder, or hdsize | — | The 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 filesystem | Firmware | Secure Boot | Bootloader |
|---|---|---|---|
| ZFS | UEFI | off | systemd-boot |
| ZFS | UEFI | on | GRUB |
| ZFS | legacy BIOS | — | GRUB |
| ext4 / xfs | any | any | GRUB |
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 root | LVM on ext4 or xfs | |
|---|---|---|
| Redundancy for the OS | Built in: mirror or raidz across the selected disks | None from the installer; needs hardware RAID |
| Bit-rot detection | Checksummed, and repaired from a good copy on scrub | Undetected |
| Snapshots of the host OS | Yes, cheap, and rollback-capable | No |
| Guest storage on the same pool | Yes, with snapshots and replication | LVM-Thin, snapshots but no replication |
| Built-in ZFS replication between nodes | Yes | No |
| Host RAM cost | ARC — significant, and must be bounded | Negligible |
| Behaviour with a RAID controller in front | Actively harmful | Expected |
| Boot complexity | Two or more ESPs to keep in sync | Usually 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:
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_maxThe 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
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'# 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: 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
| Choice | Change later? |
|---|---|
| Root filesystem (ZFS / ext4 / xfs) | No. Reinstall. |
| Which disks the root spans | No for the vdev geometry; you can add a mirror to a ZFS vdev, not convert raidz |
ZFS ashift | No. Pool-creation only. |
Swap size, maxroot, maxvz on LVM | Partly — LVM volumes can be resized within the VG |
| ARC maximum | Yes, any time |
| ZFS compression | Yes, but only applies to newly written blocks |
| Bootloader | Only by re-initialising the ESPs |
| Secure Boot | Firmware toggle, but it changes the expected bootloader on ZFS root |
| Hostname and IP | Yes, 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-maxat install time, and rememberupdate-initramfson ZFS root. ashift = 9copied from an old guide. Permanent write amplification, fixable only by recreating the pool.- Assuming
/bootis 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/grubon 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
ashiftare decided once and are not changeable afterwards. - On ZFS root the ESPs hold the kernels,
/bootdoes not, and the 512 MB size is a real limit.
Knowledge check
Knowledge check · 4 questions
Q1. A node is installed with ZFS root on UEFI firmware with Secure Boot disabled. Which bootloader will it use, and why?
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?
Q3. Which of these choices cannot be changed after installation without rebuilding the pool or reinstalling? Select all that apply.
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.