在多台机器上挂载相同的 /nix 目录

Mounting the same /nix directory on multiple machines

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

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

    现在,只有当您的底层网络文件系统正确支持 network-wide 文件锁定时,让多台机器同时 写入 到同一个 Nix 存储才能可靠地工作.这听起来可能无害,但根据我的经验,大多数网络文件系统实际上 正确支持文件锁定,我的猜测是,如果您尝试此壮举,那么您将 运行 偶尔会以 dead-locks and/or 不一致的存储形式出现问题。

  2. nix-env -i — 所有其他 nix-xxx 命令都是通用的 — 同步对 /nix/store/nix/var 中所有资源的访问,所以多个 运行ning操作互不干扰(假设文件系统提供可靠的同步)。如果一个用户 运行s 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 上的垃圾收集器 运行ning 找不到该路径并认为环境已死,因此从 /nix/var/nix/gcroots 中删除符号链接和来自 /nix/store 的底层存储路径。如果发生这种情况,A 上的活动 nix-shell 环境 运行ning 将突然停止工作。