【问题标题】:Mounting the same /nix directory on multiple machines在多台机器上挂载相同的 /nix 目录
【发布时间】:2015-12-23 10:23:44
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: nix


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

    【讨论】:

    • 非常感谢您的深入回答!非常感谢您的努力!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    相关资源
    最近更新 更多