Important: You are required to change your passwords used for Gentoo services and set an email address for your Wiki account if you haven't done so. See the full announcement and Wiki email policy change for more information.

EFI stub kernel

From Gentoo Wiki
Jump to: navigation, search

The (U)EFI firmware present in many newer computers can function as bootloader, allowing you to boot without installing a separate bootloader.

Partitioning

You need to create a partition of type "EFI System partition", which is EF00 on GPT and EF on MBR. Example using sys-apps/gptfdisk:

root # gdisk /dev/sda
Command (? for help): n
Partition number (1-128, default 1): 1
First sector: (enter desired start sector and size, 100 MB should be plenty)
Command (? for help): t
Partition number (1-2): 1
Hex code or GUID (L to show codes, Enter = 8300): EF00
Command (? for help): w

Create a FAT32 filesystem inside:

root # mkfs.vfat -F 32 /dev/sda1

If you don't have mkfs.vfat (part of sys-fs/dosfstools) installed, you can use busybox:

root # busybox mkfs.vfat /dev/sda1

Kernel

Configuration

In order to boot directly from UEFI, the kernel needs to have CONFIG_EFI_STUB support enabled.

Kernel configurationEnable EFI stub support

Processor type and features  --->
    [*] EFI runtime service support 
    [*]   EFI stub support

UEFI does not pass kernel parameters to the kernel during normal boot, so you need to hardcode them via CONFIG_CMDLINE. Example for the root partition on /dev/sda2:

Kernel configurationEnable built-in kernel parameters

Processor type and features  --->
    [*] Built-in kernel command line
    (root=/dev/sda2)

For GPT systems, using root=PARTUUID=... might be preferable. To find out, you can use gdisk:

root # gdisk /dev/sda
Command (? for help): i
Partition number (1-5): 2
Partition unique GUID: (pass the ID that is shown here to the kernel)
Command (? for help): q
Note
The partition's UUID is distinct from the filesystem's UUID.

Initramfs

EFISTUB can load an Initramfs and pass it to the Kernel, e.g. initrd=\boot\initramfs-gentoo.img.gz

Installation

Now build the kernel and copy the image to your EFI partition as EFI/Boot/bootx64.efi. Example (with your EFI partition mounted to /mnt/EFI):

root # cd /usr/src/linux
root #
make -jN
root #
make install modules_install
root #
mkdir -p /mnt/EFI/EFI/Boot
root #
cp /boot/vmlinuz-3.7.9-gentoo /mnt/EFI/EFI/Boot/bootx64.efi

Adding more kernels

Note
In order to modify UEFI boot entries, your system needs to be booted in EFI mode. This means that you need to already have booted the EFI stub image as described above, or some EFI capable live media.

You can optionally make additional kernels known to UEFI. This is especially useful if you want to test more kernels or dual-boot with another operating system. These will be shown in the boot selection prompt, normally shown after you press a hotkey at the right time during system initialization.

Ensure that you have CONFIG_EFI_VARS enabled in your kernel, install sys-boot/efibootmgr and make them known to your UEFI.

Kernel configurationEnable EFI sysfs controls

Firmware Drivers  --->
    <*> EFI Variable Support via sysfs
root # cp /boot/vmlinuz-3.6.11-gentoo /mnt/EFI/EFI/Boot/vmlinuz.efi
root #
efibootmgr --create --part 1 --label "Gentoo" --loader '\efi\boot\vmlinuz.efi'
Note
EFI uses \ as path separator.

See also

External resources