NixOS 配置回滚完全指南:从 GRUB 启动菜单到 `nixos-rebuild --rollback`
包管理器操作系统【免费下载链接】nixpkgsNix Packages collection NixOS项目地址https://gitcode.com/GitHub_Trending/ni/nixpkgs点击查看免费下载导读在 NixOS 中执行nixos-rebuild switch切换到新配置后如果新配置表现不佳服务起不来、桌面进不去、内核不兼容等你并不需要手动修复系统——NixOS 的每次配置切换都会以 generation代际的形式留存历史快照回滚到任意一个旧配置只是几步命令的事。本文基于 NixOS 官方手册 rollback.section.md 展开结合 nixpkgs 仓库中 GRUB 引导器生成逻辑、switch-to-configuration激活脚本等源码实现系统讲解两条回滚路径通过引导菜单在重启时回到旧配置以及在运行中的系统里直接切换回上一个配置。读完本文你将能熟练使用nixos-rebuild switch --rollback、手动调用switch-to-configuration并理解回滚背后的 generation、profile 与垃圾回收机制。一、为什么 NixOS 能一键回滚不可变存储与 generation要理解回滚先要理解 NixOS 的一个基本事实每次nixos-rebuild都会构建出一个全新的、内容寻址的 store 路径如/nix/store/202b...-nixos-13.07pre4932_5a676e4-4be1055旧配置的路径不会被覆盖只要没有被垃圾回收garbage-collect它就始终存在于 Nix store 中。每个已部署的配置会作为/nix/var/nix/profiles/system这一 profile 的一个 generation 被记录下来通过形如system-N-link的符号链接指回对应的 store 路径。这也是官方手册中用来枚举可用配置的命令$ ls -l /nix/var/nix/profiles/system-*-link ... lrwxrwxrwx 1 root root 78 Aug 12 13:54 /nix/var/nix/profiles/system-268-link - /nix/store/202b...-nixos-13.07pre4932_5a676e4-4be1055这里N如 268是系统配置的代际编号编号越大表示越新。需要强调的是回滚的前提是旧配置还没有被垃圾回收。官方文档也明确指出GRUB 引导菜单只能列出hasnt been garbage-collected的配置清理旧配置的方法可参考 cleaning-store.chapter.md其中同样确认了NixOS system configurations are stored in the profile/nix/var/nix/profiles/system。二、方式一从 GRUB 引导菜单回滚适合系统无法启动的情况如果新配置严重到无法正常启动例如内核或 initrd 出问题这是唯一的回滚途径。2.1 操作步骤重启机器进入 GRUB 引导菜单。打开子菜单NixOS - All configurations这里列出了所有尚未被垃圾回收的历史配置。选择要回退到的那一代配置条目通常会附带日期与版本信息形如NixOS - Configuration 268 (2026-09-20 - 25.05...)。正常启动进入该系统。2.2 启动后把它设为默认配置从旧配置启动后当前运行中的系统路径/run/current-system已经是该旧配置。但为了让后续重启也默认进入这一配置而不只是本次引导需要执行# /run/current-system/bin/switch-to-configuration bootboot这个动作的含义是把当前配置设为下次启动的默认项但不立即切换运行状态。从 nixpkgs 仓库的源码 what-happens-during-a-system-switch.chapter.md 可以确认switch-to-configuration支持switch、test、boot等动作其中如果动作是switch或boot会先更新引导器使该配置成为下一次启动的配置。也就是说用boot动作更新的是引导器层用switch动作则还会在运行中完成单位切换与激活。2.3 底层原理GRUB 子菜单是怎么生成的All configurations 子菜单并非 GRUB 自动识别而是 NixOS 在每次构建引导器配置时由 install-grub.pl 中的addProfile子程序见 install-grub.pl#L575-L612生成的。其核心逻辑# Emit submenus for all system profiles. sub addProfile { my ($profile, $description) _; # Add entries for all generations of this profile. $conf . submenu \$description\ --class submenu {\n; sub nrFromGen { my ($x) _; $x ~ /\/\w-(\d)-link/; return $1; } my links sort { nrFromGen($b) nrFromGen($a) } (glob $profile-*-link); ... } addProfile /nix/var/nix/profiles/system, distroName - All configurations;这段代码清晰地展示了子菜单的构成方式通过glob $profile-*-link扫描/nix/var/nix/profiles/system-*-link形式的所有代际链接用正则\/\w-(\d)-link提取代际编号并按编号从大到小排序最新的排在最前对每个链接读取nixos-version文件得到版本用链接的 mtime 得到日期拼成菜单条目distroName - Configuration N (date - version)跳过损坏的条目缺少nixos-version文件时输出 skipping corrupt system profile entry 警告。因此你在引导菜单里看到的配置列表本质上就是/nix/var/nix/profiles/systemprofile 下所有现存 generation 的投影。引导器还额外支持system-profiles/目录下的其他 profile会生成distroName - Profile $name形式的子菜单。2.4 相关引导器配置项GRUBboot.loader.grub.configurationLimit控制引导菜单中最多保留多少条配置默认值为100见 grub.nix#L634-L642原因是GRUB has problems when there are too many entries条目过多时 GRUB 会出现问题。install-grub.pl中last if $curEntry $configurationLimit;正是这一限制的实现点。systemd-boot对应选项为boot.loader.systemd-boot.configurationLimit默认值为null不限制只要没被垃圾回收就全部列出并注释指出限制数量有助于防止引导分区磁盘耗尽见 systemd-boot.nix#L234-L245。三、方式二在运行中的系统里切换回上一个配置如果新配置能够启动只是运行效果不理想可以在不重启的情况下直接回滚# nixos-rebuild switch --rollback该命令等效于手动调用上一个系统配置里的激活脚本进行switch动作# /nix/var/nix/profiles/system-N-link/bin/switch-to-configuration switch其中N是上一个配置的代际编号。两者的差别在于nixos-rebuild switch --rollback会帮你解析当前 profile 指向上一个 generation而手动方式需要你自行确定N可用上文的ls -l /nix/var/nix/profiles/system-*-link查看。执行后当前运行环境会切换到旧配置profile 符号链接也会随之更新指向该旧 generation从而保证后续重启默认进入的是这个已回滚的配置。四、深入理解switch-to-configuration回滚动作的底层实现switch-to-configuration是回滚链路中的关键程序它位于每个系统 store 路径的$out/bin/switch-to-configuration。从源码看当前 nixpkgs 中该程序已经统一为switch-to-configuration-ngRust 实现switchable-system.nix 中通过ln -sf ${lib.getExe pkgs.switch-to-configuration-ng} $out/bin/switch-to-configuration建立链接且注释明确说明the new switch-to-configuration-ng, which is now the only switch-to-configuration implementation。其项目说明见 switch-to-configuration-ng/README.md。它的工作方式对理解回滚行为很有帮助以当前正在运行的配置/run/current-system为起点计算向目标配置迁移所需的动作序列迁移计算综合两份数据源/etc/fstab挂载与交换分区变化和当前 systemd 状态单位启停差异动作按固定顺序执行先systemctl stop停止单位再运行激活脚本$out/activate随后按需daemon-reexec重启 systemd、daemon-reload、重启 sysinit、reload/restart/start相应单位最后输出失败或新启动的单位列表。这些细节均出自 what-happens-during-a-system-switch.chapter.md它同时提到两个排障环境变量STC_DISPLAY_ALL_UNITS1默认会过滤部分单位输出和STC_DEBUG1输出更详细的调试信息。当你回滚后想确认到底启停了哪些单位、服务是否全部拉起时这两个变量很有用。五、回滚失败或系统异常时的补充手段进入救援模式如果回滚后的系统状态仍然异常例如关键服务未启动可执行systemctl rescue进入单用户救援 shell手动排障后再exit退出详见 maintenance-mode.section.md。启动问题定位在 GRUB 菜单中按e编辑启动项可在linux行追加内核参数如systemd.debug_shell、rescue来诊断启动失败原因详见 boot-problems.section.md。日常重启与关机回滚或排障过程中常用reboot等价于systemctl reboot与shutdown等价于systemctl poweroff见 rebooting.chapter.md。六、回滚与垃圾回收别让旧配置消失最后需要再次强调回滚能力与垃圾回收的耦合关系。nix-collect-garbage会清理未被引用的 store 路径而 generation 链接system-N-link正是对旧配置 store 路径的引用。如果你执行了类似nix-env --delete-generations old或针对系统 profile 的旧代际清理对应配置就会失去引用并被回收此后它既不会出现在 GRUB 的 All configurations 子菜单中--rollback也无法再回到那一代。所以对配置满意、确认稳定后再考虑清理旧代际以释放磁盘空间若担心升级风险可在升级前记录当前代际编号并保留最近几代不清理作为回滚保险。总结NixOS 的回滚能力建立在两个支柱之上一是 Nix store 的不可变性——旧配置路径不会被覆盖只要存在引用generation 链接就不会被回收二是引导器与激活脚本的协作——GRUB 的 All configurations 子菜单由 install-grub.pl 扫描system-N-link生成switch-to-configuration则负责在运行中完成单位迁移与激活。掌握nixos-rebuild switch --rollback与手动switch-to-configuration boot两条路径并结合configurationLimit与垃圾回收策略做好配置代际管理即可在面对任何一次失败升级时从容回到稳定状态。赞分享包管理器操作系统【免费下载链接】nixpkgsNix Packages collection NixOS项目地址https://gitcode.com/GitHub_Trending/ni/nixpkgs点击查看免费下载相关推荐VDO.Ninja高级功能WHIP/WHEP流媒体技术实战VDO.Ninja高级功能WHIP/WHEP流媒体技术实战 VDO.Ninja是一款强大的WebRTC工具可将远程视频源引入OBS或其他工作室软件。其中WH音视频直播即时通讯离线也能跑 Whisper V3 Turbo 语音识别sherpa-onnx 三分钟上手实录离线也能跑 Whisper V3 Turbo 语音识别sherpa onnx 三分钟上手实录 很多开发者第一次接触语音识别时都踩过同一个坑调云 API 太贵包管理器操作系统Otomi Core核心架构深度解析Istio、Argo CD与GitOps工作流Otomi Core核心架构深度解析Istio、Argo CD与GitOps工作流 Otomi Core作为Linode Kubernetes Engine的创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

nix-env --list-generations 详解:查看与理解 Nix profile 代际(generations)

nix-env --list-generations 详解:查看与理解 Nix profile 代际(generations)

开发工具CLI 【免费下载链接】nix Nix, the purely functional package manager 项目地址: https://gitcode.com/gh_mirrors/ni/nix 点击查看 免费下载 nix-env --list-generations 是 Nix 包管理器中用于查看当前活动 profile(用户环境)所有…

2026/9/21 18:49:38 阅读更多 →
续雪一文搞懂:从证书补办到跨省转介的底层逻辑拆解

续雪一文搞懂:从证书补办到跨省转介的底层逻辑拆解

续雪一文搞懂:从证书补办到跨省转介的底层逻辑拆解 官方文档往往长达数百页,条款晦涩,新手一翻就头大,根本抓不住重点。别急,今天我们就用 一文搞懂…

2026/9/21 18:49:38 阅读更多 →
OpenWorker 的 Persona Manifest 格式与 E2E Tester 测试专用人格:从 e2e-tester.md 看人格清单的编写与全链路验证

OpenWorker 的 Persona Manifest 格式与 E2E Tester 测试专用人格:从 e2e-tester.md 看人格清单的编写与全链路验证

人工智能AI AgentAI 应用交互助手本地部署桌面应用MCP Clients 【免费下载链接】openworker 项目地址: https://gitcode.com/gh_mirrors/op/openworker 点击查看 免费下载 本篇技术指南以 OpenWorker 仓库中 surfaces/gui/e2e-live/fixtures/persona/e2e-tester.md…

2026/9/21 18:49:38 阅读更多 →

最新新闻

舌尖毁了沈子钰实战避坑:3步搞定配置与高频面试题

舌尖毁了沈子钰实战避坑:3步搞定配置与高频面试题

舌尖毁了沈子钰实战避坑:3步搞定配置与高频面试题 配置环境就卡半天,是不是让你怀疑人生?明明照着文档敲,结果报错一堆,进度条转了半小时还没动静。这种痛苦,每个开发者都经历过。更尴尬的是,面试时遇到关于底层原理的 高频面试题…

2026/9/21 19:38:06 阅读更多 →
2026最新微信小号怎么申请?3个致命坑导致封号,手把手教你合规养号

2026最新微信小号怎么申请?3个致命坑导致封号,手把手教你合规养号

2026最新微信小号怎么申请?3个致命坑导致封号,手把手教你合规养号 你是不是也遇到过这种情况:想注册个微信小号用来接私活、测试消息推送或者隔离工作生活,结果照着网上那些“2026最新”的教程操作,要么手机号被占用,要么刚注册完就收不到验证…

2026/9/21 19:38:06 阅读更多 →
手机投屏电视怎么设置全解:新手避坑指南与底层逻辑

手机投屏电视怎么设置全解:新手避坑指南与底层逻辑

手机投屏电视怎么设置全解:新手避坑指南与底层逻辑 你是不是也遇到过这种情况?手里拿着手机,对着电视屏幕折腾半天,画面就是过不过去。或者好不容易连上了,卡得跟PPT一样,声音还不同步。很多教程只告诉你“点这个图标,选那个设备”,但一旦遇到连不…

2026/9/21 19:38:06 阅读更多 →
手写实现选择地址组件避坑指南

手写实现选择地址组件避坑指南

手写实现选择地址组件避坑指南 盯着屏幕上一长串红色的 StackTrace ,手指在键盘上悬停却敲不出下一个字符。这种因为 Address 组件报错而导致的页面崩溃,几乎是前端开发者职业生涯中的“初体验”。很多新人拿到一个现成的 UI…

2026/9/21 19:38:06 阅读更多 →
3分钟吃透fbx是什么格式,这份速查手册让你面试不慌

3分钟吃透fbx是什么格式,这份速查手册让你面试不慌

3分钟吃透fbx是什么格式,这份速查手册让你面试不慌 看了一堆教程还是不会写项目?别急,很多老鸟第一反应也是懵的。今天咱们不整虚的,直接给你一份 fbx是什么格式 的 速查手册 ,专门解决你在3D资产导入、游戏引擎对接时遇到的那些幺蛾子。…

2026/9/21 19:38:06 阅读更多 →
5个致命坑:一文搞懂五笔反查工具选型与避坑

5个致命坑:一文搞懂五笔反查工具选型与避坑

5个致命坑:一文搞懂五笔反查工具选型与避坑 看了一堆教程还是不会写项目?别急,这真不是你笨。很多开发者在做输入法辅助工具或文本处理系统时,盯着屏幕上的报错发呆,明明逻辑看着没错,一跑起来就崩。今天咱们不聊虚的,直接切入正题,帮你一文搞懂【五…

2026/9/21 19:37:05 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →