diff --git a/nixos/modules/security/pam.nix b/nixos/modules/security/pam.nix index 6cd174fabc2b..6012b47c16e2 100644 --- a/nixos/modules/security/pam.nix +++ b/nixos/modules/security/pam.nix @@ -1802,11 +1802,6 @@ let else config.users.motdFile; - makePAMService = name: service: { - name = "pam.d/${name}"; - value.source = pkgs.writeText "${name}.pam" service.text; - }; - optionalSudoConfigForSSHAgentAuth = lib.optionalString (config.security.pam.sshAgentAuth.enable || config.security.pam.rssh.enable) '' @@ -2594,7 +2589,26 @@ in }; }; - environment.etc = lib.mapAttrs' makePAMService enabledServices; + environment.etc = + let + # Write all pam config in a single derivation for performance + pamd = + pkgs.runCommand "pam.d" + { + __structuredAttrs = true; + services = lib.mapAttrs (_: svc: svc.text) enabledServices; + } + '' + mkdir $out + for i in "''${!services[@]}"; do + printf '%s' "''${services[$i]}" > "$out/$i" + done + ''; + in + lib.mapAttrs' (name: service: { + name = "pam.d/${name}"; + value.source = "${pamd}/${name}"; + }) enabledServices; systemd = lib.mkIf (lib.any (service: service.lastlog.enable) (lib.attrValues config.security.pam.services))