nixos/…/kexec-boot.nix: move into netboot.nix, rename to kexecTree
`nixos/modules/installer/kexec/kexec-boot.nix` doesn't contain any custom NixOS config, other than importing `netboot-minimal.nix` (which imports `netboot-base.nix`, which imports `netboot.nix`. `netboot.nix` really is just describing a self-contained system config, running entirely off kernel and initrd, so we might as well move the kexec script generation there as well. `netboot.nix` already contains some `system.build` attributes. Provide a `system.build.kexecTree` attribute (and `kexecScript` for composability).
This commit is contained in:
parent
4a5549783e
commit
50648f568d
|
@ -1,51 +0,0 @@
|
||||||
# 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;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -101,6 +101,37 @@ with lib;
|
||||||
boot
|
boot
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
# A script invoking kexec on ./bzImage and ./initrd.gz.
|
||||||
|
# Usually used through system.build.kexecTree, but exposed here for composability.
|
||||||
|
system.build.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
|
||||||
|
'';
|
||||||
|
|
||||||
|
# A tree containing initrd.gz, bzImage and a kexec-boot script.
|
||||||
|
system.build.kexecTree = 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 = config.system.build.kexecScript;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
boot.loader.timeout = 10;
|
boot.loader.timeout = 10;
|
||||||
|
|
||||||
boot.postBootCommands =
|
boot.postBootCommands =
|
||||||
|
|
|
@ -18,8 +18,7 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
|
||||||
virtualisation.vlans = [ ];
|
virtualisation.vlans = [ ];
|
||||||
environment.systemPackages = [ pkgs.hello ];
|
environment.systemPackages = [ pkgs.hello ];
|
||||||
imports = [
|
imports = [
|
||||||
"${modulesPath}/installer/kexec/kexec-boot.nix"
|
"${modulesPath}/installer/netboot/netboot-minimal.nix"
|
||||||
"${modulesPath}/profiles/minimal.nix"
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -33,14 +32,14 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
|
||||||
node1.connect()
|
node1.connect()
|
||||||
node1.wait_for_unit("multi-user.target")
|
node1.wait_for_unit("multi-user.target")
|
||||||
|
|
||||||
# Check if the machine with kexec-boot.nix profile boots up
|
# Check if the machine with netboot-minimal.nix profile boots up
|
||||||
node2.wait_for_unit("multi-user.target")
|
node2.wait_for_unit("multi-user.target")
|
||||||
node2.shutdown()
|
node2.shutdown()
|
||||||
|
|
||||||
# Kexec node1 to the toplevel of node2 via the kexec-boot script
|
# Kexec node1 to the toplevel of node2 via the kexec-boot script
|
||||||
node1.succeed('touch /run/foo')
|
node1.succeed('touch /run/foo')
|
||||||
node1.fail('hello')
|
node1.fail('hello')
|
||||||
node1.execute('${nodes.node2.config.system.build.kexecBoot}/kexec-boot', check_return=False)
|
node1.execute('${nodes.node2.config.system.build.kexecTree}/kexec-boot', check_return=False)
|
||||||
node1.succeed('! test -e /run/foo')
|
node1.succeed('! test -e /run/foo')
|
||||||
node1.succeed('hello')
|
node1.succeed('hello')
|
||||||
node1.succeed('[ "$(hostname)" = "node2" ]')
|
node1.succeed('[ "$(hostname)" = "node2" ]')
|
||||||
|
|
Loading…
Reference in a new issue