systemd: allow custom unit folders to be configured with SYSTEMD_UNIT_PATH

This commit is contained in:
Sander van der Burg 2021-03-15 19:34:09 +01:00 committed by Sander van der Burg
parent f6092fe869
commit 5c8ed06fc9
4 changed files with 64 additions and 2 deletions

View file

@ -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@

View file

@ -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.
'';
};
}; };
}; };

View file

@ -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 {};

View 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'")
'';
})