Merge pull request #282086 from nikstur/uki

nixos/uki: init
This commit is contained in:
nikstur 2024-01-22 17:43:09 +01:00 committed by GitHub
commit 733c8ee469
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 94 additions and 20 deletions

View file

@ -1468,6 +1468,7 @@
./system/boot/stratisroot.nix ./system/boot/stratisroot.nix
./system/boot/modprobe.nix ./system/boot/modprobe.nix
./system/boot/networkd.nix ./system/boot/networkd.nix
./system/boot/uki.nix
./system/boot/unl0kr.nix ./system/boot/unl0kr.nix
./system/boot/plymouth.nix ./system/boot/plymouth.nix
./system/boot/resolved.nix ./system/boot/resolved.nix

View file

@ -0,0 +1,85 @@
{ config, lib, pkgs, ... }:
let
cfg = config.boot.uki;
inherit (pkgs.stdenv.hostPlatform) efiArch;
format = pkgs.formats.ini { };
ukifyConfig = format.generate "ukify.conf" cfg.settings;
in
{
options = {
boot.uki = {
name = lib.mkOption {
type = lib.types.str;
description = lib.mdDoc "Name of the UKI";
};
version = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = config.system.image.version;
defaultText = lib.literalExpression "config.system.image.version";
description = lib.mdDoc "Version of the image or generation the UKI belongs to";
};
settings = lib.mkOption {
type = format.type;
description = lib.mdDoc ''
The configuration settings for ukify. These control what the UKI
contains and how it is built.
'';
};
};
system.boot.loader.ukiFile = lib.mkOption {
type = lib.types.str;
internal = true;
description = lib.mdDoc "Name of the UKI file";
};
};
config = {
boot.uki.name = lib.mkOptionDefault (if config.system.image.id != null then
config.system.image.id
else
"nixos");
boot.uki.settings = lib.mkOptionDefault {
UKI = {
Linux = "${config.boot.kernelPackages.kernel}/${config.system.boot.loader.kernelFile}";
Initrd = "${config.system.build.initialRamdisk}/${config.system.boot.loader.initrdFile}";
Cmdline = "init=${config.system.build.toplevel}/init ${toString config.boot.kernelParams}";
Stub = "${pkgs.systemd}/lib/systemd/boot/efi/linux${efiArch}.efi.stub";
Uname = "${config.boot.kernelPackages.kernel.modDirVersion}";
OSRelease = "@${config.system.build.etc}/etc/os-release";
# This is needed for cross compiling.
EFIArch = efiArch;
};
};
system.boot.loader.ukiFile =
let
name = config.boot.uki.name;
version = config.boot.uki.version;
versionInfix = if version != null then "_${version}" else "";
in
name + versionInfix + ".efi";
system.build.uki = pkgs.runCommand config.system.boot.loader.ukiFile { } ''
mkdir -p $out
${pkgs.buildPackages.systemdUkify}/lib/systemd/ukify build \
--config=${ukifyConfig} \
--output="$out/${config.system.boot.loader.ukiFile}"
'';
meta.maintainers = with lib.maintainers; [ nikstur ];
};
}

View file

@ -10,10 +10,6 @@ let
imageId = "nixos-appliance"; imageId = "nixos-appliance";
imageVersion = "1-rc1"; imageVersion = "1-rc1";
bootLoaderConfigPath = "/loader/entries/nixos.conf";
kernelPath = "/EFI/nixos/kernel.efi";
initrdPath = "/EFI/nixos/initrd.efi";
in in
{ {
name = "appliance-gpt-image"; name = "appliance-gpt-image";
@ -54,19 +50,8 @@ in
"/EFI/BOOT/BOOT${lib.toUpper efiArch}.EFI".source = "/EFI/BOOT/BOOT${lib.toUpper efiArch}.EFI".source =
"${pkgs.systemd}/lib/systemd/boot/efi/systemd-boot${efiArch}.efi"; "${pkgs.systemd}/lib/systemd/boot/efi/systemd-boot${efiArch}.efi";
# TODO: create an abstraction for Boot Loader Specification (BLS) entries. "/EFI/Linux/${config.system.boot.loader.ukiFile}".source =
"${bootLoaderConfigPath}".source = pkgs.writeText "nixos.conf" '' "${config.system.build.uki}/${config.system.boot.loader.ukiFile}";
title NixOS
linux ${kernelPath}
initrd ${initrdPath}
options init=${config.system.build.toplevel}/init ${toString config.boot.kernelParams}
'';
"${kernelPath}".source =
"${config.boot.kernelPackages.kernel}/${config.system.boot.loader.kernelFile}";
"${initrdPath}".source =
"${config.system.build.initialRamdisk}/${config.system.boot.loader.initrdFile}";
}; };
repartConfig = { repartConfig = {
Type = "esp"; Type = "esp";
@ -119,8 +104,6 @@ in
assert 'IMAGE_VERSION="${imageVersion}"' in os_release assert 'IMAGE_VERSION="${imageVersion}"' in os_release
bootctl_status = machine.succeed("bootctl status") bootctl_status = machine.succeed("bootctl status")
assert "${bootLoaderConfigPath}" in bootctl_status assert "Boot Loader Specification Type #2 (.efi)" in bootctl_status
assert "${kernelPath}" in bootctl_status
assert "${initrdPath}" in bootctl_status
''; '';
} }

View file

@ -28757,6 +28757,11 @@ with pkgs;
pname = "systemd-minimal-libs"; pname = "systemd-minimal-libs";
buildLibsOnly = true; buildLibsOnly = true;
}; };
# We do not want to include ukify in the normal systemd attribute as it
# relies on Python at runtime.
systemdUkify = systemd.override {
withUkify = true;
};
udev = udev =
if (with stdenv.hostPlatform; isLinux && isStatic) then libudev-zero if (with stdenv.hostPlatform; isLinux && isStatic) then libudev-zero