3.5 KiB
3.5 KiB
title, type, tags, sources, last_updated
| title | type | tags | sources | last_updated | |||||
|---|---|---|---|---|---|---|---|---|---|
| Partition Updates | concept |
|
|
2026-04-24 |
Partition Updates(分区镜像更新)
分区镜像更新是一种操作系统原子更新策略,通过 A/B 双分区设计,在线下载新版本镜像到非活动分区,重启后切换激活,确保更新过程的原子性和系统一致性。
核心设计
┌─────────────────────────────────────────────┐
│ 磁盘布局 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 分区 A │ │ 分区 B │ │ Data Vol │ │
│ │ (活动) │ │ (备用) │ │ (数据卷) │ │
│ │ OS v1.0 │ │ OS v1.1 │ │ 容器镜像 │ │
│ │ 正在运行 │ │ 空闲 │ │ 持久数据 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────┘
更新流程:
- 下载新版本镜像到备用分区(分区 B)
- 验证镜像完整性(哈希校验 + 签名验证)
- 更新引导配置,指向新分区
- 重启系统
- 固件/引导加载程序从新分区启动
- 新分区变为活动分区,旧分区变为备用分区
优势
- 原子性:更新要么完全成功,要么系统回退到原状态,不存在"半更新"状态
- 回滚能力:如果新版本启动失败,可手动或自动回滚到旧分区
- 零停机更新:无需停止正在运行的工作负载即可下载和准备新版本
- 一致性保证:切换前已完成新镜像验证,确保启动后的系统状态可预测
- 适用于关键系统:电信、金融、工业控制系统等不能容忍更新失败的业务
与传统包管理更新的对比
| 维度 | 包管理更新(apt/yum) | 分区镜像更新(A/B) |
|---|---|---|
| 原子性 | 非原子(可能中断于中途) | 原子(全部成功或全部失败) |
| 回滚 | 依赖包管理器功能,通常复杂 | 简单(切换回旧分区即可) |
| 根文件系统一致性 | 难以保证 | 完整镜像替换,一致性保证 |
| 适用场景 | 通用 Linux 服务器 | 容器宿主、嵌入式系统 |
| 存储开销 | 无额外开销 | 需要双倍存储空间 |
在 Bottlerocket 中的实现
Bottlerocket OS 采用分区镜像更新机制:
- 根分区分为 A、B 两组,每组包含
root_a/root_b逻辑分区 - Data Volume(数据卷)独立于根分区,存储容器镜像和应用数据,更新不受影响
- Data Volume 支持快照预填充(snapshot pre-population),可在构建时就注入容器镜像,加快首次启动
- 通过 Bottlerocket API 查看当前活动分区版本和待激活版本
相关技术
- OSTree:基于 Git 的操作系统更新系统,类似的原子升级理念
- Immutable-Root-Filesystem:分区更新的最终目标——确保根文件系统一致性
- dm-verity:与分区更新配合,验证新分区的完整性