Unified kernel image: Difference between revisions

From JookWiki
(Dump initial notes)
 
(→‎Upstream install guides: Note systemd's ukify tool)
 
(16 intermediate revisions by the same user not shown)
Line 1: Line 1:
https://systemd.io/BOOT_LOADER_SPECIFICATION/#type-2-efi-unified-kernel-images
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.


== Overview ==
Traditionally bootloaders provided the following features:


apt: systemd-boot
* The ability to select something to boot
* The ability to boot applications from a filesystem


https://wiki.archlinux.org/title/Unified_kernel_image
Before UEFI these features were useful as BIOS machines could only specify a drive to boot from, not individual kernels or applications.


systemd's efistub + sections + whatever
On UEFI systems using a bootloader with these features is redundant and wastes time.


kernel efistub
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].


There are currently two main stubs you can use to boot Linux:


chmod +x /etc/kernel/postinst.d/zz-unified
* The kernel's [https://docs.kernel.org/admin-guide/efi-stub.html EFI Boot Stub] which is only useful for kernel developers
* [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:


echo "root=UUID=b1e14117-8e88-4db6-9a6f-6bea5a0605e9 ro vt.handoff=7" > /tmp/cmdline.txt
* [https://www.freedesktop.org/software/systemd/man/latest/ukify.html systemd's ukify tool]
* [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]


objcopy \
== Debian and Ubuntu install guide ==


   --add-section .osrel="/usr/lib/os-release" --change-section-vma .osrel=0x20000 \
Step 1: Copy and paste this file to 'install.sh' somewhere on your computer.


   --add-section .cmdline="/tmp/cmdline.txt" --change-section-vma .cmdline=0x30000 \
#!/bin/bash
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"


   --add-section .linux="/boot/vmlinuz" --change-section-vma .linux=0x2000000 \
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 .initrd="/boot/initrd.img" --change-section-vma .initrd=0x3000000 \
Step 3: Run <code>bash install.sh</code> as root in the directory containing the install.sh file.


   "/usr/lib/systemd/boot/efi/linuxx64.efi.stub" "/boot/efi/EFI/unified/bootx64.efi"
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.


<nowiki>#</nowiki>    --add-section .splash="/boot/splash.bmp" --change-section-vma .splash=0x40000 \
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.
 
[[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)

Latest revision as of 13:16, 25 November 2023

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.

Overview[edit | edit source]

Traditionally bootloaders provided the following features:

  • The ability to select something to 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.

On UEFI systems using a bootloader with these features is redundant and wastes time.

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 systemd's Boot Loader Specification.

There are currently two main stubs you can use to boot Linux:

  • The kernel's EFI Boot Stub which is only useful for kernel developers
  • 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[edit | edit source]

Here are install guides for projects that officially support unified kernel images:

Debian and Ubuntu install guide[edit | edit source]

Step 1: Copy and paste this file to 'install.sh' somewhere on your computer.

#!/bin/bash
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 DISK=/dev/vda to the disk with your UEFI partition on it and PART=2 to the partition number. Typing lsblk might help you find this.

Step 3: Run bash install.sh as root in the directory containing the install.sh file.

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.

Step 5: Optionally, add a splash file in /boot/splash.bmp and run /etc/kernel/postinst.d/zz-unified . You may also want to add bgrt_disable to the kernel arguments to hide your computer's UEFI logo.