systemd: allow custom unit folders to be configured with SYSTEMD_UNIT_PATH
This commit is contained in:
parent
f6092fe869
commit
5c8ed06fc9
@ -167,6 +167,7 @@ exec {logOutFd}>&- {logErrFd}>&-
|
||||
|
||||
# Start systemd.
|
||||
echo "starting systemd..."
|
||||
|
||||
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@
|
||||
|
@ -10,7 +10,7 @@ let
|
||||
src = ./stage-2-init.sh;
|
||||
shellDebug = "${pkgs.bashInteractive}/bin/bash";
|
||||
shell = "${pkgs.bash}/bin/bash";
|
||||
inherit (config.boot) systemdExecutable;
|
||||
inherit (config.boot) systemdExecutable extraSystemdUnitPaths;
|
||||
isExecutable = true;
|
||||
inherit (config.nix) readOnlyStore;
|
||||
inherit useHostResolvConf;
|
||||
@ -20,6 +20,10 @@ let
|
||||
pkgs.util-linux
|
||||
] ++ lib.optional useHostResolvConf pkgs.openresolv);
|
||||
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"
|
||||
''
|
||||
${config.boot.postBootCommands}
|
||||
@ -82,6 +86,15 @@ in
|
||||
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-nspawn = handleTest ./systemd-nspawn.nix {};
|
||||
systemd-timesyncd = handleTest ./systemd-timesyncd.nix {};
|
||||
systemd-unit-path = handleTest ./systemd-unit-path.nix {};
|
||||
taskserver = handleTest ./taskserver.nix {};
|
||||
telegraf = handleTest ./telegraf.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 New Issue
Block a user