systemd-boot vs GRUB on Arch

arch / published / guide #44 / ≈ 3 min read

When you install Arch, the wiki gives you a choice of bootloader. The two popular ones are GRUB (the old reliable that works on every kind of system) and systemd-boot (smaller, simpler, UEFI-only). This guide explains what each is, how to install either, and what you give up by choosing one over the other.

What a bootloader does

It's the program your firmware (UEFI or BIOS) runs first. Its only real job is: pick a kernel, load it, hand control over. Both options below do exactly that — the difference is everything around it.

The short comparison

systemd-boot GRUB
Works on BIOS (non-UEFI) systems No Yes
Works on UEFI Yes Yes
Config style Tiny text files per kernel Single generated file
Multiboot with Windows Picks Windows automatically Has a tool to detect (os-prober)
Encrypted /boot No Yes
Show snapshot menu Limited Yes (with grub-btrfs)
Comes with Arch base Yes (via systemd) No (separate package)

Rule of thumb:

  • UEFI laptop, single Linux install — systemd-boot. Less to learn, less to break.
  • BIOS system, encrypted /boot, btrfs with snapshots, complex multiboot — GRUB.

systemd-boot setup

Prerequisites:

  • UEFI firmware (you booted the installer in UEFI mode).
  • An EFI System Partition (ESP) — usually /dev/sda1, FAT32, ~512 MB.
  • The ESP is mounted at /boot (not /boot/efi) — systemd-boot likes it that way.

Install:

sudo bootctl install

That copies the systemd-boot files to the ESP and creates an EFI entry. The configuration lives in two places on the ESP:

/boot/loader/loader.conf            # global settings
/boot/loader/entries/*.conf         # one per boot entry

loader.conf

default arch.conf
timeout 3
console-mode max
editor no

timeout 3 = wait 3 seconds before booting the default. editor no = don't let people edit the kernel command line at boot (so a stolen laptop can't drop to a root shell).

entries/arch.conf

title    Arch Linux
linux    /vmlinuz-linux
initrd   /intel-ucode.img
initrd   /initramfs-linux.img
options  root=UUID=YOUR-ROOT-UUID rw

Find the UUID with blkid /dev/sdaX (where X is your root partition). Use amd-ucode.img instead of intel for AMD CPUs.

Make a second entry for the fallback initramfs, just like above but with initramfs-linux-fallback.img. It's your lifeboat if a kernel update breaks the main one.

Updates

systemd-boot doesn't self-update. After a systemd package upgrade, you have to refresh the bootloader on the ESP yourself:

sudo bootctl update

Easier: install the systemd-boot-pacman-hook from the AUR — it runs bootctl update automatically on every systemd upgrade.

GRUB setup

Install the package:

sudo pacman -S grub efibootmgr     # efibootmgr only needed on UEFI

For UEFI

sudo grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB
sudo grub-mkconfig -o /boot/grub/grub.cfg

For BIOS

sudo grub-install --target=i386-pc /dev/sda      # NOT /dev/sda1 — the whole disk
sudo grub-mkconfig -o /boot/grub/grub.cfg

Editing GRUB

You don't hand-edit grub.cfg. You edit /etc/default/grub and re-generate:

sudo nano /etc/default/grub
# change e.g. GRUB_TIMEOUT or GRUB_CMDLINE_LINUX
sudo grub-mkconfig -o /boot/grub/grub.cfg

The only file you ever edit is /etc/default/grub. Everything in grub.cfg is regenerated from it.

Multibooting

To make GRUB detect other operating systems on your disk:

sudo pacman -S os-prober
sudo nano /etc/default/grub          # uncomment GRUB_DISABLE_OS_PROBER=false
sudo grub-mkconfig -o /boot/grub/grub.cfg

How to switch from one to the other

You can have both installed at once; only one is active per UEFI boot entry.

From GRUB → systemd-boot (UEFI): install systemd-boot as above. efibootmgr shows you both entries; set systemd-boot first.

sudo efibootmgr                                     # see entries and current order
sudo efibootmgr -o XXXX,YYYY                        # set order (hex IDs)

From systemd-boot → GRUB: install GRUB as above. Same efibootmgr dance.

The "boot is broken" rescue

If the bootloader is the broken bit, boot from an Arch live USB and chroot in:

mount /dev/sdaROOT /mnt
mount /dev/sdaESP  /mnt/boot
arch-chroot /mnt

# for systemd-boot:
bootctl install
# for GRUB UEFI:
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB
grub-mkconfig -o /boot/grub/grub.cfg

exit
reboot

How to pick, honestly

For a single-Linux UEFI laptop in 2026, systemd-boot is the lighter, calmer option — you'll never wonder which of fifty grub config snippets is in charge. For everything weirder (encrypted /boot, BIOS hardware, snapshot menus, complex multi-OS rigs), GRUB's extra features pay off. Both work. Pick the lighter one until you have a specific need.

← back to index