如何将通道回滚到上一代 Nixos?

如何将通道回滚到上一代 Nixos?
$ sudo nix-env --list-generations --profile /nix/var/nix/profiles/system
...
 600   2020-01-25 21:01:11   
 601   2020-02-03 13:44:19   
 602   2020-02-09 14:06:20   
 603   2020-02-09 14:11:11   
 604   2020-02-11 00:02:43   
 605   2020-02-13 12:26:22   
 606   2020-02-16 16:40:02   (current)

我怎样才能获得 Nixos 一代的提交/通道生成(这是一件事吗?) - 并可能将通道回滚到它?

或者换句话说,我怎样才能将我的“通道状态”回滚到第 605 代时的状态?


为什么我想知道是因为我几天前做了一个sudo nix-channel --update,无论发生什么软件包更新,都会导致系统不稳定。sudo nixos-rebuild switch

因此,为了缓解这种情况,我启动并继续使用老一代 ( 605)。

我现在想要更新 Nixos 系统配置中的特定包,并将更改基于605而不是最新的606.


我确实找到了https://stackoverflow.com/questions/39090387/how-to-undo-nix-channel-update( nix-channel --rollback..) 但是我可能已经更新了几次频道 - 所以“最后”频道状态可能不是我需要的。

我确实注意到您可以指定通道生成编号作为此命令的参数 - 但我不确定它与 nixos 生成之间的关系是什么?这似乎605与我尝试的结果不同:

sudo nix-channel --rollback 605
error: generation 605 does not exist
error: program '/nix/store/cs47wjxwiqgyl1nkjnksyf3s2rb93piq-nix-2.3.2/bin/nix-env' failed with exit code 1

答案1

我想你想要吗sudo nix-channel --rollback?例如,您还可以手动检查/nix/var/nix/profiles/per-user/root/channels-*/manifest.nix- 那些包含名称、提交哈希等。

答案2

太长了;

配置文件生成和通道生成是不同的事情。频道生成跟踪列表的更改可用的 派生(包)和配置文件生成跟踪已安装 推导及其版本。ls -g /nix/var/nix/profiles/per-user/my_user_name/将一目了然地告诉您有关当前一代产品的所有信息。

/TLDR;

弗拉基米尔的答案是完全正确的,但由于可怕的漫长道路而很容易被忽视;)

当您更新频道时:

nix-channel --update <my-channel-alias>

您将当前用户的频道生成提前一位。仅my-channel-alias受到影响,但这仍然会导致构建全新的一代并且您的环境会引用它。

不幸的是,nix-channel没有切换到列表通道代。这就是长路径出现的地方。您可以看到channels链接到channels-4-link用户my_user_name。因此,my_user_name当前选择的通道代数为4。

ls -g /nix/var/nix/profiles/per-user/my_user_name/
  channels -> channels-4-link                                                      
  channels-1-link -> /nix/store/57904rflsfh46y7fxi62rzc7sidc9vmq-user-environment                                                      
  channels-2-link -> /nix/store/j5j5avwf07a2ajr3jszj9vv8l5ybgycm-user-environment                                                      
  channels-3-link -> /nix/store/xb0accm8k1zsll5wrxck7gj0xbdv8zk7-user-environment                                                      
  channels-4-link -> /nix/store/dlh9wlpx59lifgni06q0vwgymshn9jja-user-environment                                                      
  channels-5-link -> /nix/store/8wymqxsdy3m7gmh6f21m49hl98gy75aa-user-environment                                                      
  channels-6-link -> /nix/store/3sf1c989bbfrrxrpr235xqjqvd89apsi-user-environment                                                      
  profile -> profile-1-link                                                      
  profile-10-link -> /nix/store/kwlgbfbpwjhgb42bp7c899l8a1cyjdcl-user-environment                                                      
  profile-1-link -> /nix/store/57904rflsfh46y7fxi62rzc7sidc9vmq-user-environment                                                      
  profile-2-link -> /nix/store/c614r1kmrg9nsx2qvd944k5afj49qim7-user-environment                                                      
  profile-3-link -> /nix/store/57904rflsfh46y7fxi62rzc7sidc9vmq-user-environment                                                      
  profile-4-link -> /nix/store/2blnby22dvc92i9ahprwkl504ngj75ad-user-environment                                                      
  profile-5-link -> /nix/store/ahd9dzfkgvyfqdkdw8cw8w8dyqak66b4-user-environment                                                      
  profile-6-link -> /nix/store/gbjmn5rcjl4iscfvgms9hk26vhpr6pv2-user-environment                                                      
  profile-7-link -> /nix/store/57904rflsfh46y7fxi62rzc7sidc9vmq-user-environment                                                      
  profile-8-link -> /nix/store/k50s7rb4gz3pibd0r8136y628al74www-user-environment                                                      
  profile-9-link -> /nix/store/57904rflsfh46y7fxi62rzc7sidc9vmq-user-environment

相反,配置文件(用户环境)生成通过以下nix-env操作进行高级:

--install
--update
--uninstall

正如 nix-env 的手册页中提到的。

man nix-env | grep "new user environment"

并且可以轻松查询当前用户的不同配置文件生成:

nix-env --list-generations

相关内容