Hotdry.
systems

使用 Bootc 和 OSTree 实现容器原生引导与更新

通过 bootc 集成 OSTree,从 OCI registry pull 更新,实现 Podman 工作流下的原子 Linux 部署与零停机滚动升级的工程参数与实践。

在现代 Linux 系统部署中,传统包管理器难以满足原子性和可回滚需求,而容器技术已成熟。bootc 项目通过将 OCI 容器镜像作为操作系统 “源头真理”,结合 OSTree 的文件系统版本控制,提供容器原生引导和 pull-based 更新机制。这种方法允许使用熟悉的 Podman/Docker 工作流,从 registry(如 quay.io 或 Harbor)拉取完整 OS 镜像,并转换为 OSTree 部署,实现无缝升级。

bootc 与 OSTree 的核心集成机制

bootc 本质上是 rpm-ostree 的演进,专为容器镜像设计。它使用 skopeo 和 Podman 兼容的传输协议,从 registry 获取镜像,并在本地转换为 OSTree commit。OSTree 作为后端,确保根文件系统只读(/usr)、配置可变(/etc 通过 overlay)、状态隔离(/var)。

关键区别于经典 OSTree:更新传输层从 HTTP OSTree repo 转向 OCI registry。主机无需专用 repo 服务器,只需配置镜像引用如 quay.io/example/myos:latest,bootc 即处理拉取、验证和 staging。新镜像 push 到 registry 后,所有跟踪该 ref 的主机自动发现更新。

证据显示,这种机制已在 Fedora Silverblue、CoreOS 等中稳定运行,支持 EROFS/ComposeFS 确保数据完整性和去重压缩。

构建 bootable OS 镜像的工程清单

要落地,首先构建符合 bootc 规范的 OCI 镜像。使用 Containerfile,从 bootc 基础镜像起步:

  1. 选择基础镜像FROM quay.io/fedora/fedora-bootc:41(Fedora)或 RHEL 对应版本,确保内核、initramfs 已预置。

  2. 安装软件包:在 RUN 层使用 dnf install,如 dnf -y install nginx cowsay qemu-guest-agent,构建时允许写 /usr(不同于运行时)。

  3. 清理与 lint

    dnf clean all
    rm -rf /var/{log,lib,cache}/*
    bootc container lint  # 验证 bootable 兼容性:检查 /etc/machine-id 等
    
  4. 构建与 push

    podman build -t quay.io/ns/myos:v1.0 .
    podman push quay.io/ns/myos:v1.0
    

    参数建议:使用 semantic versioning (v1.0.0),启用 Podman 的 --format=oci 输出 chunked layers 以优化增量更新(默认 max-layers=64)。

镜像大小约 2GB,首发下载耗时长,后续 delta 小(仅变层)。

主机部署与 Podman 工作流集成

安装:使用 bootc-image-builder 生成 ISO/QCOW2:

podc run -it --rm -v $(pwd)/output:/output -v /var/lib/containers:/var/lib/containers:Z quay.io/osbuild/bootc-image-builder --output-dir /output quay.io/ns/myos:v1.0

Anaconda 自动安装,引导后 rpm-ostree status 显示 tracking quay.io/ns/myos:latest

Podman 集成无缝:bootc upgrade 等价 podman pull + OSTree import。配置 registry auth 于 /etc/ostree/auth.json(containers-auth.json 格式)。

自动更新与零停机参数配置

bootc 内置 systemd 服务实现拉取式更新:

  • 定时器/usr/lib/systemd/system/bootc-fetch-updates.timer,默认 OnCalendar=--* 04:00:00(每 4 小时),编辑 override:

    # /etc/systemd/system/bootc-fetch-updates.timer.d/override.conf
    [Timer]
    OnCalendar=hourly
    RandomizedDelaySec=30m
    Persistent=true
    
  • 服务bootc-fetch-apply-updates.service 执行 bootc upgrade --apply --quiet,staging 新 deployment,重启生效。

零停机策略:

  • Live applybootc upgrade --apply-live,部分变更(如用户空间包)无需重启。
  • Drain & reboot:集成 Kubernetes CRI 或 systemd inhibitor,升级前 drain 负载,超时 5min 强制。
  • 阈值:监控 rpm-ostree status 的 pending deployment >24h 则告警;回滚 bootc rollback 优先于 GRUB menu。

蓝绿部署:维护 dual ref,如 :stable:candidate,测试后 switch。

监控与回滚要点

  • 指标:Prometheus exporter for OSTree(rpm-ostree status --json),追踪 commits、drift(layered pkgs vs base)、fetch latency。
    • 告警:镜像 pull >10min、checksum mismatch、reboot 失败率 > 5%。
  • 回滚清单
    1. bootc rollback(立即切换上一 deployment)。
    2. 编辑 /etc/bootc/bootc-fetch-updates.conf 暂停 timer:Enabled=false
    3. 验证后 systemctl reboot
  • 验证:预升级 bootc fetch,dry-run rpm-ostree apply-live --allow-replacement

风险:drift(手动 rpm-ostree install 阻更新),解决:CI/CD 强制通过新镜像;非 RPM 内容需 symlink /opt -> /var/opt。

优化参数与规模化

大规模(100 + 主机):使用 Harbor 私有 registry,启用 sigstore/cosign 签名(ostree-image-signed:registry:...),policy.json 强制验证。

网络优化:chunked OCI(rpm-ostree compose container-encapsulate),delta 下载 < 10% 总大小。

此方案适用于 edge/server,结合 GitOps:Containerfile in repo,push trigger build/push,主机 auto-sync。

资料来源:

  • Bootc 与 OSTree 实践博客,以及 CoreOS rpm-ostree 容器文档。

(正文约 1250 字)

查看归档