Skip to content

在恶劣环境的行动指南

在恶劣环境的行动指南

所谓恶劣环境,通常不是某一个问题,而是几个问题叠在一起:网络慢、权限少、系统旧、磁盘紧、机器随时可能被重装。行动的原则不是优雅,而是可验证、可回滚、可重复。

第一部分:安装 Nix

Nix 的价值在于把“环境”从机器里拆出来。只要 /nix/store 和配置还在,软件、依赖和构建结果就有机会被复用;即使机器被换掉,也能把环境重新拉起来。

但要先接受一个事实:Nix 不是一个普通的用户态小工具。它默认需要 /nix,多用户安装还需要创建构建用户和启动 nix-daemon。如果现场完全没有 sudo,也不能让管理员帮你创建 /nix,那就不要在这一步硬拼,先改用容器、跳板机,或者争取一次性初始化权限。

1. 判断现场

先确认系统、权限、磁盘和网络:

1
2
3
4
5
6
uname -a
id
command -v sudo || true
command -v systemctl || true
df -h / /nix 2>/dev/null || df -h /
curl -I https://nixos.org/nix/install

按下面的顺序选安装方式:

  • Linux + systemd + 有 sudo:优先多用户安装。
  • macOS:使用官方 macOS 安装命令。
  • WSL2 + systemd:按 Linux 多用户安装处理。
  • 单用户机器、临时机器、权限有限但能创建 /nix:考虑单用户安装。
  • 完全没有 /nix 创建或写入权限:暂停,不要把时间浪费在伪装成安装的失败上。

2. 多用户安装

这是 Linux 上最推荐的方式,适合服务器、工作站和多人共用机器:

1
curl --proto '=https' --tlsv1.2 -L https://nixos.org/nix/install | sh -s -- --daemon

安装脚本会做几件关键的事:

  • 创建 /nix
  • 创建 nixbld 构建用户组和若干构建用户。
  • 安装并启用 nix-daemon
  • 修改系统级 shell 初始化文件,让新 shell 能找到 Nix。

安装结束后,重新打开一个 shell,或者手动加载环境:

1
2
3
4
5
if [ -e /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh ]; then
. /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
fi

nix --version

如果是 systemd 系统,再检查 daemon:

1
systemctl status nix-daemon.socket nix-daemon.service

3. macOS 安装

macOS 直接使用官方安装命令:

1
curl --proto '=https' --tlsv1.2 -L https://nixos.org/nix/install | sh

安装后重新打开终端,再检查:

1
nix --version

如果刚升级过 macOS,又遇到 _nixbld1nixbld 之类的构建用户错误,先不要反复重装。优先查官方安装页和对应的 Nix issue,因为这类问题通常和系统升级后的用户、卷或 daemon 状态有关。

4. 单用户安装

单用户安装适合个人临时环境,不适合多人共享机器:

1
curl --proto '=https' --tlsv1.2 -L https://nixos.org/nix/install | sh -s -- --no-daemon

注意两点:

  • 不要在 root 用户下做单用户安装。
  • 如果 /nix 已经存在但权限不对,先停下来确认它是谁创建的,不要直接 chown -R

加载环境并验证:

1
2
3
4
5
if [ -e "$HOME/.nix-profile/etc/profile.d/nix.sh" ]; then
. "$HOME/.nix-profile/etc/profile.d/nix.sh"
fi

nix --version

5. 打开新命令和 flakes

很多现代 Nix 用法依赖 nix-commandflakes。单独安装的 Nix 可以先写到用户配置:

1
2
3
4
5
6
mkdir -p ~/.config/nix
touch ~/.config/nix/nix.conf

if ! grep -q '^experimental-features' ~/.config/nix/nix.conf; then
printf '%s\n' 'experimental-features = nix-command flakes' >> ~/.config/nix/nix.conf
fi

多用户安装如果希望对所有用户生效,可以写入 /etc/nix/nix.conf

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/nix
sudo touch /etc/nix/nix.conf

if ! grep -q '^experimental-features' /etc/nix/nix.conf; then
echo 'experimental-features = nix-command flakes' | sudo tee -a /etc/nix/nix.conf
fi

sudo systemctl restart nix-daemon.socket nix-daemon.service

验证:

1
2
nix flake --help >/dev/null
nix run nixpkgs#hello

6. 国内网络下的 binary cache

如果访问 cache.nixos.org 很慢,可以先给 Nix 增加国内镜像。单用户安装改 ~/.config/nix/nix.conf

1
2
3
4
mkdir -p ~/.config/nix
cat >> ~/.config/nix/nix.conf <<'EOF'
substituters = https://mirrors.ustc.edu.cn/nix-channels/store https://cache.nixos.org/
EOF

多用户安装改 /etc/nix/nix.conf

1
2
3
4
5
6
sudo mkdir -p /etc/nix
cat <<'EOF' | sudo tee -a /etc/nix/nix.conf
substituters = https://mirrors.ustc.edu.cn/nix-channels/store https://cache.nixos.org/
EOF

sudo systemctl restart nix-daemon.socket nix-daemon.service

这一步只替换包缓存,不等于解决所有网络问题。Flake input、GitHub、GitLab、私有仓库、Cachix 仍然可能慢。真正恶劣的网络里,要把“能缓存的东西缓存起来”,不要期待每台机器都从公网现拉。

7. 最小可用性检查

安装结束后,不要立刻开始写复杂配置。先做最小闭环:

1
2
3
4
nix --version
nix store ping --store daemon 2>/dev/null || true
nix run nixpkgs#hello
nix shell nixpkgs#git nixpkgs#ripgrep -c git --version

如果这些命令通过,说明 Nix 本体、环境变量、daemon 或单用户 profile、基础下载和执行路径都基本可用。

8. 失败时先看这几处

nix: command not found

1
2
3
4
5
test -e /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && \
. /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh

test -e "$HOME/.nix-profile/etc/profile.d/nix.sh" && \
. "$HOME/.nix-profile/etc/profile.d/nix.sh"

daemon 不工作:

1
2
systemctl status nix-daemon.socket nix-daemon.service
journalctl -u nix-daemon.service -n 100 --no-pager

下载慢:

1
2
nix --option substituters 'https://mirrors.ustc.edu.cn/nix-channels/store https://cache.nixos.org/' \
run nixpkgs#hello

磁盘不够:

1
2
3
df -h /nix
nix store gc
nix store optimise

环境混乱:

1
2
3
type -a nix
echo "$PATH" | tr ':' '\n' | grep nix
nix show-config | sed -n '1,120p'

9. 参考

About this Post

This post is written by KaranocaVe.

#Linux #Nix #运维 #环境配置