diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index 47a42fb6418..49d1105247a 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -1170,6 +1170,7 @@
./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
diff --git a/nixos/modules/system/boot/systemd.nix b/nixos/modules/system/boot/systemd.nix
index 694544969e2..057474c607a 100644
--- a/nixos/modules/system/boot/systemd.nix
+++ b/nixos/modules/system/boot/systemd.nix
@@ -146,12 +146,6 @@ let
"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"
@@ -344,37 +338,6 @@ in
'';
};
- 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
- tmpfiles.d5
- 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 systemd-tmpfiles rules.
-
- All files ending in .conf found in
- pkg/lib/tmpfiles.d
- will be included.
- If this folder does not exist or does not contain any files an error will be returned instead.
-
- If a lib output is available, rules are searched there and only there.
- If there is no lib output it will fall back to out
- and if that does not exist either, the default output will be used.
- '';
- };
-
systemd.additionalUpstreamSystemUnits = mkOption {
default = [ ];
type = types.listOf types.str;
@@ -540,21 +503,6 @@ in
${config.systemd.sleep.extraConfig}
'';
- "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; };
});
@@ -580,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
diff --git a/nixos/modules/system/boot/systemd/tmpfiles.nix b/nixos/modules/system/boot/systemd/tmpfiles.nix
new file mode 100644
index 00000000000..cb819bc0a15
--- /dev/null
+++ b/nixos/modules/system/boot/systemd/tmpfiles.nix
@@ -0,0 +1,102 @@
+{ config, lib, pkgs, utils, ... }:
+with lib;
+let
+ systemd = config.systemd.package;
+in
+{
+ 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
+ tmpfiles.d5
+ 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 systemd-tmpfiles rules.
+
+ All files ending in .conf found in
+ pkg/lib/tmpfiles.d
+ will be included.
+ If this folder does not exist or does not contain any files an error will be returned instead.
+
+ If a lib output is available, rules are searched there and only there.
+ If there is no lib output it will fall back to out
+ and if that does not exist either, the default output will be used.
+ '';
+ };
+ };
+
+ config = {
+ systemd.additionalUpstreamSystemUnits = [
+ # Temporary file creation / cleanup.
+ "systemd-tmpfiles-clean.service"
+ "systemd-tmpfiles-clean.timer"
+ "systemd-tmpfiles-setup.service"
+ "systemd-tmpfiles-setup-dev.service"
+ ];
+
+ systemd.additionalUpstreamUserUnits = [
+ "systemd-tmpfiles-clean.service"
+ "systemd-tmpfiles-clean.timer"
+ "systemd-tmpfiles-setup.service"
+ ];
+
+ environment.etc = {
+ "tmpfiles.d".source = (pkgs.symlinkJoin {
+ name = "tmpfiles.d";
+ paths = map (p: p + "/lib/tmpfiles.d") config.systemd.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.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" config.systemd.tmpfiles.rules}
+ '';
+ })
+ ];
+ };
+}
diff --git a/nixos/modules/system/boot/systemd/user.nix b/nixos/modules/system/boot/systemd/user.nix
index 295f236e247..6f63292bf9f 100644
--- a/nixos/modules/system/boot/systemd/user.nix
+++ b/nixos/modules/system/boot/systemd/user.nix
@@ -39,9 +39,6 @@ let
"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"
] ++ config.systemd.additionalUpstreamUserUnits;