63 lines
1.9 KiB
Nix
63 lines
1.9 KiB
Nix
# This module introduces a simple boot loader installer that installs a UKI,
|
|
# leveraging bootspec. It is only designed to be useful in tests where
|
|
# rebuilding is unlikely/hard.
|
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
let
|
|
cfg = config.boot.loader.uki;
|
|
in
|
|
{
|
|
options.boot.loader.uki = {
|
|
enable = lib.mkEnableOption "UKI";
|
|
|
|
stub = lib.mkOption {
|
|
type = lib.types.path;
|
|
description = "Path to the UKI stub to use.";
|
|
};
|
|
};
|
|
|
|
config =
|
|
let
|
|
systemdUkify = pkgs.systemdMinimal.override {
|
|
withEfi = true;
|
|
withBootloader = true;
|
|
withUkify = true;
|
|
};
|
|
in
|
|
lib.mkIf cfg.enable {
|
|
boot.bootspec.enable = true;
|
|
boot.loader.external = {
|
|
enable = true;
|
|
installHook =
|
|
let
|
|
bootspecNamespace = ''"org.nixos.bootspec.v1"'';
|
|
installer = pkgs.writeShellApplication {
|
|
name = "install-uki";
|
|
runtimeInputs = with pkgs; [ jq systemd binutils ];
|
|
text = ''
|
|
boot_json=/nix/var/nix/profiles/system-1-link/boot.json
|
|
kernel=$(jq -r '.${bootspecNamespace}.kernel' "$boot_json")
|
|
initrd=$(jq -r '.${bootspecNamespace}.initrd' "$boot_json")
|
|
init=$(jq -r '.${bootspecNamespace}.init' "$boot_json")
|
|
|
|
${systemdUkify}/lib/systemd/ukify \
|
|
"$kernel" \
|
|
"$initrd" \
|
|
--stub=${cfg.stub} \
|
|
--cmdline="init=$init ${builtins.toString config.boot.kernelParams}" \
|
|
--os-release="@${config.system.build.etc}/etc/os-release" \
|
|
--output=uki.efi
|
|
|
|
esp=${config.boot.loader.efi.efiSysMountPoint}
|
|
|
|
bootctl install --esp-path="$esp"
|
|
install uki.efi "$esp"/EFI/Linux/
|
|
'';
|
|
};
|
|
in
|
|
"${installer}/bin/install-uki";
|
|
};
|
|
};
|
|
}
|