Latest revision |
Your text |
Line 1: |
Line 1: |
| If you use UEFI and only boot a single Linux kernel, you don't need a bootloader like systemd-boot or GRUB. Instead you can create a Unified Kernel Image and boot that directly. This article documents how.
| | https://systemd.io/BOOT_LOADER_SPECIFICATION/#type-2-efi-unified-kernel-images |
|
| |
|
| == Overview ==
| |
| Traditionally bootloaders provided the following features:
| |
|
| |
|
| * The ability to select something to boot
| | apt: systemd-boot |
| * The ability to boot applications from a filesystem
| |
|
| |
|
| Before UEFI these features were useful as BIOS machines could only specify a drive to boot from, not individual kernels or applications.
| | https://wiki.archlinux.org/title/Unified_kernel_image |
|
| |
|
| On UEFI systems using a bootloader with these features is redundant and wastes time.
| | systemd's efistub + sections + whatever |
|
| |
|
| With the help of an stub you can package everything needed to boot your Linux system in to a single UEFI application. This is called a 'Unified kernel image', defined in [https://systemd.io/BOOT_LOADER_SPECIFICATION/ systemd's Boot Loader Specification].
| | kernel efistub |
|
| |
|
| There are currently two main stubs you can use to boot Linux:
| |
|
| |
|
| * The kernel's [https://docs.kernel.org/admin-guide/efi-stub.html EFI Boot Stub] which is only useful for kernel developers
| | chmod +x /etc/kernel/postinst.d/zz-unified |
| * [https://www.freedesktop.org/software/systemd/man/systemd-stub.html systemd-stub] which can be used to package pre-built components
| |
|
| |
|
| Because systemd-stub can be used with existing components provided by your Linux distro, it's possible to create a script that builds a Unified Kernel Image yourself.
| |
|
| |
|
| == Upstream install guides ==
| |
| Here are install guides for projects that officially support unified kernel images:
| |
|
| |
|
| * [https://www.freedesktop.org/software/systemd/man/latest/ukify.html systemd's ukify tool]
| | echo "root=UUID=b1e14117-8e88-4db6-9a6f-6bea5a0605e9 ro vt.handoff=7" > /tmp/cmdline.txt |
| * [https://wiki.archlinux.org/title/Unified_kernel_image ArchWiki's unified kernel image page]
| |
| * [https://wiki.alpinelinux.org/wiki/UEFI_Secure_Boot Alpine Linux's UEFI Secure Boot page]
| |
| * [https://wiki.gentoo.org/wiki/Unified_kernel_image Gentoo's Unified kernel image page]
| |
|
| |
|
| == Debian and Ubuntu install guide ==
| | objcopy \ |
|
| |
|
| Step 1: Copy and paste this file to 'install.sh' somewhere on your computer.
| | --add-section .osrel="/usr/lib/os-release" --change-section-vma .osrel=0x20000 \ |
|
| |
|
| #!/bin/bash
| | --add-section .cmdline="/tmp/cmdline.txt" --change-section-vma .cmdline=0x30000 \ |
| DISK=/dev/vda
| |
| PART=2
| |
| apt install systemd-boot binutils efibootmgr
| |
| cat /proc/cmdline > /boot/cmdline.txt
| |
| mkdir -p /boot/efi/EFI/unified
| |
| cat <<EOF >/etc/kernel/postinst.d/zz-unified
| |
| #!/bin/bash
| |
| test -e /boot/splash.bmp && SPLASH='--add-section .splash=/boot/splash.bmp --change-section-vma .splash=0x40000'
| |
| exec objcopy \
| |
| --add-section .osrel=/usr/lib/os-release --change-section-vma .osrel=0x20000 \
| |
| --add-section .cmdline=/boot/cmdline.txt --change-section-vma .cmdline=0x30000 \
| |
| \$SPLASH \
| |
| --add-section .linux=/boot/vmlinuz --change-section-vma .linux=0x2000000 \
| |
| --add-section .initrd=/boot/initrd.img --change-section-vma .initrd=0x3000000 \
| |
| "/usr/lib/systemd/boot/efi/linuxx64.efi.stub" "/boot/efi/EFI/unified/bootx64.efi"
| |
| EOF
| |
| chmod +x /etc/kernel/postinst.d/zz-unified
| |
| /etc/kernel/postinst.d/zz-unified
| |
| efibootmgr -c -d $DISK -p $PART -L "Linux Unified" -l "\EFI\unified\bootx64.efi"
| |
|
| |
|
| Step 2: Change <code>DISK=/dev/vda</code> to the disk with your UEFI partition on it and <code>PART=2</code> to the partition number. Typing <code>lsblk</code> might help you find this.
| | --add-section .linux="/boot/vmlinuz" --change-section-vma .linux=0x2000000 \ |
|
| |
|
| Step 3: Run <code>bash install.sh</code> as root in the directory containing the install.sh file.
| | --add-section .initrd="/boot/initrd.img" --change-section-vma .initrd=0x3000000 \ |
|
| |
|
| Step 4: Reboot and enter UEFI setup. Run the new "Linux Unified" option and see if it works. If it does, set it to be the default option.
| | "/usr/lib/systemd/boot/efi/linuxx64.efi.stub" "/boot/efi/EFI/unified/bootx64.efi" |
|
| |
|
| Step 5: Optionally, add a splash file in <code>/boot/splash.bmp</code> and run <code>/etc/kernel/postinst.d/zz-unified</code> . You may also want to add <code>bgrt_disable</code> to the kernel arguments to hide your computer's UEFI logo.
| | <nowiki>#</nowiki> --add-section .splash="/boot/splash.bmp" --change-section-vma .splash=0x40000 \ |
| [[Category:Research]]
| | |
| | |
| | - splash bmp can be anything |
| | |
| | efibootmgr -c -d /dev/vda -p 2 -L "unified" -l "\efi\unified\bootx64.efi" |
| | |
| | mkdir /boot/efi/EFI/unified |
| | |
| | apt reinstall linux-image-generic |
| | |
| | |
| | root@jookia-Standard-PC-Q35-ICH9-2009:/boot/efi/EFI/unified# efibootmgr -c -d /dev/vda -p 2 -L "unified" -l "\efi\unified\bootx64.efi" -^C |
| | |
| | root@jookia-Standard-PC-Q35-ICH9-2009:/boot/efi/EFI/unified# efibootmgr -o 4 |
| | |
| | BootCurrent: 0004 |
| | |
| | Timeout: 3 seconds |
| | |
| | BootOrder: 0004 |
| | |
| | Boot0000* UiApp |
| | |
| | Boot0001* UEFI Misc Device |
| | |
| | Boot0002* EFI Internal Shell |
| | |
| | Boot0003* ubuntu |
| | |
| | Boot0004* unified |
| | |
| | Boot0005* UEFI PXEv4 (MAC:5254003512E6) |