From 366c8be2add24ecfb14ddc8452189358c9cb1439 Mon Sep 17 00:00:00 2001 From: Florian Klink Date: Mon, 21 Feb 2022 17:41:34 +0100 Subject: [PATCH] nixos/installer: add kexec-boot This module exposes a config.system.build.kexecBoot attribute, which returns a directory with kernel, initrd and a shell script running the necessary kexec commands. It's meant to be scp'ed to a machine with working ssh and kexec binary installed. This is useful for (cloud) providers where you can't boot a custom image, but get some Debian or Ubuntu installation. --- nixos/modules/installer/kexec/kexec-boot.nix | 50 ++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 nixos/modules/installer/kexec/kexec-boot.nix diff --git a/nixos/modules/installer/kexec/kexec-boot.nix b/nixos/modules/installer/kexec/kexec-boot.nix new file mode 100644 index 000000000000..c2f1a64a36a0 --- /dev/null +++ b/nixos/modules/installer/kexec/kexec-boot.nix @@ -0,0 +1,50 @@ +# This module exposes a config.system.build.kexecBoot attribute, +# which returns a directory with kernel, initrd and a shell script +# running the necessary kexec commands. + +# It's meant to be scp'ed to a machine with working ssh and kexec binary +# installed. + +# This is useful for (cloud) providers where you can't boot a custom image, but +# get some Debian or Ubuntu installation. + +{ pkgs +, modulesPath +, config +, ... +}: +{ + imports = [ + (modulesPath + "/installer/netboot/netboot-minimal.nix") + ]; + + config = { + system.build.kexecBoot = + let + kexecScript = pkgs.writeScript "kexec-boot" '' + #!/usr/bin/env bash + if ! kexec -v >/dev/null 2>&1; then + echo "kexec not found: please install kexec-tools" 2>&1 + exit 1 + fi + kexec --load ./bzImage \ + --initrd=./initrd.gz \ + --command-line "init=${config.system.build.toplevel}/init ${toString config.boot.kernelParams}" + kexec -e + ''; in + pkgs.linkFarm "kexec-tree" [ + { + name = "initrd.gz"; + path = "${config.system.build.netbootRamdisk}/initrd"; + } + { + name = "bzImage"; + path = "${config.system.build.kernel}/bzImage"; + } + { + name = "kexec-boot"; + path = kexecScript; + } + ]; + }; +}