[systemd-devel] Passing Kernel Params from systemd-boot for Secure Boot UKI
Lennart Poettering
lennart at poettering.net
Tue Oct 8 07:22:05 UTC 2024
On Mo, 07.10.24 13:54, Mah, Yock Gen (yock.gen.mah at intel.com) wrote:
> My Mariner OS is built with following features:
>
> 1, Unified Kernel Image (kernel+initrd+cmdline)
> 2. Systemd-boot as boot loader
> 3. Secure Boot enabled
> 4. Multi boot
>
> Systemd-boot config files looks like below
>
> ```
> root at YockgenOS [ ~ ]# cat /boot/efi/loader/entries/sos1.conf
> Title Yockgen OS1 UKI
> efi /EFI/Linux/linux-6.1.0-0.efi.signed
> options root=PARTUUID=xxxxx-xxxx-xxxxa ro quiet yockgen=1
> ```
> ```
> root at YockgenOS [ ~ ]# cat /boot/efi/loader/entries/sos2.conf
> Title Yockgen OS2 UKI
> efi /EFI/Linux/linux-6.1.0-1.efi.signed
> options root=PARTUUID=xxxxx-xxxx-xxxxa ro quiet yockgen=2
> ```
>
> With Secure Boot enabled, the /proc/cmdline is no longer overwritten by the systemd-boot configuration. The cmdline is shown those params during UKI built time.
>
> Runtime logs as below:
>
> ```
> root at YockgenOS [ ~ ]# cat /proc/cmdline
> BOOT_IMAGE=/boot/vmlinuz-6.6.43-1.cm2 rd.auto=1 root=PARTUUID=21f13e53-110f-4be5-b18a-fed745cacc87 init=/lib/systemd/systemd ro loglevel=3 no-vmw-sta crashkernel=256M lockdown=integrity lockdown=integrity sysctl.kernel.unprivileged_bpf_disabled=1 net.ifnames=0 plymouth.enable=0 systemd.legacy_systemd_cgroup_controller=yes systemd.unified_cgroup_hierarchy=0
>
> root at YockgenOS [ ~ ]# cat /boot/efi/loader/entries/sos1.conf
> Title Yockgen OS1 UKI
> efi /EFI/Linux/linux-6.1.0-0.efi.signed
> options root=PARTUUID=xxxxx-xxxx-xxxxa ro quiet yockgen=1
>
>
> root at YockgenOS [ ~ ]# cat /boot/efi/loader/entries/sos2.conf
> Title Yockgen OS2 UKI
> efi /EFI/Linux/linux-6.1.0-1.efi.signed
> options root=PARTUUID=xxxxx-xxxx-xxxxa ro quiet yockgen=2
> ```
> I couldn't hardcode the 'yockgen' parameter during the build process, as its value depends on the runtime environment. This value needs to be assessed by a custom Dracut module during the initrd stage to mount specific devices.
>
> What could be the possible solution for this?
>
> Thanks a lot, of any guidance!
You have the following options:
1. You encode the full set of cmdline choices in the UKI. Starting
with the upcoming v257 we support "multi-profile" UKIs, that
basically allow you to encode multiple different but fixed choices,
so that one UKI can synthesize multiple menu entries in sd-boot.
2. You use PE "addons" for the kernel cmdline. Which are PE binaries
that resemble UKIs in structure, but do not contain any code
(i.e. no real PE stub, and no .linux section). They can be
SecureBoot signed like any other PE binary, which is how they are
authenticated. You can drop them as "side-car" next to your UKI and
their contents will be combined/override the relevant sections in
the main UKI. This is already available in released systemd
versions. See sd-stub man page for details.
Lennart
--
Lennart Poettering, Berlin
More information about the systemd-devel
mailing list