NixOS执行nix-env --rollback后,如何查看被移除的软件包?
如何查询Nix回滚后被移除的软件包?
问题背景
我测试了nix-env --rollback命令,发现它并不会修改/etc/nixos/configuration.nix的内容,但执行后有一个软件包被删除了。我想知道具体是哪个包被移除——原本可以在回滚前后执行nix-env -q对比结果,但我之前忘了这么做,现在需要一个可行的解决方案。
已尝试的操作
我尝试执行以下命令:
nix-env -iA nixos.nix-diff nix-diff /nix/var/nix/profiles/system /nix/var/nix/profiles/system-$22-link
得到的报错信息如下:
- /nix/var/nix/profiles/system:{out}
- /nix/var/nix/profiles/system-2-link:{out}
nix-diff: unknown-deriver: openBinaryFile: does not exist (No such file or directory)
可行解决方案
方法1:对比用户profile历史版本的包列表
用户环境的所有历史配置版本都存放在/nix/var/nix/profiles/per-user/你的用户名/目录下,每个版本对应一个profile-*-link符号链接。可以通过以下步骤对比版本差异:
- 列出所有历史版本链接:
ls -l /nix/var/nix/profiles/per-user/$(whoami)/
- 分别列出回滚前后两个版本的已安装包:
假设回滚前的版本是profile-5-link,回滚后的版本是profile-4-link,执行:
nix-env -q --profile /nix/var/nix/profiles/per-user/$(whoami)/profile-5-link nix-env -q --profile /nix/var/nix/profiles/per-user/$(whoami)/profile-4-link
- 使用
diff命令直接对比两个输出结果,快速定位被移除的包:
diff <(nix-env -q --profile /nix/var/nix/profiles/per-user/$(whoami)/profile-5-link) <(nix-env -q --profile /nix/var/nix/profiles/per-user/$(whoami)/profile-4-link)
方法2:修复nix-diff的使用问题
之前的报错是因为路径或版本号不匹配导致的,调整后即可正常使用:
- 先确认目标环境的历史版本链接:
如果是系统环境回滚,查看系统profile的历史:
ls -l /nix/var/nix/profiles/
如果是用户环境回滚,查看用户profile的历史:
ls -l /nix/var/nix/profiles/per-user/$(whoami)/
- 使用实际存在的链接路径执行
nix-diff:
比如系统环境下对比system-23-link和system-22-link:
nix-diff /nix/var/nix/profiles/system-23-link /nix/var/nix/profiles/system-22-link
用户环境下对比profile-5-link和profile-4-link:
nix-diff /nix/var/nix/profiles/per-user/$(whoami)/profile-5-link /nix/var/nix/profiles/per-user/$(whoami)/profile-4-link
内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud
相关产品推荐
相关产品推荐

