30 个版本 (重大更改)

新增 0.21.0 2024年8月20日
0.20.1 2024年7月10日
0.19.1 2024年6月6日
0.17.1 2024年3月7日
0.0.0-未发布2022年12月21日

#25 in Unix APIs

Download history 179/week @ 2024-05-02 5/week @ 2024-05-16 5/week @ 2024-05-23 130/week @ 2024-06-06 6/week @ 2024-06-13 2/week @ 2024-06-20 136/week @ 2024-06-27 101/week @ 2024-07-04 55/week @ 2024-07-11 2/week @ 2024-07-18 111/week @ 2024-08-15

每月 111 次下载

LGPL-2.1

660KB
15K SLoC

确定性的Nix安装程序

Crates.io Docs.rs

一个快速、友好且可靠的工具,帮助您在 Flakes 任何地方使用 Nix。

curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install

nix-installer 已在多个环境中成功完成超过 2,000,000 次安装,包括 Github ActionsGitLab

平台 多用户 仅限 root 成熟度
Linux (x86_64 & aarch64) ✓ (通过 systemd) 稳定
MacOS (x86_64 & aarch64) 稳定(见备注)
Valve Steam Deck (SteamOS) 稳定
WSL2 (x86_64 & aarch64) ✓ (通过 systemd) 稳定
Podman Linux 容器 ✓ (通过 systemd) 稳定
Docker 容器 稳定

[!NOTE] 在 MacOS 上,如果没有图形登录的用户,则删除用户和/或组可能会失败。

使用方法

使用默认计划器和选项安装 Nix

curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install

或者,自行下载特定平台的 Installer 二进制文件

$ curl -sL -o nix-installer https://install.determinate.systems/nix/nix-installer-x86_64-linux
$ chmod +x nix-installer
$ ./nix-installer

nix-installer 通过遵循 计划 来安装 Nix,该计划由 计划器 制作。查看可用的计划器

foo@ubuntuserver2204:~$ ./nix-installer install --help
Install Nix using a planner

By default, an appropriate planner is heuristically determined based on the system.

Some planners have additional options which can be set from the planner's subcommand.

Usage: nix-installer install [OPTIONS] [PLAN]
       nix-installer install <COMMAND>

Commands:
  linux       A planner for traditional, mutable Linux systems like Debian, RHEL, or Arch
  steam-deck  A planner for the Valve Steam Deck running SteamOS
  ostree      A planner suitable for immutable systems using ostree, such as Fedora Silverblue
  help        Print this message or the help of the given subcommand(s)
# ...

计划器有自己的选项和默认值,其中大部分是通用的

$ ./nix-installer install linux --help
A planner for Linux installs

Usage: nix-installer install linux [OPTIONS]

Options:
# ...
      --nix-build-group-name <NIX_BUILD_GROUP_NAME>
          The Nix build group name

          [env: NIX_INSTALLER_NIX_BUILD_GROUP_NAME=]
          [default: nixbld]

      --nix-build-group-id <NIX_BUILD_GROUP_ID>
          The Nix build group GID

          [env: NIX_INSTALLER_NIX_BUILD_GROUP_ID=]
          [default: 3000]
# ...

计划器可以通过环境变量或命令行参数进行配置

$ 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
# Or...
$ NIX_BUILD_GROUP_NAME=nixbuilder ./nix-installer install --nix-build-group-id 4000

故障排除

安装程序有问题吗?请参阅我们的 故障排除指南,看看您的问题是否被涵盖。

Nix 升级

您可以通过运行以下命令将Nix升级到我们目前推荐的版本:

sudo -i nix upgrade-nix

或者,您也可以通过使用不同版本的nix-installer卸载重新安装

卸载

您可以通过运行以下命令来移除由nix-installer安装的Nix:

/nix/nix-installer uninstall

作为Github Action

您可以使用如下方式的nix-installer-action Github Action:

on:
  pull_request:
  push:
    branches: [main]

jobs:
  lints:
    name: Build
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v3
      - name: Install Nix
        uses: DeterminateSystems/nix-installer-action@main
      - name: Run `nix build`
        run: nix build .

在GitLab上

GitLab CI运行器通常是基于Docker的,并以root用户身份运行。这意味着systemd不可用,因此需要将--init none选项传递给Linux计划器。

在默认的GitLab.com运行器上,您可以这样安装和使用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 install 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
# 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 init的容器

# 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在PowerShell中打开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-installer试图提供全面且无特性干扰的经验,但不幸的是,有些问题可能需要手动干预或操作员的选择。

nix-darwin仍然安装的情况下,从MacOS移除nix后,网络请求失败

如果先未卸载nix-darwin就卸载了nix,用户可能会遇到类似以下错误

$ nix shell nixpkgs#curl
error: unable to download 'https://cache.nixos.org/g8bqlgmpa4yg601w561qy2n576i6g0vh.narinfo': Problem with the SSL CA cert (path? access rights?) (77)

这是因为nix-darwin提供了一种名为org.nixos.activate-system的服务,它在Nix卸载后仍然存在。此状态下的org.nixos.activate-system服务与新的Nix交互,并将其使用的SSL证书更改为一个损坏的符号链接。

$ ls -lah /etc/ssl/certs
total 0
drwxr-xr-x  3 root  wheel    96B Oct 17 08:26 .
drwxr-xr-x  6 root  wheel   192B Sep 16 06:28 ..
lrwxr-xr-x  1 root  wheel    41B Oct 17 08:26 ca-certificates.crt -> /etc/static/ssl/certs/ca-certificates.crt

由于 nix-darwin 卸载器 在卸载 Nix 后将无法正常工作(因为它使用 Nix 并需要网络连接),因此问题变得更加复杂。

可以通过删除 org.nixos.activate-system 服务和 ca-certificates 来解决这种情况。

$ sudo rm /Library/LaunchDaemons/org.nixos.activate-system.plist
$ sudo launchctl bootout system/org.nixos.activate-system
$ /nix/nix-installer uninstall
$ sudo rm /etc/ssl/certs/ca-certificates.crt

然后再次运行 nix-installer,它应该可以正常工作。

更新的 nix-installer 版本会在卸载 nix-darwin 之前拒绝卸载,从而有助于缓解这个问题。

构建二进制文件

由于您将使用 nix-installer 在没有 Nix 的系统上安装 Nix,默认构建是静态二进制文件。

在具有 Nix 的系统上构建可移植的 Linux 二进制文件

# to build a local copy
nix build -L ".#nix-installer-static"
# to build the remote main development branch
nix build -L "github:determinatesystems/nix-installer#nix-installer-static"
# for a specific version of the installer:
export NIX_INSTALLER_TAG="v0.6.0"
nix build -L "github:determinatesystems/nix-installer/$NIX_INSTALLER_TAG#nix-installer-static"

在 Mac 上

# to build a local copy
nix build -L ".#nix-installer"
# to build the remote main development branch
nix build -L "github:determinatesystems/nix-installer#nix-installer"
# for a specific version of the installer:
export NIX_INSTALLER_TAG="v0.6.0"
nix build -L "github:determinatesystems/nix-installer/$NIX_INSTALLER_TAG#nix-installer"

然后将 result/bin/nix-installer 复制到您希望运行它的机器上。

您还可以通过 cargonix-installer 添加到没有 Nix 的系统中,无需担心任何系统依赖。

# to build and run a local copy
RUSTFLAGS="--cfg tokio_unstable" cargo run -- --help
# to build the remote main development branch
RUSTFLAGS="--cfg tokio_unstable" cargo install --git https://github.com/DeterminateSystems/nix-installer
nix-installer --help
# for a specific version of the installer:
export NIX_INSTALLER_TAG="v0.6.0"
RUSTFLAGS="--cfg tokio_unstable" cargo install --git https://github.com/DeterminateSystems/nix-installer --tag $NIX_INSTALLER_TAG
nix-installer --help

为了使此构建可移植,请传递 --target x86_64-unknown-linux-musl

[!NOTE] 由于我们使用 Tokio 的进程组,它封装了稳定的 std API,但因其需要 MSRV 升级而不稳定,我们目前需要 --cfg tokio_unstable

作为库

[!WARNING] 作为库的使用仍然是实验性的。此功能可能会在未来没有倡导者的情况下被移除。如果您正在使用此功能,请告诉我们,我们可以制定一个稳定化的路径。

nix-installer 添加到您的依赖中

cargo add nix-installer

如果您正在 构建 CLI,请查看 clap 集成的 cli 功能标志。

您还需要编辑您的 .cargo/config.toml 以使用 tokio_unstable,因为我们使用 Tokio 的进程组,它封装了稳定的 std API,但由于需要 MSRV 升级而不稳定。

# .cargo/config.toml
[build]
rustflags=["--cfg", "tokio_unstable"]

您还需要设置环境变量 NIX_INSTALLER_TARBALL_PATH,使其指向适当的 Nix 安装 tarball,例如 nix-2.21.2-aarch64-darwin.tar.xz。这些内容嵌入到生成的二进制文件中,而不是在安装时下载。

然后您可以查看 文档

cargo doc --open -p nix-installer

文档也可通过 nix 构建

nix build github:DeterminateSystems/nix-installer#nix-installer.doc
firefox result-doc/nix-installer/index.html

访问其他版本

对于希望进行版本固定的用户,可以在 curl 命令中指定要使用的 nix-installer 版本。

VERSION="v0.6.0"
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix/tag/${VERSION} | sh -s -- install

要发现哪些版本可用或下载任何发布版本的二进制文件,请检查 Github 发布

这些发布版本可以直接下载和使用。

VERSION="v0.6.0"
ARCH="aarch64-linux"
curl -sSf -L https://github.com/DeterminateSystems/nix-installer/releases/download/${VERSION}/nix-installer-${ARCH} -o nix-installer
./nix-installer install

每个安装程序版本都有一个 相关的支持 Nix 版本 -- 如果您固定安装程序版本,您也将间接固定到相关的 Nix 版本。

您还可以通过 --nix-package-urlNIX_INSTALLER_NIX_PACKAGE_URL= 覆盖 nix 版本,但这样做并不推荐,因为我们尚未测试该组合。以下是一些包含 nix 版本、操作系统和架构的示例 nix 软件包 URL:

安装差异

与上游 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

动机

现有的上游脚本做得很好,但是难以维护。

脚本中使用的shell实现和工具之间的细微差异使得对安装程序的实质性更改变得困难。

确定性的Nix安装程序具有许多优点

  • 在macOS升级中存活
  • 保留安装收据以便轻松卸载
  • 为用户提供机会审查准确、计算的安装计划
  • 拥有“规划者”,可以为复杂的目标创建适当的安装计划
  • 为失败的安装用户提供最佳努力恢复的机会
  • 通过最大化并行操作来提高性能
  • 支持扩展的测试套件,包括“治疗”案例
  • 支持SELinux和基于OSTree的发行版,而不要求用户做出妥协
  • 作为一个单一、静态的二进制文件,具有外部依赖项(如 openssl),仅在必要时调用现有系统工具(如 useradd
  • 作为MacOS远程构建目标,确保 nix 不在路径中缺失

与Nix安装程序工作组和其他更广泛社区的其他参与者合作真是太好了。工作组维护了一个由基金会拥有的安装程序分支

安装程序设置

确定性的Nix安装程序提供了各种配置设置,一些是通用的,一些是按命令设置的。所有设置都可以通过标志或通过 NIX_INSTALLER_* 环境变量访问。

通用设置

这些设置适用于所有命令。

标志(s) 描述 默认(如果有) 环境变量
--log-directives 以逗号分隔的跟踪指令 NIX_INSTALLER_LOG_DIRECTIVES
--logger 使用哪个记录器(选项为 compactfullprettyjson compact NIX_INSTALLER_LOGGER
--verbose 启用调试日志,(-vv 用于跟踪) false NIX_INSTALLER_VERBOSITY

安装(《nix-installer install》)

标志(s) 描述 默认(如果有) 环境变量
--diagnostic-attribution 将安装诊断与特定值相关联 NIX_INSTALLER_DIAGNOSTIC_ATTRIBUTION
--diagnostic-endpoint 发送安装诊断的URL或文件路径 https://install.determinate.systems/nix/diagnostic NIX_INSTALLER_DIAGNOSTIC_ENDPOINT
--explain 提供安装过程将对系统做出的更改的解释 false NIX_INSTALLER_EXPLAIN
--extra-conf /etc/nix.conf提供的额外配置行 NIX_INSTALLER_EXTRA_CONF
--force 如果nix-installer应强制重新创建它找到的现有文件 false NIX_INSTALLER_FORCE
--init 配置哪个初始化系统(如果--init none,Nix将仅作为root运行) launchd(macOS),systemd(Linux) NIX_INSTALLER_INIT
--nix-build-group-id Nix构建组的GID 30000 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(递增) 300(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
--proxy 要使用的代理(如果有的话);有效的代理基础是https://$URLhttp://$URLsocks5://$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

标志(s) 描述 默认(如果有) 环境变量
--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

标志(s) 描述 默认(如果有) 环境变量
--out-file 将生成的计划(JSON格式)写入的位置 /dev/stdout NIX_INSTALLER_PLAN_OUT_FILE

修复(nix-installer repair

标志(s) 描述 默认(如果有) 环境变量
--no-confirm 运行安装而不需要显式用户确认 false NIX_INSTALLER_NO_CONFIRM

自检(nix-installer self-test

nix-installer self-test仅接受通用设置

诊断

Determinate Nix安装器的目标是成功且正确地安装Nix。通过curl | sh管道和安装器收集少量诊断信息以帮助我们实现这一目标。

以下是我们收集的诊断数据表

字段 用途
version Determinate Nix安装器的版本。
planner Nix(Linux、macos、steam-deck)的安装方法
configured_settings 从默认值更改的规划器设置名称。不包括值。
os_name 正在运行的操作系统。
os_version 操作系统的版本。
triple 您的系统的体系结构/操作系统/二进制格式。
is_ci 安装程序是否在CI(例如GitHub Actions)中使用。
action 可以是InstallUninstall
status 可以是SuccessFailurePendingCancelled之一。
attribution 用户可以可选定义,将此运行的诊断与提供的值关联。
failure_chain 如果有失败,请提供失败的高级描述。例如:如果命令diskutil list失败,则为Command("diskutil")

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

您可以在Determinate Systems的完整隐私策略中阅读,Determinate Systems是Determinate Nix Installer的创建者,此处

依赖关系

~18–36MB
~607K SLoC