Nix

来自 Arch Linux 中文维基

Nix 是一个纯函数式包管理器,旨在使软件包管理可靠且可重现。

安装[编辑 | 编辑源代码]

目前有两种方法来安装 Nix,一种是受 Arch Linux 支持的,另一种则是受 Nix 官方支持的。

通过 Pacman 安装[编辑 | 编辑源代码]

安装 nix

使用 Nix 官方(上游)安装脚本[编辑 | 编辑源代码]

使用 curl --proto '=https' --tlsv1.2 -sSfL https://nixos.org/nix/install -o nix-install.sh 下载文件,审阅 less ./nix-install.sh,然后运行脚本 ./nix-install.sh --daemon 来开始安装 Nix。

警告: 正如 Nix 文档所述,直接运行 curl some-url | sh 有安全风险,因为它会执行未知的代码,再者它可能在下载过程中已经损坏。因此,请在执行安装脚本前手动检查它。

配置[编辑 | 编辑源代码]

要使 Nix 守护程序能够在系统启动时一并启动,启用 nix-daemon.service

将需要运行 Nix 的用户添加到 nix-users 用户组中以获取与守护程序套接字连接的权限。

添加一个通道并将其更新。

$ nix-channel --add https://nixos.org/channels/nixpkgs-unstable
$ nix-channel --update

提示与技巧[编辑 | 编辑源代码]

当 shell 配置完成后,以下内容应该将 hello 安装到你已经更新过的 PATH(/nix/store/[hash]-hello-[version]/bin/hello)中。

如果你从官方仓库安装 Nix,你需要手动将 ~/.nix-profile/bin 添加到 PATH。

$ nix-env -iA nixpkgs.hello

运行 hello 程序以确保 PATH 配置正确,如果正常工作,你可以卸载它:

$ nix-env --uninstall hello

或者你可以检查已经安装的程序列表(q 意指 query):

$ nix-env -q

你也可以查询迭代版本

$ nix-env --list-generations

更多信息参见 nix-env(1)

最大任务数[编辑 | 编辑源代码]

nix 默认只同时进行一个构建。以下内容将可以使 nix 同时进行与 CPU 数量相同的构建:

/etc/nix/nix.conf
max-jobs = auto

故障排查[编辑 | 编辑源代码]

权限错误[编辑 | 编辑源代码]

运行 nix replnix-env -u 时提示:

cannot connect to daemon at '/nix/var/nix/daemon-socket/socket: permission denied

如果你刚安装 nix,请重启系统。

打开的文件太多[编辑 | 编辑源代码]

一些构建可能会遇到类似如下的问题:

error: opening directory '/nix/store/...': Too many open files

编辑 nix-daemon.service 并增大文件限制:

[Service]
LimitNOFILE=65536

关于 root 用户更新频道的警告[编辑 | 编辑源代码]

warning: Nix search path entry '/nix/var/nix/profiles/per-user/root/channels' does not exist, ignoring

如果在使用 Nix 时出现上述信息,则 root 用户需要更新他们的软件更新频道信息:

# nix-channel --update

沙盒构建问题[编辑 | 编辑源代码]

其他沙盒问题[编辑 | 编辑源代码]

error: while setting up the build environment: mounting /proc: Operation not permitted
error: program '/usr/bin/nix-env' failed with exit code 1
1: package 'utils' in options("defaultPackages") was not found
2: package 'stats' in options("defaultPackages") was not found
Error: .onLoad failed in loadNamespace() for 'utils', details:
 call: system(paste(which, shQuote(names[i])), intern = TRUE, ignore.stderr = TRUE)
 error: cannot popen '/nix/store/fnkvlbls29d01jcx3wsdnhykyrl7087r-which-2.21/bin/which 'uname' 2>/dev/null', probable reason 'Cannot allocate memory'

这是已知的上游问题:#2311#3000#4636

警告: 通常不建议禁用沙盒,因为这会污染构建环境,且可能导致更多的构建错误。nixpkgs 中的所有内容都指望在启用沙盒的情况下构建。

最常见的解决方法是在配置文件中禁用沙盒,然后重新启动 nix-daemon 服务。

/etc/nix/nix.conf
# disable sandboxing
sandbox = false

参见[编辑 | 编辑源代码]