Nix (简体中文) - ArchWiki

Jump to content
翻译状态：本文是 Nix 的翻译。上次翻译日期：2022-06-14。如果英文版本有所更改，则您可以帮助同步翻译。

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 repl` 或 `nix-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

## 参见

- Nix 官网
- Nix Wiki
- Nix 包管理器指南
- Wikipedia:Nix package manager

Category:

- Package management (简体中文)