Hotdry.
systems

使用 bootc 在 OSTree 上实现原子化 Linux 部署:回滚与增量更新实践

详解 bootc 工具结合 OSTree 实现容器化、版本化不可变 OS 镜像的原子部署,包括构建流程、回滚策略、增量更新参数与工程监控要点。

在现代 Linux 系统管理中,原子化部署已成为提升可靠性和可维护性的关键技术。bootc 工具基于 OSTree,提供了一种将 OCI 容器镜像直接转化为可引导 OS 镜像的方案,实现版本化、不可变的文件系统,支持无缝回滚和增量更新。这种方法特别适用于服务器、边缘设备和桌面环境,避免了传统包管理器的碎片化更新风险。

OSTree 与 bootc 的核心机制

OSTree 将操作系统树视为内容寻址的 Git-like 仓库,存储在 /ostree/repo 中,每个提交对应一个完整快照。部署位于 /ostree/deploy//deploy/,通过 Boot Loader Specification (BLS) 生成 /boot/loader/entries/ostree-*.conf 文件,内核参数 ostree= 指定当前部署。系统启动时,initramfs chroot 到部署根目录,实现原子切换。

bootc 扩展了这一模型,使用标准 Containerfile 构建 OCI 镜像(如基于 quay.io/fedora/fedora-bootc),镜像包含内核 (/usr/lib/modules/) 和用户空间。部署时,bootc 将镜像 unpack 到 OSTree 仓库,创建新部署,支持 registry pull(如 quay.io 或私有 Harbor)。关键优势在于容器工具链的复用:podman build、skopeo copy、镜像 lint 检查。

文件系统语义严格:/usr 不可变(推荐 composefs 后端,确保只读语义),/etc 通过三方合并(旧默认 + 当前修改 + 新默认)处理本地变更,/var 持久共享(跨部署)。这保证了更新原子性:新部署 staging 后,重启切换,失败即回滚。

实施步骤:从镜像构建到部署

  1. 镜像构建
    创建 Containerfile:

    FROM quay.io/fedora/fedora-bootc:40
    RUN dnf install -y nginx vim
    RUN systemctl enable nginx
    RUN bootc container lint  # 验证镜像合规
    

    构建:podman build -t my-os:latest .
    推送 registry:podman push localhost/my-os:latest

  2. 生成安装介质
    使用 bootc-image-builder:

    podman run --privileged -v .:/output quay.io/centos-bootc/bootc-image-builder:latest \
      --type iso localhost/my-os:latest
    

    生成 ISO,支持 Anaconda 安装,自动配置 bootloader。

  3. 直接部署
    在现有 bootc 系统:bootc install-to-disk /dev/sda localhost/my-os:latestbootc switch localhost/my-os:latest(切换镜像)。
    新系统:从 ISO 引导安装。

  4. 更新与回滚

    • 手动:bootc upgrade(pull + stage),重启应用。
    • 自动:bootc-fetch-apply-updates.timer(默认 4 小时检查),可掩码或自定义 timer(如每日 12:30)。
    • 回滚:bootc rollback,或 GRUB 菜单选择 pending / 先前部署。
      OSTree 支持 delta 更新包,减少带宽:ostree remote-add --set=gpg-verify=false myrepo http://example.com/repo,启用 delta=1。

工程参数与清单

为生产环境落地,配置以下参数:

参数 推荐值 说明
/usr/lib/ostree/prepare-root.conf [composefs] enabled=true 启用 composefs,只读 /usr,提升完整性
bootc-fetch-apply-updates.timer OnCalendar=--* 02:00:00 夜间更新,避免高峰干扰
ostree sysroot prune --keep-younger-than=7d cron 每周 清理旧部署,节省空间
bootc status 监控脚本 检查当前 /pending 状态,drift 文件
/etc 漂移监控 ostree admin config-diff 警报本地修改,防止更新阻塞

监控要点:

  • 健康检查bootc status 输出当前部署哈希、pending 状态、drift 文件数 >0 告警。
  • 回滚阈值:boot 失败检测(bootc 支持),连续 3 次失败自动回滚。
  • 带宽优化:delta 阈值 >10MB 使用全量,否则 delta;监控 repo 镜像同步。
  • 安全:镜像签名(cosign/skopeo verify),/usr/lib/ostree/auth.json 配置 registry 凭证。
  • 回滚策略:保留 3 个部署(ostree admin prune --keep=3),测试环境先 staging 不 finalize。

风险控制:初次部署测试 VM(qemu -drive file=image.qcow2),验证 /etc 合并(修改本地文件后 upgrade)。Fedora/RHEL 生态最成熟,其他发行版(如 Arch OSTree 端口)实验性强。

实际案例:在服务器上,从标准 Silverblue bootc switch my-registry/server:v1,CI/CD 推送 v2(加 nginx),4h 后自动升级。模拟失败:bootc rollback,系统回 v1,无数据丢失(/var 持久)。

此方案将 Linux 部署容器化,结合 OSTree 的原子性,实现零停机更新。相比传统 dnf/rpm-ostree,bootc 简化了镜像分发,适用于 GitOps 流程。

资料来源

  • Bootc 官方文档(bootc-dev.github.io/bootc)
  • OSTree 部署指南(ostreedev.github.io/ostree/deployment)
  • HN 讨论 & 博客(a-cup-of.coffee/blog/ostree-bootc)
查看归档