Revision as of 20:18, 15 June 2013

zh-CN:UEFI Bootloaders
This page contains info about various UEFI Bootloaders capable of booting Linux kernel. It is recommended to read the UEFI and GPT pages before reading this page. The following bootloaders are explained here:

Linux Kernel EFISTUB

Warning: A bug has been noticed where booting EFISTUB can fail depending on kernel version and motherboard model. See [1] for more information.

Linux (Kernel >= 3.3) supports EFISTUB (EFI BOOT STUB) booting. It is enabled by default on Arch Linux kernels or can be activated by setting CONFIG_EFI_STUB=y in the Kernel configuration (see The EFI Boot Stub for more information).

A single EFISTUB kernel is not capable of launching other kernels, hence each EFISTUB Kernel + Initramfs pair requires a separate boot menu entry. It is recommended to use a UEFI Boot Manager to manage multiple kernels.

Setting up EFISTUB

Mount the UEFI System Partition at /boot/efi with # mount <UEFI Partition> /boot/efi if you're going to be using GRUB2, or at /boot with # mount <UEFI Partition> /boot if you're going to be using Gummiboot or rEFInd. Gummiboot cannot boot across partitions, and will never have such capability due to its nature, so it's paramount that you mount the UEFI System Partition at /boot for use with Gummiboot so that the kernel and initramfs lie on the same partition as the bootmanager.

Note: On some machines, when using rEFInd, it works fine when mounting the UEFI partition in /boot/efi

Create /boot/efi/EFI/arch/ directory with # mkdir /boot/efi/EFI/arch/

Copy the following files from source to destination

Boot File Source

UEFI Destination

/boot/vmlinuz-linux

/boot/efi/EFI/arch/vmlinuz-arch.efi

/boot/initramfs-linux.img

/boot/efi/EFI/arch/initramfs-arch.img

/boot/initramfs-linux-fallback.img

/boot/efi/EFI/arch/initramfs-arch-fallback.img

Note: As of refind-efi 0.2.7, you don't need to copy these files, since refind will automatically detect them

Sync EFISTUB Kernel

Warning: The EFISTUB Kernel must be updated each time the kernel is updated (follow step 4 in Setting up EFISTUB. Failure to do so will result in failure to boot. Alternatively one can automatically update the EFISTUB kernel using one of the following methods:

Note: As of refind-efi 0.2.7, refind automatically detects kernels in /boot. They do not have to be renamed to have a .efi extension either. Hence, the following sync scripts aren't needed if using refind. You do need to isntall an EFI driver to read the Linux filesystem on which the kernel is stored, though.

Systemd

Systemd features event triggered tasks. In this particular case, the ability to detect a change in path is used to sync the EFISTUB kernel and initramfs files when they are updated in boot.

Warning: Since mkinitcpio takes time to build the kernel stub and the initramfs. It is possible for the following systemd services to copy older kernel stubs and initramfs instead of the new ones. To reduce the chance of this error, it is better to bind the efistub copying service to check if the initramfs-linux-fallback.img was changed (since it is the last thing built by mkinitcpio).

Tip: Save the following script as /usr/lib/systemd/system/efistub-update.path

Note: The first parameter /boot/initramfs-linux-fallback.img is the file to watch. The second parameter IN_CLOSE_WRITE is the action to watch for. The third parameter /usr/local/bin/efistub-update.sh is the script to execute.

Tip: In order to use this method, incron must be activated, if it is not run

# systemctl enable incrond.service

Mkinitcpio hook

Mkinitcpio can generate a hook that does not need a system level daemon to function. It spawns a background process which waits for the generation of vm-linuz, initramfs-linux.img, and initramfs-linux-fallback.img; then follows step 4 in Setting up EFISTUB

Tip: Save the following script as /usr/lib/initcpio/install/efistub-update

Note: As of refind-efi 0.2.7, refind automatically detects kernels in /boot. They do not have to be renamed to have a .efi extension either. Hence, the following sync scripts aren't needed if using refind. You do need to isntall an EFI driver to read the Linux filesystem on which the kernel is stored, though.

Booting EFISTUB

Warning: Linux Kernel EFISTUB booting uses \ instead of / and should be relative to the UEFI System Partition's root. For example, if the initramfs is located in /boot/efi/EFI/arch/initramfs-linux.img, the corresponding UEFI formatted line would be \EFI\arch\initramfs-linux.img. Failure to convert the options will lead to a system hang without any error message from the firmware or kernel.

Note: Support of initrd path name with / in EFISTUB booting has been added in mainline 3.9-rc1 and stable 3.8.2. Leading / can be ignored but the path still has to be full path. Example: initrd=EFI/arch/initramfs-linux.img

One can boot the EFISTUB kernel using one of the following ways :

Using rEFInd

rEFInd is a fork of rEFIt Boot Manager (used in Intel Macs) by Rod Smith (author of GPT-fdisk). rEFInd fixes many issues in rEFIt with respect to non-Mac UEFI booting and also has support for booting EFISTUB kernels and contains some features specific to them.

Copy the following files from their source directory to their destination

Note: <arch> is the bit architecture of the system. Run $ uname -m to get the architecture. Replace <arch> with "ia32" for 32 bit systems, and <arch> with "x64" for 64 bit systems.

rEFInd File Source

UEFI Destination

/usr/lib/refind/refind_<arch>.efi

/boot/efi/EFI/refind/refind_<arch>.efi

/usr/lib/refind/config/refind.conf

/boot/efi/EFI/refind/refind.conf

/usr/share/refind/icons

/boot/efi/EFI/refind/icons

/usr/lib/refind/drivers_<arch>

/boot/efi/EFI/refind/drivers

Tip: Refind's configuration file is located in /boot/efi/EFI/refind/refind.conf. The file is well commented.

As of refind-efi 0.2.7, refind can auto-detect kernels in /boot, if there are UEFI drivers for the filesystem used by /boot partition (or / partition if no separate /boot is used) in the ESP, and are loaded by rEFInd. This is enabled in the default configuration in refind.conf (you may need to include the PATH to the drivers folders in the ESP). Copy your /usr/lib/refind/config/refind_linux.conf to /boot/refind_linux.conf. You may pass kernel specific commands in this file.

Edit the refind_linux.conf configuration file to be similar to the template below. Replace the string after PARTUUID with your root's PARTUUID

Note: Please notice the difference between the standard UUID and the PARTUUID shown by $ ls -l /dev/disk/by-partuuid/

Note: As of refind-efi 0.2.7, refind automatically detects kernels in /boot. They do not have to be renamed to have a .efi extension either. Hence, the following sync scripts aren't needed if using refind. You do need to isntall an EFI driver to read the Linux filesystem on which the kernel is stored, though.

Note: Save the following service file as /usr/lib/systemd/system/refind_update.path

Apple Macs

In case of Apple Macs, try mactel-bootAUR for an experimental "bless" utility for Linux. If that does not work, use "bless" form within OSX to set rEFInd as default bootloader. Assuming UEFISYS partition is mounted at /mnt/efi within OSX, do

This way you can specify UUID's without needing to remember the name or type out 20-30 characters.

Using efibootmgr entry

Warning: Some kernel and efibootmgr combinations do not work [2]. You will be able to delete but not create boot entries.

Note: Some UEFI firmwares may not support embedding command line parameters to uefi applications in the boot entries.

It is possible to directly embed the kernel parameters within the boot entry created by efibootmgr. This means that in your BIOS/UEFI you will be able to select Arch Linux directly in the default boot order, and on startup it will boot into Arch directly without any kind of boot selection GUI.

to verify that the resulting entry is correct. You should also consider reordering the boot options (efibootmgr -o) to place the Arch entry last, which could make the system easier to recover if it fails.

GRUB 2.x

GRUB 2.x contains its own filesystem drivers and does not rely on the firmware to access the files. It can directly read files from /boot and does not require the kernel and initramfs files to be in the UEFISYS partition. Detailed information at GRUB#UEFI_systems_2. For bzr development version try AUR package - grub-efi-x86_64-bzrAUR.

SYSLINUX

Note: Syslinux UEFI support is currently part of version 6.00-preXX or in firmware branch of upstream git repo. It is considered alpha quality by upstream. The below information is provided mainly to enable bug-testing. Please report all issues upstream.

Note: Syslinux UEFI can boot only those kernels that support EFI Handover Protocol. Thus LTS kernels are not supported.

Install syslinux-efi-gitAUR AUR package and copy /usr/lib/syslinux/efi64/* to $esp/EFI/syslinux/ ($esp is the mountpoint of UEFISYS partition) (efi64 is for x86_64 UEFI firmwares, replace with efi32 for i386 UEFI firmwares), and then create a boot entry using efibootmgr in the firmware boot manager.

ELILO

ELILO is the UEFI version of LILO Boot Loader. It was originally created for Intel Itanium systems which supported only EFI (precursor to UEFI). It is the oldest UEFI bootloader for Linux. It is still in development but happens at a very slow pace. Upstream provided compiled binaries are available at http://sourceforge.net/projects/elilo/ . Elilo config file elilo.conf is similar to LILO's config file. AUR package - elilo-efiAUR.

Package Naming Guidelines

UEFI bootloader package(s) should be suffixed with -efi-x86_64 or -efi-i386 to denote package built for 64-bit and 32-bit UEFI respectively. If a single package contains both 64-bit and 32-bit UEFI applications, then -efi suffix should be used in the pkgname.