因此,在 NixOS 上,我们可以编辑文件
/etc/nixos/configuration.nix
来指定我们的“输入”系统配置。 然而,当我们运行 nixos-rebuild switch
来构建并激活我们的“输入”配置时,严格来说,激活的实际配置并不完全是我们在“输入”中的配置,而是基于该“输入”的“输出”配置”.
具体来说,某些杂项配置参数可能会导致 NixOS 逻辑插入“输入”配置中未严格指定的附加服务的配置。 例如,这里https://github.com/NixOS/nixpkgs/blob/724ed08df02546fea2ab38613d615dd47461528c/nixos/modules/services/web-apps/wordpress.nix#L279是一些为MySQL插入配置的NixOS逻辑/ MariaDB服务进入最终的“输出”系统配置,但不是因为在“输入”配置中直接请求MySQL服务,而是因为指定了WordPress配置,并且自动激活MySQL服务以方便WordPress实例的运行。
我的问题是,有谁知道查看此“最终”生成的“输出”配置的命令或过程是什么,该配置将是系统在
nixos-rebuild switch
之后构建、激活和运行的实际配置?
这对于故障排除非常有用,能够评估正在运行的所有内容及其运行时的实际配置。
您提到的最终配置是模块使用的
config
变量。
它的值不包含纯粹的数据,因此您不能仅将其序列化。有些选项是函数类型的。并非所有内容都与您的配置相关,因为所有模块始终加载到此变量中。即使他们的主要 enable
选项仍然具有 false
值,它仍然存在。
因此,为了排除故障,您最好的选择是
nix repl
:
$ nix repl '<nixpkgs/nixos>'
Loading '<nixpkgs/nixos>'...
Added 6 variables.
nix-repl> config.services.mysql.[press TAB key]
config.services.mysql.bind config.services.mysql.extraOptions config.services.mysql.port
config.services.mysql.configFile config.services.mysql.group config.services.mysql.replication
config.services.mysql.dataDir config.services.mysql.initialDatabases config.services.mysql.rootPassword
config.services.mysql.enable config.services.mysql.initialScript config.services.mysql.settings
config.services.mysql.ensureDatabases config.services.mysql.package config.services.mysql.user
config.services.mysql.ensureUsers config.services.mysql.pidDir
nix-repl> config.services.mysql.ensureDatabases
[ ]
nix-repl>
所以我的笔记本电脑上没有任何 mysql 数据库。
如果您使用薄片,这些值可在
nixosConfigurations.<hostname>
属性中找到。
薄片也可以加载到repl中。截至撰写本文时,它还不太理想,但本期将描述实现此目的的最佳方法。
借助 Hercules CI Effects,使用模块系统的部署通常会出于相同目的提供
.prebuilt.config
属性。这是一个 用于 runNixOS。
罗伯特的答案很接近,但没有给出当前系统的当前输出。
NixOS & Flakes 书中有一个关于 使用
nix repl
进行调试的部分,它研究了如何查看最终输出:
$ cd /etc/nixos
$ nix repl
Lix 2.91.1
Type :? for help.
# I use a flake-based configuration, so...
nix-repl> :lf .
Added 11 variables.
# Now I can inspect outputs:
# this is my hostname...
nix-repl> outputs.nixosConfigurations.antikythera.config.networking.hostName
"antikythera"
# ...I use GNOME, not Xfce
nix-repl> outputs.nixosConfigurations.antikythera.config.services.xserver.displayManager.gdm.enable
true
nix-repl> outputs.nixosConfigurations.antikythera.config.services.xserver.desktopManager.xfce.enable
false
# ...I customise my GRUB theme
nix-repl> outputs.nixosConfigurations.antikythera.config.boot.loader.grub.theme
«derivation /nix/store/zmdbjdnwbv7jbzavwmgxxlhr2m6wld1k-distro-grub-themes.drv»
# You can remove the type attribute so it prints out the set:
nix-repl> builtins.removeAttrs outputs.nixosConfigurations.antikythera.config.boot.loader.grub.theme ["type"]
{
__ignoreNulls = true;
__structuredAttrs = false;
all = [ ... ];
args = [ ... ];
buildInputs = [ ];
builder = "/nix/store/5mh7kaj2fyv8mk4sfq1brwxgc02884wi-bash-5.2p37/bin/bash";
...
}