Nix

出自 ArchWiki


Nix 是一个纯函数式包管理器,旨在使包管理 可重现、声明式和可靠

安装

有四种安装 Nix 的选择

  • 原生的 Arch Linux 软件包,
  • Nix 官方支持的上游安装脚本,
  • 由 Determinate Systems 公司提供的 Zero to Nix 脚本,该公司为 Nix 提供第三方支持,
  • 以及由充满热情的 Nix 社区成员提供的 Lix 脚本,旨在通过提供 Nix 包管理器的硬分叉版本来改进 Nix 生态系统。

原生

安装 nix 软件包。

上游安装脚本

本文或章节正在考虑移除。

理由: 上游说明与 Arch 无关,如果人们想忽略官方软件包,我们不需要在我们的页面上保留这些说明。(在 Talk: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 安装。

警告: 运行 curl some-url | sh,正如 Nix 文档建议的那样,被认为是安全风险,因为它会执行未知代码。因此,建议手动下载脚本并在执行前检查它。

Zero to Nix 安装脚本

本文或章节正在考虑移除。

理由: 为了“更简单和不复杂的设置”而使用 Curl 管道,但没有说明这实际上意味着什么,并且唯一的其他区别是它向一家公司发送遥测数据(在 Talk:Nix 中讨论)

为了更简单和不复杂的 Nix 设置,您可以使用 Determinate Systems 的设置。 使用 curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix -o nix-install.sh 下载文件,查看它:less ./nix-install.sh,并运行脚本 sh ./nix-install.sh install 以开始安装。

警告: 运行 curl some-url | sh,正如 Determinate Systems 建议的那样,被认为是安全风险,因为它会执行未知代码。因此,建议手动下载脚本并在执行前检查它。
注意: 安装程序 默认情况下会向 Determinate Systems 发送遥测数据。要手动禁用它,请使用 sh ./nix-install.sh install --diagnostic-endpoint=""

有关更多信息,请参阅 Determinate Systems 的手册。

Lix 安装脚本

本文或章节正在考虑移除。

理由: 另一个未打包的 nix 分叉,与 Arch Linux 无关(在 Talk:Nix 中讨论)

使用 curl --proto '=https' --tlsv1.2 -sSf -L https://install.lix.systems/lix -o lix-install.sh 下载文件,查看它:less ./lix-install.sh,并运行脚本 sh ./lix-install.sh 以开始安装。

警告: 运行 curl some-url | sh,正如 Lix 建议的那样,被认为是安全风险,因为它会执行未知代码。因此,建议手动下载脚本并在执行前检查它。

有关更多信息,请参阅 Lix Installer 的手册

注意: 如果您 卸载 了原生的 nix 软件包,您仍然会有一些用户帐户和组,这些帐户和组会阻止 lix 完成其安装,因为该组已存在且编号意外。在运行 lix 之前删除它们和该组,因为它会重新创建它们
uninstallnix.sh
#!/bin/sh
for i in {01..10}; do
  userdel "nixbld$i"
done
groupdel nixbld

配置

要在启动时启动 Nix 守护进程,启用 nix-daemon.service

将所需用户添加到 nix-users ,以便访问守护进程套接字。重新启动会话以使更改生效。

添加一个 频道 并更新它。

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

使用

注意: 如果您从官方仓库安装 Nix,您必须手动将 ~/.nix-profile/bin 目录添加到您的 PATH 中。

在 shell 配置好之后,以下命令应该会将 hello 安装到您更新后的 PATH 中

$ nix-env -iA nixpkgs.hello

二进制文件本身将位于 /nix/store/[hash]-hello-[version]/bin/hello

运行 hello 并确保它在正确的 PATH 中。如果它工作正常,您可以将其删除

$ nix-env --uninstall hello

或者您可以查看已安装程序的列表

$ nix-env --query

您还可以列出世代

$ nix-env --list-generations

有关更详细的信息,请参阅 nix-env(1)

技巧与诀窍

最大任务数

默认情况下,nix 仅使用一个构建器。以下配置将允许 nix 使用与 CPU 数量一样多的任务

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

图形加速

要运行 OpenGL 和 Vulkan 应用程序,请使用 NixGL

桌面集成

为了将 Nix 应用程序与您的桌面环境集成,请将 ~/.nix-profile/share 目录添加到您的 $XDG_DATA_DIRS 中,例如使用 export XDG_DATA_DIRS=$HOME/.nix-profile/share:$XDG_DATA_DIRS

nix-shell 的 Zsh 集成

nix-shell 默认启动 Bashzsh-nix-shellAUR 让您可以在 nix-shell 环境中使用 Zsh 作为默认 shell。一些提示符插件,例如 zsh-theme-powerlevel10kAURzsh-pure-promptAUR 提供了 nix-shell 指示器。

命令补全

Zsh

nix-zsh-completionsAUR 为 nix 命令(例如 nix-envnix-shell)提供 Zsh 补全。

故障排除

打开文件过多

某些构建可能会遇到如下错误

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

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

[Service]
LimitNOFILE=65536

关于 root 用户频道的警告消息

如果您在使用 Nix 时遇到此错误

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

root 用户将需要更新其频道

# nix-channel --update

用户相关的 Nix 搜索路径条目不存在,忽略

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

请参阅 FS#78828。或者,您可以使用#上游安装脚本#Zero to Nix 安装脚本,它们不会出现此问题。

error: file 'nixpkgs' was not found in the Nix search path (add it using $NIX_PATH or -I)

请参阅 FS#78828。或者,您可以使用#上游安装脚本#Zero to Nix 安装脚本,它们不会出现此问题。

沙盒构建问题

其他沙盒问题

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 的任何内容都期望在启用沙盒的情况下构建。

最常见的修复方法是在配置文件中禁用沙盒

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

然后重启 nix-daemon 服务。

区域设置警告

Nixos wiki 建议运行 export LOCALE_ARCHIVE=/usr/lib/locale/locale-archive。或者,导出环境变量 LC_ALL=C

参见