summaryrefslogtreecommitdiffstats
path: root/nixos
diff options
context:
space:
mode:
authorFlorian Klink <flokli@flokli.de>2022-03-21 13:03:55 +0100
committerGitHub <noreply@github.com>2022-03-21 13:03:55 +0100
commit9427a17ccb332822dc7d0a693d7b859ba5a9f0ab (patch)
tree21b9d571a5bbe8a925b49a69a885acace57837eb /nixos
parentb043c9d5f6eb35c345b84271f8bb08baea9f1e98 (diff)
parent397b8257a0f926c518a01dd20d2911945a649743 (diff)
Merge pull request #164016 from bobvanderlinden/pr-refactor-systemd-module
nixos: systemd: split module up into multiple files
Diffstat (limited to 'nixos')
-rw-r--r--nixos/modules/module-list.nix7
-rw-r--r--nixos/modules/system/boot/systemd.nix448
-rw-r--r--nixos/modules/system/boot/systemd/coredump.nix57
-rw-r--r--nixos/modules/system/boot/systemd/journald.nix131
-rw-r--r--nixos/modules/system/boot/systemd/logind.nix114
-rw-r--r--nixos/modules/system/boot/systemd/nspawn.nix (renamed from nixos/modules/system/boot/systemd-nspawn.nix)0
-rw-r--r--nixos/modules/system/boot/systemd/tmpfiles.nix104
-rw-r--r--nixos/modules/system/boot/systemd/user.nix158
8 files changed, 572 insertions, 447 deletions
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index 68f9c6c1227e..c36c77874444 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -1168,7 +1168,12 @@
./system/boot/stage-1.nix
./system/boot/stage-2.nix
./system/boot/systemd.nix
- ./system/boot/systemd-nspawn.nix
+ ./system/boot/systemd/coredump.nix
+ ./system/boot/systemd/journald.nix
+ ./system/boot/systemd/logind.nix
+ ./system/boot/systemd/nspawn.nix
+ ./system/boot/systemd/tmpfiles.nix
+ ./system/boot/systemd/user.nix
./system/boot/timesyncd.nix
./system/boot/tmp.nix
./system/etc/etc-activation.nix
diff --git a/nixos/modules/system/boot/systemd.nix b/nixos/modules/system/boot/systemd.nix
index ff002d87a120..057474c607ac 100644
--- a/nixos/modules/system/boot/systemd.nix
+++ b/nixos/modules/system/boot/systemd.nix
@@ -2,7 +2,6 @@
with utils;
with systemdUtils.unitOptions;
-with systemdUtils.lib;
with lib;
let
@@ -12,6 +11,8 @@ let
systemd = cfg.package;
inherit (systemdUtils.lib)
+ makeUnit
+ generateUnits
makeJobScript
unitConfig
serviceConfig
@@ -79,32 +80,6 @@ let
"printer.target"
"smartcard.target"
- # Login stuff.
- "systemd-logind.service"
- "autovt@.service"
- "systemd-user-sessions.service"
- "dbus-org.freedesktop.import1.service"
- "dbus-org.freedesktop.machine1.service"
- "dbus-org.freedesktop.login1.service"
- "user@.service"
- "user-runtime-dir@.service"
-
- # Journal.
- "systemd-journald.socket"
- "systemd-journald@.socket"
- "systemd-journald-varlink@.socket"
- "systemd-journald.service"
- "systemd-journald@.service"
- "systemd-journal-flush.service"
- "systemd-journal-catalog-update.service"
- ] ++ (optional (!config.boot.isContainer) "systemd-journald-audit.socket") ++ [
- "systemd-journald-dev-log.socket"
- "syslog.socket"
-
- # Coredumps.
- "systemd-coredump.socket"
- "systemd-coredump@.service"
-
# Kernel module loading.
"systemd-modules-load.service"
"kmod-static-nodes.service"
@@ -165,19 +140,12 @@ let
# Slices / containers.
"slices.target"
- "user.slice"
"machine.slice"
"machines.target"
"systemd-importd.service"
"systemd-machined.service"
"systemd-nspawn@.service"
- # Temporary file creation / cleanup.
- "systemd-tmpfiles-clean.service"
- "systemd-tmpfiles-clean.timer"
- "systemd-tmpfiles-setup.service"
- "systemd-tmpfiles-setup-dev.service"
-
# Misc.
"systemd-sysctl.service"
"dbus-org.freedesktop.timedate1.service"
@@ -188,9 +156,6 @@ let
"systemd-hostnamed.service"
"systemd-exit.service"
"systemd-update-done.service"
- ] ++ optionals config.services.journald.enableHttpGateway [
- "systemd-journal-gatewayd.socket"
- "systemd-journal-gatewayd.service"
] ++ cfg.additionalUpstreamSystemUnits;
upstreamSystemWants =
@@ -201,36 +166,6 @@ let
"timers.target.wants"
];
- upstreamUserUnits = [
- "app.slice"
- "background.slice"
- "basic.target"
- "bluetooth.target"
- "default.target"
- "exit.target"
- "graphical-session-pre.target"
- "graphical-session.target"
- "paths.target"
- "printer.target"
- "session.slice"
- "shutdown.target"
- "smartcard.target"
- "sockets.target"
- "sound.target"
- "systemd-exit.service"
- "systemd-tmpfiles-clean.service"
- "systemd-tmpfiles-clean.timer"
- "systemd-tmpfiles-setup.service"
- "timers.target"
- "xdg-desktop-autostart.target"
- ];
-
-
- logindHandlerType = types.enum [
- "ignore" "poweroff" "reboot" "halt" "kexec" "suspend"
- "hibernate" "hybrid-sleep" "suspend-then-hibernate" "lock"
- ];
-
proxy_env = config.networking.proxy.envVars;
in
@@ -383,26 +318,6 @@ in
'';
};
- systemd.coredump.enable = mkOption {
- default = true;
- type = types.bool;
- description = ''
- Whether core dumps should be processed by
- <command>systemd-coredump</command>. If disabled, core dumps
- appear in the current directory of the crashing process.
- '';
- };
-
- systemd.coredump.extraConfig = mkOption {
- default = "";
- type = types.lines;
- example = "Storage=journal";
- description = ''
- Extra config options for systemd-coredump. See coredump.conf(5) man page
- for available options.
- '';
- };
-
systemd.extraConfig = mkOption {
default = "";
type = types.lines;
@@ -413,142 +328,6 @@ in
'';
};
- services.journald.console = mkOption {
- default = "";
- type = types.str;
- description = "If non-empty, write log messages to the specified TTY device.";
- };
-
- services.journald.rateLimitInterval = mkOption {
- default = "30s";
- type = types.str;
- description = ''
- Configures the rate limiting interval that is applied to all
- messages generated on the system. This rate limiting is applied
- per-service, so that two services which log do not interfere with
- each other's limit. The value may be specified in the following
- units: s, min, h, ms, us. To turn off any kind of rate limiting,
- set either value to 0.
-
- See <option>services.journald.rateLimitBurst</option> for important
- considerations when setting this value.
- '';
- };
-
- services.journald.rateLimitBurst = mkOption {
- default = 10000;
- type = types.int;
- description = ''
- Configures the rate limiting burst limit (number of messages per
- interval) that is applied to all messages generated on the system.
- This rate limiting is applied per-service, so that two services
- which log do not interfere with each other's limit.
-
- Note that the effective rate limit is multiplied by a factor derived
- from the available free disk space for the journal as described on
- <link xlink:href="https://www.freedesktop.org/software/systemd/man/journald.conf.html">
- journald.conf(5)</link>.
-
- Note that the total amount of logs stored is limited by journald settings
- such as <literal>SystemMaxUse</literal>, which defaults to a 4 GB cap.
-
- It is thus recommended to compute what period of time that you will be
- able to store logs for when an application logs at full burst rate.
- With default settings for log lines that are 100 Bytes long, this can
- amount to just a few hours.
- '';
- };
-
- services.journald.extraConfig = mkOption {
- default = "";
- type = types.lines;
- example = "Storage=volatile";
- description = ''
- Extra config options for systemd-journald. See man journald.conf
- for available options.
- '';
- };
-
- services.journald.enableHttpGateway = mkOption {
- default = false;
- type = types.bool;
- description = ''
- Whether to enable the HTTP gateway to the journal.
- '';
- };
-
- services.journald.forwardToSyslog = mkOption {
- default = config.services.rsyslogd.enable || config.services.syslog-ng.enable;
- defaultText = literalExpression "services.rsyslogd.enable || services.syslog-ng.enable";
- type = types.bool;
- description = ''
- Whether to forward log messages to syslog.
- '';
- };
-
- services.logind.extraConfig = mkOption {
- default = "";
- type = types.lines;
- example = "IdleAction=lock";
- description = ''
- Extra config options for systemd-logind. See
- <link xlink:href="https://www.freedesktop.org/software/systemd/man/logind.conf.html">
- logind.conf(5)</link> for available options.
- '';
- };
-
- services.logind.killUserProcesses = mkOption {
- default = false;
- type = types.bool;
- description = ''
- Specifies whether the processes of a user should be killed
- when the user logs out. If true, the scope unit corresponding
- to the session and all processes inside that scope will be
- terminated. If false, the scope is "abandoned" (see
- <link xlink:href="https://www.freedesktop.org/software/systemd/man/systemd.scope.html#">
- systemd.scope(5)</link>), and processes are not killed.
- </para>
-
- <para>
- See <link xlink:href="https://www.freedesktop.org/software/systemd/man/logind.conf.html#KillUserProcesses=">logind.conf(5)</link>
- for more details.
- '';
- };
-
- services.logind.lidSwitch = mkOption {
- default = "suspend";
- example = "ignore";
- type = logindHandlerType;
-
- description = ''
- Specifies what to be done when the laptop lid is closed.
- '';
- };
-
- services.logind.lidSwitchDocked = mkOption {
- default = "ignore";
- example = "suspend";
- type = logindHandlerType;
-
- description = ''
- Specifies what to be done when the laptop lid is closed
- and another screen is added.
- '';
- };
-
- services.logind.lidSwitchExternalPower = mkOption {
- default = config.services.logind.lidSwitch;
- defaultText = literalExpression "services.logind.lidSwitch";
- example = "ignore";
- type = logindHandlerType;
-
- description = ''
- Specifies what to do when the laptop lid is closed and the system is
- on external power. By default use the same action as specified in
- services.logind.lidSwitch.
- '';
- };
-
systemd.sleep.extraConfig = mkOption {
default = "";
type = types.lines;
@@ -559,95 +338,6 @@ in
'';
};
- systemd.user.extraConfig = mkOption {
- default = "";
- type = types.lines;
- example = "DefaultCPUAccounting=yes";
- description = ''
- Extra config options for systemd user instances. See man systemd-user.conf for
- available options.
- '';
- };
-
- systemd.tmpfiles.rules = mkOption {
- type = types.listOf types.str;
- default = [];
- example = [ "d /tmp 1777 root root 10d" ];
- description = ''
- Rules for creation, deletion and cleaning of volatile and temporary files
- automatically. See
- <citerefentry><refentrytitle>tmpfiles.d</refentrytitle><manvolnum>5</manvolnum></citerefentry>
- for the exact format.
- '';
- };
-
- systemd.tmpfiles.packages = mkOption {
- type = types.listOf types.package;
- default = [];
- example = literalExpression "[ pkgs.lvm2 ]";
- apply = map getLib;
- description = ''
- List of packages containing <command>systemd-tmpfiles</command> rules.
-
- All files ending in .conf found in
- <filename><replaceable>pkg</replaceable>/lib/tmpfiles.d</filename>
- will be included.
- If this folder does not exist or does not contain any files an error will be returned instead.
-
- If a <filename>lib</filename> output is available, rules are searched there and only there.
- If there is no <filename>lib</filename> output it will fall back to <filename>out</filename>
- and if that does not exist either, the default output will be used.
- '';
- };
-
- systemd.user.units = mkOption {
- description = "Definition of systemd per-user units.";
- default = {};
- type = with types; attrsOf (submodule (
- { name, config, ... }:
- { options = concreteUnitOptions;
- config = {
- unit = mkDefault (makeUnit name config);
- };
- }));
- };
-
- systemd.user.paths = mkOption {
- default = {};
- type = with types; attrsOf (submodule [ { options = pathOptions; } unitConfig ]);
- description = "Definition of systemd per-user path units.";
- };
-
- systemd.user.services = mkOption {
- default = {};
- type = with types; attrsOf (submodule [ { options = serviceOptions; } unitConfig serviceConfig ] );
- description = "Definition of systemd per-user service units.";
- };
-
- systemd.user.slices = mkOption {
- default = {};
- type = with types; attrsOf (submodule [ { options = sliceOptions; } unitConfig ] );
- description = "Definition of systemd per-user slice units.";
- };
-
- systemd.user.sockets = mkOption {
- default = {};
- type = with types; attrsOf (submodule [ { options = socketOptions; } unitConfig ] );
- description = "Definition of systemd per-user socket units.";
- };
-
- systemd.user.targets = mkOption {
- default = {};
- type = with types; attrsOf (submodule [ { options = targetOptions; } unitConfig] );
- description = "Definition of systemd per-user target units.";
- };
-
- systemd.user.timers = mkOption {
- default = {};
- type = with types; attrsOf (submodule [ { options = timerOptions; } unitConfig ] );
- description = "Definition of systemd per-user timer units.";
- };
-
systemd.additionalUpstreamSystemUnits = mkOption {
default = [ ];
type = types.listOf types.str;
@@ -783,8 +473,6 @@ in
in ({
"systemd/system".source = generateUnits "system" enabledUnits enabledUpstreamSystemUnits upstreamSystemWants;
- "systemd/user".source = generateUnits "user" cfg.user.units upstreamUserUnits [];
-
"systemd/system.conf".text = ''
[Manager]
${optionalString config.systemd.enableCgroupAccounting ''
@@ -810,76 +498,17 @@ in
${config.systemd.extraConfig}
'';
- "systemd/user.conf".text = ''
- [Manager]
- ${config.systemd.user.extraConfig}
- '';
-
- "systemd/journald.conf".text = ''
- [Journal]
- Storage=persistent
- RateLimitInterval=${config.services.journald.rateLimitInterval}
- RateLimitBurst=${toString config.services.journald.rateLimitBurst}
- ${optionalString (config.services.journald.console != "") ''
- ForwardToConsole=yes
- TTYPath=${config.services.journald.console}
- ''}
- ${optionalString (config.services.journald.forwardToSyslog) ''
- ForwardToSyslog=yes
- ''}
- ${config.services.journald.extraConfig}
- '';
-
- "systemd/coredump.conf".text =
- ''
- [Coredump]
- ${config.systemd.coredump.extraConfig}
- '';
-
- "systemd/logind.conf".text = ''
- [Login]
- KillUserProcesses=${if config.services.logind.killUserProcesses then "yes" else "no"}
- HandleLidSwitch=${config.services.logind.lidSwitch}
- HandleLidSwitchDocked=${config.services.logind.lidSwitchDocked}
- HandleLidSwitchExternalPower=${config.services.logind.lidSwitchExternalPower}
- ${config.services.logind.extraConfig}
- '';
-
"systemd/sleep.conf".text = ''
[Sleep]
${config.systemd.sleep.extraConfig}
'';
- # install provided sysctl snippets
- "sysctl.d/50-coredump.conf".source = "${systemd}/example/sysctl.d/50-coredump.conf";
- "sysctl.d/50-default.conf".source = "${systemd}/example/sysctl.d/50-default.conf";
-
- "tmpfiles.d".source = (pkgs.symlinkJoin {
- name = "tmpfiles.d";
- paths = map (p: p + "/lib/tmpfiles.d") cfg.tmpfiles.packages;
- postBuild = ''
- for i in $(cat $pathsPath); do
- (test -d "$i" && test $(ls "$i"/*.conf | wc -l) -ge 1) || (
- echo "ERROR: The path '$i' from systemd.tmpfiles.packages contains no *.conf files."
- exit 1
- )
- done
- '' + concatMapStrings (name: optionalString (hasPrefix "tmpfiles.d/" name) ''
- rm -f $out/${removePrefix "tmpfiles.d/" name}
- '') config.system.build.etc.passthru.targets;
- }) + "/*";
-
"systemd/system-generators" = { source = hooks "generators" cfg.generators; };
"systemd/system-shutdown" = { source = hooks "shutdown" cfg.shutdown; };
});
services.dbus.enable = true;
- users.users.systemd-coredump = {
- uid = config.ids.uids.systemd-coredump;
- group = "systemd-coredump";
- };
- users.groups.systemd-coredump = {};
users.users.systemd-network = {
uid = config.ids.uids.systemd-network;
group = "systemd-network";
@@ -899,36 +528,6 @@ in
unitConfig.X-StopOnReconfiguration = true;
};
- systemd.tmpfiles.packages = [
- # Default tmpfiles rules provided by systemd
- (pkgs.runCommand "systemd-default-tmpfiles" {} ''
- mkdir -p $out/lib/tmpfiles.d
- cd $out/lib/tmpfiles.d
-
- ln -s "${systemd}/example/tmpfiles.d/home.conf"
- ln -s "${systemd}/example/tmpfiles.d/journal-nocow.conf"
- ln -s "${systemd}/example/tmpfiles.d/static-nodes-permissions.conf"
- ln -s "${systemd}/example/tmpfiles.d/systemd.conf"
- ln -s "${systemd}/example/tmpfiles.d/systemd-nologin.conf"
- ln -s "${systemd}/example/tmpfiles.d/systemd-nspawn.conf"
- ln -s "${systemd}/example/tmpfiles.d/systemd-tmp.conf"
- ln -s "${systemd}/example/tmpfiles.d/tmp.conf"
- ln -s "${systemd}/example/tmpfiles.d/var.conf"
- ln -s "${systemd}/example/tmpfiles.d/x11.conf"
- '')
- # User-specified tmpfiles rules
- (pkgs.writeTextFile {
- name = "nixos-tmpfiles.d";
- destination = "/lib/tmpfiles.d/00-nixos.conf";
- text = ''
- # This file is created automatically and should not be modified.
- # Please change the option ‘systemd.tmpfiles.rules’ instead.
-
- ${concatStringsSep "\n" cfg.tmpfiles.rules}
- '';
- })
- ];
-
systemd.units =
mapAttrs' (n: v: nameValuePair "${n}.path" (pathToUnit n v)) cfg.paths
// mapAttrs' (n: v: nameValuePair "${n}.service" (serviceToUnit n v)) cfg.services
@@ -943,14 +542,6 @@ in
(v: let n = escapeSystemdPath v.where;
in nameValuePair "${n}.automount" (automountToUnit n v)) cfg.automounts);
- systemd.user.units =
- mapAttrs' (n: v: nameValuePair "${n}.path" (pathToUnit n v)) cfg.user.paths
- // mapAttrs' (n: v: nameValuePair "${n}.service" (serviceToUnit n v)) cfg.user.services
- // mapAttrs' (n: v: nameValuePair "${n}.slice" (sliceToUnit n v)) cfg.user.slices
- // mapAttrs' (n: v: nameValuePair "${n}.socket" (socketToUnit n v)) cfg.user.sockets
- // mapAttrs' (n: v: nameValuePair "${n}.target" (targetToUnit n v)) cfg.user.targets
- // mapAttrs' (n: v: nameValuePair "${n}.timer" (timerToUnit n v)) cfg.user.timers;
-
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"
@@ -958,11 +549,6 @@ in
"TMPFS_XATTR" "SECCOMP"
];
- users.groups.systemd-journal.gid = config.ids.gids.systemd-journal;
- users.users.systemd-journal-gateway.uid = config.ids.uids.systemd-journal-gateway;
- users.users.systemd-journal-gateway.group = "systemd-journal-gateway";
- users.groups.systemd-journal-gateway.gid = config.ids.gids.systemd-journal-gateway;
-
# Generate timer units for all services that have a ‘startAt’ value.
systemd.timers =
mapAttrs (name: service:
@@ -979,42 +565,14 @@ in
})
(filterAttrs (name: service: service.startAt != []) cfg.user.services);
- systemd.sockets.systemd-journal-gatewayd.wantedBy =
- optional config.services.journald.enableHttpGateway "sockets.target";
-
- # Provide the systemd-user PAM service, required to run systemd
- # user instances.
- security.pam.services.systemd-user =
- { # Ensure that pam_systemd gets included. This is special-cased
- # in systemd to provide XDG_RUNTIME_DIR.
- startSession = true;
- };
-
# Some overrides to upstream units.
systemd.services."systemd-backlight@".restartIfChanged = false;
systemd.services."systemd-fsck@".restartIfChanged = false;
systemd.services."systemd-fsck@".path = [ config.system.path ];
- systemd.services."user@".restartIfChanged = false;
- systemd.services.systemd-journal-flush.restartIfChanged = false;
systemd.services.systemd-random-seed.restartIfChanged = false;
systemd.services.systemd-remount-fs.restartIfChanged = false;
systemd.services.systemd-update-utmp.restartIfChanged = false;
- systemd.services.systemd-user-sessions.restartIfChanged = false; # Restart kills all active sessions.
systemd.services.systemd-udev-settle.restartIfChanged = false; # Causes long delays in nixos-rebuild
- # Restarting systemd-logind breaks X11
- # - upstream commit: https://cgit.freedesktop.org/xorg/xserver/commit/?id=dc48bd653c7e101
- # - systemd announcement: https://github.com/systemd/systemd/blob/22043e4317ecd2bc7834b48a6d364de76bb26d91/NEWS#L103-L112
- # - this might be addressed in the future by xorg
- #systemd.services.systemd-logind.restartTriggers = [ config.environment.etc."systemd/logind.conf".source ];
- systemd.services.systemd-logind.restartIfChanged = false;
- systemd.services.systemd-logind.stopIfChanged = false;
- # The user-runtime-dir@ service is managed by systemd-logind we should not touch it or else we break the users' sessions.
- systemd.services."user-runtime-dir@".stopIfChanged = false;
- systemd.services."user-runtime-dir@".restartIfChanged = false;
- systemd.services.systemd-journald.restartTriggers = [ config.environment.etc."systemd/journald.conf".source ];
- systemd.services.systemd-journald.stopIfChanged = false;
- systemd.services."systemd-journald@".restartTriggers = [ config.environment.etc."systemd/journald.conf".source ];
- systemd.services."systemd-journald@".stopIfChanged = false;
systemd.targets.local-fs.unitConfig.X-StopOnReconfiguration = true;
systemd.targets.remote-fs.unitConfig.X-StopOnReconfiguration = true;
systemd.targets.network-online.wantedBy = [ "multi-user.target" ];
@@ -1025,8 +583,6 @@ in
systemd.services.systemd-remount-fs.unitConfig.ConditionVirtualization = "!container";
systemd.services.systemd-random-seed.unitConfig.ConditionVirtualization = "!container";
- boot.kernel.sysctl."kernel.core_pattern" = mkIf (!cfg.coredump.enable) "core";
-
# Increase numeric PID range (set directly instead of copying a one-line file from systemd)
# https://github.com/systemd/systemd/pull/12226
boot.kernel.sysctl."kernel.pid_max" = mkIf pkgs.stdenv.is64bit (lib.mkDefault 4194304);
diff --git a/nixos/modules/system/boot/systemd/coredump.nix b/nixos/modules/system/boot/systemd/coredump.nix
new file mode 100644
index 000000000000..b6ee2cff1f9a
--- /dev/null
+++ b/nixos/modules/system/boot/systemd/coredump.nix
@@ -0,0 +1,57 @@
+{ config, lib, pkgs, utils, ... }:
+
+with lib;
+
+let
+ cfg = config.systemd.coredump;
+ systemd = config.systemd.package;
+in {
+ options = {
+ systemd.coredump.enable = mkOption {
+ default = true;
+ type = types.bool;
+ description = ''
+ Whether core dumps should be processed by
+ <command>systemd-coredump</command>. If disabled, core dumps
+ appear in the current directory of the crashing process.
+ '';
+ };
+
+ systemd.coredump.extraConfig = mkOption {
+ default = "";
+ type = types.lines;
+ example = "Storage=journal";
+ description = ''
+ Extra config options for systemd-coredump. See coredump.conf(5) man page
+ for available options.
+ '';
+ };
+ };
+
+ config = {
+ systemd.additionalUpstreamSystemUnits = [
+ "systemd-coredump.socket"
+ "systemd-coredump@.service"
+ ];
+
+ environment.etc = {
+ "systemd/coredump.conf".text =
+ ''
+ [Coredump]
+ ${cfg.extraConfig}
+ '';
+
+ # install provided sysctl snippets
+ "sysctl.d/50-coredump.conf".source = "${systemd}/example/sysctl.d/50-coredump.conf";
+ "sysctl.d/50-default.conf".source = "${systemd}/example/sysctl.d/50-default.conf";
+ };
+
+ users.users.systemd-coredump = {
+ uid = config.ids.uids.systemd-coredump;
+ group = "systemd-coredump";
+ };
+ users.groups.systemd-coredump = {};
+
+ boot.kernel.sysctl."kernel.core_pattern" = mkIf (!cfg.enable) "core";
+ };
+}
diff --git a/nixos/modules/system/boot/systemd/journald.nix b/nixos/modules/system/boot/systemd/journald.nix
new file mode 100644
index 000000000000..7e14c8ae4077
--- /dev/null
+++ b/nixos/modules/system/boot/systemd/journald.nix
@@ -0,0 +1,131 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.journald;
+in {
+ options = {
+ services.journald.console = mkOption {
+ default = "";
+ type = types.str;
+ description = "If non-empty, write log messages to the specified TTY device.";
+ };
+
+ services.journald.rateLimitInterval = mkOption {
+ default = "30s";
+ type = types.str;
+ description = ''
+ Configures the rate limiting interval that is applied to all
+ messages generated on the system. This rate limiting is applied
+ per-service, so that two services which log do not interfere with
+ each other's limit. The value may be specified in the following
+ units: s, min, h, ms, us. To turn off any kind of rate limiting,
+ set either value to 0.
+
+ See <option>services.journald.rateLimitBurst</option> for important
+ considerations when setting this value.
+ '';
+ };
+
+ services.journald.rateLimitBurst = mkOption {
+ default = 10000;
+ type = types.int;
+ description = ''
+ Configures the rate limiting burst limit (number of messages per
+ interval) that is applied to all messages generated on the system.
+ This rate limiting is applied per-service, so that two services
+ which log do not interfere with each other's limit.
+
+ Note that the effective rate limit is multiplied by a factor derived
+ from the available free disk space for the journal as described on
+ <link xlink:href="https://www.freedesktop.org/software/systemd/man/journald.conf.html">
+ journald.conf(5)</link>.
+
+ Note that the total amount of logs stored is limited by journald settings
+ such as <literal>SystemMaxUse</literal>, which defaults to a 4 GB cap.
+
+ It is thus recommended to compute what period of time that you will be
+ able to store logs for when an application logs at full burst rate.
+ With default settings for log lines that are 100 Bytes long, this can
+ amount to just a few hours.
+ '';
+ };
+
+ services.journald.extraConfig = mkOption {
+ default = "";
+ type = types.lines;
+ example = "Storage=volatile";
+ description = ''
+ Extra config options for systemd-journald. See man journald.conf
+ for available options.
+ '';
+ };
+
+ services.journald.enableHttpGateway = mkOption {
+ default = false;
+ type = types.bool;
+ description = ''
+ Whether to enable the HTTP gateway to the journal.
+ '';
+ };
+
+ services.journald.forwardToSyslog = mkOption {
+ default = config.services.rsyslogd.enable || config.services.syslog-ng.enable;
+ defaultText = literalExpression "services.rsyslogd.enable || services.syslog-ng.enable";
+ type = types.bool;
+ description = ''
+ Whether to forward log messages to syslog.
+ '';
+ };
+ };
+
+ config = {
+ systemd.additionalUpstreamSystemUnits = [
+ "systemd-journald.socket"
+ "systemd-journald@.socket"
+ "systemd-journald-varlink@.socket"
+ "systemd-journald.service"
+ "systemd-journald@.service"
+ "systemd-journal-flush.service"
+ "systemd-journal-catalog-update.service"
+ ] ++ (optional (!config.boot.isContainer) "systemd-journald-audit.socket") ++ [
+ "systemd-journald-dev-log.socket"
+ "syslog.socket"
+ ] ++ optionals cfg.enableHttpGateway [
+ "systemd-journal-gatewayd.socket"
+ "systemd-journal-gatewayd.service"
+ ];
+
+ environment.etc = {
+ "systemd/journald.conf".text = ''
+ [Journal]
+ Storage=persistent
+ RateLimitInterval=${cfg.rateLimitInterval}
+ RateLimitBurst=${toString cfg.rateLimitBurst}
+ ${optionalString (cfg.console != "") ''
+ ForwardToConsole=yes
+ TTYPath=${cfg.console}
+ ''}
+ ${optionalString (cfg.forwardToSyslog) ''
+ ForwardToSyslog=yes
+ ''}
+ ${cfg.extraConfig}
+ '';
+ };
+
+ users.groups.systemd-journal.gid = config.ids.gids.systemd-journal;
+ users.users.systemd-journal-gateway.uid = config.ids.uids.systemd-journal-gateway;
+ users.users.systemd-journal-gateway.group = "systemd-journal-gateway";
+ users.groups.systemd-journal-gateway.gid = config.ids.gids.systemd-journal-gateway;
+
+ systemd.sockets.systemd-journal-gatewayd.wantedBy =
+ optional cfg.enableHttpGateway "sockets.target";
+
+ systemd.services.systemd-journal-flush.restartIfChanged = false;
+ systemd.services.systemd-journald.restartTriggers = [ config.environment.etc."systemd/journald.conf".source ];
+ systemd.services.systemd-journald.stopIfChanged = false;
+ systemd.services."systemd-journald@".restartTriggers = [ config.environment.etc."systemd/journald.conf".source ];
+ systemd.services."systemd-journald@".stopIfChanged = false;
+ };
+}
diff --git a/nixos/modules/system/boot/systemd/logind.nix b/nixos/modules/system/boot/systemd/logind.nix
new file mode 100644
index 000000000000..c1e6cfe61d04
--- /dev/null
+++ b/nixos/modules/system/boot/systemd/logind.nix
@@ -0,0 +1,114 @@
+{ config, lib, pkgs, utils, ... }:
+
+with lib;
+
+let
+ cfg = config.services.logind;
+
+ logindHandlerType = types.enum [
+ "ignore" "poweroff" "reboot" "halt" "kexec" "suspend"
+ "hibernate" "hybrid-sleep" "suspend-then-hibernate" "lock"
+ ];
+in
+{
+ options = {
+ services.logind.extraConfig = mkOption {
+ default = "";
+ type = types.lines;
+ example = "IdleAction=lock";
+ description = ''
+ Extra config options for systemd-logind. See
+ <link xlink:href="https://www.freedesktop.org/software/systemd/man/logind.conf.html">
+ logind.conf(5)</link> for available options.
+ '';
+ };
+
+ services.logind.killUserProcesses = mkOption {
+ default = false;
+ type = types.bool;
+ description = ''
+ Specifies whether the processes of a user should be killed
+ when the user logs out. If true, the scope unit corresponding
+ to the session and all processes inside that scope will be
+ terminated. If false, the scope is "abandoned" (see
+ <link xlink:href="https://www.freedesktop.org/software/systemd/man/systemd.scope.html#">
+ systemd.scope(5)</link>), and processes are not killed.
+ </para>
+
+ <para>
+ See <link xlink:href="https://www.freedesktop.org/software/systemd/man/logind.conf.html#KillUserProcesses=">logind.conf(5)</link>
+ for more details.
+ '';
+ };
+
+ services.logind.lidSwitch = mkOption {
+ default = "suspend";
+ example = "ignore";
+ type = logindHandlerType;
+
+ description = ''
+ Specifies what to be done when the laptop lid is closed.
+ '';
+ };
+
+ services.logind.lidSwitchDocked = mkOption {
+ default = "ignore";
+ example = "suspend";
+ type = logindHandlerType;
+
+ description = ''
+ Specifies what to be done when the laptop lid is closed
+ and another screen is added.
+ '';
+ };
+
+ services.logind.lidSwitchExternalPower = mkOption {
+ default = cfg.lidSwitch;
+ defaultText = literalExpression "services.logind.lidSwitch";
+ example = "ignore";
+ type = logindHandlerType;
+
+ description = ''
+ Specifies what to do when the laptop lid is closed and the system is
+ on external power. By default use the same action as specified in
+ services.logind.lidSwitch.
+ '';
+ };
+ };
+
+ config = {
+ systemd.additionalUpstreamSystemUnits = [
+ "systemd-logind.service"
+ "autovt@.service"
+