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
每月 111 次下载
660KB
15K SLoC
确定性的Nix安装程序
一个快速、友好且可靠的工具,帮助您在 Flakes 任何地方使用 Nix。
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install
nix-installer
已在多个环境中成功完成超过 2,000,000 次安装,包括 Github Actions 和 GitLab
平台 | 多用户 | 仅限 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
权限的用户可以运行Nixsudo -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
权限的用户可以运行Nixsudo -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
权限的用户可以运行Nixsudo -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
复制到您希望运行它的机器上。
您还可以通过 cargo
将 nix-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-url
或 NIX_INSTALLER_NIX_PACKAGE_URL=
覆盖 nix
版本,但这样做并不推荐,因为我们尚未测试该组合。以下是一些包含 nix 版本、操作系统和架构的示例 nix
软件包 URL:
- 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
动机
现有的上游脚本做得很好,但是难以维护。
脚本中使用的shell实现和工具之间的细微差异使得对安装程序的实质性更改变得困难。
确定性的Nix安装程序具有许多优点
- 在macOS升级中存活
- 保留安装收据以便轻松卸载
- 为用户提供机会审查准确、计算的安装计划
- 拥有“规划者”,可以为复杂的目标创建适当的安装计划
- 为失败的安装用户提供最佳努力恢复的机会
- 通过最大化并行操作来提高性能
- 支持扩展的测试套件,包括“治疗”案例
- 支持SELinux和基于OSTree的发行版,而不要求用户做出妥协
- 作为一个单一、静态的二进制文件,具有外部依赖项(如
openssl
),仅在必要时调用现有系统工具(如useradd
) - 作为MacOS远程构建目标,确保
nix
不在路径中缺失
与Nix安装程序工作组和其他更广泛社区的其他参与者合作真是太好了。工作组维护了一个由基金会拥有的安装程序分支。
安装程序设置
确定性的Nix安装程序提供了各种配置设置,一些是通用的,一些是按命令设置的。所有设置都可以通过标志或通过 NIX_INSTALLER_*
环境变量访问。
通用设置
这些设置适用于所有命令。
标志(s) | 描述 | 默认(如果有) | 环境变量 |
---|---|---|---|
--log-directives |
以逗号分隔的跟踪指令 | NIX_INSTALLER_LOG_DIRECTIVES |
|
--logger |
使用哪个记录器(选项为 compact ,full ,pretty 和 json ) |
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://$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
)
标志(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 |
可以是Install 或Uninstall 。 |
status |
可以是Success 、Failure 、Pending 或Cancelled 之一。 |
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