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

时间:2017-08-08 18:11:12

标签: 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然后抱怨它有两个配置文件源,官方文件和我的({{1} }}):

mismatched duplicate entry /nix/… <-> /nix/…

在NixOS中是否有一般方法可以附加到/ etc /配置文件(或修补它)?

或者是修改系统.nix文件的唯一方法(例如修改environment.etc."pam.d/sudo".text = ''blah''; ,我不愿意这样做,因为它会与未来的更新发生冲突)?

2 个答案:

答案 0 :(得分:0)

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

security.pam.services.sudo.text = ''
existing contents of /etc/pam.d/sudo …
extra lines …
'';

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

答案 1 :(得分:0)

您可以使用security.pam.services.sudo.text或快捷方式mkOverride将行添加到默认值mkDefault,以使您的值具有与默认值相同的优先级。您可以使用mkOrder或快捷方式mkBeforemkAfter来控制订单。所以要追加,你可以这样做:

security.pam.services.sudo.text = pkgs.lib.mkDefault( pkgs.lib.mkAfter "# hi" );

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

NixOS manual section on Modularity解释了一点。

我认为您不能对environment.etc执行此操作,因为目标文件不必与属性名称匹配,并且pam.nix特别没有在etc.nix中命名任何条目{1}}。它更像是按顺序处理的指令列表。见make-etc.sh和  {{3}}