Editing Unified kernel image

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

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)
Please note that all contributions to JookWiki are considered to be released under the Creative Commons Zero (Public Domain) (see JookWiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!

To edit this page, please answer the question that appears below (more info):

Cancel Editing help (opens in new window)