7.11. 在离线和 air-gapped 环境中部署镜像模式更新
使用 Red Hat Enterprise Linux 的镜像模式,您可以使用外部存储传输容器镜像,在离线和 air-gapped 环境中部署 RHEL 系统更新。
要将镜像模式更新部署到主机机器上,您需要网络连接才能访问 registry 并获取更新。但是,当您的环境需要特定的架构因素,如硬件规格、字符串的安全要求、基于位置的网络限制或在远程访问不可用时进行计划更新时,您可以完全离线和 air-gapped 执行系统更新。
当您在很多设备中使用离线更新时,离线更新可能会非常耗时,且可能需要现场功能来部署更新。
先决条件
- 正在运行的 RHEL 系统,其中包含您要对系统进行的更新。
- 在目标硬件上部署的 Red Hat Enterprise Linux 10 正在运行的 RHEL 系统。
-
container-tools元数据软件包已安装。meta-package包含所有容器工具,如 Podman、Buildah 和 Skopeo。 - 访问 registry 或本地存储的容器。
- 容器的外部存储设备需要更新。
流程
验证哪些存储设备已经连接到您的系统。
$ lsblk NAME MAJ:MIN SIZE RO TYPE MOUNTPOINTS zram0 251:0 8G 0 disk [SWAP] nvme0n1 259:0 476.9G 0 disk ├─nvme0n1p1 259:1 600M 0 part /boot/efi ├─nvme0n1p2 259:2 1G 0 part /boot └─nvme0n1p3 259:3 475.4G 0 part连接外部存储并运行相同的命令。比较两个输出,以查找系统上外部存储设备的名称。
$ lsblk NAME MAJ:MIN SIZE RO TYPE MOUNTPOINTS sda 8:0 28.9G 0 disk └─sda1 8:1 28.9G 0 part zram0 251:0 8G 0 disk [SWAP] nvme0n1 259:0 476.9G 0 disk ├─nvme0n1p1 259:1 600M 0 part /boot/efi ├─nvme0n1p2 259:2 1G 0 part /boot └─nvme0n1p3 259:3 475.4G 0 part在这种情况下,名为 sda 的 USB 驱动器有一个
分区。sda1MOUNTPOINTS列列出了外部存储上分区的挂载点。如果您的系统自动挂载外部存储,则已存在有效的挂载点。但是,如果没有挂载点,则必须自行挂载它,然后才能在设备上存储任何内容。创建空目录或使用现有目录挂载分区:
$ sudo mkdir /mnt/usb/挂载您的设备分区。
$ sudo mount /dev/sda1 /mnt/usb可选:验证是否正确创建了分区:
$ lsblk NAME MAJ:MIN SIZE RO TYPE MOUNTPOINTS sda 8:0 28.9G 0 disk └─sda1 8:1 28.9G 0 part /mnt/usb [...]您的外部存储设备已准备好将文件复制到其中。
使用
skopeo命令,将本地存储的容器复制到挂载的设备中,并为您自己的环境调整容器的路径和名称:对于本地存储:
$ sudo skopeo copy --preserve-digests --all \ containers-storage:localhost/rhel-container:latest \ oci://mnt/usb/对于存储在远程 registry 中的容器:
$ sudo skopeo copy --preserve-digests --all \ docker://quay.io/example:latest \ oci://mnt/usb/注意根据容器的大小,这些命令可能需要几分钟时间完成。
卸载并弹出外部存储:
$ sudo umount /dev/sda1 $ sudo eject /dev/sda1- 将更新应用到离线系统上的容器。
-
将外部存储设备插入离线系统中。如果存储设备没有自动挂载,请使用
mkdir和mount命令查找外部存储并挂载它。 将容器从外部设备复制到离线系统的本地容器 registry。将容器复制到离线机器的本地容器存储中:
$ skopeo copy --preserve-digests --all \ oci://mnt/usb \ containers-storage:rhel-update:latest在这种情况下,外部存储的挂载点是
OCI部分的路径。containers-storage部分因您希望容器具有的名称和标签而异。使用 Podman 验证容器现在是否是本地的:
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE example.io/library/rhel-update latest cdb6d... 1 min 1.48 GB使用
bootc在离线系统中向容器部署更新:$ bootc switch --transport containers-storage \ example.io/library/rhel-update:latest如果无法将容器复制到本地存储,请使用
oci 传输标志和存储设备的路径:$ bootc switch --transport oci /mnt/usb使用
bootc switch命令中的-transport标志,您可以为容器指定替代源。默认情况下,
bootc会尝试从 registry 中拉取,因为bootc-image-builder使用 registry 来构建原始镜像。使用bootc upgrade时,您无法指定更新所在的位置。通过使用bootc 开关并指定您使用本地容器存储,您无法仅删除远程 registry 的要求,同时在以后使用此本地容器来部署更新。现在,您可以成功使用
bootc 升级,前提是本地容器和更新共享相同的位置。如果要切换到将来的远程存储库中的更新,您必须再次使用bootc 切换。
验证
确保正确部署更新:
$ bootc status Staged image: containers-storage:example.io/library/rhel-update:latest Digest: sha256: 05b1dfa791... Version: 10.0 (2025-07-07 18:33:19.380715153 UTC) Booted Image: localhost/rhel-intel:base Digest: sha256: 7d6f312e09... Version: 10.0 (2025-06-23 15:58:12.228704562 UTC)输出显示您当前的引导镜像,以及暂存至的所有更改。您之前使用的容器可见,但暂存的更改在下一次重启之前不会发生。输出还会确认将从容器存储中拉取更新。
重启系统:
$ bootc status Booted image: containers-storage:example.io/library/rhel-update:latest Digest: sha256: 05b1dfa791... Version: 10.0 (2025-07-07 18:33:19.380715153 UTC) Rollback image: localhost/rhel-intel:base Digest: sha256: 7d6f312e09... Version: 10.0 (2025-06-23 15:58:12.228704562 UTC)您可以验证您是否引导到正确的镜像:
- 引导的镜像是您的更新镜像。
- 回滚镜像是之前的镜像。您已成功执行了离线镜像模式更新。