️ 为什么要清理?#
成功构建系统会在 /nix/store 产生系统闭包;切换系统 profile 后形成可选择的世代(generation)。旧世代的引用保护其依赖,后续可以选用旧配置。重复切换同一输出不应理解为一定生成不同的软件版本。
- 好处:你可以随时在启动菜单里选择旧版本回滚。
- 代价:硬盘空间会被迅速占满。
️ 第一阶段:手动清理#
1. 清理旧版本 (Generations)
# 查看目前的版本
nixos-rebuild list-generations
# 删除旧版本(保留当前版本)
sudo nix-env --delete-generations old --profile /nix/var/nix/profiles/system2. 垃圾回收 (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 --rollback2. 启动菜单回滚
如果系统无法进入桌面,直接在 GRUB/systemd-boot 菜单里选择前一个版本启动。
给 Arch 用户的建议#
不要像在 Arch 里那样频繁清理缓存。Nix 的存储模型很特别,有时候保留最近的 2-3 个 Generation 能救你的命。
总结#
- Generation:系统配置闭包和 profile 的历史引用,不是用户文件、数据库或整块文件系统快照。
- GC:释放未被 GC roots 保护的 store 对象,仍有引用的依赖会保留。
- Optimize:节省重复文件的磁盘开销。
回滚前提
删除旧世代可能使对应引导项失去所需 store 内容。配置回滚不会撤销应用写入的数据或数据库迁移;系统变更与数据备份应分别设计。switch --rollback 会即时激活旧配置,属于实际应用操作。
参考与延伸
根据技术笔记重新整理,示例使用通用名称。