diff options
author | Janne Heß <janne@hess.ooo> | 2022-03-23 15:56:23 +0100 |
---|---|---|
committer | Janne Heß <janne@hess.ooo> | 2022-03-30 20:24:27 +0200 |
commit | a3e0698bf6fd676d96b89bdb4cd54c73ea502746 (patch) | |
tree | 750875589062bfee5f9fcefa7b7a5e691ae3e347 /nixos/modules/system/boot/systemd.nix | |
parent | d56076aa39859f675bbdc64ea148664406db3278 (diff) | |
download | nixpkgs-a3e0698bf6fd676d96b89bdb4cd54c73ea502746.tar nixpkgs-a3e0698bf6fd676d96b89bdb4cd54c73ea502746.tar.gz nixpkgs-a3e0698bf6fd676d96b89bdb4cd54c73ea502746.tar.bz2 nixpkgs-a3e0698bf6fd676d96b89bdb4cd54c73ea502746.tar.lz nixpkgs-a3e0698bf6fd676d96b89bdb4cd54c73ea502746.tar.xz nixpkgs-a3e0698bf6fd676d96b89bdb4cd54c73ea502746.tar.zst nixpkgs-a3e0698bf6fd676d96b89bdb4cd54c73ea502746.zip |
nixos/systemd: Switch to ManagerEnvironment=
This accomplishes multiple things: - Allows us to start systemd without stage-2-init.sh. This was not possible before because the environment would have been wrong - `systemctl daemon-reexec` also changes the environment, giving us newer tools for the fs packages - Starts systemd in a fully clean environment, making everything more consistent and pure
Diffstat (limited to 'nixos/modules/system/boot/systemd.nix')
-rw-r--r-- | nixos/modules/system/boot/systemd.nix | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/nixos/modules/system/boot/systemd.nix b/nixos/modules/system/boot/systemd.nix index 057474c607a..297a80d4681 100644 --- a/nixos/modules/system/boot/systemd.nix +++ b/nixos/modules/system/boot/systemd.nix @@ -302,6 +302,16 @@ in ''; }; + systemd.managerEnvironment = mkOption { + type = with types; attrsOf (nullOr (oneOf [ str path package ])); + default = {}; + example = { SYSTEMD_LOG_LEVEL = "debug"; }; + description = '' + Environment variables of PID 1. These variables are + <emphasis>not</emphasis> passed to started units. + ''; + }; + systemd.enableCgroupAccounting = mkOption { default = true; type = types.bool; @@ -470,11 +480,13 @@ in enabledUpstreamSystemUnits = filter (n: ! elem n cfg.suppressedSystemUnits) upstreamSystemUnits; enabledUnits = filterAttrs (n: v: ! elem n cfg.suppressedSystemUnits) cfg.units; + in ({ "systemd/system".source = generateUnits "system" enabledUnits enabledUpstreamSystemUnits upstreamSystemWants; "systemd/system.conf".text = '' [Manager] + ManagerEnvironment=${lib.concatStringsSep " " (lib.mapAttrsToList (n: v: "${n}=${lib.escapeShellArg v}") cfg.managerEnvironment)} ${optionalString config.systemd.enableCgroupAccounting '' DefaultCPUAccounting=yes DefaultIOAccounting=yes @@ -542,6 +554,17 @@ in (v: let n = escapeSystemdPath v.where; in nameValuePair "${n}.automount" (automountToUnit n v)) cfg.automounts); + # Environment of PID 1 + systemd.managerEnvironment = { + # Doesn't contain systemd itself - everything works so it seems to use the compiled-in value for its tools + PATH = lib.makeBinPath config.system.fsPackages; + LOCALE_ARCHIVE = "/run/current-system/sw/lib/locale/locale-archive"; + TZDIR = "/etc/zoneinfo"; + # If SYSTEMD_UNIT_PATH ends with an empty component (":"), the usual unit load path will be appended to the contents of the variable + SYSTEMD_UNIT_PATH = lib.mkIf (config.boot.extraSystemdUnitPaths != []) "${builtins.concatStringsSep ":" config.boot.extraSystemdUnitPaths}:"; + }; + + system.requiredKernelConfig = map config.lib.kernelConfig.isEnabled [ "DEVTMPFS" "CGROUPS" "INOTIFY_USER" "SIGNALFD" "TIMERFD" "EPOLL" "NET" "SYSFS" "PROC_FS" "FHANDLE" "CRYPTO_USER_API_HASH" "CRYPTO_HMAC" |