ITADN
DeterminateSystems/nix-installer
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

确定性 Nix 安装程序

Crates.io CI Docs.rs License Discord

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 ActionsGitLab

平台多用户?root 专用成熟度
Linux (x86_64aarch64)✓ (通过 systemd)稳定
macOS (Apple Silicon / aarch64)稳定(见备注)
Valve Steam Deck (SteamOS)稳定
Windows Subsystem for Linux 2 (WSL2) (x86_64aarch64)✓ (通过 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-urlNIX_INSTALLER_NIX_PACKAGE_URL= 覆盖 Nix 版本,但不建议这样做,因为我们尚未测试过该组合。 以下是一些 Nix 软件包 URL 示例,包括 Nix 版本、操作系统和架构:

安装差异

与上游 Nix 安装脚本不同:

  • nix.conf 中:
    • 启用了 nix-commandflakes 功能
    • 设置了 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使用哪个日志记录器(选项为 compactfullprettyjsoncompactNIX_INSTALLER_LOGGER
--verbose启用调试日志,(-vv 用于跟踪)falseNIX_INSTALLER_VERBOSITY

安装 (nix-installer install)

Flag(s)DescriptionDefault (if any)Environment variable
--diagnostic-attribution将安装诊断关联到特定的唯一用户 IDNIX_INSTALLER_DIAGNOSTIC_ATTRIBUTION
--diagnostic-endpoint要发送的安装诊断的 URL 或文件路径NIX_INSTALLER_DIAGNOSTIC_ENDPOINT
--explain提供安装过程将对系统所做的更改的说明falseNIX_INSTALLER_EXPLAIN
--extra-conf/etc/nix.conf 的额外配置行NIX_INSTALLER_EXTRA_CONF
--force安装程序是否应强制重新创建其发现的已存在文件falseNIX_INSTALLER_FORCE
--init要配置的 init 系统(如果 --init none Nix 将仅对 root 可用)launchd (macOS), systemd (Linux)NIX_INSTALLER_INIT
--nix-build-group-idNix 构建组的 GID350 (macOS), 30000 (Linux)NIX_INSTALLER_NIX_BUILD_GROUP_ID
--nix-build-group-nameNix 构建组的名称nixbldNIX_INSTALLER_NIX_BUILD_GROUP_NAME
--nix-build-user-count要创建的构建用户数量32NIX_INSTALLER_NIX_BUILD_USER_COUNT
--nix-build-user-id-baseNix 构建用户的基础 UID(升序)(注意:第一个 UID 将是此基础值 + 1)350 (macOS), 30000 (Linux)NIX_INSTALLER_NIX_BUILD_USER_ID_BASE
--nix-build-user-prefixNix 构建用户前缀(用户编号将作为后缀添加)_nixbld (macOS), nixbld (Linux)NIX_INSTALLER_NIX_BUILD_USER_PREFIX
--nix-package-urlNix 软件包 URLNIX_INSTALLER_NIX_PACKAGE_URL
--no-confirm运行安装过程,无需显式的用户确认falseNIX_INSTALLER_NO_CONFIRM
--no-modify-profile修改用户配置文件以自动加载 Nix。trueNIX_INSTALLER_MODIFY_PROFILE
--prefer-upstream-nix指定希望安装程序安装 upstream Nix 而非 Determinate Nix。可用至 2026 年 1 月 1 日falseNIX_INSTALLER_PREFER_UPSTREAM_NIX
--proxy要使用的代理(如有);有效的代理基础为 https://$URLhttp://$URLsocks5://$URLNIX_INSTALLER_PROXY
--ssl-cert-file要使用的 SSL 证书(如有);用于获取 Nix 并设置 /etc/nix/nix.conf 中的 ssl-cert-fileNIX_INSTALLER_SSL_CERT_FILE
--no-start-daemon启动守护进程(如果未 --init nonetrueNIX_INSTALLER_START_DAEMON

您也可以通过第一个参数指定一个规划器:

nix-installer install <plan>

或者,您可以使用 NIX_INSTALLER_PLAN 环境变量:

NIX_INSTALLER_PLAN=<plan> nix-installer install

卸载 (nix-installer uninstall)

标志描述默认值 (如有)环境变量
--explain提供安装过程将对系统所做的更改的说明falseNIX_INSTALLER_EXPLAIN
--no-confirm运行安装而无需显式的用户确认falseNIX_INSTALLER_NO_CONFIRM

您也可以将安装回执指定为第一个参数(默认为 /nix/receipt.json):

nix-installer uninstall /path/to/receipt.json

规划 (nix-installer plan)

标志 (Flag)描述默认值 (如有)环境变量
--out-file写入生成的计划的位置 (JSON 格式)/dev/stdoutNIX_INSTALLER_PLAN_OUT_FILE

修复 (nix-installer repair)

标志 (Flag)描述默认值 (如有)环境变量
--no-confirm运行安装而无需显式的用户确认falseNIX_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 流水线以及安装程序会收集少量匿名诊断信息,以帮助我们实现这一目标。

我们收集的用于改进安装程序的匿名诊断信息包括:

  • 安装程序版本
  • 使用的规划器(linuxmacossteam-deck
  • 执行的操作(安装、卸载)
  • 结果(SuccessFailurePendingCancelled
  • 自定义规划器设置的名称(不是 值)
  • 有关您主机的信息,例如操作系统及版本、架构、二进制格式等
  • 您是否处于 CI 环境中
  • 关于故障的高层描述,例如某个特定命令是否失败。

要禁用诊断报告,请通过传递 --diagnostic-endpoint="" 或设置 NIX_INSTALLER_DIAGNOSTIC_ENDPOINT="" 将诊断 URL 设置为空字符串。

您可以在此处阅读 Determinate Systems(Determinate Nix Installer 的创建者)的完整隐私政策 here

Footnotes

  1. 一点历史:Determinate Nix Installer 是 Determinate Systems 作为公司持续时间最长项目。 我们后来构建了许多其他东西,例如 FlakeHubFlakeHub CacheDeterminate Secure Packages,但一切从这里开始!