systemd: allow custom unit folders to be configured with SYSTEMD_UNIT_PATH
This commit is contained in:
parent
f6092fe869
commit
5c8ed06fc9
4 changed files with 64 additions and 2 deletions
|
@ -167,6 +167,7 @@ exec {logOutFd}>&- {logErrFd}>&-
|
||||||
|
|
||||||
# Start systemd.
|
# Start systemd.
|
||||||
echo "starting systemd..."
|
echo "starting systemd..."
|
||||||
|
|
||||||
PATH=/run/current-system/systemd/lib/systemd:@fsPackagesPath@ \
|
PATH=/run/current-system/systemd/lib/systemd:@fsPackagesPath@ \
|
||||||
LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive \
|
LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive @systemdUnitPathEnvVar@ \
|
||||||
exec @systemdExecutable@
|
exec @systemdExecutable@
|
||||||
|
|
|
@ -10,7 +10,7 @@ let
|
||||||
src = ./stage-2-init.sh;
|
src = ./stage-2-init.sh;
|
||||||
shellDebug = "${pkgs.bashInteractive}/bin/bash";
|
shellDebug = "${pkgs.bashInteractive}/bin/bash";
|
||||||
shell = "${pkgs.bash}/bin/bash";
|
shell = "${pkgs.bash}/bin/bash";
|
||||||
inherit (config.boot) systemdExecutable;
|
inherit (config.boot) systemdExecutable extraSystemdUnitPaths;
|
||||||
isExecutable = true;
|
isExecutable = true;
|
||||||
inherit (config.nix) readOnlyStore;
|
inherit (config.nix) readOnlyStore;
|
||||||
inherit useHostResolvConf;
|
inherit useHostResolvConf;
|
||||||
|
@ -20,6 +20,10 @@ let
|
||||||
pkgs.util-linux
|
pkgs.util-linux
|
||||||
] ++ lib.optional useHostResolvConf pkgs.openresolv);
|
] ++ lib.optional useHostResolvConf pkgs.openresolv);
|
||||||
fsPackagesPath = lib.makeBinPath config.system.fsPackages;
|
fsPackagesPath = lib.makeBinPath config.system.fsPackages;
|
||||||
|
systemdUnitPathEnvVar = lib.optionalString (config.boot.extraSystemdUnitPaths != [])
|
||||||
|
("SYSTEMD_UNIT_PATH="
|
||||||
|
+ builtins.concatStringsSep ":" config.boot.extraSystemdUnitPaths
|
||||||
|
+ ":"); # If SYSTEMD_UNIT_PATH ends with an empty component (":"), the usual unit load path will be appended to the contents of the variable
|
||||||
postBootCommands = pkgs.writeText "local-cmds"
|
postBootCommands = pkgs.writeText "local-cmds"
|
||||||
''
|
''
|
||||||
${config.boot.postBootCommands}
|
${config.boot.postBootCommands}
|
||||||
|
@ -82,6 +86,15 @@ in
|
||||||
PATH.
|
PATH.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extraSystemdUnitPaths = mkOption {
|
||||||
|
default = [];
|
||||||
|
type = types.listOf types.str;
|
||||||
|
description = ''
|
||||||
|
Additional paths that get appended to the SYSTEMD_UNIT_PATH environment variable
|
||||||
|
that can contain mutable unit files.
|
||||||
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -393,6 +393,7 @@ in
|
||||||
systemd-networkd-vrf = handleTest ./systemd-networkd-vrf.nix {};
|
systemd-networkd-vrf = handleTest ./systemd-networkd-vrf.nix {};
|
||||||
systemd-nspawn = handleTest ./systemd-nspawn.nix {};
|
systemd-nspawn = handleTest ./systemd-nspawn.nix {};
|
||||||
systemd-timesyncd = handleTest ./systemd-timesyncd.nix {};
|
systemd-timesyncd = handleTest ./systemd-timesyncd.nix {};
|
||||||
|
systemd-unit-path = handleTest ./systemd-unit-path.nix {};
|
||||||
taskserver = handleTest ./taskserver.nix {};
|
taskserver = handleTest ./taskserver.nix {};
|
||||||
telegraf = handleTest ./telegraf.nix {};
|
telegraf = handleTest ./telegraf.nix {};
|
||||||
tiddlywiki = handleTest ./tiddlywiki.nix {};
|
tiddlywiki = handleTest ./tiddlywiki.nix {};
|
||||||
|
|
47
nixos/tests/systemd-unit-path.nix
Normal file
47
nixos/tests/systemd-unit-path.nix
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
import ./make-test-python.nix ({ pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
exampleScript = pkgs.writeTextFile {
|
||||||
|
name = "example.sh";
|
||||||
|
text = ''
|
||||||
|
#! ${pkgs.runtimeShell} -e
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
echo "Example script running" >&2
|
||||||
|
${pkgs.coreutils}/bin/sleep 1
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
executable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
unitFile = pkgs.writeTextFile {
|
||||||
|
name = "example.service";
|
||||||
|
text = ''
|
||||||
|
[Unit]
|
||||||
|
Description=Example systemd service unit file
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=${exampleScript}
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
name = "systemd-unit-path";
|
||||||
|
|
||||||
|
machine = { pkgs, lib, ... }: {
|
||||||
|
boot.extraSystemdUnitPaths = [ "/etc/systemd-rw/system" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
testScript = ''
|
||||||
|
machine.wait_for_unit("multi-user.target")
|
||||||
|
machine.succeed("mkdir -p /etc/systemd-rw/system")
|
||||||
|
machine.succeed(
|
||||||
|
"cp ${unitFile} /etc/systemd-rw/system/example.service"
|
||||||
|
)
|
||||||
|
machine.succeed("systemctl start example.service")
|
||||||
|
machine.succeed("systemctl status example.service | grep 'Active: active'")
|
||||||
|
'';
|
||||||
|
})
|
Loading…
Reference in a new issue