The bootloader is the first piece of software that runs when a Linux server starts — it loads the kernel, passes boot parameters, and hands control to the operating system. While many administrators never think about their bootloader until something goes wrong, choosing the right one affects boot reliability, security, multi-boot capability, and recovery options.

This guide compares the three most widely used Linux bootloaders: GRUB (the nearly universal default), systemd-boot (the minimalist UEFI-only alternative), and rEFInd (the visual boot manager with auto-detection). Each serves different operational needs, from enterprise server deployments to multi-boot development environments.

Understanding the Boot Process

Before comparing bootloaders, it helps to understand where they fit in the Linux boot sequence:

  1. Firmware (BIOS or UEFI) initializes hardware and finds the boot device
  2. Bootloader (GRUB, systemd-boot, or rEFInd) loads from the EFI System Partition (ESP)
  3. Kernel (vmlinuz) is loaded into memory along with the initial ramdisk (initramfs)
  4. Initramfs mounts the root filesystem and hands control to systemd (PID 1)
  5. Userspace initialization begins — services, networking, and applications start

The bootloader’s job is critical: it must reliably find and load the kernel, handle multiple kernel versions for rollback, and pass the correct parameters (root device, encryption keys, filesystem options) to the kernel.

Feature Comparison

FeatureGRUB 2systemd-bootrEFInd
Firmware SupportBIOS + UEFIUEFI onlyUEFI only
Filesystem SupportExtensive (ext4, btrfs, xfs, zfs, lvm, raid)ESP only (FAT32)Extensive (ext4, btrfs, xfs, ntfs, hfs+)
Configuration Location/boot/grub/grub.cfg (generated)/boot/loader/entries/*.conf (manual)/boot/efi/EFI/refind/refind.conf
Auto-DetectionVia os-proberNo (manual entries)Yes (scans all ESPs and filesystems)
Graphical MenuYes (themes supported)No (text-only)Yes (icon-based, themes)
Secure Boot SupportYes (signed shim)Yes (native)Yes (signed binary)
Network Boot (PXE)YesNoLimited
LUKS EncryptionYes (native unlock)No (requires initramfs)No (requires initramfs)
Btrfs Subvolume BootYesYesYes
Windows Dual-BootYes (chainload)Yes (auto-detected)Yes (auto-detected)
macOS Dual-BootNoNoYes (native support)
Kernel ParametersFull supportFull supportFull support
Package Managergrub-mkconfigkernel-installManual or refind-install
Default OnMost distrosArch, Fedora (optional)User-installed
Active DevelopmentYesYes (part of systemd)Yes
LicenseGPL v3LGPL v2.1GPL v3

GRUB 2 — The Universal Standard

GRUB (GRand Unified Bootloader) version 2 is the default bootloader for the vast majority of Linux distributions. Its primary advantage is versatility: it boots from BIOS and UEFI, supports virtually every filesystem, and handles complex storage configurations (LVM, software RAID, encrypted partitions).

Key Features

  • Universal compatibility: Boots from BIOS (MBR) and UEFI (GUID Partition Table) systems
  • Filesystem drivers: Native read access to ext2/3/4, btrfs, xfs, zfs, FAT, NTFS
  • LVM and RAID support: Boot from logical volumes and software RAID arrays
  • LUKS decryption: Unlock encrypted root partitions at boot time
  • Theme support: Customizable graphical boot menus
  • Serial console: Boot management over serial connections for headless servers
  • Scripting: Full scripting language for complex boot logic

Installation

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# Debian/Ubuntu (UEFI)
sudo apt install grub-efi-amd64
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu

# Debian/Ubuntu (BIOS)
sudo apt install grub-pc
sudo grub-install /dev/sda

# RHEL/Fedora
sudo dnf install grub2-efi-x64
sudo grub2-install --target=x86_64-efi

# Regenerate configuration after kernel updates
sudo update-grub        # Debian/Ubuntu
sudo grub2-mkconfig -o /boot/grub2/grub.cfg  # RHEL/Fedora

Configuration

GRUB’s configuration is generated from /etc/default/grub and /etc/grub.d/ scripts:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# /etc/default/grub
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="OpenSwap Guide"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="root=UUID=xxxx-xxxx ro"

# Kernel parameters for headless server
# GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"

# Serial console configuration
# GRUB_TERMINAL="serial console"
# GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

After editing, regenerate the configuration:

1
sudo update-grub

Custom Menu Entry

For manual boot entries (custom kernels, rescue systems):

1
2
3
4
5
6
7
8
9
# /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0

menuentry "Custom Kernel" {
    set root='hd0,gpt2'
    linux /vmlinuz-custom root=UUID=xxxx-xxxx ro quiet
    initrd /initramfs-custom.img
}

systemd-boot — The Minimalist UEFI Bootloader

systemd-boot (formerly gummiboot) is a simple UEFI boot manager that is part of the systemd project. It reads configuration files directly from the EFI System Partition, making it significantly simpler than GRUB — but also more limited in scope.

Key Features

  • Simplicity: Configuration files are plain text in /boot/loader/entries/
  • Fast boot: Minimal code path from UEFI firmware to kernel
  • Native Secure Boot: Works with UEFI Secure Boot without additional shim layers
  • Kernel installation integration: kernel-install tool manages entries automatically
  • No filesystem drivers needed: Relies on UEFI firmware to read the ESP (FAT32)
  • Blissfully simple: No complex scripting language, no generated configuration

Installation

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Arch Linux
sudo bootctl install

# Fedora (if not already using)
sudo dnf install systemd-boot
sudo bootctl install

# Debian/Ubuntu
sudo apt install systemd-boot
sudo bootctl install

Boot Entry Configuration

Each kernel gets its own entry file in /boot/loader/entries/:

1
2
3
4
5
# /boot/loader/entries/arch.conf
title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options root=UUID=xxxx-xxxx rw quiet

Multiple entries for kernel rollback:

1
2
3
4
5
# /boot/loader/entries/arch-fallback.conf
title   Arch Linux (Fallback)
linux   /vmlinuz-linux
initrd  /initramfs-linux-fallback.img
options root=UUID=xxxx-xxxx rw quiet

Loader Configuration

1
2
3
4
5
# /boot/loader/loader.conf
default  arch.conf
timeout  5
console-mode max
editor   no

Automatic Entry Management with kernel-install

1
2
3
4
5
# Install a new kernel with automatic entry creation
sudo kernel-install add 6.6.12-arch1-1 /boot/vmlinuz-linux

# Remove an old kernel and its boot entry
sudo kernel-install remove 6.6.10-arch1-1 /boot/vmlinuz-linux.old

rEFInd — The Visual Boot Manager

rEFInd is a fork of the rEFIt boot manager, designed specifically for UEFI systems. Its primary advantage is automatic detection of bootable operating systems and kernels — it scans all mounted filesystems for kernels, EFI executables, and boot managers.

Key Features

  • Auto-detection: Scans all partitions for kernels, Windows boot managers, and macOS
  • Visual interface: Icon-based boot menu with theme support
  • Multi-platform: Handles Linux, Windows, and macOS in a single boot menu
  • Kernel parameter editing: Edit kernel parameters at boot time from the menu
  • Secure Boot: Supports signed binaries with PreLoader/shim
  • USB boot detection: Automatically detects bootable USB drives when plugged in
  • Minimal configuration: Works out of the box with zero configuration on most systems

Installation

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Debian/Ubuntu
sudo apt install refind
sudo refind-install

# Arch Linux
sudo pacman -S refind
sudo refind-install

# Manual install (download from rodsbooks.com)
unzip refind-bin-0.14.0.2.zip
cd refind-bin-0.14.0.2
sudo ./refind-install

Configuration

rEFInd works without configuration in most cases. When customization is needed:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# /boot/efi/EFI/refind/refind.conf

# Timeout before auto-booting default
timeout 5

# Scan for specific OS types
scanfor internal,external,optical,manual

# Default selection
default_selection "Arch Linux"

# Custom menu entry
menuentry "Custom Kernel" {
    icon /EFI/refind/icons/os_arch.png
    loader /vmlinuz-linux
    initrd /initramfs-linux.img
    options "root=UUID=xxxx-xxxx rw quiet"
}

# Custom icon themes
# icons_dir /EFI/refind/themes/my-theme

Choosing the Right Bootloader

The choice depends on your hardware and operational requirements:

Choose GRUB when:

  • You need BIOS (legacy) boot support
  • Your root filesystem is on LVM, software RAID, or Btrfs
  • You need LUKS full-disk encryption with passphrase entry at boot
  • You are deploying on heterogeneous hardware (mix of BIOS and UEFI)
  • You need network boot (PXE) capability
  • You want a proven, battle-tested solution with universal distro support

Choose systemd-boot when:

  • You are running UEFI-only systems (all modern servers)
  • You want the simplest possible boot configuration
  • Your ESP is on a separate FAT32 partition
  • You prefer plain-text configuration files over generated scripts
  • You are using systemd’s kernel-install for automated kernel management
  • You want fast, reliable boot with minimal attack surface

Choose rEFInd when:

  • You are dual-booting or tri-booting (Linux + Windows + macOS)
  • You want automatic kernel detection without manual configuration
  • You prefer a visual, icon-based boot menu
  • You frequently boot from USB drives and want automatic detection
  • You are managing development machines with multiple kernel installations

Why Self-Host Your Bootloader Configuration?

Bootloader management is foundational to self-hosted infrastructure reliability. A properly configured bootloader ensures that kernel updates deploy smoothly, that rollback to previous kernel versions is always possible, and that headless servers boot reliably without manual intervention.

Cloud VM providers abstract away the bootloader entirely — you never see it or configure it. But when you manage bare-metal servers, edge devices, or homelab infrastructure, the bootloader is your first line of defense against boot failures. Understanding how GRUB, systemd-boot, and rEFInd work means you can recover from failed kernel updates, configure serial console access for headless recovery, and ensure Secure Boot compliance for security-sensitive deployments.

For server bootstrapping automation that runs after the bootloader, see our cloud-init vs Ignition vs Butane comparison. For network-based boot workflows, our PXE boot guide covers diskless server provisioning. And for initramfs management (which the bootloader loads before the root filesystem), check our initramfs builders comparison.

FAQ

Can I switch from GRUB to systemd-boot after installation?

Yes, but it requires careful steps. systemd-boot only reads from the EFI System Partition (FAT32), so your kernel and initramfs must be accessible there. On most distributions, /boot is already mounted on the ESP, making the transition straightforward. Install with bootctl install, create entry files in /boot/loader/entries/, and remove GRUB from the UEFI boot order with efibootmgr.

Does rEFInd replace GRUB or work alongside it?

rEFInd can either replace GRUB as the primary bootloader or chain-load from GRUB. When installed as the primary bootloader (via refind-install), it becomes the default UEFI boot entry. GRUB can still be present on the system — rEFInd will detect and offer it as a boot option.

How do I configure GRUB for a headless server with serial console?

Add these lines to /etc/default/grub:

1
2
3
GRUB_TERMINAL="serial console"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"

Then run update-grub. The GRUB menu and kernel output will both be available over the serial connection.

What happens if I accidentally delete all boot entries?

If you can still boot from a live USB, you can reinstall the bootloader. For GRUB: boot from live USB, chroot into your installation, and run grub-install. For systemd-boot: boot from live USB, mount the ESP, and run bootctl install. For rEFInd: boot from live USB and run refind-install.

Does Secure Boot work with all three bootloaders?

Yes, but with different setups. GRUB uses a signed shim (grubx64.efi signed by the distribution’s key). systemd-boot has native Secure Boot support since it is part of systemd (signed by systemd’s key). rEFInd requires either a pre-signed binary from the distribution or self-signing with your own Secure Boot keys using sbsigntool.

How do I add a kernel parameter permanently?

For GRUB: edit GRUB_CMDLINE_LINUX in /etc/default/grub and run update-grub. For systemd-boot: edit the options line in the relevant /boot/loader/entries/*.conf file. For rEFInd: edit the options line in the menuentry block in refind.conf, or add a line to /boot/efi/EFI/refind/refind_linux.conf.