summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien Malka <julien@malka.sh>2023-11-16 23:48:19 +0000
committerJulien Malka <julien@malka.sh>2023-11-17 14:39:04 +0100
commit81e378618e3f201e1d55abcbd920fdca394c21a5 (patch)
tree20a881bb044d717bd089801f67f30a9d26200451
parent4fae7293f40740bbc584df9056d8856a1c7b0dbe (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.py17
-rw-r--r--nixos/modules/system/boot/loader/systemd-boot/systemd-boot.nix2
-rw-r--r--nixos/tests/systemd-boot.nix16
-rw-r--r--pkgs/tools/misc/bootspec/default.nix12
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; {