UEFI Unified Kernel Image for Debian Installer on riscv64
On the riscv64 port, the default boot method is UEFI, with U-Boot typically used as the firmware. This approach
aligns more closely with other architectures, which avoid developping riscv64
specific code. For advanced users, booting using U-Boot and extlinux is
possible, thanks to the kernel being built with
CONFIG_EFI_STUB=y
.
The same applies to the Debian Installer, which is provided as ISO images in various sizes and formats like on other architectures. These images can be put on a USB drive or an SD-card and booted directly from U-Boot in UEFI mode. Some users prefer to use the netboot "image", which in practice consists of a Linux kernel, an initrd, plus a set of Device Tree Blob (DTB) files.
However, booting this in UEFI mode is not straightforward, unless you use a
TFTP server, which is also not trivial. Less known to users, there is also a
corresponding mini.iso
image, which contains all the above plus a bootloader. This offers a simpler
alternative for installation, but depending on your (vendor) U-Boot version
this still requires to go through a media.
Systemd version 257-rc2
comes with a great new feature, the ability to include multiple DTB files in a
single UKI (Unified Kernel Image) file, with systemd-stub
automatically
loading the appropriate one for the current hardware. A UKI file combines a
UEFI boot stub program, a Linux kernel image, an optional initrd, and further
resources in a single UEFI PE file. This finally solves the DTB problem in the
UEFI world for distributions, as a single image can work on multiple boards.
Building upon this, debian-installer on riscv64 now also creates a UEFI UKI
mini.efi
image, which contains systemd-stub
, a Linux kernel, an initrd, plus a set of
Device Tree Blob (DTB) files. Using this image also ensures that the system is
booted in UEFI mode. Booting it with debian-installer is as simple as:
load mmc 0:1 mini.efo $kernel_addr_r # (can also be done using tftpboot, wget, etc.)
bootefi $kernel_addr_r
Additional parameters can be passed to the image using the U-Boot bootargs
environment variable. For instance, to boot in rescue mode:
setenv bootargs "rescue/enable=true"