【问题标题】:Can nix be installed in a different location other than /nix?nix 可以安装在 /nix 以外的其他位置吗?
【发布时间】:2015-03-24 15:41:27
【问题描述】:

一段时间后,我的开发机器上的磁盘空间开始用完(只有 128GB)。出于这个原因,我决定将本地缓存存储(.npm、.m2、.ivy2 等)移动到外部驱动器。

在经历了众所周知的“阴谋集团地狱”之后,我最近转向 Nix 进行 Haskell 开发。不过,我还没有找到合适的方法来更改 Nix 商店的位置。

有可能吗?

【问题讨论】:

    标签: nix


    【解决方案1】:

    经过一点github考古,发现nixos commit f8cd904:

    https://github.com/NixOS/nix/commit/f8cd904e05b95c5a3ca7cf570c0503a25a2095ca

    这可以解决 gcc 3.3.3 中的一个行为(错误?)。相同的提交消息建议使用绑定挂载解决该问题:

    在 Linux 上,可以使用绑定挂载代替符号链接(例如,`mount -o bind /data/nix/store /nix/store')。

    【讨论】:

    • 链接可能有一天会过时。
    • Nix 确实支持符号链接存储,并且有一个标志 - NIX_IGNORE_SYMLINK_STORE。在我尝试安装一个想要编译 c++ 代码的 R 包之前,我一直使用符号链接的 /nix(带有标志)没有任何问题。在符号链接被实际路径替换后,ld-wrapper.sh 无法识别存储中的路径。所以绑定挂载确实解决了这个问题。见github.com/NixOS/nixpkgs/issues/16298
    • 我会选择mount -o bind,因为它还修复了符号链接目录烦人的自动完成(键入“/ni”和制表符,完成到“/nix”,而不是“/nix/” ,然后我必须输入斜杠)。
    • @saeedgnu this I have to type slash -- 或再次按 Tab。 :-) 但是,是的,烦人。
    【解决方案2】:

    如果有人仍在寻找这个问题:Nix 手册解释说,您可以自担风险使用符号链接(可能从源代码构建失败)https://nixos.org/nix/manual/#sec-common-env 设置如下环境变量就够了

    export NIX_IGNORE_SYMLINK_STORE=1
    

    编辑:

    tl,博士;

    设置此环境变量将允许您使用指向 /nix 的符号链接; 如果

    • 你不想在你的根目录上挂载一些东西
    • 您仍想使用预编译包

    警告:这不是便携式的

    详情:

    来自文档

    通常,Nix 存储目录(通常是 /nix/store)不允许包含任何符号链接组件。这是为了防止“不纯”构建。构建器有时会通过解析所有符号链接组件来“规范化”路径。因此,在不同的机器上构建(使用 /nix/store 解析到不同的位置)可能会产生不同的结果。这通常不是问题,除非将构建部署到 /nix/store 以不同方式解析的机器上。如果您确定不打算这样做,可以将 NIX_IGNORE_SYMLINK_STORE 设置为 1。

    因此,这主要是与某些 makefile 如何工作有关的决定。如果您不打算将您的配置移植到其他地方,它就可以工作。

    【讨论】:

    • 是否愿意更详细地解释这一点,以防万一链接失效?
    • 是的;我会尝试添加一些细节,如果够的话请告诉我
    • 完美,请记住,对于未来的答案,信息/答案的链接取决于链接末尾的网站,几年后仍然有效。在这个网站上有太多的答案链接到 5/6 年前的优秀文档,现在已经没有用了,因为这个网站已经不存在了。
    【解决方案3】:

    从 Nix 2.0 开始,有三个选项允许用户使用替代的 nix 存储,我假设这三个选项都使用用户命名空间:

    https://nixos.wiki/wiki/Nix_Installation_Guide#Installing_without_root_permissions

    • nix-user-chroot 使用重新定位的 /nix 创建环境。
    • proot 创建一个用户管理的 chroot-like。
    • 如果您安装了 Nix,用户可以选择使用带有 nix run --store /path/to/store 的替代商店。

    【讨论】:

      【解决方案4】:

      是的,但是您将无法使用二进制包(一切都将从头开始编译)。要引导,请参阅https://nixos.org/wiki/How_to_install_nix_in_home_%28on_another_distribution%29

      一个更好的主意可能是让 /nix 成为外部驱动器上目录的符号链接。你考虑过这个吗? 正如@jarandaf 下面提到的,/nix 不能是符号链接。

      【讨论】:

      • 能否解释一下为什么二进制缓存会丢失?
      • 大多数程序在构建时会将它们构建为的PREFIX 硬编码到程序中。标准的 nix 二进制文件在 /nix/store 中查找所有内容。对于其他发行版也是如此,您不能(通常)获取二进制包并将其安装在任意目录中。不过,使用指向更大驱动器的符号链接,就程序而言,您可以将所有内容保存在 /nix/store 中,但实际上将其 存储 到其他地方。
      • 为了进一步参考,不能在/nix 中创建符号链接:error: the path ‘/nix’ is a symlink; this is not allowed for the Nix store and its parent directories
      • @jarandaf 这很荒谬(不是你的评论,而是 Nix 决定检查它是否是符号链接)。他们为什么要关心这些?
      • @Jcl 不知道,这绝对是我有兴趣知道的。可能nix 大量使用符号链接可能是一个原因。
      【解决方案5】:

      从源代码构建并指定--with-store-dir=path

      请注意,这只会将存储文件夹 (/nix/store) 定义到另一个位置,而不是整个 /nix 文件夹

      文档还说

      警告:最好不要更改 Nix 商店的默认值, 因为这样做使得无法使用预构建的二进制文件 标准 Nixpkgs 渠道——也就是说,所有的包都需要 从源代码构建。

      参考:http://nixos.org/nix/manual/#sec-building-source

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-25
        • 2017-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-08
        相关资源
        最近更新 更多