确定性 Nix 安装程序
Determinate Nix Installer 是安装 Determinate Nix 最简单且最可靠的方式。1 该安装程序适用于多种环境,包括 macOS、Linux、Windows Subsystem for Linux (WSL)、SELinux、Valve Steam Deck 等,它支持无缝 卸载 Nix,使 Nix 能够经受 macOS 升级,并提供 一系列功能,使其成为安装 Nix 的行业标准。
默认情况下,它安装 Determinate Nix,该版本启用了 flakes 并提供多种行业领先的 [功能] 和 [改进]。
[!NOTE] 如果您愿意,也可以使用 Determinate Nix Installer 安装 上游 Nix。 然而,此选项仅在 2026 年 1 月 1 日 之前可用。
安装 Determinate Nix
这一行命令几乎可以在任何受支持的系统中安装 Determinate Nix:
curl -fsSL https://install.determinate.systems/nix | sh -s -- install
[!TIP] 在 macOS 上开始使用 Determinate Nix 的最佳方式是使用我们的 macOS 软件包,它在后台使用 Determinate Nix Installer,但提供了高度直观的图形用户界面。
Determinate Nix Installer 每天在多种环境中成功完成数万次安装,包括 Github Actions 和 GitLab:
| 平台 | 多用户? | root 专用 | 成熟度 |
|---|---|---|---|
Linux (x86_64 和 aarch64) | ✓ (通过 systemd) | ✓ | 稳定 |
macOS (Apple Silicon / aarch64) | ✓ | 稳定(见备注) | |
| Valve Steam Deck (SteamOS) | ✓ | 稳定 | |
Windows Subsystem for Linux 2 (WSL2) (x86_64 和 aarch64) | ✓ (通过 systemd) | ✓ | 稳定 |
| Podman Linux 容器 | ✓ (通过 systemd) | ✓ | 稳定 |
| Docker 容器 | ✓ | 稳定 |
作为 Github Action
你可以在 GitHub Actions 上使用 determinate-nix-action 安装 Determinate Nix。
以下是一个配置示例:
on:
pull_request:
push:
branches: [main]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: DeterminateSystems/determinate-nix-action@v3
- name: Run `nix build`
run: nix build .
固定 GitHub Action 版本
determinate-nix-action 会针对每个 Determinate 版本进行更新和打标签。
例如,DeterminateSystems/determinate-nix-action@v3.5.2 始终会安装 Determinate Nix v3.5.2。
此外,主版本上的额外标签会保持与当前发布版本同步。
例如,DeterminateSystems/determinate-nix-action@v3 引用会安装 v3.x.y 系列中最新的发布版本。
规划器
Determinate Nix Installer 通过遵循由 规划器 制定的 计划 来安装 Nix。 要查看可用的规划器:
/nix/nix-installer install --help
规划器拥有各自的选项和默认值,其中大部分是共用的。 例如,要查看 Linux 的选项:
/nix/nix-installer install linux --help
您可以通过环境变量或命令参数来配置规划器:
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | \
NIX_BUILD_GROUP_NAME=nixbuilder sh -s -- install --nix-build-group-id 4000
# Alternatively:
NIX_BUILD_GROUP_NAME=nixbuilder ./nix-installer install --nix-build-group-id 4000
请参阅下方安装程序设置]以获取完整的选项列表。
故障排除
安装程序遇到问题? 请参阅我们的故障排除指南],查看您的问题是否已涵盖。
升级 Determinate Nix
如果您已安装 Determinate Nix,可以使用 Determinate Nixd 进行升级:
sudo determinate-nixd upgrade
或者,您可以卸载并使用不同版本的 Determinate Nix Installer 重新安装。
卸载
您可以通过运行以下命令来移除由 Determinate Nix Installer 安装的 Nix:
/nix/nix-installer uninstall
在 GitLab 上
GitLab CI 运行器通常基于 Docker,并以 root 用户身份运行。
这意味着 systemd 不存在,因此你需要向 Linux 规划器传递 --init none 选项。
在默认的 GitLab 运行器上,你可以使用以下配置安装 Nix:
test:
script:
- curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux --no-confirm --init none
- . /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
- nix run nixpkgs#hello
- nix profile add nixpkgs#hello
- hello
如果您使用的是不同的运行器,上述示例可能需要进行调整。
不使用 systemd(仅限 Linux)
[!WARNING] 当使用
--init none时,_仅*root或能够提升至root权限的用户可以运行 Nix:sudo -i nix run nixpkgs#hello
如果您不使用 systemd,仍然可以通过显式指定 linux 方案和 --init none 来安装 Nix:
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | \
sh -s -- install linux --init none
在容器中
在 Docker/Podman 容器或 WSL2 实例中,如果不存在 init(如 systemd),请传递 --init none。
对于容器(无 init):
[!WARNING] 当使用
--init none时,_仅*root或能够提升至root权限的用户可以运行 Nix:sudo -i nix run nixpkgs#hello
[!WARNING] 如果你想添加一个
flake.nix,请先在你的Dockerfile中声明一个工作目录(例如/src)。 你无法锁定位于 docker 镜像根目录(/)的 flake(详见)。 在 docker 构建期间,你将遇到一个file '/dev/full' has an unsupported type。# append this to the below dockerfiles WORKDIR /src # now flakes will work RUN nix flake init RUN nix flake lock
# Dockerfile
FROM ubuntu:latest
RUN apt update -y
RUN apt install curl -y
RUN curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux \
--extra-conf "sandbox = false" \
--init none \
--no-confirm
ENV PATH="${PATH}:/nix/var/nix/profiles/default/bin"
RUN nix run nixpkgs#hello
docker build -t ubuntu-with-nix .
docker run --rm -ti ubuntu-with-nix
docker rmi ubuntu-with-nix
# or
podman build -t ubuntu-with-nix .
podman run --rm -ti ubuntu-with-nix
podman rmi ubuntu-with-nix
对于具有 systemd 初始化的容器:
# Dockerfile
FROM ubuntu:latest
RUN apt update -y
RUN apt install curl systemd -y
RUN curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux \
--extra-conf "sandbox = false" \
--no-start-daemon \
--no-confirm
ENV PATH="${PATH}:/nix/var/nix/profiles/default/bin"
RUN nix run nixpkgs#hello
CMD [ "/bin/systemd" ]
podman build -t ubuntu-systemd-with-nix .
IMAGE=$(podman create ubuntu-systemd-with-nix)
CONTAINER=$(podman start $IMAGE)
podman exec -ti $CONTAINER /bin/bash
podman rm -f $CONTAINER
podman rmi $IMAGE
使用某些容器工具,例如 Docker,可以省略 sandbox = false。
省略此项将负面影响与 Podman 等容器工具的兼容性。
在 WSL2 中
我们强烈建议首先 启用 systemd,然后正常安装 Nix:
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | \
sh -s -- install
如果启用了 WSLg,你可以在 Windows 的 Powershell 中执行诸如从 Windows 打开 Linux Firefox 之类的操作:
wsl nix run nixpkgs#firefox
要使用某些 OpenGL 应用程序,您可以使用 nixGL(请注意,某些应用程序,例如 blender,可能无法正常工作):
wsl nix run --impure github:guibou/nixGL nix run nixpkgs#obs-studio
如果启用 systemd 不是一个选项,请在命令末尾传递 --init none:
[!WARNING] 当使用
--init none时,仅root或能够提升至root权限的用户可以运行 Nix:sudo -i nix run nixpkgs#hello
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | \
sh -s -- install linux --init none
跳过确认
如果您想绕过确认步骤,可以应用 --no-confirm 标志:
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | \
sh -s -- install --no-confirm
这在非交互式脚本中使用安装程序时尤其有用。
功能
现有的 Nix 安装脚本做得不错,但难以维护。
脚本中 shell 实现和所用工具的细微差异使得对安装程序进行有意义的更改变得困难。
Determinate Nix 安装程序相比这些选项具有诸多优势:
- 它默认启用 flakes 安装 Nix
- 它使 Nix 能够 在 macOS 升级后存活
- 它保留安装 收据 以便轻松 卸载
- 它使用 planners 为复杂目标创建适当的安装计划—这些计划可以在安装前进行审查
- 它允许在安装失败时执行尽力而为的回滚
- 它通过最大化并行操作来提高安装性能
- 它支持扩展的测试套件,包括“治愈”用例(与系统中已存在的 Nix 的兼容性)
- 它支持 SELinux 和基于 OSTree 的发行版,而无需用户做出妥协
- 它作为单个静态二进制文件运行,外部依赖项如 OpenSSL,仅在必要时调用现有系统工具(如
useradd) - 作为 macOS 远程构建目标,它确保 Nix 存在于
PATH
Nix 社区参与
与其他 Nix Installer Working Group 参与者以及更广泛社区的成员合作,一直是一段美好的经历。 该工作组维护着一个 由基金会拥有的安装程序分支。
怪癖
尽管 Determinate Nix Installer 力求提供全面且无怪癖的体验,但遗憾的是,仍有一些问题可能需要手动干预或操作者选择。 请参阅 此文档 以获取解决这些问题的信息:
构建二进制文件
请参阅 此指南 以获取自行构建和分发安装程序的说明。
作为 Rust 库
Determinate Nix Installer 可作为标准的 Rust 库使用。 请参阅 此指南 以获取在您的 Rust 代码中使用该库的说明。
访问其他版本
您可以通过修改下载 URL 来固定 Determinate Nix Installer 的特定版本。 以下是一个示例:
VERSION="v0.6.0"
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix/tag/${VERSION} | \
sh -s -- install
要查看可用版本,或下载任何版本的二进制文件,请查看 Github Releases。
每个安装程序版本都有一个关联的受支持 nix 版本—如果您固定了安装程序版本,您也将间接固定到关联的 nix 版本。
您还可以使用 --nix-package-url 或 NIX_INSTALLER_NIX_PACKAGE_URL= 覆盖 Nix 版本,但不建议这样做,因为我们尚未测试过该组合。
以下是一些 Nix 软件包 URL 示例,包括 Nix 版本、操作系统和架构:
- https://releases.nixos.org/nix/nix-2.18.1/nix-2.18.1-x86_64-linux.tar.xz
- https://releases.nixos.org/nix/nix-2.18.1/nix-2.18.1-aarch64-darwin.tar.xz
安装差异
与上游 Nix 安装脚本不同:
- 在
nix.conf中:- 启用了
nix-command和flakes功能 - 设置了
bash-prompt-prefix - 将
auto-optimise-store设置为true(仅在 Linux 上) - 将
always-allow-substitutes设置为true - 将
extra-nix-path设置为nixpkgs=flake:nixpkgs - 将
max-jobs设置为auto - 将
upgrade-nix-store-path-url设置为https://install.determinate.systems/nix-upgrade/stable/universal,以防止意外降级。
- 启用了
- 安装回执(用于卸载)也存储在
/nix/receipt.json,以及安装二进制的副本存储在/nix/nix-installer - 不会运行
nix-channel --update,不会配置~/.nix-channels - 如果使用
ssl-cert-file参数,则在/etc/nix/nix.conf中设置ssl-cert-file。
安装程序设置
Determinate Nix Installer 提供多种配置设置,一些是通用,一些是按命令设置的。
所有设置均可通过标志或 NIX_INSTALLER_* 环境变量使用。
通用设置
这些设置适用于所有命令。
| 标志 | 描述 | 默认值(如有) | 环境变量 |
|---|---|---|---|
--log-directives | 以逗号分隔的跟踪指令 | NIX_INSTALLER_LOG_DIRECTIVES | |
--logger | 使用哪个日志记录器(选项为 compact、full、pretty 和 json) | compact | NIX_INSTALLER_LOGGER |
--verbose | 启用调试日志,(-vv 用于跟踪) | false | NIX_INSTALLER_VERBOSITY |
安装 (nix-installer install)
| Flag(s) | Description | Default (if any) | Environment variable |
|---|---|---|---|
--diagnostic-attribution | 将安装诊断关联到特定的唯一用户 ID | NIX_INSTALLER_DIAGNOSTIC_ATTRIBUTION | |
--diagnostic-endpoint | 要发送的安装诊断的 URL 或文件路径 | NIX_INSTALLER_DIAGNOSTIC_ENDPOINT | |
--explain | 提供安装过程将对系统所做的更改的说明 | false | NIX_INSTALLER_EXPLAIN |
--extra-conf | /etc/nix.conf 的额外配置行 | NIX_INSTALLER_EXTRA_CONF | |
--force | 安装程序是否应强制重新创建其发现的已存在文件 | false | NIX_INSTALLER_FORCE |
--init | 要配置的 init 系统(如果 --init none Nix 将仅对 root 可用) | launchd (macOS), systemd (Linux) | NIX_INSTALLER_INIT |
--nix-build-group-id | Nix 构建组的 GID | 350 (macOS), 30000 (Linux) | NIX_INSTALLER_NIX_BUILD_GROUP_ID |
--nix-build-group-name | Nix 构建组的名称 | nixbld | NIX_INSTALLER_NIX_BUILD_GROUP_NAME |
--nix-build-user-count | 要创建的构建用户数量 | 32 | NIX_INSTALLER_NIX_BUILD_USER_COUNT |
--nix-build-user-id-base | Nix 构建用户的基础 UID(升序)(注意:第一个 UID 将是此基础值 + 1) | 350 (macOS), 30000 (Linux) | NIX_INSTALLER_NIX_BUILD_USER_ID_BASE |
--nix-build-user-prefix | Nix 构建用户前缀(用户编号将作为后缀添加) | _nixbld (macOS), nixbld (Linux) | NIX_INSTALLER_NIX_BUILD_USER_PREFIX |
--nix-package-url | Nix 软件包 URL | NIX_INSTALLER_NIX_PACKAGE_URL | |
--no-confirm | 运行安装过程,无需显式的用户确认 | false | NIX_INSTALLER_NO_CONFIRM |
--no-modify-profile | 修改用户配置文件以自动加载 Nix。 | true | NIX_INSTALLER_MODIFY_PROFILE |
--prefer-upstream-nix | 指定希望安装程序安装 upstream Nix 而非 Determinate Nix。可用至 2026 年 1 月 1 日。 | false | NIX_INSTALLER_PREFER_UPSTREAM_NIX |
--proxy | 要使用的代理(如有);有效的代理基础为 https://$URL、http://$URL 和 socks5://$URL | NIX_INSTALLER_PROXY | |
--ssl-cert-file | 要使用的 SSL 证书(如有);用于获取 Nix 并设置 /etc/nix/nix.conf 中的 ssl-cert-file | NIX_INSTALLER_SSL_CERT_FILE | |
--no-start-daemon | 启动守护进程(如果未 --init none) | true | NIX_INSTALLER_START_DAEMON |
您也可以通过第一个参数指定一个规划器:
nix-installer install <plan>
或者,您可以使用 NIX_INSTALLER_PLAN 环境变量:
NIX_INSTALLER_PLAN=<plan> nix-installer install
卸载 (nix-installer uninstall)
| 标志 | 描述 | 默认值 (如有) | 环境变量 |
|---|---|---|---|
--explain | 提供安装过程将对系统所做的更改的说明 | false | NIX_INSTALLER_EXPLAIN |
--no-confirm | 运行安装而无需显式的用户确认 | false | NIX_INSTALLER_NO_CONFIRM |
您也可以将安装回执指定为第一个参数(默认为 /nix/receipt.json):
nix-installer uninstall /path/to/receipt.json
规划 (nix-installer plan)
| 标志 (Flag) | 描述 | 默认值 (如有) | 环境变量 |
|---|---|---|---|
--out-file | 写入生成的计划的位置 (JSON 格式) | /dev/stdout | NIX_INSTALLER_PLAN_OUT_FILE |
修复 (nix-installer repair)
| 标志 (Flag) | 描述 | 默认值 (如有) | 环境变量 |
|---|---|---|---|
--no-confirm | 运行安装而无需显式的用户确认 | false | NIX_INSTALLER_NO_CONFIRM |
自检 (nix-installer self-test)
nix-installer self-test 仅接受 通用设置.
安装上游 Nix
你可以通过应用 --prefer-upstream-nix 标志来安装 上游 Nix:
nix-installer install --prefer-upstream-nix
在 GitHub Actions 中,你可以使用我们的 nix-installer-action 并在配置中设置 determinate: false 来安装上游 Nix:
- name: Install upstream Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: false
诊断
Determinate Nix Installer 的目标是成功且正确地安装 Nix。
curl | sh 流水线以及安装程序会收集少量匿名诊断信息,以帮助我们实现这一目标。
我们收集的用于改进安装程序的匿名诊断信息包括:
- 安装程序版本
- 使用的规划器(
linux、macos、steam-deck) - 执行的操作(安装、卸载)
- 结果(
Success、Failure、Pending或Cancelled) - 自定义规划器设置的名称(不是 值)
- 有关您主机的信息,例如操作系统及版本、架构、二进制格式等
- 您是否处于 CI 环境中
- 关于故障的高层描述,例如某个特定命令是否失败。
要禁用诊断报告,请通过传递 --diagnostic-endpoint="" 或设置 NIX_INSTALLER_DIAGNOSTIC_ENDPOINT="" 将诊断 URL 设置为空字符串。
您可以在此处阅读 Determinate Systems(Determinate Nix Installer 的创建者)的完整隐私政策 here。
Footnotes
-
一点历史:Determinate Nix Installer 是 Determinate Systems 作为公司持续时间最长项目。 我们后来构建了许多其他东西,例如 FlakeHub、FlakeHub Cache 和 Determinate Secure Packages,但一切从这里开始! ↩