commit
733c8ee469
4 changed files with 94 additions and 20 deletions
|
@ -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
|
||||||
|
|
85
nixos/modules/system/boot/uki.nix
Normal file
85
nixos/modules/system/boot/uki.nix
Normal 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 ];
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
|
@ -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
|
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue