NixOS 运维实战:升级、回滚、GC 与日常维护

NixOS 运维与维护实战:系统升级流程(稳定版/滚动版)、channel 与 flake 升级对比、nixos-rebuild 各种子命令、回滚与世代管理、垃圾回收与 store 瘦身、磁盘空间排查、备份与恢复、日常巡检清单。

引言

NixOS 的运维能力是它区别于传统发行版的最大卖点:升级可回滚、世代可管理、store 可垃圾回收。但「能回滚」不等于「会运维」——什么时候升级、怎么升级、磁盘怎么瘦身、坏了怎么恢复,本文给一套完整的 NixOS 日常运维手册。

前置:/nixos-configuration/(配置基础)、/nixos-storage-filesystems/(存储与磁盘)、/nix-flakes/(Flake 升级基础)。


目录


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 对比

维度FlakeChannel
锁定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
GCnix-collect-garbage -d
定时GCnix.gc.automatic
去重nix store optimise
配置入 gitgit 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 运维手册

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「nix」更多文章

  1. NixOS 网络与防火墙配置:声明式网络管理实战
  2. NixOS 服务管理实战:systemd 声明、NixOS 容器与常用服务部署
  3. NixOS 密钥管理实战:sops-nix、agenix 与声明式秘钥分发