引言
NixOS 的运维能力是它区别于传统发行版的最大卖点:升级可回滚、世代可管理、store 可垃圾回收。但「能回滚」不等于「会运维」——什么时候升级、怎么升级、磁盘怎么瘦身、坏了怎么恢复,本文给一套完整的 NixOS 日常运维手册。
前置:/nixos-configuration/(配置基础)、/nixos-storage-filesystems/(存储与磁盘)、/nix-flakes/(Flake 升级基础)。
目录
- 1. 世代与回滚:NixOS 的核心保障
- 2. nixos-rebuild 命令全解析
- 3. 升级流程:稳定版 vs 滚动版
- 4. Flake 升级 vs Channel 升级
- 5. 垃圾回收与 store 瘦身
- 6. 磁盘空间排查与清理
- 7. 备份与恢复
- 8. 系统监控与巡检
- 9. 故障处理与急救
- 10. 速查表与一句话记忆
- 延伸阅读
1. 世代与回滚:NixOS 的核心保障
1.1 什么是世代(Generation)
每次 nixos-rebuild switch 生成一个新的「系统世代」,旧的完整保留——可以随时回到任意历史状态。
nixos-rebuild list-generations # 列出所有世代
# 27 2026-09-01 ... (current)
# 26 2026-08-28 ...
1.2 回滚
nixos-rebuild switch --rollback # 回到上一个世代
nixos-rebuild switch --rollback-to 25 # 回到第 25 世代
记忆:每次 rebuild 生成新世代、旧世代完整保留;list-generations 查看、–rollback 回退,这是 NixOS 防翻车的底牌。
2. nixos-rebuild 命令全解析
2.1 子命令对照
| 子命令 | 效果 |
|---|---|
switch | 构建并切换到新系统(推荐) |
boot | 构建但等下次重启生效 |
test | 构建并临时切换(重启恢复) |
dry-build | 只构建不切换 |
build | 构建但不安装 |
list-generations | 查看世代 |
2.2 常用组合
nixos-rebuild switch --flake .#myhost # 按 flake 配置切换
nixos-rebuild switch -I nixos-config=/etc/nixos/configuration.nix # 经典配置
nixos-rebuild dry-run # 演练,看会改什么
记忆:switch 日常用、boot 谨慎重启生效、test 临时试、dry-build/dry-run 先演练。
3. 升级流程:稳定版 vs 滚动版
3.1 版本分支
| 分支 | 更新频率 | 适合 |
|---|---|---|
| 稳定版(nixos-24.11 等) | 半年一版 | 生产/服务器 |
| 滚动版(unstable) | 每日 | 桌面/尝鲜 |
3.2 稳定版升级流程
# 1. 更新 channel(或 flake 输入)
sudo nix-channel --update
# 2. 构建并切换(先 dry-run 演练)
nixos-rebuild dry-run
nixos-rebuild switch
# 3. 验证关键服务
systemctl status nginx
# 4. 确认无误后清理旧世代
nix-collect-garbage -d
记忆:生产用稳定版、桌面可滚动版;升级 = 更新 channel → dry-run 演练 → switch → 验证服务 → 确认后 GC 清理。
4. Flake 升级 vs Channel 升级
4.1 Flake 方式(现代)
nix flake update nixpkgs # 更新锁定 nixpkgs 输入
nixos-rebuild switch --flake .#myhost
4.2 Channel 方式(经典)
sudo nix-channel --update
nixos-rebuild switch
4.3 对比
| 维度 | Flake | Channel |
|---|---|---|
| 锁定 | flake.lock 精确锁定 | channel 指针 |
| 可复现 | 强 | 较弱 |
| 多环境 | 按 host 输出 | 全局一套 |
| 现代度 | 推荐 | 兼容 |
记忆:升级优先用 Flake(nix flake update + switch);channel 是经典兼容路径;Flake 靠 flake.lock 精确锁定更可复现。
5. 垃圾回收与 store 瘦身
5.1 垃圾回收原理
Nix store 内容寻址、可共享,但旧世代/旧构建会残留。GC 删除不再被引用的路径。
nix-collect-garbage # 删除未被引用路径
nix-collect-garbage -d # 删除旧世代(-d 连历史世代一起)
5.2 保留策略
# 保留最近 N 代系统 + N 天
nix-collect-garbage --delete-older-than 30d
# 定期自动 GC
systemd.services = {
gc = { ... }; # 或配 nix.gc 服务
};
nix.gc = { automatic = true; dates = "weekly"; options = "--delete-older-than 30d"; };
记忆:GC 删除未被引用路径;-d 连旧世代一起删、–delete-older-than 30d 按时间保保留;配 nix.gc.automatic 定期自动清理。
6. 磁盘空间排查与清理
6.1 store 占多大
du -sh /nix/store
nix path-info -sh --all | sort -h | tail # 最大路径
6.2 清理思路
| 手段 | 效果 |
|---|---|
nix-collect-garbage -d | 删旧世代+孤儿 |
nix store optimise | 硬链接去重(自动) |
| 清理日志 | journalctl –vacuum-size=500M |
| 排查大目录 | du -sh /* |
6.3 常见坑
升级后 store 暴涨 → 通常依赖闭包变大,先 GC 观察
某路径被锁定 → 检查是否被 chroot/journal 引用
记忆:磁盘排查先 du -sh /nix/store,再 nix-collect-garbage -d、nix store optimise 去重、journalctl vacuum 清日志。
7. 备份与恢复
7.1 配置即备份
NixOS 最轻的「备份」是配置进 git——换机恢复只需重装+拉取配置:
git init /etc/nixos && git add -A && git commit # 配置入 git
7.2 数据备份
# 用 restic/borg 定时备份(声明式)
services.restic.backups.data = {
initialize = true;
repository = "sftp:backup@host:/repo";
paths = [ "/data" ];
timerConfig.OnCalendar = "daily";
};
7.3 恢复流程
① 全新安装 NixOS
② git clone 配置到 /etc/nixos
③ nixos-rebuild switch --flake .#host
④ 恢复数据(restic restore / rsync)
记忆:配置进 git 是最轻备份;数据用 restic/borg 声明式定时备份;换机恢复 = 重装 → 拉配置 → rebuild → 恢复数据。
8. 系统监控与巡检
8.1 监控基础
systemctl list-units --failed # 失败单元
journalctl -p err -b # 本次启动错误日志
df -h # 磁盘
top / htop # 负载
8.2 自动化巡检
# 定期健康检查
systemd.timers.health-check = { ... };
# 或接入 Prometheus/node_exporter
services.prometheus = { ... };
记忆:巡检看失败单元、错误日志、磁盘与负载;关键系统配 systemd.timer 自动健康检查或 node_exporter 接监控。
9. 故障处理与急救
9.1 常见故障
| 故障 | 处理 |
|---|---|
| 升级后服务起不来 | 回滚 --rollback |
| 配置错误导致无法启动 | 进 grub 选旧世代 |
| store 损坏 | nix-store --verify 修复 |
| 磁盘满 | 救援模式 GC |
9.2 急救三步
① 回滚(--rollback 或 grub 旧世代)
② 最小化进系统修配置
③ 验证通过再正常 switch
记忆:NixOS 故障先回滚——nixos-rebuild –rollback 或 grub 里选旧世代;store 损坏用 nix-store –verify;修好配置再正常 switch。
10. 速查表与一句话记忆
| 操作 | 命令 |
|---|---|
| 查看世代 | nixos-rebuild list-generations |
| 回滚 | nixos-rebuild switch –rollback |
| 升级(flake) | nix flake update && switch |
| 升级(channel) | nix-channel –update && switch |
| GC | nix-collect-garbage -d |
| 定时GC | nix.gc.automatic |
| 去重 | nix store optimise |
| 配置入 git | git init /etc/nixos |
| 数据备份 | services.restic |
| 巡检 | journalctl -p err -b |
一句话记忆:NixOS 运维的核心是世代与回滚——每次 nixos-rebuild switch 生成新世代,–rollback 一键回退;升级按「更新输入 → dry-run 演练 → switch → 验证 → 确认后 GC」流程;垃圾回收用 nix-collect-garbage -d、按时间保留用 –delete-older-than、配 nix.gc.automatic 自动清理;配置进 git 是最轻备份、数据用 restic 声明式备份;故障先回滚(–rollback 或 grub 旧世代)、store 损坏 nix-store –verify——「能回滚」是 NixOS 运维最大的底气。
延伸阅读
- /nixos-configuration/ — configuration.nix 基础
- /nix-flakes/ — Flake 工作流与升级
- /nixos-storage-filesystems/ — 磁盘与文件系统
- /nixos-network-firewall/ — 网络与防火墙
- /nix-deployment-tools/ — 远程部署与回滚
- [[linux]] — Linux 系统运维
- [[devops]] — 运维与可观测性
- NixOS 运维手册
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。