如何在 NixOS 中将文本附加到 /etc/... 配置文件?

Suz*_*ron 7 config pam nixos

[披露:我早些时候在 NixOS 频道上问过这个问题,但 30 分钟后没有得到答复,这是一个繁忙的频道。如果我在那里得到一个,我会在这里复制它]

我正在尝试向 NixOS 中的配置文件添加一些行(例如/etc/pam.d/sudo)。pam.nix 中可用的配置选项不包括我要添加的行(在本例中为account requisite pam_time.so),也不包括extraConfig选项。

我知道我可以使用它来创建新的配置文件,environement.etc.filename.text所以我继续使用它,但sudo nixos-rebuild switch后来抱怨它有两个配置文件的来源,官方的和我的 ( mismatched duplicate entry /nix/… <-> /nix/…):

environment.etc."pam.d/sudo".text = ''blah'';
Run Code Online (Sandbox Code Playgroud)

在 NixOS 中是否有附加到 /etc/ 配置文件(或修补它)的通用方法?

或者是修改系统 .nix 文件的唯一方法(例如修改pam.nix,我不愿意这样做,因为它会与未来的更新发生冲突)?

小智 5

security.pam.services.sudo.text您可以向using的默认值mkOverride或快捷方式添加行mkDefault,以使您的值具有与默认值相同的优先级。mkOrder您可以使用或快捷键mkBefore和来控制顺序mkAfter。因此,要附加,您可以执行以下操作:

security.pam.services.sudo.text = pkgs.lib.mkDefault( pkgs.lib.mkAfter "# hi" );
Run Code Online (Sandbox Code Playgroud)

当一个选项有多个值时,仅保留优先级最低的值。如果仍有多个值,则对它们进行排序并合并。mkOverride并创建module.nixmkOrder中的代码在执行此操作时可以识别的特殊值。普通值具有默认优先级 (100) 和排序顺序 (1000)。pam.nix使用它为选项创建的值,这使得优先级为 1000,因此普通值将替换它而不是被合并。mkDefaulttext

NixOS手册中有关模块化的部分解释了更多内容。

我认为您不能一般地执行此操作,environment.etc因为目标文件不必与属性名称匹配,特别是pam.nix不会在environment.etc. 它更像是按顺序处理的指令列表。请参阅etc.nixmake-etc.sh


Suz*_*ron -1

对于同一目录中的文件/etc/pam.d/sudo和其他文件,一个简单的解决方案是使用security.pam.services.sudo.text,但我当前的最佳尝试需要对文件的原始内容进行硬编码。

\n\n
security.pam.services.sudo.text = ''\nexisting contents of /etc/pam.d/sudo \xe2\x80\xa6\nextra lines \xe2\x80\xa6\n'';\n
Run Code Online (Sandbox Code Playgroud)\n\n

希望其他答案能够提出一种更通用的方法来更改配置文件(并保留其原始内容)。

\n