This is a guide on how to setup systemd-boot
on Arch Linux. Most of this information is in the linked Arch Linux wiki page, but I keep making mistakes the two times I’ve had to set it up so I thought I’d compile my thoughts here for setting it up. If using this guide in the distant future, make sure to reference the wiki page for any changes to the setup process that may have occurred.
One thing I just got working that I thought was cool was the ability to get an entry to boot my Windows partition that was in a separate EFI partition, which systemd-boot
isn’t supposed to support.
Systemd-boot
only supports UEFI systems, so make sure the following directory exists:
/sys/firmware/efi/efivars
Then, you need to identify your ESP mountpoint. You can do this with the command lsblk
:
[hiddenwonders@xyz ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme1n1 259:0 0 1.8T 0 disk
├─nvme1n1p1 259:1 0 1G 0 part /boot
└─nvme1n1p2 259:2 0 1.8T 0 part /
nvme0n1 259:3 0 465.8G 0 disk
├─nvme0n1p1 259:4 0 100M 0 part
├─nvme0n1p2 259:5 0 16M 0 part
├─nvme0n1p3 259:6 0 465.1G 0 part
└─nvme0n1p4 259:7 0 509M 0 part
On my system I have two SSDs, one with Windows 10 & another with Arch Linux. Looking at the mountpoints tab, the ESP mountpoint should be the partition mounted at either /boot
or /efi
. Mine is mounted at /boot
, and is /dev/nvme1n1p1
. (I use a swapfile if wondering why I only have two partitions). The ESP mountpoint should be formatted as FAT32
if you’re having trouble finding it (filetype can be output by running lsblk -f
.
Regarding systemd-boot
installation: it ships with systemd
, which is required for Arch Linux systems (for better or worse).
systemd-boot
to your EFI partition.[#]bootctl install
That creates some boot image files. You may also want to do this to reinstall the boot image on each update of systemd.
Now we need to configure systemd-boot
.
loader.conf
[#]Create file at /boot/loader/loader.conf
:
default @saved
timeout 2
console-mode max
editor no
See loader.conf(5).
This controls options for the loader menu that appears. The default
line sets the last selected entry in the menu as default next time you boot. You can also set it to one of the configuration files that get made in the next step.
The timeout option controls how long the menu pops up for. I have it set to 2 seconds, “If you have set timeout 0, the boot menu can be accessed by pressing Space.”
There’s a directory, /boot/loader/entries/
, where configuration files reside that specify another boot image option for systemd-boot
. Without these, systemd-boot
displays no options in the boot menu. Here’s an example:
title Arch Linux
linux /vmlinuz-linux
initrd /initramfs-linux.img
options root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw
The line with all the X’s can be acquired by running lsblk -f
. In this case we want the UUID of the root partition, so in my case that’s the UUID of the disk /dev/nvme1n1p2
.
The lines containing the linux
and initrd
parameters are paths relative to the root of the EFI directory (hence /vmlinuz-linux
rather than /boot/vmlinuz-linux
). Note that these filenames will change based on the Linux kernel you’re using: if you’re using the default kernel then everything will be like in the example, however if you’re using the LTS kernel, your filenames will differ:
# For LTS kernel
title Arch Linux
linux /vmlinuz-linux-lts
initrd /initramfs-linux-lts.img
options root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw
Finally, update your config by running bootctl update
.
With this step done, you should be able to boot and select the Arch Linux boot options with systemd-boot
. Have an Arch Linux USB handy though in case you soft-lock your system though, it’s easy to make a mistake.
The final goal of this setup guide will be to boot an OS with a separate EFI partition. An OS like Windows should work with no trouble if it’s located on the same EFI partition, but for a separate EFI partition like I have, the only real way to launch the OS is through the UEFI shell (or you need some strange intermediary XBOOTLDR partition).
First we need to boot into a UEFI shell by installing the edk2-shell
package and setting up systemd-boot
to find the shell and present it as a boot option.
pacman -S edk2-shell
This installs a file which we can copy onto our EFI partition:
cp /usr/share/edk2-shell/x64/Shell_Full.efi /boot/shellx64.efi
You probably want to run bootctl update
again to get the UEFI shell option to appear on your next reboot.
If this doesn’t work, see the wiki page for more options.
Before rebooting into the UEFI shell, run lsblk
and take note of the UUID of your Windows parition, which can be found using lsblk -f
as was done earlier.
Reboot your system and the UEFI shell boot option should be present (systemd-boot
automatically adds a boot entry if the shellx64.efi
file is present). Select it, and you should be dropped into the UEFI shell. Type map
, which should present you a mapping of all partitions, including their UUID. Find the FS alias which has the correct UUID and note it’s name (for me, my FS alias was HD0b
).
Boot back into Linux and create the following /boot/loader/entries/windows.conf
, substituting HD0b
to whatever your output was from the UEFI shell:
title Windows 10
efi /shellx64.efi
options -nointerrupt -nomap -noversion HD0b:EFI\Microsoft\Boot\Bootmgfw.efi
See the wiki the details of what those options do.
Run bootctl update
and you should then be able to boot Windows by selecting the Windows 10
option on the systemd-boot
menu on your next restart.
I recently found out that this method sometimes doesn’t work. I plugged in an old iPod I found laying around to my computer and this must have changed my FS alias from HD0b
to something else because the Windows 10 boot option was no longer working until after I unplugged the iPod. Just something to keep in mind, this method is convienient but not perfect unfortunately.
You should be good to go and will hopefully not have to configure systemd-boot
any further after this.
Even though it’s not as straight forward as it could be, I still believe systemd-boot
is a bit less error-prone than using GRUB, and since it comes with systemd
and you’re stuck with systemd
since you’re on Arch Linux, might as well save the extra package install right?
I wish you all a comfy night and a working bootloader.
Site Licensing Site last updated: 2024-12-08