diff --git a/nixos/doc/manual/release-notes/rl-1903.xml b/nixos/doc/manual/release-notes/rl-1903.xml
index 9c07184613e..4f3e632c377 100644
--- a/nixos/doc/manual/release-notes/rl-1903.xml
+++ b/nixos/doc/manual/release-notes/rl-1903.xml
@@ -152,6 +152,20 @@
has been renamed to postgresql_9_6.
+
+
+ Slurm introduces the new option
+ services.slurm.stateSaveLocation,
+ which is now set to /var/spool/slurm by default
+ (instead of /var/spool).
+ Make sure to move all files to the new directory or to set the option accordingly.
+
+
+ The slurmctld now runs as user slurm instead of root.
+ If you want to keep slurmctld running as root, set
+ services.slurm.user = root.
+
+
diff --git a/nixos/modules/misc/ids.nix b/nixos/modules/misc/ids.nix
index 5c30e512a1b..a32e4fe3f7c 100644
--- a/nixos/modules/misc/ids.nix
+++ b/nixos/modules/misc/ids.nix
@@ -331,6 +331,7 @@
zeronet = 304;
lirc = 305;
lidarr = 306;
+ slurm = 307;
# When adding a uid, make sure it doesn't match an existing gid. And don't use uids above 399!
@@ -622,6 +623,7 @@
zeronet = 304;
lirc = 305;
lidarr = 306;
+ slurm = 307;
# When adding a gid, make sure it doesn't match an existing
# uid. Users and groups with the same name should have equal
diff --git a/nixos/modules/services/computing/slurm/slurm.nix b/nixos/modules/services/computing/slurm/slurm.nix
index 09174ed39f5..9dbb6a4d0d9 100644
--- a/nixos/modules/services/computing/slurm/slurm.nix
+++ b/nixos/modules/services/computing/slurm/slurm.nix
@@ -6,9 +6,14 @@ let
cfg = config.services.slurm;
# configuration file can be generated by http://slurm.schedmd.com/configurator.html
+
+ defaultUser = "slurm";
+
configFile = pkgs.writeTextDir "slurm.conf"
''
ClusterName=${cfg.clusterName}
+ StateSaveLocation=${cfg.stateSaveLocation}
+ SlurmUser=${cfg.user}
${optionalString (cfg.controlMachine != null) ''controlMachine=${cfg.controlMachine}''}
${optionalString (cfg.controlAddr != null) ''controlAddr=${cfg.controlAddr}''}
${optionalString (cfg.nodeName != null) ''nodeName=${cfg.nodeName}''}
@@ -159,6 +164,25 @@ in
'';
};
+ stateSaveLocation = mkOption {
+ type = types.str;
+ default = "/var/spool/slurmctld";
+ description = ''
+ Directory into which the Slurm controller, slurmctld, saves its state.
+ '';
+ };
+
+ user = mkOption {
+ type = types.str;
+ default = defaultUser;
+ description = ''
+ Set this option when you want to run the slurmctld daemon
+ as something else than the default slurm user "slurm".
+ Note that the UID of this user needs to be the same
+ on all nodes.
+ '';
+ };
+
extraConfig = mkOption {
default = "";
type = types.lines;
@@ -226,6 +250,15 @@ in
services.munge.enable = mkDefault true;
+ # use a static uid as default to ensure it is the same on all nodes
+ users.users.slurm = mkIf (cfg.user == defaultUser) {
+ name = defaultUser;
+ group = "slurm";
+ uid = config.ids.uids.slurm;
+ };
+
+ users.groups.slurm.gid = config.ids.uids.slurm;
+
systemd.services.slurmd = mkIf (cfg.client.enable) {
path = with pkgs; [ wrappedSlurm coreutils ]
++ lib.optional cfg.enableSrunX11 slurm-spank-x11;
@@ -261,6 +294,11 @@ in
PIDFile = "/run/slurmctld.pid";
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
};
+
+ preStart = ''
+ mkdir -p ${cfg.stateSaveLocation}
+ chown -R ${cfg.user}:slurm ${cfg.stateSaveLocation}
+ '';
};
};