EFI Stub
this articles is about booting your linux system without a bootload (grub, lilo...), traditionally we use bootloaders to load the kernel and initramfs, but if you have an uefi system, you could skip bootloaders entirely, and use uefi to load the kernel.
1. Verify
to check if you have a uefi run:
ls /sys/firmware/efi/efivars
the directory should exist and contains some entries.
2. Setup ESP
to make use of uefi, you need to create a separate partition, to hold efi files, it should be at least 100MiB, use fdisk(or any tool you like) to create it:
doas fdisk /dev/sda
here replace /dev/sda
, with the disk you want to use.
then format the partition you just created:
doas mkfs.fat -F32 /dev/sda1
I assume it is /dev/sda1
, replace it w/ whatever you have.
then mount it:
doas mkdir -p /boot/efi
doas mount /dev/sda1 /boot/efi
now your partition is ready, if you like you can add it to /etc/fstab
, but it is not mandatory:
# /dev/sda1
UUID=YOUR-UUID /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2
3. Install EFI Entry
first you need to install efibootmgr
doas pacman -S efibootmgr
then copy your kernel, and initramfs to ESP
partition.
doas mkdir -p /boot/efi/EFI/arch
doas cp -v /boot/{vmlinuz-linux, initramfs-linux.img} /boot/efi/EFI/arch
finally add an entry to the uefi:
doas efibootmgr --verbose --create --disk /dev/sda --part 1 --loader "\EFI\arch\vmlinuz-linux" --unicode "initrd=\EFI\arch\initramfs-linux.img root=/dev/sda2 rw"
finally reboot to make sure it works:
doas reboot now
and that's it. if you booted directly with your kernel, without going through the bootloader menu, you successfully did it.
4. Notes
if you don't use an initramfs as I have explained here, you don't need to pass initrd
argument to the kernel.
5. Common Problems
some times this method efibootmgr
doesn't work, because it is not compatible with your machine uefi implementations.
in that case you can try uefi shell that comes with archlinux iso, boot it, and run the following commands:
bcfg boot add N FS0:\EFI\arch\vmlinuz-linux
where N is boot entry number, to see the next available boot number run:
bcfg boot dump -v
and FS0
is the ESP
partition you can use cd
, ls
utilities to find it. now we will add arguments to our kernel, by creating file that contains them.
edit FS0:\boot.config
add the same arguments we use before, then save and quit the file.
finally read args and add them to the entry
bcfg boot -opt N FS0:\boot.config
then exit
exit
now the entry should appear in uefi firmware menu, and you could boot properly.