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 [[Boot Loader|bootloaders]] are explained here:

−

−

== Linux Kernel EFISTUB ==

−

{{Warning|1=A bug has been noticed where booting EFISTUB can fail depending on kernel version and motherboard model. See [https://bbs.archlinux.org/viewtopic.php?id=156670&p=1] for more information.}}

−

−

Linux (Kernel >= 3.3) supports {{ic|EFISTUB (EFI BOOT STUB)}} booting. It is enabled by default on Arch Linux kernels or can be activated by setting {{ic|CONFIG_EFI_STUB&#61;y}} in the Kernel configuration (see [https://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob_plain;f=Documentation/x86/efi-stub.txt;hb=HEAD 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.

# Mount the UEFI System Partition at {{ic|/boot/efi}} with {{ic|# mount <UEFI Partition> /boot/efi}} if you're going to be using GRUB2, or at {{ic|/boot}} with {{ic|# 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 {{ic|/boot/efi}}}}

{{note| As of {{Pkg|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 [https://wiki.archlinux.org/index.php/UEFI_Bootloaders#Setting_up_EFISTUB 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 [https://www.archlinux.org/packages/extra/any/refind-efi/ refind-efi 0.2.7], refind automatically detects kernels in {{ic|/boot}}. They do not have to be renamed to have a {{ic|.efi}} extension either. Hence, the following sync scripts aren't needed if using [https://wiki.archlinux.org/index.php/UEFI_Bootloaders#Using_rEFInd refind]. You do need to install an EFI driver to read the Linux filesystem on which the kernel is stored, though. See [http://www.rodsbooks.com/refind/drivers.html]. Briefly, if the /boot is within an ext4 filesystem and the kernel is x64 architecture, you may run "mkdir -p /boot/efi/EFI/refind/drivers; cp /usr/share/refind/drivers_x64/ext4_x64.efi /boot/efi/EFI/refind/drivers" to install ext4 filesystem driver for 64 bit kernel so that the kernel can be located by the rEFInd.}}

−

−

==== 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 {{ic|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 {{ic|/etc/systemd/system/efistub-update.path}}}}

−

{{bc|<nowiki>

−

[Unit]

−

Description=Copy EFISTUB Kernel to UEFISYS Partition

−

−

[Path]

−

PathChanged=/boot/initramfs-linux-fallback.img

−

−

[Install]

−

WantedBy=multi-user.target

−

</nowiki>}}

−

−

{{Tip|Save the following script as {{ic|/etc/systemd/system/efistub-update.service}}}}

{{Tip|Save the following script as {{ic|/etc/incron.d/efistub-update.conf}}}}

−

{{Note|The first parameter {{ic|/boot/initramfs-linux-fallback.img}} is the file to watch. The second parameter {{ic|IN_CLOSE_WRITE}} is the action to watch for. The third parameter {{ic|/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

−

{{bc|<nowiki>

−

# systemctl enable incrond.service

−

</nowiki>}}}}

−

−

==== 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 {{ic|vm-linuz}}, {{ic|initramfs-linux.img}}, and {{ic|initramfs-linux-fallback.img}}; then follows step 4 in [https://wiki.archlinux.org/index.php/UEFI_Bootloaders#Setting_up_EFISTUB Setting up EFISTUB]

−

−

{{Tip|Save the following script as {{ic|/usr/lib/initcpio/install/efistub-update}}}}

−

{{bc|<nowiki>

−

#!/usr/bin/env bash

−

−

build() {

−

/root/watch.sh &

−

}

−

−

help() {

−

cat <<HELPEOF

−

This hook waits for mkinitcpio to finish and copies the finished ramdisk and kernel to the ESP

−

HELPEOF

−

}

−

</nowiki>}}

−

−

{{Tip|Save the following script as {{ic|/root/watch.sh}} and make it executable}}

{{Tip|Add {{ic|efistub-update}} to the list of hooks in {{ic|/etc/mkinitcpio.conf}}}}

−

−

{{Note| As of [https://www.archlinux.org/packages/extra/any/refind-efi/ refind-efi 0.2.7], refind automatically detects kernels in {{ic|/boot}}. They do not have to be renamed to have a {{ic|.efi}} extension either. Hence, the following sync scripts aren't needed if using [https://wiki.archlinux.org/index.php/UEFI_Bootloaders#Using_rEFInd 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 {{ic|\}} instead of {{ic|/}} and should be relative to the UEFI System Partition's root. For example, if the initramfs is located in {{ic|/boot/efi/EFI/arch/initramfs-linux.img}}, the corresponding UEFI formatted line would be {{ic|\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 {{ic|/}} in EFISTUB booting has been added in [https://patchwork.kernel.org/patch/1899361/ mainline 3.9-rc1] and [http://lwn.net/Articles/541002/ stable 3.8.2]. Leading {{ic|/}} can be ignored but the path still has to be full path. Example: {{ic|initrd&#61;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.

−

{{Tip|If you're new to EFISTUB and/or rEFInd, you need to read [http://www.rodsbooks.com/refind/linux.html The rEFInd Boot Manager: Methods of Booting Linux] before going any further. This section illustrates only one possible use-case which is not suitable for all configurations.}}

{{Tip|Refind's configuration file is located in {{ic|/boot/efi/EFI/refind/refind.conf}}. The file is well commented.}}

−

−

As of {{Pkg|refind-efi}} 0.2.7, refind can auto-detect kernels in {{ic|/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 {{ic|refind.conf}} (you may need to include the PATH to the drivers folders in the ESP). Copy your {{ic|/usr/share/refind/refind_linux.conf-sample}} to {{ic|/boot/refind_linux.conf}}. You may pass kernel specific commands in this file.

−

−

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

−

−

{{Note|1=Please notice the [https://bbs.archlinux.org/viewtopic.php?pid=1286972 difference] between the standard UUID and the PARTUUID shown by {{ic|$ ls -l /dev/disk/by-partuuid/}}}}

## : Changed efibootmgr writing code to be more concise and added (-w) to write the entry as per dusktreader's excellent guide : https://docs.google.com/document/d/1pvgm3BprpXoadsQi38FxqMOCUZhcSqFhZ26FZBkmn9I/edit

−

## : Function to check if NVRAM boot entry was already listed was fixed to use awk and an if then clause

−

## : ref_bin_escape was modified from : ref_bin_escape=${ref_bin//\//\\\\} to remove extra backslashes (error does not show up when using cmdline)

Did not copy configuration files, please move refind.conf to $refind_dir/";

−

)

−

}

−

main; ## run the main insertion function

−

</nowiki>}}

−

−

{{Note| As of [https://www.archlinux.org/packages/extra/any/refind-efi/ refind-efi 0.2.7], refind automatically detects kernels in {{ic|/boot}}. They do not have to be renamed to have a {{ic|.efi}} extension either. Hence, the following sync scripts aren't needed if using [https://wiki.archlinux.org/index.php/UEFI_Bootloaders#Using_rEFInd 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 {{ic|/usr/lib/systemd/system/refind_update.path}}}}

−

{{bc|<nowiki>

−

[Unit]

−

Description=Update rEFInd bootloader files

−

−

[Path]

−

PathChanged=/usr/share/refind/refind_<arch>.efi

−

Unit=refind_update.service

−

−

[Install]

−

WantedBy=multi-user.target

−

</nowiki>}}

−

−

{{Note|Save the following service file as {{ic|/usr/lib/systemd/system/refind_update.service}}}}

−

{{bc|<nowiki>

−

[Unit]

−

Description=Update rEFInd directories, binaries, and nvram

−

−

[Service]

−

Type=oneshot

−

ExecStart=/usr/bin/bash /usr/lib/systemd/scripts/refind_name_patchv2

−

RemainAfterExit=no

−

</nowiki>}}

−

−

{{Tip|Enable the systemd path unit by running :

−

{{bc|<nowiki>

−

# systemctl enable refind_update.path

−

</nowiki>}}}}

−

−

===== Apple Macs =====

−

−

In case of Apple Macs, try {{AUR|mactel-boot}} 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 {{ic|/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|1=Some kernel and efibootmgr combinations might not work without manual intervention [https://bugs.archlinux.org/task/34641]. 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 you can use your UEFI boot order/GUI to directly boot Arch Linux without a separate bootloader like GRUB (below, the EFI System Partition is on {{ic|/dev/sdX}}, partition {{ic|Y}}).

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

−

−

{{Tip|Save the command for creating your boot entry in a shell script somewhere, which makes it easier to modify (when changing kernel parameters, for example).}}

−

−

More info about efibootmgr at [[UEFI#efibootmgr]]. Forum post https://bbs.archlinux.org/viewtopic.php?pid=1090040#p1090040 .

−

−

== GRUB 2.xx ==

−

−

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 {{ic|/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 - {{AUR|grub-bzr}}.

−

−

== SYSLINUX 6.xx ==

−

−

Install {{Pkg|syslinux}} (from [testing]) or {{AUR|syslinux-firmware-git}} AUR package and copy {{ic|/usr/lib/syslinux/efi64/*}} to {{ic|$esp/EFI/syslinux/}} ({{ic|$esp}} is the mountpoint of UEFISYS partition) ({{ic|efi64}} is for x86_64 UEFI firmwares, replace with {{ic|efi32}} for ia32 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 {{ic|elilo.conf}} is similar to [[LILO]]'s config file. AUR package - {{AUR|elilo-efi}}.

−

−

== EFILINUX ==

−

−

EFILINUX is the precursor to Kernel EFISTUB support. It can be used to boot kernel that do not support EFISTUB (mainly LTS kernels). It is not necessary to use efilinux if the kernel supports EFISTUB.

−

−

It is available in the [extra] as {{Pkg|efilinux-efi}}. Upstream sources are at https://git.kernel.org/cgit/boot/efilinux/efilinux.git/ and the usage instructions are at http://thread.gmane.org/gmane.linux.kernel/1172645 and http://article.gmane.org/gmane.linux.kernel/1175060.

−

−

== Troubleshooting ==

−

{{Poor writing|This troubleshooting note has been transferred from [[Beginners' Guide]] as discussed on the talk page. It is not yet well integrated here and is rather selective in terms of the help provided.}}

−

−

If you run into problems, such as not being able to boot after the bootloader has been installed without any visible error. In this case, you will instead have to enter the UEFI shell and manually add an entry to the UEFI boot menu with the {{ic|bcfg}} command, as described [[Unified Extensible Firmware Interface#bcfg|here]].

−

* On some ASUS motherboards, there is an EFI bug that always reports {{ic|MaxVariableSize&#61;0}}. Combined with a recent kernel that enforces checks on this value, this prevents {{ic|efibootmgr}} from setting new EFI variables. These motherboards do not support the UEFI Shell v2, so you cannot use the {{ic|bcfg}} method either. To work around this, add {{ic|efi_no_storage_paranoia}} to the kernel command line. You can do this by pressing "e" at the bootloader menu.

−

* On some UEFI motherboards like the Intel Z77 boards, adding entries with efibootmgr or bcfg from efi shell will not work because they don't show up on the boot menu list after being added to NVRAM.

−

−

:To solve this you have to trick the UEFI firmware that Windows boot manager is present on the ESP partition.

−

−

:Copy the bootx64.efi file from USB drive as bootmgfw.efi efi file to your ESP partition by booting into EFI shell and typing:

−

−

FS1:

−

cd EFI

−

mkdir Microsoft

−

cd Microsoft

−

mkdir Boot

−

cp FS0:\EFI\BOOT\bootx64.efi FS1:\EFI\Microsoft\Boot\bootmgfw.efi

−

−

:After reboot, any entries added to NVRAM should show up in the boot menu.