8

我想在相同架构的多台 openSUSE 机器(不同版本)上始终使用 nix-package manager 安装软件。我不是任何系统的 root,但我想说服我们的系统管理员nix在所有使用网络挂载的机器上以多用户模式安装。

  • 是否可以在所有机器上挂载相同的/nix目录并在所有这些机器上以多用户模式运行 nix?

  • nix-env -i干扰其他机器吗?

  • nix-env -i xxx安装xxx在所有机器的用户配置文件中还是只安装在执行命令的机器上?那些安装的root怎么样?

  • 一台机器上的垃圾收集是否考虑到其他机器上安装的软件?

4

1 回答 1

8
  1. 可以在多台机器安装 Nix 存储,以便在具有相似架构的许多主机之间共享二进制文件。如果/nix在所有这些机器上都可用,那么它们中的每一个都可以以与本地安装它们几乎相同的方式使用已安装的包。

    现在,只有当您的底层网络文件系统正确支持网络范围的文件锁定时,让多台机器同时写入同一个 Nix 存储才能可靠地工作。这听起来可能无害,但根据我的经验,大多数网络文件系统实际上并不支持正确的文件锁定,我的猜测是,如果你尝试这个壮举,那么你偶尔会遇到死锁和/或不一致的商店。

  2. nix-env -i- 所有其他nix-xxx命令都是通用的 - 同步访问和中的所有资源/nix/store/nix/var因此多个运行操作不会相互干扰(假设文件系统提供可靠的同步)。如果一个用户nix-env -i同时在两台机器上运行,那么他显然会遇到竞争条件,因为这两个命令中的一个会抵消另一个的影响。但是,当您在一台机器上同时运行两个nix-env -i命令时,这种现象也会以同样的方式发生,因此这不是共享存储所特有的问题。

  3. nix-env -i同时修改所有主机上的用户环境。用户配置文件~foo/.nix-profile只是指向共享存储的符号链接/nix/var/nix/profiles/per-user/foo/profile,因此在一台计算机上对该配置文件所做的更改也将在所有其他计算机上可见。root在这方面就像任何其他用户一样。

  4. 是的,nix-collect-garbage可以在共享商店的任何机器上正常工作。由于用户配置文件也是共享的,因此该工具可以看到完整的使用/依赖关系图,并且不会对仍被用户配置文件引用的存储路径进行垃圾收集。

    然而,另一件事是临时环境,例如为nix-shell或由nix-build. Nix 通过符号链接 from/nix/var/nix/gcroots到本地硬盘上的适当路径(即临时环境所在的位置)来记录这些环境的存在。如果该符号链接变得陈旧,即如果 Nix 环境的“真实路径”消失,则这种环境被认为是死的。现在,如果用户进入nix-shell机器A上的环境,那么将在其中创建一个符号链接/nix/var/nix/gcroots,指向/run/user/1000/nix-shell-environment-1. 但是,在机器B上运行的垃圾收集器不会找到该路径,并且会认为环境已死,因此会删除符号链接/nix/var/nix/gcroots和底层存储路径/nix/store. 如果发生这种情况,那么在Anix-shell上运行的活动环境将突然停止工作。

于 2016-01-05T11:01:50.473 回答