[披露:我之前在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'';
,我不愿意这样做,因为它会与未来的更新发生冲突)?
答案 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
或快捷方式mkBefore
和mkAfter
来控制订单。所以要追加,你可以这样做:
security.pam.services.sudo.text = pkgs.lib.mkDefault( pkgs.lib.mkAfter "# hi" );
如果选项有多个值,则仅保留优先级最低的值。如果仍有多个值,则对它们进行排序和合并。 mkOverride
和mkOrder
创建了modules.nix中的代码在执行此操作时可识别的特殊值。普通值具有默认优先级(100)和排序顺序(1000)。 pam.nix使用mkDefault
为text
选项创建的值,这使得优先级为1000,因此普通值将替换它而不是合并。
NixOS manual section on Modularity解释了一点。
我认为您不能对environment.etc
执行此操作,因为目标文件不必与属性名称匹配,并且pam.nix特别没有在etc.nix中命名任何条目{1}}。它更像是按顺序处理的指令列表。见make-etc.sh和
{{3}}