71 lines
3.4 KiB
Markdown
71 lines
3.4 KiB
Markdown
---
|
||
title: "Partition Updates"
|
||
type: concept
|
||
tags:
|
||
- Operating System
|
||
- Updates
|
||
- Reliability
|
||
- A/B Testing
|
||
sources:
|
||
- public-cloud-learning-sessions-eks-optimization-part-2-of-3-running-containers-w
|
||
last_updated: 2026-04-24
|
||
---
|
||
|
||
# Partition Updates(分区镜像更新)
|
||
|
||
分区镜像更新是一种操作系统原子更新策略,通过 A/B 双分区设计,在线下载新版本镜像到非活动分区,重启后切换激活,确保更新过程的原子性和系统一致性。
|
||
|
||
## 核心设计
|
||
|
||
```
|
||
┌─────────────────────────────────────────────┐
|
||
│ 磁盘布局 │
|
||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
||
│ │ 分区 A │ │ 分区 B │ │ Data Vol │ │
|
||
│ │ (活动) │ │ (备用) │ │ (数据卷) │ │
|
||
│ │ OS v1.0 │ │ OS v1.1 │ │ 容器镜像 │ │
|
||
│ │ 正在运行 │ │ 空闲 │ │ 持久数据 │ │
|
||
│ └──────────┘ └──────────┘ └──────────┘ │
|
||
└─────────────────────────────────────────────┘
|
||
```
|
||
|
||
**更新流程:**
|
||
1. 下载新版本镜像到备用分区(分区 B)
|
||
2. 验证镜像完整性(哈希校验 + 签名验证)
|
||
3. 更新引导配置,指向新分区
|
||
4. 重启系统
|
||
5. 固件/引导加载程序从新分区启动
|
||
6. 新分区变为活动分区,旧分区变为备用分区
|
||
|
||
## 优势
|
||
|
||
- **原子性**:更新要么完全成功,要么系统回退到原状态,不存在"半更新"状态
|
||
- **回滚能力**:如果新版本启动失败,可手动或自动回滚到旧分区
|
||
- **零停机更新**:无需停止正在运行的工作负载即可下载和准备新版本
|
||
- **一致性保证**:切换前已完成新镜像验证,确保启动后的系统状态可预测
|
||
- **适用于关键系统**:电信、金融、工业控制系统等不能容忍更新失败的业务
|
||
|
||
## 与传统包管理更新的对比
|
||
|
||
| 维度 | 包管理更新(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]]:与分区更新配合,验证新分区的完整性
|