52 lines
1.5 KiB
Nix
52 lines
1.5 KiB
Nix
# 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
|
|
SCRIPT_DIR=$( cd -- "$( dirname -- "''${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
|
kexec --load ''${SCRIPT_DIR}/bzImage \
|
|
--initrd=''${SCRIPT_DIR}/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}/${config.system.boot.loader.kernelFile}";
|
|
}
|
|
{
|
|
name = "kexec-boot";
|
|
path = kexecScript;
|
|
}
|
|
];
|
|
};
|
|
}
|