diff options
author | Julien Malka <julien@malka.sh> | 2023-11-16 23:48:19 +0000 |
---|---|---|
committer | Julien Malka <julien@malka.sh> | 2023-11-17 14:39:04 +0100 |
commit | 81e378618e3f201e1d55abcbd920fdca394c21a5 (patch) | |
tree | 20a881bb044d717bd089801f67f30a9d26200451 | |
parent | 4fae7293f40740bbc584df9056d8856a1c7b0dbe (diff) |
nixos/systemd-boot: allow for bootspec-less generations
Generation built with old versions of NixOS with no bootspec
support may still be present on the system and must be
accounted for.
-rw-r--r-- | nixos/modules/system/boot/loader/systemd-boot/systemd-boot-builder.py | 17 | ||||
-rw-r--r-- | nixos/modules/system/boot/loader/systemd-boot/systemd-boot.nix | 2 | ||||
-rw-r--r-- | nixos/tests/systemd-boot.nix | 16 | ||||
-rw-r--r-- | pkgs/tools/misc/bootspec/default.nix | 12 |
4 files changed, 44 insertions, 3 deletions
diff --git a/nixos/modules/system/boot/loader/systemd-boot/systemd-boot-builder.py b/nixos/modules/system/boot/loader/systemd-boot/systemd-boot-builder.py index 96b42066b223..7d06e0131d9d 100644 --- a/nixos/modules/system/boot/loader/systemd-boot/systemd-boot-builder.py +++ b/nixos/modules/system/boot/loader/systemd-boot/systemd-boot-builder.py @@ -88,9 +88,20 @@ def write_loader_conf(profile: str | None, generation: int, specialisation: str def get_bootspec(profile: str | None, generation: int) -> BootSpec: - boot_json_path = os.path.realpath("%s/%s" % (system_dir(profile, generation, None), "boot.json")) - boot_json_f = open(boot_json_path, 'r') - bootspec_json = json.load(boot_json_f) + system_directory = system_dir(profile, generation, None) + boot_json_path = os.path.realpath("%s/%s" % (system_directory, "boot.json")) + if os.path.isfile(boot_json_path): + boot_json_f = open(boot_json_path, 'r') + bootspec_json = json.load(boot_json_f) + else: + boot_json_str = subprocess.check_output([ + "@bootspecTools@/bin/synthesize", + "--version", + "1", + system_directory, + "/dev/stdout"], + universal_newlines=True) + bootspec_json = json.loads(boot_json_str) return bootspec_from_json(bootspec_json) def bootspec_from_json(bootspec_json: Dict) -> BootSpec: diff --git a/nixos/modules/system/boot/loader/systemd-boot/systemd-boot.nix b/nixos/modules/system/boot/loader/systemd-boot/systemd-boot.nix index 1086ab80b14f..9d55c21077d1 100644 --- a/nixos/modules/system/boot/loader/systemd-boot/systemd-boot.nix +++ b/nixos/modules/system/boot/loader/systemd-boot/systemd-boot.nix @@ -16,6 +16,8 @@ let systemd = config.systemd.package; + bootspecTools = pkgs.bootspec; + nix = config.nix.package.out; timeout = optionalString (config.boot.loader.timeout != null) config.boot.loader.timeout; diff --git a/nixos/tests/systemd-boot.nix b/nixos/tests/systemd-boot.nix index 13007d0d80d8..a592504addc0 100644 --- a/nixos/tests/systemd-boot.nix +++ b/nixos/tests/systemd-boot.nix @@ -277,4 +277,20 @@ in machine.wait_for_unit("multi-user.target") ''; }; + + no-bootspec = makeTest + { + name = "systemd-boot-no-bootspec"; + meta.maintainers = with pkgs.lib.maintainers; [ julienmalka ]; + + nodes.machine = { + imports = [ common ]; + boot.bootspec.enable = false; + }; + + testScript = '' + machine.start() + machine.wait_for_unit("multi-user.target") + ''; + }; } diff --git a/pkgs/tools/misc/bootspec/default.nix b/pkgs/tools/misc/bootspec/default.nix index 7bf6bc478d7c..2ffa6c47ab09 100644 --- a/pkgs/tools/misc/bootspec/default.nix +++ b/pkgs/tools/misc/bootspec/default.nix @@ -1,6 +1,7 @@ { lib , rustPlatform , fetchFromGitHub +, fetchpatch }: rustPlatform.buildRustPackage rec { pname = "bootspec"; @@ -13,6 +14,17 @@ rustPlatform.buildRustPackage rec { hash = "sha256-5IGSMHeL0eKfl7teDejAckYQjc8aeLwfwIQSzQ8YaAg="; }; + patches = [ + # https://github.com/DeterminateSystems/bootspec/pull/127 + # Fixes the synthesize tool for aarch64-linux + (fetchpatch { + name = "aarch64-support.patch"; + url = "https://github.com/DeterminateSystems/bootspec/commit/1d0e925f360f0199f13422fb7541225fd162fd4f.patch"; + sha256 = "sha256-wU/jWnOqVBrU2swANdXbQfzRpNd/JIS4cxSyCvixZM0="; + }) + + ]; + cargoHash = "sha256-eGSKVHjPnHK7WyGkO5LIjocNGHawahYQR3H5Lgk1C9s="; meta = with lib; { |