Merge pull request #233 from Dasharo/uki

Generate UKI file for DTS and iPXE & add support for Secure Boot
This commit is contained in:
Danik Klimuk
2026-03-31 08:13:48 +02:00
committed by GitHub
19 changed files with 558 additions and 19 deletions
+4
View File
@@ -77,6 +77,7 @@ jobs:
ssh -i ~/.ssh/dts-ci-key builder@10.1.40.2 "mkdir -p boot/dts/${DTS_VER}"
cd build/tmp/deploy/images/genericx86-64/
cp bzImage bzImage-${DTS_VER}
cp ipxe_dtsx64.efi ipxe_dtsx64-${DTS_VER}.efi
cp dts-base-image-genericx86-64.cpio.gz dts-base-image-${DTS_VER}.cpio.gz
cp dts-base-image-genericx86-64.wic.gz dts-base-image-${DTS_VER}.wic.gz
cp dts-base-image-genericx86-64.wic.bmap dts-base-image-${DTS_VER}.wic.bmap
@@ -84,6 +85,7 @@ jobs:
# see: https://github.com/dasharo/dasharo-issues/issues/288
# cp dts-base-image-genericx86-64.iso dts-base-image-${DTS_VER}.iso
scp -i ~/.ssh/dts-ci-key bzImage-${DTS_VER} builder@10.1.40.2:boot/dts/${DTS_VER}/
scp -i ~/.ssh/dts-ci-key ipxe_dtsx64-${DTS_VER}.efi builder@10.1.40.2:boot/dts/${DTS_VER}/
scp -i ~/.ssh/dts-ci-key dts-base-image-${DTS_VER}.cpio.gz builder@10.1.40.2:boot/dts/${DTS_VER}/
scp -i ~/.ssh/dts-ci-key dts-base-image-${DTS_VER}.wic.gz builder@10.1.40.2:boot/dts/${DTS_VER}/
scp -i ~/.ssh/dts-ci-key dts-base-image-${DTS_VER}.wic.bmap builder@10.1.40.2:boot/dts/${DTS_VER}/
@@ -103,6 +105,7 @@ jobs:
DTS_VER="${{ env.DTS_VER }}"
cd build/tmp/deploy/images/genericx86-64/
sha256sum bzImage-${DTS_VER} > bzImage-${DTS_VER}.sha256
sha256sum ipxe_dtsx64-${DTS_VER}.efi > ipxe_dtsx64-${DTS_VER}.efi.sha256
sha256sum dts-base-image-${DTS_VER}.cpio.gz > dts-base-image-${DTS_VER}.cpio.gz.sha256
sha256sum dts-base-image-${DTS_VER}.wic.gz > dts-base-image-${DTS_VER}.wic.gz.sha256
sha256sum dts-base-image-${DTS_VER}.wic.bmap > dts-base-image-${DTS_VER}.wic.bmap.sha256
@@ -111,6 +114,7 @@ jobs:
# see: https://github.com/dasharo/dasharo-issues/issues/288
# sha256sum dts-base-image-${DTS_VER}.iso > dts-base-image-${DTS_VER}.iso.sha256
scp -i ~/.ssh/dts-ci-key bzImage-${DTS_VER}.sha256 builder@10.1.40.2:boot/dts/${DTS_VER}/
scp -i ~/.ssh/dts-ci-key ipxe_dtsx64-${DTS_VER}.efi.sha256 builder@10.1.40.2:boot/dts/${DTS_VER}/
scp -i ~/.ssh/dts-ci-key dts-base-image-${DTS_VER}.cpio.gz.sha256 builder@10.1.40.2:boot/dts/${DTS_VER}/
scp -i ~/.ssh/dts-ci-key dts-base-image-${DTS_VER}.wic.gz.sha256 builder@10.1.40.2:boot/dts/${DTS_VER}/
scp -i ~/.ssh/dts-ci-key dts-base-image-${DTS_VER}.wic.bmap.sha256 builder@10.1.40.2:boot/dts/${DTS_VER}/
+4
View File
@@ -76,11 +76,13 @@ jobs:
ssh -i ~/.ssh/dts-ci-key builder@10.1.40.2 "mkdir -p boot/dts/${DTS_VER}"
cd build/tmp/deploy/images/genericx86-64/
cp bzImage bzImage-${DTS_VER}
cp ipxe_dtsx64.efi ipxe_dtsx64-${DTS_VER}.efi
cp dts-base-image-genericx86-64.cpio.gz dts-base-image-${DTS_VER}.cpio.gz
cp dts-base-image-genericx86-64.wic.gz dts-base-image-${DTS_VER}.wic.gz
cp dts-base-image-genericx86-64.wic.bmap dts-base-image-${DTS_VER}.wic.bmap
cp dts-base-image-genericx86-64.iso dts-base-image-${DTS_VER}.iso
scp -i ~/.ssh/dts-ci-key bzImage-${DTS_VER} builder@10.1.40.2:boot/dts/${DTS_VER}/
scp -i ~/.ssh/dts-ci-key ipxe_dtsx64-${DTS_VER}.efi builder@10.1.40.2:boot/dts/${DTS_VER}/
scp -i ~/.ssh/dts-ci-key dts-base-image-${DTS_VER}.cpio.gz builder@10.1.40.2:boot/dts/${DTS_VER}/
scp -i ~/.ssh/dts-ci-key dts-base-image-${DTS_VER}.wic.gz builder@10.1.40.2:boot/dts/${DTS_VER}/
scp -i ~/.ssh/dts-ci-key dts-base-image-${DTS_VER}.wic.bmap builder@10.1.40.2:boot/dts/${DTS_VER}/
@@ -98,12 +100,14 @@ jobs:
DTS_VER="${{ env.DTS_VER }}"
cd build/tmp/deploy/images/genericx86-64/
sha256sum bzImage-${DTS_VER} > bzImage-${DTS_VER}.sha256
sha256sum ipxe_dtsx64-${DTS_VER}.efi > ipxe_dtsx64-${DTS_VER}.efi.sha256
sha256sum dts-base-image-${DTS_VER}.cpio.gz > dts-base-image-${DTS_VER}.cpio.gz.sha256
sha256sum dts-base-image-${DTS_VER}.wic.gz > dts-base-image-${DTS_VER}.wic.gz.sha256
sha256sum dts-base-image-${DTS_VER}.wic.bmap > dts-base-image-${DTS_VER}.wic.bmap.sha256
sha256sum dts-base-image-${DTS_VER}.iso > dts-base-image-${DTS_VER}.iso.sha256
sha256sum dts-base-image-${DTS_VER}.manifest > dts-base-image-${DTS_VER}.manifest.sha256
scp -i ~/.ssh/dts-ci-key bzImage-${DTS_VER}.sha256 builder@10.1.40.2:boot/dts/${DTS_VER}/
scp -i ~/.ssh/dts-ci-key ipxe_dtsx64-${DTS_VER}.efi.sha256 builder@10.1.40.2:boot/dts/${DTS_VER}/
scp -i ~/.ssh/dts-ci-key dts-base-image-${DTS_VER}.cpio.gz.sha256 builder@10.1.40.2:boot/dts/${DTS_VER}/
scp -i ~/.ssh/dts-ci-key dts-base-image-${DTS_VER}.wic.gz.sha256 builder@10.1.40.2:boot/dts/${DTS_VER}/
scp -i ~/.ssh/dts-ci-key dts-base-image-${DTS_VER}.wic.bmap.sha256 builder@10.1.40.2:boot/dts/${DTS_VER}/
+9
View File
@@ -0,0 +1,9 @@
{
"variables": {
"known": [
"IMAGE_EFI_BOOT_FILES",
"INITRD_ARCHIVE"
],
"renamed": {}
}
}
+1 -1
View File
@@ -45,7 +45,7 @@ repos:
rev: 9.0.1
hooks:
- id: oelint-adv
args: [--rulefile=.oelint-ruleset.json, --hide=info, --quiet, --fix]
args: [--rulefile=.oelint-ruleset.json, --hide=info, --quiet, --fix, --constantmods=+.oelint-constants.json]
name: Advanced oelint
description: Based on the OpenEmbedded Styleguide and work done by oe-stylize-tool this module offers a (nearly) complete linter for bitbake-recipes.
entry: oelint-adv
+171
View File
@@ -0,0 +1,171 @@
# DTS boot paths
This document describes how DTS can be booted and which files are used in those
different boot paths. Diagram below shows the most important elements
![](images/boot-paths.png)
* iPXE - this assumes that [dts.ipxe](https://boot.dasharo.com/dts/dts.ipxe)
script is used
- on non-UEFI firmware old method is still used, i.e. booting `bzImage` and
`.cpio.gz` archive
- on UEFI firmware we first run a small EFI application that renames
FirmwareUpdateMode variable if it exists (workaround for
[Dasharo/dasharo-issues#1759](https://github.com/Dasharo/dasharo-issues/issues/1759)),
and then we boot `ipxe_dtsx64.efi` ([Unified Kernel
Image](https://uapi-group.org/specifications/specs/unified_kernel_image/))
which contains both kernel and rootfs.
* USB/disk
- on non-UEFI firmware we first boot GRUB which then boots kernel
(`bzImage`). This GRUB, unlike when booting via UEFI is embedded inside
boot partition itself. You can read more about [MBR boot flow
here](https://neosmart.net/wiki/mbr-boot-process/)
- on UEFI firmware we first boot shim, which then boots GRUB which then
boots DTS. This is fairly standard flow used when booting Linux systems.
## Dasharo UEFI
When analyzing UEFI boot flow one can notice that shim is mentioned twice
* `EFI/BOOT/bootx64.efi`
* `EFI/DTS/grubx64.efi`
The first path is the default file booted by UEFI firmware. The second path is
detected automatically by Dasharo firmware and boot menu entry is created under
`Dasharo Tools Suite` name. This and the fact that shim should be the first
file booted if one wants to use GRUB with Secure Boot is the reason why
`EFI/DTS/grubx64.efi` is actually shim and not GRUB. The real GRUB is under
`EFI/BOOT/grubx64.efi` which is booted by shim.
## Secure Boot
### USB
UEFI boot flow was made specifically so it could be compatible with Secure Boot.
Currently, all files are built unsigned and there are no certificates embedded
inside of shim or GRUB, but it's possible to sign all files by yourself.
Minimal USB example that allows booting DTS with Secure Boot enabled.
1. Generate Secure Boot key/certificate that'll be used for signing `.efi` files
```sh
openssl req -new -x509 -newkey rsa:2048 -nodes \
-keyout sb.key -out sb.crt -subj "/C=PL"
openssl x509 -in sb.crt -out sb.cer -outform DER
```
2. Decompress and mount DTS boot partition
```sh
bmaptool copy images/dts-base-image-genericx86-64.wic.gz dts.img
dev=$(sudo losetup --show -Pf dts.img)
sudo mount "${dev}p1" /mnt
```
3. Sign all files
```sh
sudo sbsign --key sb.key --cert sb.crt /mnt/EFI/BOOT/bootx64.efi --output /mnt/EFI/BOOT/bootx64.efi
sudo sbsign --key sb.key --cert sb.crt /mnt/EFI/BOOT/grubx64.efi --output /mnt/EFI/BOOT/grubx64.efi
sudo sbsign --key sb.key --cert sb.crt /mnt/EFI/DTS/grubx64.efi --output /mnt/EFI/DTS/grubx64.efi
sudo sbsign --key sb.key --cert sb.crt /mnt/EFI/DTS/dtsx64.efi --output /mnt/EFI/DTS/dtsx64.efi
```
4. Copy certificate to boot partition. We will add it to Secure Boot allowed
signatures (DB) later
```sh
sudo cp sb.cer /mnt
```
5. Unmount everything.
```sh
sudo umount /mnt
sudo losetup -d "${dev}"
```
6. Now you can flash `dts.img` on USB flash drive or run it in e.g. QEMU.
7. Enable SB and enroll `sb.cer` into
[DB](https://docs.dasharo.com/dasharo-menu-docs/device-manager/#enabling-secure-boot)
8. Boot DTS. If you've done everything correctly DTS should boot without any
problems. You can verify Secure Boot state by checking dmesg output in
shell:
```sh
bash-5.2# dmesg | grep 'Secure boot'
[ 0.004989] Secure boot enabled
```
### iPXE
Example below allows booting DTS via iPXE with Secure Boot enabled.
1. Generate Secure Boot key/certificate (or use previous ones) as described in
[Secure Boot USB](#usb)
2. Sign `ipxe_dtsx64.efi`. You can download it from <https://boot.dasharo.com>
or build it yourself (it's in `build/tmp/deploy/images/genericx86-64/`)
```sh
sbsign --key sb.key --cert sb.crt ipxe_dtsx64.efi --output ipxe_dtsx64.efi
```
3. Start HTTP server
```sh
python -m http.server
```
4. Enable SB and enroll `sb.cer` into
[DB](https://docs.dasharo.com/dasharo-menu-docs/device-manager/#secure-boot-configuration)
on your test firmware e.g. in QEMU.
5. Boot `ipxe_dtsx64.efi` via iPXE. You can follow steps in
[Launching DTS](https://docs.dasharo.com/dasharo-tools-suite/documentation/running/#launching-dts)
section. The only difference is in `chain` command:
```text
chain http://localhost:8000/ipxe_dtsx64.efi
```
If you are using iPXE on another platform (not QEMU) you should replace
`localhost` with IP of the host with HTTP server running.
To also run `replace_fum_efivar.efi` you have to
1. Sign `replace_fum_efivar.efi` the same way you have signed `ipxe_dtsx64.efi`
```sh
sbsign --key sb.key --cert sb.crt replace_fum_efivar.efi --output replace_fum_efivar.efi
```
1. Modify iPXE commands:
```text
chain http://localhost:8000/replace_fum_efivar.efi
imgfree
chain http://localhost:8000/ipxe_dtsx64.efi
```
## Live image
Instead of booting `ipxe_dtsx64.efi` via iPXE you can instead use it as live
USB image. In short, you just have to boot `ipxe_dtsx64.efi` directly, either by
using [Boot from
file](https://docs.dasharo.com/dasharo-menu-docs/boot-maintenance-mgr/#boot-from-file)
menu, or by creating dedicated flash drive. Below is one such example, that will
create `dts-live.img` that can be used in QEMU or flashed into USB flash drive:
```sh
dd if=/dev/zero of=dts-live.img bs=1 seek=400M count=0
printf '%s\n' "n" "p" "1" "" "" "t" "ef" "w" | fdisk dts-live.img
dev=$(sudo losetup --show -Pf dts-live.img)
sudo mkfs.vfat "${dev}p1" -n DTS-LIVE
sudo mount "${dev}p1" /mnt
sudo mkdir -p /mnt/EFI/BOOT
sudo cp ipxe_dtsx64.efi /mnt/EFI/BOOT/bootx64.efi
sudo umount /mnt
sudo losetup -d "${dev}"
sync
```
This booting method will only work on UEFI firmware.
Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

+38
View File
@@ -0,0 +1,38 @@
@startuml "boot-paths"
start
if (Choose boot method) then (iPXE)
if (UEFI) then (yes)
:Run //replace_fum_efivar.efi//;
note left
Rename //FirmwareUpdateMode// EFI variable
to //FirmwareUpdateModeRT// if it exists
endnote
:Boot //ipxe_dtsx64.efi//;
note left
Contains both kernel and rootfs
endnote
else (no)
:Boot //bzImage// and
//dts.cpio.gz// archive;
endif
else (USB/disk)
if (UEFI) then (no)
:Boot GRUB;
:Boot //bzImage//;
else (yes)
if (Which menu entry) then (Dasharo Tools Suite)
:Boot //EFI/DTS/grubx64.efi// (shim);
note left
Yes, it's shim
endnote
else (Default boot file)
:Boot //EFI/BOOT/bootx64.efi// (shim);
endif
:Boot //EFI/BOOT/grubx64.efi// (GRUB);
:Boot //EFI/DTS/dtsx64.efi// (DTS);
endif
:Mount rootfs;
endif
:We are in DTS;
stop
@enduml
+1 -1
View File
@@ -1,6 +1,6 @@
---
header:
version: 11
version: 14
includes:
- kas/common.yml
- kas/cache.yml
+1 -1
View File
@@ -1,6 +1,6 @@
---
header:
version: 11
version: 14
local_conf_header:
yocto-cache: |
+6 -6
View File
@@ -1,6 +1,6 @@
---
header:
version: 11
version: 14
repos:
meta-dts:
@@ -9,7 +9,7 @@ repos:
poky:
url: https://git.yoctoproject.org/git/poky
refspec: d71d1c02ff622e00d6fa5ca9ce44a4e567691dce
commit: d71d1c02ff622e00d6fa5ca9ce44a4e567691dce
layers:
meta:
meta-poky:
@@ -17,7 +17,7 @@ repos:
meta-openembedded:
url: https://git.openembedded.org/meta-openembedded
refspec: a72010b414ee3d73888ac9cb4e310e8f05e13aea
commit: a72010b414ee3d73888ac9cb4e310e8f05e13aea
layers:
meta-oe:
meta-networking:
@@ -25,17 +25,17 @@ repos:
meta-security:
url: https://git.yoctoproject.org/git/meta-security
refspec: 11ea91192d43d7c2b0b95a93aa63ca7e73e38034
commit: 11ea91192d43d7c2b0b95a93aa63ca7e73e38034
layers:
meta-tpm:
meta-dasharo:
url: https://github.com/Dasharo/meta-dasharo
refspec: f548e66a69046f60762de05777090c95708ee4a5
commit: f548e66a69046f60762de05777090c95708ee4a5
meta-coreboot:
url: https://github.com/zarhus/meta-coreboot
refspec: c8254de6ee875ff4d8f7a3c91880c4d1ed9a7c6e
commit: c8254de6ee875ff4d8f7a3c91880c4d1ed9a7c6e
bblayers_conf_header:
standard: |
+196
View File
@@ -0,0 +1,196 @@
# Unified kernel image (UKI) class
#
# This bbclass merges kernel, initrd etc as a UKI standard UEFI binary,
# to be loaded with UEFI firmware and systemd-boot on target HW.
# TPM PCR pre-calculation is not supported since systemd-measure tooling
# is meant to run on target, not in cross compile environment.
#
# See:
# https://www.freedesktop.org/software/systemd/man/latest/ukify.html
# https://uapi-group.org/specifications/specs/unified_kernel_image/
#
# The UKI contains:
#
# - UEFI stub
# The linux kernel can generate a UEFI stub, however the one from systemd-boot can fetch
# the command line from a separate section of the EFI application, avoiding the need to
# rebuild the kernel.
# - kernel
# - initramfs
# - kernel command line
# - uname -r kernel version
# - /etc/os-release to create a boot menu with version details
# - optionally secure boot signature(s)
# - other metadata (e.g. TPM PCR measurements)
#
# Usage instructions:
#
# - requires UEFI compatible firmware on target, e.g. qemuarm64-secureboot u-boot based
# from meta-arm or qemux86 ovmf/edk2 based firmware for x86_64
#
# - Distro/build config:
#
# INIT_MANAGER = "systemd"
# MACHINE_FEATURES:append = " efi"
# EFI_PROVIDER = "systemd-boot"
# INITRAMFS_IMAGE = "core-image-minimal-initramfs"
#
# - image recipe:
#
# inherit uki
#
# - qemuboot/runqemu changes in image recipe or build config:
#
# # Kernel command line must be inside the signed uki
# QB_KERNEL_ROOT = ""
# # kernel is in the uki image, not loaded separately
# QB_DEFAULT_KERNEL = "none"
#
# - for UEFI secure boot, systemd-boot and uki (including kernel) can
# be signed but require sbsign-tool-native (recipe available from meta-secure-core,
# see also qemuarm64-secureboot from meta-arm). Set variable
# UKI_SB_KEY to path of private key and UKI_SB_CERT for certificate.
# Note that systemd-boot also need to be signed with the same key.
#
# - at runtime, UEFI firmware will load and boot systemd-boot which
# creates a menu from all detected uki binaries. No need to manually
# setup boot menu entries.
#
# - see efi-uki-bootdisk.wks.in how to create ESP partition which hosts systemd-boot,
# config file(s) for systemd-boot and the UKI binaries.
#
DEPENDS += "\
os-release \
systemd-boot \
systemd-boot-native \
binutils-cross-${TARGET_ARCH} \
virtual/kernel \
python3-pefile-native \
"
inherit image-artifact-names
INITRAMFS_IMAGE ?= "core-image-minimal-initramfs"
INITRD_ARCHIVE ?= "${INITRAMFS_IMAGE}-${MACHINE}.${INITRAMFS_FSTYPES}"
do_image_complete[depends] += "${INITRAMFS_IMAGE}:do_image_complete"
UKIFY_CMD ?= "ukify build"
UKI_CONFIG_FILE ?= "${UNPACKDIR}/uki.conf"
UKI_FILENAME ?= "uki.efi"
UKI_KERNEL_FILENAME ?= "${KERNEL_IMAGETYPE}"
UKI_CMDLINE ?= "rootwait root=LABEL=root console=${KERNEL_CONSOLE}"
# secure boot keys and cert, needs sbsign-tools-native (meta-secure-core)
#UKI_SB_KEY ?= ""
#UKI_SB_CERT ?= ""
IMAGE_EFI_BOOT_FILES ?= "${UKI_FILENAME};EFI/Linux/${UKI_FILENAME}"
do_uki[depends] += " \
systemd-boot:do_deploy \
virtual/kernel:do_deploy \
"
do_uki[depends] += "${@ '${INITRAMFS_IMAGE}:do_image_complete' if d.getVar('INITRAMFS_IMAGE') else ''}"
# ensure that the build directory is empty every time we generate a newly-created uki
do_uki[cleandirs] = "${B}"
# influence the build directory at the start of the builds
do_uki[dirs] = "${B}"
# we want to allow specifying files in SRC_URI, such as for signing the UKI
# nooelint: oelint.task.noanonpython
python () {
d.delVarFlag("do_fetch","noexec")
d.delVarFlag("do_unpack","noexec")
}
# main task
python do_uki() {
import glob
import bb.process
# base ukify command, can be extended if needed
ukify_cmd = d.getVar('UKIFY_CMD')
deploy_dir_image = d.getVar('DEPLOY_DIR_IMAGE')
# architecture
target_arch = d.getVar('EFI_ARCH')
if target_arch:
ukify_cmd += " --efi-arch %s" % (target_arch)
# systemd stubs
stub = "%s/linux%s.efi.stub" % (d.getVar('DEPLOY_DIR_IMAGE'), target_arch)
if not os.path.exists(stub):
bb.fatal(f"ERROR: cannot find {stub}.")
ukify_cmd += " --stub %s" % (stub)
# initrd
initramfs_image = "%s" % (d.getVar('INITRD_ARCHIVE'))
ukify_cmd += " --initrd=%s" % (os.path.join(deploy_dir_image, initramfs_image))
deploy_dir_image = d.getVar('DEPLOY_DIR_IMAGE')
# kernel
kernel_filename = d.getVar('UKI_KERNEL_FILENAME') or None
if kernel_filename:
kernel = "%s/%s" % (deploy_dir_image, kernel_filename)
if not os.path.exists(kernel):
bb.fatal(f"ERROR: cannot find %s" % (kernel))
ukify_cmd += " --linux=%s" % (kernel)
# not always needed, ukify can detect version from kernel binary
kernel_version = d.getVar('KERNEL_VERSION')
if kernel_version:
ukify_cmd += "--uname %s" % (kernel_version)
else:
bb.fatal("ERROR - UKI_KERNEL_FILENAME not set")
# command line
cmdline = d.getVar('UKI_CMDLINE')
if cmdline:
ukify_cmd += " --cmdline='%s'" % (cmdline)
# dtb
if d.getVar('KERNEL_DEVICETREE'):
for dtb in d.getVar('KERNEL_DEVICETREE').split():
dtb_path = "%s/%s" % (deploy_dir_image, dtb)
if not os.path.exists(dtb_path):
bb.fatal(f"ERROR: cannot find {dtb_path}.")
ukify_cmd += " --devicetree %s" % (dtb_path)
# custom config for ukify
if os.path.exists(d.getVar('UKI_CONFIG_FILE')):
ukify_cmd += " --config=%s" % (d.getVar('UKI_CONFIG_FILE'))
# systemd tools
ukify_cmd += " --tools=%s%s/lib/systemd/tools" % \
(d.getVar("RECIPE_SYSROOT_NATIVE"), d.getVar("prefix"))
# version
ukify_cmd += " --os-release=@%s%s/lib/os-release" % \
(d.getVar("RECIPE_SYSROOT"), d.getVar("prefix"))
# TODO: tpm2 measure for secure boot, depends on systemd-native and TPM tooling
# needed in systemd > 254 to fulfill ConditionSecurity=measured-uki
# Requires TPM device on build host, thus not supported at build time.
#ukify_cmd += " --measure"
# securebooot signing, also for kernel
key = d.getVar('UKI_SB_KEY')
if key:
ukify_cmd += " --sign-kernel --secureboot-private-key='%s'" % (key)
cert = d.getVar('UKI_SB_CERT')
if cert:
ukify_cmd += " --secureboot-certificate='%s'" % (cert)
# custom output UKI filename
output = " --output=%s/%s" % (d.getVar('DEPLOY_DIR_IMAGE'), d.getVar('UKI_FILENAME'))
ukify_cmd += " %s" % (output)
# Run the ukify command
bb.debug(2, "uki: running command: %s" % (ukify_cmd))
bb.process.run(ukify_cmd, shell=True)
}
addtask uki after do_rootfs before do_deploy do_image_complete do_image_wic
+4 -1
View File
@@ -31,8 +31,11 @@ IMAGE_FSTYPES = "cpio.gz wic.gz wic.bmap iso"
# installing GRUB in EFI/DTS helps in adding custom label in Boot Menu when
# Dasharo firmware is installed
IMAGE_EFI_BOOT_FILES += "grub-efi-bootx64.efi;EFI/DTS/grubx64.efi"
IMAGE_EFI_BOOT_FILES += "grub-efi-grub${EFI_ARCH}.efi;EFI/BOOT/grub${EFI_ARCH}.efi"
PREFERRED_VERSION_flashrom = "dasharo-v1.2.2+git%"
PREFERRED_VERSION_fwupd = "2.0.1"
APPEND += "quiet"
BOOT_LABEL="dts-boot"
ROOT_LABEL="dts-root"
@@ -0,0 +1,7 @@
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
default=DTS
timeout=0
menuentry 'DTS' {
chainloader /EFI/DTS/dtsx64.efi
}
@@ -0,0 +1,2 @@
sbat,1,SBAT Version,sbat,1,https://github.com/rhboot/shim/blob/main/SBAT.md
grub,6,Free Software Foundation,grub,2.12,https://www.gnu.org/software/grub/
1 sbat 1 SBAT Version sbat 1 https://github.com/rhboot/shim/blob/main/SBAT.md
2 grub 6 Free Software Foundation grub 2.12 https://www.gnu.org/software/grub/
@@ -1 +1,34 @@
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
require ${@bb.utils.contains('DISTRO_FEATURES', 'efi-secure-boot', 'grub-efi-efi-custom.inc', '', d)}
SRC_URI += " \
file://grub.cfg \
file://sbat.csv \
"
do_mkimage:append() {
rm "./${GRUB_IMAGE_PREFIX}${GRUB_IMAGE}"
grub-mkimage -v -c ../cfg -p ${EFIDIR} -d ./grub-core/ -s "${WORKDIR}/sbat.csv" \
-O ${GRUB_TARGET}-efi -o ./${GRUB_IMAGE_PREFIX}${GRUB_IMAGE} \
${GRUB_MKIMAGE_MODULES}
}
do_install:append() {
if [ -n "${D}" ]; then
rm -rf "${D}${EFI_PREFIX}/"
fi
}
do_deploy:append() {
install -m 644 "${WORKDIR}/grub.cfg" "${DEPLOYDIR}/"
}
# This recipe creates grub-efi-bootx64.efi by default
# ("${GRUB_EFI_PREFIX}-${EFI_BOOT_IMAGE}")
# which is then copied to EFI/BOOT/BOOTX64.efi by build_hddimg and build_iso
# when building ISO image. This results in current bootx64 (shim) being
# overwritten. This workaround isn't needed if iso isn't added to IMAGE_FSTYPES.
EFI_BOOT_IMAGE = "grub${EFI_ARCH}.efi"
GRUB_BUILDIN:append = " probe regexp chain"
# We are using custom grub.cfg
RDEPENDS:${PN}:remove = "virtual-grub-bootconf"
@@ -0,0 +1,38 @@
# nooelint: oelint.file.requirenotfound
require conf/image-uefi.conf
inherit deploy
SUMMARY = "UEFI shim loader"
HOMEPAGE = "https://github.com/rhboot/shim"
SECTION = "bootloaders"
LICENSE = "BSD-2-Clause"
LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=b92e63892681ee4e8d27e7a7e87ef2bc"
SRC_URI = "gitsm://github.com/rhboot/shim.git;protocol=https;branch=main"
SRCREV = "afc49558b34548644c1cd0ad1b6526a9470182ed"
S = "${WORKDIR}/git"
BACKSLASHES = "\\\\"
EXTRA_OEMAKE = "\
CROSS_COMPILE=${TARGET_PREFIX} \
LIB_GCC="`${CC} -print-libgcc-file-name`" \
DEFAULT_LOADER=${BACKSLASHES}EFI${BACKSLASHES}BOOT${BACKSLASHES}grub${EFI_ARCH}.efi \
"
do_configure() {
oe_runmake clean
}
do_deploy() {
install -Dm 0755 "${B}/shim${EFI_ARCH}.efi" "${DEPLOYDIR}/shim${EFI_ARCH}.efi"
install -Dm 0755 "${B}/mm${EFI_ARCH}.efi" "${DEPLOYDIR}/mm${EFI_ARCH}.efi"
install -Dm 0755 "${B}/fb${EFI_ARCH}.efi" "${DEPLOYDIR}/fb${EFI_ARCH}.efi"
# Required by build_hddimg and build_iso.
# More information in grub/grub-efi_%.bbappend
install -Dm 0755 "${B}/shim${EFI_ARCH}.efi" "${DEPLOYDIR}/grub-efi-${EFI_BOOT_IMAGE}"
}
addtask deploy after do_compile
@@ -1 +1,33 @@
require dts-base-image.inc
inherit uki
KERNEL_CONSOLE = "ttyUSB0"
UKI_CMDLINE = "root=LABEL=${ROOT_LABEL} console=${KERNEL_CONSOLE} rootwait ${APPEND}"
UKI_FILENAME = "dts${EFI_ARCH}.efi"
IMAGE_EFI_BOOT_FILES += " \
${UKI_FILENAME};EFI/DTS/${UKI_FILENAME} \
grub.cfg;EFI/BOOT/grub.cfg \
shim${EFI_ARCH}.efi;EFI/BOOT/shim${EFI_ARCH}.efi \
shim${EFI_ARCH}.efi;EFI/DTS/grub${EFI_ARCH}.efi \
"
do_ipxe_uki() {
stub="${DEPLOY_DIR_IMAGE}/linux${EFI_ARCH}.efi.stub"
kernel="${DEPLOY_DIR_IMAGE}/${UKI_KERNEL_FILENAME}"
rootfs="${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.cpio.gz"
ukify build --cmdline "${UKI_CMDLINE}" --stub "${stub}" \
--linux "${kernel}" --initrd "${rootfs}" \
--tools "${RECIPE_SYSROOT_NATIVE}/lib/systemd/tools" \
--os-release "${RECIPE_SYSROOT}/lib/os-release" \
--output "${DEPLOY_DIR_IMAGE}/ipxe_${UKI_FILENAME}"
}
do_ipxe_uki[depends] += " \
systemd-boot:do_deploy \
virtual/kernel:do_deploy \
dts-base-image:do_image_complete \
"
do_image_wic[depends] += "shim:do_deploy"
addtask ipxe_uki after do_image_complete before do_build
+2 -2
View File
@@ -1,4 +1,4 @@
bootloader --timeout=0 --append=" rootwait console=ttyUSB0"
part /boot --source bootimg-biosplusefi --sourceparams="loader=grub-efi" --ondisk sda --label dts-boot --align 1024 --use-uuid --active --system-id 0xef
part / --source rootfs --fstype=ext4 --ondisk sda --label dts-root --align 1024 --use-uuid --fixed-size 1024
part /boot --source bootimg-biosplusefi --sourceparams="loader=grub-efi" --ondisk sda --label ${BOOT_LABEL} --align 1024 --use-uuid --active --system-id 0xef
part / --source rootfs --fstype=ext4 --ondisk sda --label ${ROOT_LABEL} --align 1024 --use-uuid --fixed-size 1024
+9 -7
View File
@@ -6,6 +6,9 @@ gen_common_ipxe() {
#!ipxe
set dts_version ${version}
set dts_prefix \${dts_version}
iseq \${platform} efi && goto is_efi || goto not_efi
:not_efi
set path_kernel \${dts_prefix}/bzImage-\${dts_version}
set path_initrd \${dts_prefix}/dts-base-image-\${dts_version}.cpio.gz
@@ -13,25 +16,24 @@ imgfetch --name file_kernel \${path_kernel}
imgfetch --name file_initrd \${path_initrd}
kernel file_kernel initrd=file_initrd console=ttyUSB0
boot
:is_efi
EOF
}
gen_fum_workaround_ipxe() {
gen_common_ipxe "$@"
cat <<EOF
iseq \${platform} efi && goto is_efi || goto not_efi
:is_efi
chain replace_fum_efivar.efi
:not_efi
boot
imgfree
chain \${dts_prefix}/ipxe_dtsx64-\${dts_version}.efi
EOF
}
gen_without_fum_workaround_ipxe() {
gen_common_ipxe "$@"
echo "boot"
echo "chain \${dts_prefix}/ipxe_dtsx64-\${dts_version}.efi console=ttyUSB0"
}
VERSION=$1