nix 可以安装在除 /nix 以外的其他位置吗?
Can nix be installed in a different location other than /nix?
一段时间后,我的开发机器(只有 128GB)开始 运行 磁盘 space 不足。出于这个原因,我决定将本地缓存存储(.npm、.m2、.ivy2 等)移动到外部驱动器。
在经历了众所周知的 "cabal hell" 之后,我最近转向 Nix 进行 Haskell 开发。不过,我还没有找到更改 Nix 商店位置的正确方法。
可能吗?
是的,但您将无法使用二进制包(一切都将从头开始编译)。至bootstrap,见https://nixos.org/wiki/How_to_install_nix_in_home_%28on_another_distribution%29
一个更好的主意可能是使 /nix 成为外部驱动器上目录的符号链接。你考虑过这个吗? 正如@jarandaf 在下面提到的,/nix
不能是符号链接。
经过一点github考古,我发现nixos commit f8cd904:
https://github.com/NixOS/nix/commit/f8cd904e05b95c5a3ca7cf570c0503a25a2095ca
这解决了 gcc 3.3.3 中的一个行为(错误?)。相同的提交消息建议解决绑定安装的问题:
On Linux, bind mounts can be used instead of symlink for this purpose (e.g., `mount -o bind /data/nix/store /nix/store').
从源构建并指定 --with-store-dir=path
请注意,这只会将存储文件夹 (/nix/store) 定义到另一个位置,而不是整个 /nix文件夹
文档还说
Warning: It is best not to change the Nix store from its default,
since doing so makes it impossible to use pre-built binaries from the
standard Nixpkgs channels — that is, all packages will need to be
built from source.
万一有人还在搜索这个问题:Nix 手册解释说您可以使用符号链接,风险自负(从源代码构建可能失败)https://nixos.org/nix/manual/#sec-common-env
设置如下环境变量即可
export NIX_IGNORE_SYMLINK_STORE=1
编辑:
tl,dr;
设置此环境变量将允许您使用指向 /nix 的符号链接;
如果
这可能很方便
- 你不想在你的根目录上挂载一些东西
- 您仍想使用预编译包
请注意:这不可移植
详情:
来自文档
Normally, the Nix store directory (typically /nix/store) is not allowed to contain any symlink components. This is to prevent “impure” builds. Builders sometimes “canonicalise” paths by resolving all symlink components. Thus, builds on different machines (with /nix/store resolving to different locations) could yield different results. This is generally not a problem, except when builds are deployed to machines where /nix/store resolves differently. If you are sure that you’re not going to do that, you can set NIX_IGNORE_SYMLINK_STORE to 1.
因此,这主要是与某些 makefile 的工作方式相关的决定。如果您不打算将您的配置移植到其他地方,它就可以正常工作。
从 Nix 2.0 开始,有三个选项允许用户使用替代的 nix 存储,我假设这三个选项都使用用户命名空间:
https://nixos.wiki/wiki/Nix_Installation_Guide#Installing_without_root_permissions
- nix-user-chroot 创建一个重定位的环境
/nix
.
- proot 创建一个用户管理的类似 chroot 的文件。
- 如果您安装了 Nix,用户可以选择使用带有
nix run --store /path/to/store
的替代商店。
一段时间后,我的开发机器(只有 128GB)开始 运行 磁盘 space 不足。出于这个原因,我决定将本地缓存存储(.npm、.m2、.ivy2 等)移动到外部驱动器。
在经历了众所周知的 "cabal hell" 之后,我最近转向 Nix 进行 Haskell 开发。不过,我还没有找到更改 Nix 商店位置的正确方法。
可能吗?
是的,但您将无法使用二进制包(一切都将从头开始编译)。至bootstrap,见https://nixos.org/wiki/How_to_install_nix_in_home_%28on_another_distribution%29
一个更好的主意可能是使 /nix 成为外部驱动器上目录的符号链接。你考虑过这个吗? 正如@jarandaf 在下面提到的,/nix
不能是符号链接。
经过一点github考古,我发现nixos commit f8cd904:
https://github.com/NixOS/nix/commit/f8cd904e05b95c5a3ca7cf570c0503a25a2095ca
这解决了 gcc 3.3.3 中的一个行为(错误?)。相同的提交消息建议解决绑定安装的问题:
On Linux, bind mounts can be used instead of symlink for this purpose (e.g., `mount -o bind /data/nix/store /nix/store').
从源构建并指定 --with-store-dir=path
请注意,这只会将存储文件夹 (/nix/store) 定义到另一个位置,而不是整个 /nix文件夹
文档还说
Warning: It is best not to change the Nix store from its default, since doing so makes it impossible to use pre-built binaries from the standard Nixpkgs channels — that is, all packages will need to be built from source.
万一有人还在搜索这个问题:Nix 手册解释说您可以使用符号链接,风险自负(从源代码构建可能失败)https://nixos.org/nix/manual/#sec-common-env 设置如下环境变量即可
export NIX_IGNORE_SYMLINK_STORE=1
编辑:
tl,dr;
设置此环境变量将允许您使用指向 /nix 的符号链接; 如果
这可能很方便- 你不想在你的根目录上挂载一些东西
- 您仍想使用预编译包
请注意:这不可移植
详情:
来自文档
Normally, the Nix store directory (typically /nix/store) is not allowed to contain any symlink components. This is to prevent “impure” builds. Builders sometimes “canonicalise” paths by resolving all symlink components. Thus, builds on different machines (with /nix/store resolving to different locations) could yield different results. This is generally not a problem, except when builds are deployed to machines where /nix/store resolves differently. If you are sure that you’re not going to do that, you can set NIX_IGNORE_SYMLINK_STORE to 1.
因此,这主要是与某些 makefile 的工作方式相关的决定。如果您不打算将您的配置移植到其他地方,它就可以正常工作。
从 Nix 2.0 开始,有三个选项允许用户使用替代的 nix 存储,我假设这三个选项都使用用户命名空间:
https://nixos.wiki/wiki/Nix_Installation_Guide#Installing_without_root_permissions
- nix-user-chroot 创建一个重定位的环境
/nix
. - proot 创建一个用户管理的类似 chroot 的文件。
- 如果您安装了 Nix,用户可以选择使用带有
nix run --store /path/to/store
的替代商店。