Merge pull request #262583 from ElvishJerricco/systemd-stage-1-shells

systemd-stage-1: Support for user shells

Changed files
+20 -8
nixos
modules
config
system
+14 -3
nixos/modules/config/users-groups.nix
···
defaultText = literalExpression "config.users.users.\${name}.group";
default = cfg.users.${name}.group;
};
+
options.shell = mkOption {
+
type = types.passwdEntry types.path;
+
description = ''
+
The path to the user's shell in initrd.
+
'';
+
default = "${pkgs.shadow}/bin/nologin";
+
defaultText = literalExpression "\${pkgs.shadow}/bin/nologin";
+
};
}));
};
···
boot.initrd.systemd = lib.mkIf config.boot.initrd.systemd.enable {
contents = {
"/etc/passwd".text = ''
-
${lib.concatStringsSep "\n" (lib.mapAttrsToList (n: { uid, group }: let
+
${lib.concatStringsSep "\n" (lib.mapAttrsToList (n: { uid, group, shell }: let
g = config.boot.initrd.systemd.groups.${group};
-
in "${n}:x:${toString uid}:${toString g.gid}::/var/empty:") config.boot.initrd.systemd.users)}
+
in "${n}:x:${toString uid}:${toString g.gid}::/var/empty:${shell}") config.boot.initrd.systemd.users)}
'';
"/etc/group".text = ''
${lib.concatStringsSep "\n" (lib.mapAttrsToList (n: { gid }: "${n}:x:${toString gid}:") config.boot.initrd.systemd.groups)}
'';
+
"/etc/shells".text = lib.concatStringsSep "\n" (lib.unique (lib.mapAttrsToList (_: u: u.shell) config.boot.initrd.systemd.users)) + "\n";
};
+
storePaths = [ "${pkgs.shadow}/bin/nologin" ];
+
users = {
-
root = {};
+
root = { shell = lib.mkDefault "/bin/bash"; };
nobody = {};
};
+6 -5
nixos/modules/system/boot/initrd-ssh.nix
···
for instructions.
'';
}
+
];
-
{
-
assertion = config.boot.initrd.systemd.enable -> cfg.shell == null;
-
message = "systemd stage 1 does not support boot.initrd.network.ssh.shell";
-
}
-
];
+
warnings = lib.optional (config.boot.initrd.systemd.enable -> cfg.shell != null) ''
+
Please set 'boot.initrd.systemd.users.root.shell' instead of 'boot.initrd.network.ssh.shell'
+
'';
boot.initrd.extraUtilsCommands = mkIf (!config.boot.initrd.systemd.enable) ''
copy_bin_and_libs ${package}/bin/sshd
···
boot.initrd.systemd = mkIf config.boot.initrd.systemd.enable {
users.sshd = { uid = 1; group = "sshd"; };
groups.sshd = { gid = 1; };
+
+
users.root.shell = mkIf (config.boot.initrd.network.ssh.shell != null) config.boot.initrd.network.ssh.shell;
contents."/etc/ssh/authorized_keys.d/root".text =
concatStringsSep "\n" config.boot.initrd.network.ssh.authorizedKeys;