forked from mirrors/nixpkgs
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
|
||||
'';
|
||||
|
||||
# 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.postBootCommands =
|
||||
|
|
|
@ -18,8 +18,7 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
|
|||
virtualisation.vlans = [ ];
|
||||
environment.systemPackages = [ pkgs.hello ];
|
||||
imports = [
|
||||
"${modulesPath}/installer/kexec/kexec-boot.nix"
|
||||
"${modulesPath}/profiles/minimal.nix"
|
||||
"${modulesPath}/installer/netboot/netboot-minimal.nix"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
@ -33,14 +32,14 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
|
|||
node1.connect()
|
||||
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.shutdown()
|
||||
|
||||
# Kexec node1 to the toplevel of node2 via the kexec-boot script
|
||||
node1.succeed('touch /run/foo')
|
||||
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('hello')
|
||||
node1.succeed('[ "$(hostname)" = "node2" ]')
|
||||
|
|
Loading…
Reference in a new issue