7.11. 오프라인 및 Air-gapped 환경에서 이미지 모드 업데이트 배포
Red Hat Enterprise Linux의 이미지 모드를 사용하면 외부 스토리지를 사용하여 컨테이너 이미지를 전송하여 오프라인 및 Air-gapped 환경의 RHEL 시스템에 대한 업데이트를 배포할 수 있습니다.
호스트 머신에 이미지 모드 업데이트를 배포하려면 레지스트리에 액세스하여 업데이트를 받으려면 네트워크 연결이 필요합니다. 그러나 운영 환경에 하드웨어 사양, 엄격한 보안 요구 사항, 위치 기반 네트워크 제한 사항 또는 원격 액세스를 사용할 수 없는 경우 시스템 업데이트를 완전히 오프라인 및 무선 적용과 같은 특정 아키텍처 요소가 필요한 경우 시스템 업데이트를 수행할 수 있습니다.
오프라인 업데이트는 많은 장치에서 사용할 때 시간이 오래 걸릴 수 있으며 업데이트를 배포하기 위해 현장 기능이 필요할 수 있습니다.
사전 요구 사항
- 시스템에 만들려는 업데이트가 포함된 실행 중인 RHEL 시스템입니다.
- 대상 하드웨어에 배포된 Red Hat Enterprise Linux 10이 있는 실행 중인 RHEL 시스템입니다.
-
container-toolsmeta-package가 설치되어 있습니다.meta-package에는 Podman, Buildah, Skopeo와 같은 모든 컨테이너 툴이 포함되어 있습니다. - 레지스트리 또는 로컬에 저장된 컨테이너에 액세스합니다.
- 컨테이너의 외부 스토리지 장치에는 업데이트가 필요합니다.
프로세스
시스템에 이미 연결된 스토리지 장치를 확인합니다.
$ 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/원격 레지스트리에 저장된 컨테이너의 경우:
$ sudo skopeo copy --preserve-digests --all \ docker://quay.io/example:latest \ oci://mnt/usb/참고컨테이너 크기에 따라 이러한 명령을 완료하는 데 몇 분이 걸릴 수 있습니다.
외부 스토리지를 마운트 해제하고 제거합니다.
$ sudo umount /dev/sda1 $ sudo eject /dev/sda1- 오프라인 시스템의 컨테이너에 업데이트를 적용합니다.
-
외부 스토리지 장치를 오프라인 시스템에 연결합니다. 스토리지 장치가 자동으로 마운트되지 않으면 Cryostat
및mount명령을 사용하여 외부 스토리지를 찾아서 마운트합니다. 외부 장치의 컨테이너를 오프라인 시스템의 로컬 컨테이너 레지스트리로 복사합니다. 컨테이너를 오프라인 머신의 로컬 컨테이너 스토리지에 복사합니다.
$ 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 GBbootc를 사용하여 오프라인 시스템의 컨테이너에 업데이트를 배포합니다.$ bootc switch --transport containers-storage \ example.io/library/rhel-update:latest컨테이너를 로컬 스토리지에 복사할 수 없는 경우
oci transport플래그와 스토리지 장치의 경로를 대신 사용합니다.$ bootc switch --transport oci /mnt/usbbootc switch명령에--transport플래그를 사용하면 컨테이너에 대한 대체 소스를 지정할 수 있습니다.는 레지스트리를 사용하여 원래 이미지를 빌드하므로 기본적으로 bootc에서 레지스트리를 가져옵니다.bootc-image-builderbootc 업그레이드를 사용하는 경우 업데이트가 있는 위치를 지정할 수 없습니다.bootc 스위치를 사용하고 로컬 컨테이너 스토리지를 사용하도록 지정하면 원격 레지스트리의 요구 사항만 제거할 수 없으며 나중에 이 로컬 컨테이너를 사용하여 업데이트를 배포합니다.로컬 컨테이너 및 업데이트가 동일한 위치를 공유하면
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)올바른 이미지로 부팅되었는지 확인할 수 있습니다.
- 부팅된 이미지는 업데이트된 이미지입니다.
- 롤백 이미지는 이전 이미지입니다. 오프라인 이미지 모드 업데이트가 성공적으로 수행되었습니다.