1{ pkgs, lib, ... }:
2
3{
4 config = lib.mkIf (lib.meta.availableOn pkgs.stdenv.hostPlatform pkgs.kexec-tools) {
5 environment.systemPackages = [ pkgs.kexec-tools ];
6
7 systemd.services.prepare-kexec = {
8 description = "Preparation for kexec";
9 wantedBy = [ "kexec.target" ];
10 before = [ "systemd-kexec.service" ];
11 unitConfig.DefaultDependencies = false;
12 serviceConfig.Type = "oneshot";
13 path = [ pkgs.kexec-tools ];
14 script = ''
15 # Don't load the current system profile if we already have a kernel loaded
16 if [[ 1 = "$(</sys/kernel/kexec_loaded)" ]] ; then
17 echo "kexec kernel has already been loaded, prepare-kexec skipped"
18 exit 0
19 fi
20
21 p=$(readlink -f /nix/var/nix/profiles/system)
22 if ! [[ -d $p ]]; then
23 echo "Could not find system profile for prepare-kexec"
24 exit 1
25 fi
26 echo "Loading NixOS system via kexec."
27 exec kexec --load "$p/kernel" --initrd="$p/initrd" --append="$(cat "$p/kernel-params") init=$p/init"
28 '';
29 };
30 };
31}