OFFSET偏移
← 文章目录OFFSET / FIELD NOTESNO. 084

垃圾回收、存储优化与回滚世代

区分删除世代引用、回收 store 对象和切换旧系统配置。

所在专题Nix 命令与长期维护 ↗
约 4 分钟阅读开始阅读

️ 为什么要清理?#

成功构建系统会在 /nix/store 产生系统闭包;切换系统 profile 后形成可选择的世代(generation)。旧世代的引用保护其依赖,后续可以选用旧配置。重复切换同一输出不应理解为一定生成不同的软件版本。

  • 好处:你可以随时在启动菜单里选择旧版本回滚。
  • 代价:硬盘空间会被迅速占满。

️ 第一阶段:手动清理#

1. 清理旧版本 (Generations)

# 查看目前的版本
nixos-rebuild list-generations
# 删除旧版本(保留当前版本)
sudo nix-env --delete-generations old --profile /nix/var/nix/profiles/system

2. 垃圾回收 (Garbage Collection)

删除旧版本只是去掉了引用。要真正释放硬盘空间,需要执行:

sudo nix-collect-garbage
# 另一个更激进的选择:会先删除找到的旧 profile 世代
# sudo nix-collect-garbage -d
  • -d:先删除找到的 profile 的旧世代,再对未被任何 GC root 引用的对象回收;不是简单地只清理当前系统之外的软件,也不会保留最近两三代。

第二阶段:自动化维护#

在 configuration.nix 里配置自动清理,再也不用手动运行命令。

{
  # 自动垃圾回收
  nix.gc = {
    automatic = true;
    dates = "weekly";
    options = "--delete-older-than 7d";
  };

  # 自动优化存储 (将相同的文件硬链接到一起)
  nix.settings.auto-optimise-store = true;
}

第三阶段:回滚的艺术#

1. 临时回滚 (不重启)

如果你发现刚装的配置有问题,不需要重启:

sudo nixos-rebuild switch --rollback

2. 启动菜单回滚

如果系统无法进入桌面,直接在 GRUB/systemd-boot 菜单里选择前一个版本启动。

给 Arch 用户的建议#

不要像在 Arch 里那样频繁清理缓存。Nix 的存储模型很特别,有时候保留最近的 2-3 个 Generation 能救你的命。

总结#

  1. Generation:系统配置闭包和 profile 的历史引用,不是用户文件、数据库或整块文件系统快照。
  2. GC:释放未被 GC roots 保护的 store 对象,仍有引用的依赖会保留。
  3. Optimize:节省重复文件的磁盘开销。

回滚前提

删除旧世代可能使对应引导项失去所需 store 内容。配置回滚不会撤销应用写入的数据或数据库迁移;系统变更与数据备份应分别设计。switch --rollback 会即时激活旧配置,属于实际应用操作。

参考与延伸

  1. Nix 垃圾回收命令 ↗
  2. NixOS 回滚 ↗

根据技术笔记重新整理,示例使用通用名称。

沿专题继续阅读

Nix 命令与长期维护

  1. 01NixOS 学习路线:基础、Flakes、用户配置与进阶
  2. 02Nix 命令详解:构建、环境、profile 与系统
  3. 03nh:统一 Nix 系统、用户和清理工作流
  4. 04垃圾回收、存储优化与回滚世代
  5. 05NixOS 配置组织、维护与排错实践
CONTINUE READING / 下一篇Colmena:多节点构建、传输与激活

用 hive 组织节点配置,明确本地构建与远程应用的边界。