如何查询NixOS系统全局安装的软件包及验证配置生效情况?
嘿,这个问题我之前也纠结过,给你整理几个实用的操作方法:
一、查询系统全局安装的软件包
和用户级包用nix-env -q不同,系统全局的包存在系统专属的profile里,用下面的命令就能查看:
查看当前激活的系统全局包列表:
nix-env -q --profile /nix/var/nix/profiles/system这个命令会列出所有通过
environment.systemPackages配置并生效的包,以及系统运行依赖的其他底层包。查看历史系统世代的包列表:
先通过nixos-rebuild list-generations查看所有系统世代的编号(比如输出里的2024-05-20 10:30:01 567),再用世代号查询对应版本的包:nix-env -q --profile /nix/var/nix/profiles/system-567-link
二、验证environment.systemPackages配置是否已生效
如果不确定添加包后有没有执行nixos-rebuild switch,可以用这几种方法确认:
方法1:对比配置文件和当前系统的包列表
先输出configuration.nix里你手动配置的systemPackages:
nix-instantiate --eval -E 'with import <nixpkgs> {}; lib.attrNames config.environment.systemPackages' -I nixos-config=/etc/nixos/configuration.nix
这个命令会直接列出你在配置里添加的包名,然后和前面nix-env -q --profile /nix/var/nix/profiles/system的输出对比,看新增的包是否已经出现在全局列表里。
方法2:检查系统配置是否为最新版本
用nixos-rebuild的 dry-run 模式,它会模拟执行switch并告诉你是否需要更新:
nixos-rebuild switch --dry-run
如果输出显示building Nix...之后没有任何变更提示,或者出现类似no change的内容,说明当前系统已经是配置文件对应的版本,你的包已经生效了。
方法3:对比系统路径哈希
当前激活的系统路径是/run/current-system,你可以先构建配置文件对应的系统路径:
nix-build /etc/nixos/configuration.nix
然后查看构建结果的路径(比如/nix/store/abc123-nixos-system-xxx),再对比readlink /run/current-system的输出,如果两者一致,说明配置已经生效。
内容的提问来源于stack exchange,提问作者illabout

