Image Mode for RHEL を使用したオペレーティングシステムのビルド、デプロイ、管理


Red Hat Enterprise Linux 10

Red Hat Enterprise Linux 10 での RHEL bootc イメージの使用

概要

RHEL bootc イメージを使用すると、オペレーティングシステムをコンテナーとして構築、デプロイ、管理できます。Image Mode for RHEL を使用すると、コンテナーネイティブワークフロー 1 つでアプリケーションと基盤となる OS を管理できます。

Red Hat ドキュメントへのフィードバック (英語のみ)

Red Hat は質の高いドキュメントを提供することに尽力しており、皆様からのフィードバックを大切にしています。改善にご協力いただくため、Red Hat Jira トラッキングシステムを通じてご提案やエラー報告をお寄せください。

手順

  1. Jira の Web サイトにログインします。

    アカウントがない場合、アカウント作成オプションを選択します。

  2. 上部のナビゲーションバーで Create をクリックします。
  3. Summary フィールドにわかりやすいタイトルを入力します。
  4. Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも追加してください。
  5. ウィンドウ下部の Create をクリックします。

第1章 Image Mode for RHEL の紹介

Image Mode for RHEL を使用すると、アプリケーションコンテナーと同じツールと手法を用いて、オペレーティングシステムのビルド、テスト、デプロイを行うことができます。Image Mode for RHEL は、registry.redhat.io/rhel10/rhel-bootc bootc イメージを使用することで利用できます。

RHEL bootc イメージには、既存のアプリケーション向け Universal Base Images (UBI) では従来は除外されていた、カーネル、initrd、ブートローダー、ブート用ファームウェアなどの必須の追加コンポーネントが含まれています。

注記

rhel-bootc および rhel-bootc コンテナーイメージに基づいてユーザーが作成したコンテナーは、Red Hat Enterprise Linux ユーザーライセンス契約 (EULA) の対象となります。これらのイメージを公開して再配布することはできません。

1.1. Image Mode for RHEL の概要

RHEL Imade Mode は、コンテナー技術を使用してオペレーティングシステムを Open Container Initiative (OCI) コンテナーイメージとして管理するデプロイメント方法です。

Red Hat は、次のコンピューターアーキテクチャー用の bootc イメージを提供します。

  • AMD および Intel 64 ビットアーキテクチャー (x86-64-v2)
  • 64 ビット ARM アーキテクチャー (ARMv8.0-A)
  • IBM Power Systems 64 ビットリトルエンディアンアーキテクチャー (ppc64le)
  • IBM Z 64 ビットアーキテクチャー (s390x)
警告

Anaconda は、s390x および ppc64le アーキテクチャーでは正しく動作しません。詳細は、リリースノート を参照してください。

Image Mode for RHEL の利点は、システムのライフサイクル全体にわたって得られます。次のリストには、いくつかの最も重要な利点が含まれます。

コンテナーイメージは他のイメージ形式よりも簡単に理解して使用でき、ビルドが高速
Containerfile は、イメージのコンテンツとビルド手順を定義するシンプルな方法を提供します。コンテナーイメージは、しばしば他のイメージ作成ツールよりもビルドとイテレートが非常に高速です。
プロセス、インフラストラクチャー、リリースアーティファクトを統合
アプリケーションをコンテナーとして配布すると、同じインフラストラクチャーとプロセスを使用して、基盤となるオペレーティングシステムを管理できます。
イミュータブルな更新
Image Mode for RHEL では、コンテナー化されたアプリケーションがイミュータブルな方法で更新されるのと同様に、オペレーティングシステムもイミュータブルな方法で更新されます。rpm-ostree システムを使用する場合と同じように、更新を起動し、必要に応じてロールバックできます。
ハイブリッドクラウド環境間での移植性

bootc イメージは、物理環境、仮想環境、クラウド環境、エッジ環境全体で使用できます。コンテナーはイメージの構築、転送、実行を行いますが、これらの bootc イメージをディスクイメージにデプロイまたは変換した後、システムはコンテナーとして実行されません。

  • Bootc は、次のコンテナーイメージ形式とディスクイメージ形式をサポートします。
Expand
表1.1 bootc がサポートするイメージタイプ
イメージタイプターゲット環境

OCI container format

物理環境、仮想環境、クラウド環境、エッジ環境。

ami

Amazon Machine Image。

qcow2 (デフォルト)

QEMU (Red Hat OpenStack、Red Hat OpenStack services for OpenShift、OpenShift Virtualization などの環境を対象)、Libvirt (RHEL)。

vmdk

VMDK for vSphere。

anaconda-iso

最初に見つかったディスクにインストールする無人 Anaconda インストーラー。

raw

フォーマットされていない raw ディスク。QEMU および Libvirt でもサポートされる。

vhd

仮想 PC 用の VHD など。

gce

Google Compute Engine (GCE) 環境。

コンテナーは、以下の手段を提供することで、RHEL システムのライフサイクルを合理化します。

コンテナーイメージのビルド
Containerfile を変更することで、ビルド時にオペレーティングシステムを設定できます。Image Mode for RHEL は、コンテナーイメージ registry.redhat.io/rhel10/rhel-bootc を使用することで利用できます。

Podman、OpenShift Container Platform、またはその他の標準のコンテナービルドツールを使用して、コンテナーとコンテナーイメージを管理できます。CI/CD パイプラインを使用してビルドプロセスを自動化できます。

コンテナーイメージのバージョン管理、ミラーリング、テスト
Podman や OpenShift Container Platform などのコンテナーツールを使用して、派生した bootc イメージのバージョン管理、ミラーリング、イントロスペクション、署名を行うことができます。
コンテナーイメージのターゲット環境へのデプロイ

イメージをデプロイする方法はいくつか存在します。

  • Anaconda: RHEL で使用されるインストールプログラムです。Anaconda とキックスタートを使用してインストールプロセスを自動化することで、すべてのイメージタイプをターゲット環境にデプロイできます。
  • bootc-image-builder: コンテナーイメージをさまざまな種類のディスクイメージに変換し、必要に応じてイメージレジストリーまたはオブジェクトストレージにアップロードする、コンテナー化されたツールです。
  • bootc: コンテナーレジストリーからコンテナーイメージを取得してシステムにインストールしたり、オペレーティングシステムを更新したり、既存の ostree ベースのシステムから切り替えたりするツールです。RHEL bootc イメージは、デフォルトで bootc ユーティリティーを含んでおり、すべてのイメージタイプに対応しています。これは rpm-ostree の後継です。
オペレーティングシステムの更新
システムは、デプロイメント後にロールバックが可能なインプレーストランザクション更新をサポートします。自動更新はデフォルトでオンになっています。systemd サービスユニットと systemd タイマーユニットファイルがコンテナーレジストリーの更新をチェックし、システムに適用します。更新はトランザクショナルであるため、再起動が必要です。より高度なロールアウトやスケジュールされたロールアウトが必要な環境では、自動更新を無効にし、bootc ユーティリティーを使用してオペレーティングシステムを更新してください。

1.2. RHEL におけるイメージモードのデプロイメントモード

Image Mode for RHEL では、OCI 準拠のコンテナーイメージ (bootc) を使用してデプロイメント、ビルド、およびアップデートを行うことで、オペレーティングシステムのコンテナーネイティブな管理が可能になります。

RHEL には 2 つのデプロイメントモードがあります。どちらも、デプロイメント時の安定性、信頼性、パフォーマンスは同様です。相違点を参照してください。

  1. パッケージモード: オペレーティングシステムは RPM パッケージを使用し、dnf パッケージマネージャーを使用して更新されます。ルートファイルシステムはミュータブルです。ただし、オペレーティングシステムをコンテナー化されたアプリケーションとして管理することはできません。
  2. イメージモード:RHEL の構築、デプロイ、管理を行うためのコンテナーネイティブなアプローチ。同じ RPM パッケージがベースイメージとして提供され、アップデートはコンテナーイメージとして展開されます。ルートファイルシステムは、/etc/var を除きデフォルトではイミュータブルであり、ほとんどのコンテンツはコンテナーイメージから取得されます。

オペレーティングシステムの構築、テスト、共有を行う際には、イメージモード または パッケージモード のいずれかを選択してデプロイメントできます。イメージモードは、他のコンテナー化されたアプリケーションと同様に、オペレーティングシステムの管理もサポートします。

1.3. Image Mode for RHEL で使用可能なローカルコンテナーレジストリーオプション

Image Mode for RHEL を使用するローカル環境では、Red Hat Quay と Red Hat Satellite の両方が、起動可能なコンテナーイメージ (bootc) を保存、ミラーリング、配布するためのローカルコンテナーレジストリーとして機能します。

以下のいずれかの方法を使用して、ローカルコンテナーレジストリーを作成できます。

  • スタンドアロン版 Red Hat Quay: この方法では、Red Hat Quay をスタンドアロン環境または Red Hat OpenShift 環境内にインストールします。脆弱性スキャンや地理的レプリケーションなどの高度な機能を利用するには、Red Hat Quay をブート可能なコンテナー専用のレジストリーとしてオンプレミス環境にデプロイできます。

  • Red Hat Satellite:Satellite は、イメージベースのクライアントを管理するためのネイティブな方法を提供します。Red Hat Ecosystem Catalog からベースとなる rhel10/rhel-bootc イメージをミラーリングし、コンテンツビューを通じて派生イメージを公開できます。

    • Red Hat Satellite 6.17 以降を使用すると、イメージモード用のローカルコンテナーレジストリーを構築できます。詳細は、コンテナーイメージの管理を 参照してください。

第2章 RHEL bootc イメージのビルドとテスト

RHEL bootc イメージは、Podman、Containerfiles、OpenShift Container Platform など、アプリケーションコンテナーと同じツールと手法を使用してビルド、テスト、デプロイできます。単一のコンテナーネイティブワークフローに集約して、アプリケーションから基盤となるオペレーティングシステムまですべてを管理できます。

2.1. Containerfile から bootc ベースのイメージをビルドおよび設定する

Containerfile でシステム仕様を定義することで、Red Hat Enterprise Linux の bootc ベースのイメージを構築および設定できます。お客様固有のデプロイメント要件に合わせて、カスタマイズ可能で再現性があり、スケーラブルなコンテナーネイティブのオペレーティングシステムを生成できます。

一般的な Containerfile の構造は次のとおりです。

FROM quay.io/<namespace>/<image>:latest

RUN dnf -y install [software] [dependencies] && dnf clean all

ADD [application]
ADD [configuration files]
RUN [config scripts]

rhel-10-bootc イメージのシステムへのインストール時には、Containerfile 内の以下のコマンドは無視されます。

  • ENTRYPOINT および CMD (OCI: Entrypoint/Cmd): 代わりに CMD /sbin/init を設定できます。
  • ENV (OCI: Env): systemd 設定を変更して、グローバルシステム環境を設定します。
  • EXPOSE (OCI: exposedPorts): 実行時にシステムのファイアウォールやネットワークがどのように機能するかとは無関係です。
  • USER (OCI: User): RHEL bootc 内の個々のサービスを、権限のないユーザーとして実行するように設定します。

rhel-10-bootc コンテナーイメージは OCI イメージ形式を再利用します。

  • rhel-10-bootc コンテナーイメージは、システムへのインストール時にはコンテナー設定セクション (Config) を無視します。
  • rhel-10-bootc コンテナーイメージは、podmandocker などのコンテナーランタイムを使用してこのイメージを実行するときには、コンテナー設定セクション (Config) を無視しません。

2.2. コンテナーツールで再現可能なコンテナーイメージをビルドする

Red Hat Enterprise Linux は、Podman と Buildah を使用した再現可能なコンテナービルドをサポートします。これにより、一貫した入力によって時間経過に伴うイメージの差異を削減できます。この機能により、イメージの更新時にレジストリーから取得するデータが削減されます。これは、サプライチェーンのセキュリティー、信頼性の高いソフトウェアのデプロイメント、効果的なデバッグにとって極めて重要です。

以前は、tar ファイルの作成とコンテナーイメージサイズの拡大に関する課題により、基盤となるデータが変更されていない場合でもストレージの負担が増加し、不要なレイヤープルが発生して、rhel-bootc や RHEL AI などの環境での更新が高速化されませんでした。RHEL コンテナーの再現可能なビルドを使用すると、レジストリーストレージが削減され、更新ペイロードが小さくなり、イメージレイヤーの一貫性が維持されるためダウンロードが高速化されます。

詳細は、再現可能なコンテナービルドの概要 を参照してください。

2.3. コンテナーイメージのビルド

Red Hat Enterprise Linux コンテナーイメージをビルドして、オペレーティングシステムの設定とアプリケーションを単一のアーティファクトにカプセル化します。カスタムイメージを作成することで、標準的なコンテナーツールを使用してシステムライフサイクルを管理し、ハイブリッドインフラストラクチャー全体で一貫したデプロイメントを確保できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. Containerfile を作成します。

    FROM quay.io/<namespace>/<image>:latest
    RUN dnf -y install cloud-init && \
        ln -s ../cloud-init.target /usr/lib/systemd/system/default.target.wants && \
        dnf clean all

    この Containerfile の例では、cloud-init ツールが追加されています。そのため、SSH 鍵を自動的に取得し、インフラストラクチャーからスクリプトを実行できます。このツールは、インスタンスのメタデータから設定情報とシークレット情報を収集します。たとえば、このコンテナーイメージを、事前に生成した AWS または KVM ゲストシステムに使用できます。

  2. 現在のディレクトリーの Containerfile を使用して、<image> イメージをビルドします。

    $ podman build -t quay.io/<namespace>/<image>:<tag> .

検証

  • すべてのイメージをリスト表示します。

    $ podman images
    REPOSITORY                                  TAG      IMAGE ID       CREATED              SIZE
    localhost/<image>                           latest   b28cd00741b3   About a minute ago   2.1 GB

2.4. コンテナーイメージの実行

Red Hat Enterprise Linux のコンテナーイメージを実行することで、アプリケーションを実行したり、オペレーティングシステムのビルドを隔離された環境で検証したりできます。コンテナーを起動することで、ホストインフラストラクチャーを変更することなく、システムの動作と設定を確認できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • 適切なオプションを指定した podman run コマンドを使用してコンテナーを実行します。たとえば、quay.io/<namespace>/<image>:<tag> コンテナーイメージに基づいて mybootc という名前のコンテナーを実行するには、以下を実行します。

    $ sudo podman run -it --rm --name mybootc quay.io/<namespace>/<image>:<tag> /bin/bash
    • -i オプションは対話式のセッションを作成します。-i オプションを指定しないと、シェルが開き、終了します。
    • -t オプションは、コマンドラインセッションを開きます。-t オプションを指定しないと、シェルは開いたままにも拘らず、シェルには何も入力できません。
    • --rm オプションは、コンテナーの終了後に quay.io/<namespace>/<image>:<tag> コンテナーイメージを削除します。

検証

  • 実行中のすべてのコンテナーをリスト表示します。

    $ podman ps
    CONTAINER ID  IMAGE                                    COMMAND          CREATED        STATUS            PORTS   NAMES
    7ccd6001166e  quay.io/<namespace>/<image>:<tag>  /sbin/init  6 seconds ago  Up 5 seconds ago          mybootc

2.5. bootc イメージのバージョンのオーバーライド

Red Hat Enterprise Linux (RHEL) のベースイメージ、Universal Base Images (UBI)、および rhel-bootc は、主要なオペレーティングシステムバージョンのみを追跡するバージョン番号を使用します。派生イメージに対して特定のバージョン番号を定義するには、Containerfile に version ラベルを追加することで、この値をオーバーライドできます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. Containerfile を作成します。

    FROM registry.redhat.io/rhel10/rhel-bootc:latest
    # In this example, the custom operating system has its own
    # version scheme.
    # The operating system major version is copied
    # and a sub-version of it is added, which represents a point-in-time
    # snapshot of the base OS content.
    # This just changes the output of bootc status. A deeper level
    # of customization is available by also changing the contents of /usr/lib/os-release.
    # Define the custom version and release metadata
    LABEL org.opencontainers.image.version=”10.1.1”
  2. 現在のディレクトリーの Containerfile を使用して <image> イメージをビルドします。

    $ podman build -t quay.io/<namespace>/<image>:<tag> .

検証

  • オーバーライドが適用されたことを確認します。

    $ podman inspect <image-name> --format '{{index .Labels "org.opencontainers.image.version"}}'

2.6. マルチステージビルドによるカスタムブート可能イメージの利点

デプロイメントイメージには、ビルドツールや不要なライブラリーを追加せずに、アプリケーションと必要なランタイムのみを含める必要があります。これを実現するには、2 つのステージで構成される Containerfile を使用します。1 つのステージはアーティファクトをビルドするためのもので、もう 1 つのステージはアプリケーションをホストするためのものです。

マルチステージビルドでは、Containerfile で複数の FROM 命令を使用します。各 FROM 命令は異なるベースを使用でき、そこから新しいビルドステージを開始します。あるステージから別のステージにアーティファクトを選択的にコピーし、最終イメージに必要のないものをすべて除外することができます。

マルチステージビルドにはいくつかの利点があります。

イメージサイズの削減
ビルド環境をランタイム環境から分離することで、最終イメージに必要なファイルと依存関係のみが含まれ、サイズが大幅に削減されます。
セキュリティーの向上
最終イメージからビルドツールと不要なライブラリーが取り除かれるため、攻撃対象領域が縮小され、よりセキュアなコンテナーが実現します。
パフォーマンスの最適化
イメージサイズが削減されるため、ダウンロード、デプロイ、起動の時間が短縮し、コンテナー化されたアプリケーションの全体的な効率が向上します。
メンテナンスの簡素化
ビルド環境とランタイム環境が分離されるため、アプリケーションの実行に必要なものだけが最終イメージに取り込まれ、イメージがよりクリーンになり、保守が容易になります。
よりクリーンなビルド
マルチステージビルドによって、ビルドプロセス中に蓄積される中間ファイルによる混乱を回避し、重要なアーティファクトだけを最終イメージに取り込むことができます。
リソース効率
1 つのステージでビルドし、不要な部分を破棄できるため、デプロイ時のストレージと帯域幅の使用が最小限に抑えられます。
レイヤーキャッシュの改善
ステージが定義されていることから、Podman は以前のステージの結果を効率的にキャッシュでき、将来のビルドが高速化される可能性があります。

次の Containerfile は 2 つのステージで構成されています。最初のステージは、通常 builder と呼ばれ、golang バイナリーをコンパイルします。2 番目のステージでは、最初のステージからバイナリーをコピーします。go-toolset ビルダーのデフォルトの作業ディレクトリーは opt/ap-root/src です。

FROM registry.access.redhat.io/ubi10/go-toolset:latest as builder
RUN echo 'package main; import "fmt"; func main() { fmt.Println("hello world") }' > helloworld.go
RUN go build helloworld.go

FROM registry.redhat.io/rhel10/rhel-bootc:latest
COPY --from=builder /opt/app-root/src/helloworld /
CMD ["/helloworld"]

結果として、最終的なコンテナーイメージには helloworld バイナリーが含まれますが、前のステージのデータは含まれません。

また、マルチステージビルドを使用すると、次のシナリオを実行できます。

特定のビルドステージで停止する
イメージをビルドするときに、指定したビルドステージで停止できます。以下に例を示します。
$ podman build --target build -t hello .

たとえば、この方法を使用して特定のビルドステージをデバッグできます。

外部のイメージをステージとして使用する
別のイメージからコピーするには、COPY --from 命令を使用できます。ローカルイメージ名、ローカルまたはコンテナーレジストリーで使用可能なタグ、あるいはタグ ID を使用できます。以下に例を示します。
COPY --from=<image> <source_path> <destination_path>
前のステージを新しいステージとして使用する
FROM 命令を使用すると、前のステージが終了したところから続行できます。以下に例を示します。
FROM ubi10 AS stage1
[...]

FROM stage1 AS stage2
[...]

FROM ubi10 AS final-stage
[...]

2.7. コンテナーイメージのレジストリーへのプッシュ

デプロイメントでアクセスできるようにするには、Red Hat Enterprise Linux コンテナーイメージをリモートレジストリーにプッシュします。イメージをアップロードすることで、カスタマイズしたオペレーティングシステムをインフラストラクチャー全体に配布したり、テストのために共同作業者と共有したりできます。

前提条件

  • container-tools メタパッケージがインストールされている。
  • イメージがビルドされ、ローカルシステムで使用できる。
  • Red Hat Quay レジストリーを作成した。詳細は、概念実証 - Red Hat Quay のデプロイ を参照してください。

手順

  • ローカルストレージからレジストリーに quay.io/<namespace>/<image>:<tag> コンテナーイメージをプッシュします。

    $ podman push quay.io/<namespace>/<image>:<tag>

    詳細は、システム上の podman-tag(1) および podman-push(1) の man ページを参照してください。

第3章 論理的にバインドされたイメージのビルドと管理

論理的にバインドされたイメージを使用すると、ベース bootc イメージのライフサイクルにバインドされたコンテナーイメージを扱うことができます。これは、アプリケーションとオペレーティングシステムのさまざまな運用プロセスを統合する際に役立ちます。コンテナーアプリケーションイメージは、ベースイメージからイメージファイルまたはそれに相当するものとして参照されます。したがって、システムインストール用の複数のコンテナーイメージを管理できます。

セキュリティーエージェントや監視ツールなど、ライフサイクルにバインドされたワークロードにコンテナーを使用できます。このようなワークロードは、bootc upgrade コマンドを使用してアップグレードすることもできます。

3.1. 論理的にバインドされたイメージの概要

論理的にバインドされたイメージを使用することで、コンテナーアプリケーションイメージをベース bootc システムイメージに関連付けることができます。デフォルトでは、たとえば podman によって実行されるアプリケーションコンテナーは、ホストのアップグレードとは独立したライフサイクルを持ちます。

論理的にバインドされたイメージの主な利点は、この方法でバインドされたアプリケーションコンテナーのライフサイクルがホストのアップグレードと連動される点にあります。これにより、ホストが新しいオペレーティングシステムへと再起動する前から、コンテナーが利用可能な状態となります。これらのコンテナーイメージは、bootc コンテナーが参照している場合、保持されます。

以下は、通常はホスト外部では更新されない、ライフサイクルにバインドされたワークロードの例です。

  • ロギング (例: journald → リモートログフォワーダーコンテナー)
  • 監視 (例: Prometheus node_exporter)
  • 設定管理エージェント
  • セキュリティーエージェント

この種のワークロードでは、ブートプロセスの早期段階でコンテナーを起動することが重要です。たとえば、ネットワークが利用可能になった直後の段階などがこれに該当します。論理的にバインドされたイメージを使用すると、ベース bootc イメージ内のバイナリーを ExecStart= で実行する場合と同等の信頼性で、(多くの場合 systemd を介して) コンテナーを起動できるようになります。

論理的にバインドされたイメージを使用する場合、システムが論理的にバインドされたイメージをインストールするように、複数のコンテナーイメージを管理できます。これは利点であると同時に欠点でもあります。たとえば、非接続インストールまたはオフラインインストールの場合は、1 つのコンテナーだけでなく、すべてのコンテナーをミラーリングします。アプリケーションイメージは、.image ファイルまたは同等のファイルとしてベースイメージからのみ参照されます。

論理的にバインドされたイメージのインストール
bootc install を実行する場合、論理的にバインドされたイメージがデフォルトの /var/lib/containers コンテナーストアに存在しています。イメージはターゲットシステムにコピーされ、bootc ベースイメージと共に起動時に直接表示されます。
論理的にバインドされたイメージのライフサイクル
論理的にバインドされたイメージは bootc によって参照され、bootc ベースのサーバーが起動した際に確実に利用可能となります。イメージは常に bootc upgrade を使用してアップグレードされます。Podman などの他のプロセスでは、イメージを read-only として使用できます。
アップグレード、ロールバック、ガベージコレクションにおける論理的にバインドされたイメージの管理
  • アップグレード中、論理的にバインドされたイメージは bootc によって排他的に管理されます。
  • ロールバック中は、ロールバックデプロイメントに対応する論理的にバインドされたイメージが保持されます。
  • bootc が、未使用のバインドされたイメージのガベージコレクションを実行します。

3.2. 論理的にバインドされたイメージの作成

論理的にバインドされたイメージを作成するには、アプリケーションコンテナーイメージをベース bootc イメージのライフサイクルにリンクします。このアプローチにより、アプリケーションとオペレーティングシステムを 1 つのまとまりとして管理できるため、更新が容易になり、一貫性も確保されます。論理的にバインドされたイメージは、Podman Quadlet の .image または .container ファイルを使用して作成できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. 論理的にバインドするイメージを選択します。
  2. Containerfile を作成します。

    $ cat Containerfile
    FROM quay.io/<namespace>/<image>:latest
    COPY ./<app_1>.image /usr/share/containers/systemd/<app_1>.image
    COPY ./<app_2>.container /usr/share/containers/systemd/<app_2>.container
    
    RUN ln -s /usr/share/containers/systemd/<app_1>.image \
    	/usr/lib/bootc/bound-images.d/<app_1>.image && \
        ln -s /usr/share/containers/systemd/<app_2>.container \
        	/usr/lib/bootc/bound-images.d/<app_2>.container
  3. .container 定義で、以下を使用します。

    GlobalArgs=--storage-opt=additionalimagestore=/usr/lib/bootc/storage

    この Containerfile の例では、/usr/lib/bootc/bound-images.d ディレクトリーに、.image ファイルまたは .container ファイルを参照するシンボリックリンクを作成することにより、論理的にバインドされるイメージが選択されます。

  4. bootc upgrade コマンドを実行します。

    $ bootc upgrade

    bootc upgrade では、次の主な手順が実行されます。

    1. イメージリポジトリーから新しいベースイメージを取得します。コンテナープルシークレットの設定 を参照してください。
    2. 新しいベースイメージのルートファイルシステムを読み取り、論理的にバインドされたイメージを検出します。
    3. 新しい bootc イメージで定義されている、検出された論理的にバインドされたイメージを、bootc が所有する /usr/lib/bootc/storage イメージストレージに自動的にプルします。
  5. バインドされたイメージを Podman などのコンテナーランタイムで使用できるようにします。そのためには、バインドされたイメージが "追加のイメージストア" として bootc ストレージを参照するように明示的に設定する必要があります。以下に例を示します。

    podman --storage-opt=additionalimagestore=/usr/lib/bootc/storage run <image>
    重要

    /etc/containers/storage.conf/usr/lib/bootc/storage イメージストレージをグローバルに有効にしないでください。論理的にバインドされたイメージには bootc ストレージだけを使用してください。

    bootc image storebootc が所有します。論理的にバインドされたイメージは、/usr/lib/bootc/bound-images.d ディレクトリー内のファイルによって参照されなくなると、ガベージコレクションされます。

第4章 bootc-image-builder を使用した bootc 互換ベースディスクイメージの作成

bootc-image-builder ツールを使用して、bootc イメージからディスクイメージを作成します。これらのアーティファクトを活用することで、物理ハードウェア、仮想マシン、エッジ環境やクラウド環境などの多様なインフラストラクチャーにわたって、コンテナー化されたオペレーティングシステムのプロビジョニングが可能になります。

4.1. bootc-image-builder の Image Mode for RHEL の概要

bootc-image-builder ツールを使用すると、bootc イメージをさまざまなプラットフォームや形式のディスクイメージに変換できます。bootc イメージをディスクイメージに変換することは、bootc イメージをインストールすることと同じです。これらのディスクイメージは、ターゲット環境にデプロイした後、コンテナーレジストリーから直接更新できます。

次のいずれかの方法を使用してベースイメージをビルドできます。

  • ローカルの RHEL システムを使用し、Podman ツールをインストールして、ローカルでイメージをビルドします。その後、イメージをプライベートレジストリーにプッシュできます。
  • CI/CD パイプラインを使用します。RHEL ベースのシステムを使用してイメージをビルドし、プライベートレジストリーにプッシュする CI/CD パイプラインを作成します。

bootc-image-builder ツールは、次のイメージタイプの生成をサポートしています。

  • 切断されたインストールに適した ISO などのディスクイメージ形式。
  • 次のような仮想ディスクイメージ形式:

    • QEMU copy-on-write (QCOW2)
    • Amazon Machine Image (AMI)
    • 未フォーマットの raw ディスク (Raw)
    • 仮想マシンイメージ (VMI)

bootc-image-builder ツールは、デフォルトではローカルコンテナーストレージを使用します。リモートレジストリーからコンテナーイメージを自身でプルすることはできません。

ディスクイメージをビルドするには、ベースとなる bootc コンテナーイメージをシステムのローカルコンテナーレジストリーで利用可能な状態にします。システムのコンテナーストレージを bootc-image-builder ツールにマウントして、システムストレージのコンテナーを使用できるようにします。

コンテナーイメージからデプロイすると同じインストール結果を得られるため、仮想マシンまたはサーバーを実行するときに便利です。同じコンテナーイメージからビルドする場合、当該一貫性は複数の異なるイメージタイプとプラットフォームにわたって保持されます。

その結果、プラットフォーム間でオペレーティングシステムイメージを維持するための労力を最小限に抑えることができます。また、bootc-image-builder を使用して新しいディスクイメージを再作成およびアップロードする代わりに、bootc ツールを使用して、これらのディスクイメージからデプロイしたシステムを更新することもできます。

rhel-10-bootc イメージを直接デプロイすることもできますが、この bootc イメージから派生した独自のカスタマイズされたイメージを作成することもできます。bootc-image-builder ツールは rhel-10-bootc OCI コンテナーイメージを入力として受け取ります。

注記

汎用ベースコンテナーイメージには、デフォルトのパスワードや SSH 鍵は含まれません。また、bootc-image-builder ツールを使用して作成したディスクイメージには、cloud-init などの一般的なディスクイメージで使用できるツールは含まれません。そのようなディスクイメージは、変換されたコンテナーイメージだけです。

4.2. bootc-image-builder のインストール

bootc-image-builder をインストールするには、Red Hat Container Registry を使用してください。bootc-image-builder はコンテナーとしての使用が意図されており、RHEL で RPM パッケージとして利用することはできません。

前提条件

  • container-tools メタパッケージがインストールされている。メタパッケージには、Podman、Buildah、Skopeo などのすべてのコンテナーツールが含まれます。
  • registry.redhat.io に対して認証されている。詳細は、Red Hat コンテナーレジストリーの認証 を参照してください。

手順

  1. ログインして、registry.redhat.io に対する認証を行います。

    $ sudo podman login registry.redhat.io
  2. bootc-image-builder ツールをインストールします。

    $ sudo podman pull registry.redhat.io/rhel10/bootc-image-builder

検証

  • ローカルシステムにプルしたすべてのイメージをリスト表示します。

    $ sudo podman images
    REPOSITORY                                    TAG         IMAGE ID      CREATED       SIZE
    registry.redhat.io/rhel10/bootc-image-builder  latest      b361f3e845ea  24 hours ago  676 MB

4.3. 設定ファイルでサポートされているイメージのカスタマイズ

TOML または JSON 形式のビルド設定ファイルを使用して、作成するディスクイメージにカスタマイズを追加できます。コンテナーディレクトリーは、設定ファイルを /config.toml にマッピングします。カスタマイズオブジェクトにより、イメージの変更を定義します。

また、ビルド設定ファイルを config.json または config.toml として /usr/lib/bootc-image-builder ディレクトリーに埋め込むこともできます。明示的にオーバーライドされない限り、システムはこれらのデフォルトのカスタマイズを使用します。JSON 形式の場合、--config 引数を使用するときに stdin を使用して設定を渡すこともできます。

ユーザーのカスタマイズ

ディスクイメージにユーザーを追加し、必要に応じて SSH 鍵を設定します。このセクションのフィールドは、name を除いてすべてオプションです。

Expand
TOMLJSON
[[customizations.user]]
name = "user"
password = "password"
key = "ssh-rsa AAA ... user@email.com"
groups = ["wheel"]
{
  "customizations": {
    "user": [
      {
        "name": "user",
        "password": "password",
        "key": "ssh-rsa AAA ... user@email.com",
        "groups": [
          "wheel",
          "admins"
        ]
      }
    ]
  }
}
カーネルの設定

設定ファイルでカーネルブートパラメーターをカスタマイズできます。

Expand
TOMLJSON
[customizations.kernel]
name = "kernel-debug"
append = "nosmt=force"
{
  "customizations": {
    "kernel": {
      "append": "mitigations=auto,nosmt"
    }
  }
}
ファイルシステムの設定

カスタマイズのファイルシステムセクションを使用して、//boot などのベースパーティションの最小サイズを設定したり、/var の下にマウントポイントを持つ追加のパーティションを作成したりできます。

Expand
TOMLJSON
[[customizations.filesystem]]
mountpoint = "/"
minsize = "10 GiB"

[[customizations.filesystem]]
mountpoint = "/var/data"
minsize = "20 GiB"
{
  "customizations": {
    "filesystem": [
      {
        "mountpoint": "/",
        "minsize": "10 GiB"
      },
      {
        "mountpoint": "/var/data",
        "minsize": "20 GiB"
      }
    ]
  }
}
ファイルシステムタイプと rootfs の相互作用

ルートファイルシステムタイプ (--rootfs) 引数は、ソースコンテナーのデフォルト値をオーバーライドします。また、ext4xfs、および btrfs タイプのすべての追加マウントポイントのファイルシステムタイプも設定します。

サポートされているマウントポイントとサイズには、rootfsbtrfs でない限り、次の制限とルールが適用されます。

  • / を指定すると、ルートファイルシステムの最小サイズを設定できます。起動したシステムの /sysroot にマウントされるファイルシステムの最終的なサイズは、この設定で指定した値、またはベースコンテナーのサイズを 2 倍にした値のうち、どちらか大きい方になります。
  • /boot を指定すると、ブートパーティションの最小サイズを設定できます。/var のサブディレクトリーも指定できますが、/var 内のシンボリックリンクは指定できません。たとえば、/var/home/var/run はシンボリックリンクであり、それ自体ではファイルシステムにはなりません。
  • /var 自体はマウントポイントにはなりません。rootfs オプションは、ルートファイルシステムのファイルシステムタイプを定義します。
  • 現在、ビルド時に btrfs サブボリュームを作成することはサポートされていません。したがって、rootfsbtrfs の場合、/var 配下にカスタムマウントポイントを作成することはサポートされていません。//boot のみを設定できます。
Anaconda ISO (インストーラー) の設定オプション

任意のインストールコマンドを含むキックスタートファイルを作成します。その後、ISO ビルドにキックスタートファイルを追加して、フルカスタマイズおよび自動化されたインストールメディアを作成します。

注記

[customizations.user][customizations.installer.kickstart] を組み合わせたカスタマイズはサポートされていません。キックスタートを追加するときは、TOML 形式の設定ファイルを使用してください。複数行の文字列ではエラーが発生しやすいためです。

Expand
TOMLJSON
[customizations.installer.kickstart]
contents = """
text --non-interactive
zerombr
clearpart --all --initlabel --disklabel=gpt
autopart --noswap --type=lvm
network --bootproto=dhcp --device=link --activate --onboot=on
"""
{
  "customizations": {
    "installer": {
      "kickstart": {
        "contents": "text --non-interactive\nzerombr\nclearpart --all --initlabel --disklabel=gpt\nautopart --noswap --type=lvm\nnetwork --bootproto=dhcp --device=link --activate --onboot=on"
      }
    }
  }
}
警告

bootc-image-builder は、コンテナーイメージ以外にさらなるキックスタートコマンドを追加しません。これらのコマンドは、システムによってコンテナーイメージに自動的に追加されます。詳細は、キックスタートファイルの作成 を参照してください。

4.4. bootc-image-builder を使用して QEMU ディスクイメージを作成する

KVM ハイパーバイザーで起動可能な、事前設定済みの RHEL イメージを準備するには、RHEL bootc イメージを QEMU(QCOW2) イメージに組み込むことができます。その後、仮想マシン上で QCOW2 イメージを実行できます。

前提条件

  • ホストマシンに Podman がインストールされている。
  • bootc-image-builder ツールを実行したり、コンテナーを --privileged モードで実行したりするには、root 権限が必要です。
  • システムの root コンテナーレジストリーで、ベース bootc コンテナーイメージが使用できる。

手順

  1. オプション:QCOW2 イメージのユーザー設定を準備するために、config.toml ファイルを作成します。

    RHEL ベースイメージにはデフォルトのユーザーは含まれません。ユーザー設定を追加するには、ファイルに以下のような内容を入力します。

    [[customizations.user]]
    name = "user"
    password = "pass"
    key = "ssh-rsa AAA ... user@email.com"
    groups = ["wheel"]

    後で、このファイルを使用して、bootc-image-builder コンテナーを実行する際にユーザー設定を挿入できます。

    または、cloud-init を使用してベースイメージを設定し、初回起動時にユーザーと SSH キーを挿入することもできます。ユーザーとグループの設定 - cloud-init を使用したユーザーと SSH 鍵の注入 を参照してください。

  2. コンテナーを実行する前に、出力 ディレクトリーを初期化する必要があります。ディレクトリーがすでに存在する場合にコマンドが失敗しないようにするには、-p 引数を使用します。

    $ mkdir -p ./output
  3. 必要なイメージがシステムストレージにプルされていることを確認してください。

    $ quay.io/<namespace>/<image>:<tag>

    ローカルイメージは、以下のいずれかになります。

    • Containerfile を使用して構築したイメージ
    • ログインが必要な、アクセス制限付きのプライベートレジストリーから取得したイメージ
    • .tar ファイルから読み込んだイメージ
  4. bootc-image-builder コンテナーを実行します。必要に応じて、ユーザーアクセス設定を使用する場合は、config.toml を引数として渡します。以下に例を示します。

    $ sudo podman run \
        --rm \
        -it \
        --privileged \
        --pull=newer \
        --security-opt label=type:unconfined_t \
        -v /var/lib/containers/storage:/var/lib/containers/storage:Z \
        -v ./config.toml:/config.toml:Z \
        -v ./output:/output:Z \
        registry.redhat.io/rhel10/bootc-image-builder:latest \
        --type qcow2 \
        --config /config.toml \
        localhost/<local-image>:latest

検証

  • 指定された出力フォルダーに .qcow2 イメージファイルが作成されていることを確認してください。

次のステップ

4.5. bootc-image-builder を使用した VMDK イメージの作成

bootc-image-builder を使用して、Red Hat Enterprise Linux の bootc イメージから仮想マシンディスク (VMDK) を生成します。このアーティファクトにより、起動可能なコンテナーイメージを VMware vSphere 上の仮想マシンとしてデプロイすることが可能になります。

  • registry.redhat.io/rhel10/bootc-image-builder:latest のようなレジストリーからコンテナーイメージを使用している場合は、ローカルストレージをマウントする必要はありません。
  • ローカルでビルドしたコンテナーイメージを使用する場合は、-v/var/lib/containers/storage:/var/lib/containers/storage 引数を含める必要があります。

前提条件

  • ホストマシンに Podman がインストールされている。
  • podman login registry.redhat.io 使用して Red Hat Registry に認証した。
  • rhel10/bootc-image-builder コンテナーイメージをプルした。

手順

  1. 次の内容の Containerfile を作成します。

    FROM quay.io/<namespace>/<image>:latest
    RUN dnf -y install cloud-init open-vm-tools && \
    ln -s ../cloud-init.target /usr/lib/systemd/system/default.target.wants && \
    rm -rf /var/{cache,log} /var/lib/{dnf,rhsm} && \
    systemctl enable vmtoolsd.service
  2. bootc イメージをビルドします。

    $ sudo podman build . -t localhost/rhel-bootc-vmdk
  3. コンテナーを実行する前に、出力 ディレクトリーを初期化してください。ディレクトリーがすでに存在する場合にコマンドが失敗しないようにするには、-p 引数を使用します。

    $ mkdir -p ./output
  4. 以前に作成した bootc イメージから VMDK ファイルを作成します。このイメージは、registry.redhat.io/rhel10/bootc-image-builder:latest などのレジストリーからアクセスできる必要があります。

    $ sudo podman run \
        --rm \
        --privileged \
        -v /var/lib/containers/storage:/var/lib/containers/storage \
        -v ./output:/output \
        --security-opt label=type:unconfined_t \
        --pull newer \
        registry.redhat.io/rhel10/bootc-image-builder:latest \
        --type vmdk \
        --config /config.toml \
        localhost/rhel-bootc-vmdk:latest

    bootc イメージの VMDK ディスクファイルは、output/vmdk ディレクトリーに保存されます。

次のステップ

  • イメージをデプロイできます。
  • イメージを更新し、変更をレジストリーにプッシュできます。RHEL bootc イメージの管理 を参照してください。

4.6. bootc-image-builder を使用した GCE イメージの作成

RHEL bootc イメージを、コマンドを実行しているアーキテクチャー用の GCE イメージにビルドします。

RHEL ベースイメージにはデフォルトのユーザーは含まれません。必要に応じて、--config オプションを使用してユーザー設定を注入し、bootc-image-builder コンテナーを実行できます。または、cloud-init を使用してベースイメージを設定し、初回起動時にユーザーと SSH 鍵を注入することもできます。cloud-init を使用したユーザーと SSH キーの注入 を参照してください。

前提条件

  • ホストマシンに Podman がインストールされている。
  • bootc-image-builder ツールを実行し、コンテナーを --privileged モードで実行して、イメージをビルドするための root アクセスがある。

手順

  1. オプション: ユーザーアクセスを設定するための config.toml を作成します。次に例を示します。

    [[customizations.user]]
    name = "user"
    password = "pass"
    key = "ssh-rsa AAA ... user@email.com"
    groups = ["wheel"]
  2. コンテナーを実行する前に、出力 ディレクトリーを初期化してください。ディレクトリーがすでに存在する場合にコマンドが失敗しないようにするには、-p 引数を使用します。

    $ mkdir -p ./output
  3. bootc-image-builder を実行します。必要に応じて、ユーザーアクセス設定を使用する場合は、config.toml を引数として渡します。このイメージは、registry.redhat.io/rhel10/bootc-image-builder:latest などのレジストリーからアクセスできる必要があります。

    1. 以下は gce イメージを作成する例です。

      $ sudo podman run \
          --rm \
          --it \
          --privileged \
          --pull=newer \
          --security-opt label=type:unconfined_t \
          -v ./config.toml:/config.toml \
          -v ./output:/output \
          -v /var/lib/containers/storage:/var/lib/containers/storage \
          registry.redhat.io/rhel10/bootc-image-builder:latest \
          --type gce \
          --config /config.toml \
        quay.io/<namespace>/<image>:<tag>

      gce イメージは出力ディレクトリーにあります。

次のステップ

4.7. bootc-image-builder を使用した AMI イメージの作成および AWS へのアップロード

bootc-image-builder ツールを使用して、Red Hat Enterprise Linux の bootc イメージから Amazon Machine Image (AMI) を生成します。これにより、コンテナーネイティブなオペレーティングシステムを Amazon Web Services (AWS) 内の標準 EC2 インスタンスとしてデプロイすることが可能になります。

  • registry.redhat.io/rhel10/bootc-image-builder:latest などのレジストリーからコンテナーイメージを使用する場合は、ローカルストレージをマウントする必要があります。
  • ローカルでビルドしたコンテナーイメージを使用する場合は、-v/var/lib/containers/storage:/var/lib/containers/storage 引数を含める必要があります。

前提条件

  • ホストマシンに Podman がインストールされている。
  • AWS アカウント内に既存の AWS S3 バケットがある。
  • bootc-image-builder ツールを実行し、コンテナーを --privileged モードで実行して、イメージをビルドするための root アクセスがある。
  • AMI を AWS アカウントにインポートするために、アカウントに vmimport サービスロールが設定されている。

手順

  1. bootc イメージからディスクイメージを作成します。

    • Containerfile でユーザーの詳細を設定します。このユーザーには、必ず sudo アクセス権限を割り当ててください。
    • Containerfile で設定したユーザーを使用して、カスタマイズされたオペレーティングシステムイメージをビルドします。パスワードなしの sudo アクセス権限を持つデフォルトユーザーが作成されます。
  2. オプション: cloud-init を使用してマシンイメージを設定します。Image Mode for RHEL でのファイルシステムの管理 を参照してください。以下に例を示します。

    FROM quay.io/<namespace>/<image>:latest
    
    RUN dnf -y install cloud-init && \
        ln -s ../cloud-init.target /usr/lib/systemd/system/default.target.wants && \
        rm -rf /var/{cache,log} /var/lib/{dnf,rhsm}
    注記

    cloud-init により、インスタンスメタデータを使用してユーザーや設定を追加することもできます。

  3. bootc イメージをビルドします。たとえば、イメージを x86_64 AWS マシンにデプロイするには、次のコマンドを使用します。

    $ podman build -t quay.io/<namespace>/<image>:<tag> .
    $ podman push quay.io/<namespace>/<image>:<tag> .
  4. コンテナーを実行する前に、出力 ディレクトリーを初期化してください。ディレクトリーがすでに存在する場合にコマンドが失敗しないようにするには、-p 引数を使用します。

    $ mkdir -p ./output
  5. bootc-image-builder ツールを使用して、bootc コンテナーイメージからパブリックな AMI イメージを作成します。このイメージは、registry.redhat.io/rhel10/bootc-image-builder:latest などのレジストリーからアクセスできる必要があります。

    $ sudo podman run \
      --rm \
      --it \
      --privileged \
      --pull=newer \
      -v ./config.toml:/config.toml \
      -v /var/home/<user>/.aws:/root/.aws \
      --env AWS_PROFILE=default \
      registry.redhat.io/rhel10/bootc-image-builder:latest \
      --type ami \
      --config /config.toml \
      --aws-ami-name rhel-bootc-x86 \
      --aws-bucket rhel-bootc-bucket \
      --aws-region us-east-1 \
    quay.io/<namespace>/<image>:<tag>

    以下のフラグはすべてまとめて指定する必要があります。フラグを指定しない場合、AMI は出力ディレクトリーにエクスポートされます。

    • --aws-ami-name - AWS の AMI イメージの名前
    • --aws-bucket - AMI を作成する際の中間ストレージのターゲット S3 バケット名
    • --aws-region - AWS アップロードのターゲットリージョン

      bootc-image-builder ツールは、お客様の AWS 認証情報を使用して、AMI イメージをビルドおよびアップロードし、AWS S3 バケットに登録します。

次のステップ

トラブルシューティング

AWS イメージの要件の設定に問題がある場合は、次のドキュメントを参照してください。

4.8. bootc-image-builder を使用した raw ディスクイメージの作成

bootc-image-builder を使用すると、bootc イメージを MBR または GPT パーティションテーブルを持つ raw イメージに変換できます。

RHEL ベースイメージにはデフォルトのユーザーは含まれません。--config オプションを使用してユーザー設定を注入し、bootc-image-builder コンテナーを実行できます。または、cloud-init を使用してベースイメージを設定し、初回起動時にユーザーと SSH 鍵を注入することもできます。ユーザーとグループの設定 - cloud-init を使用したユーザーと SSH 鍵の注入 を参照してください。

前提条件

  • ホストマシンに Podman がインストールされている。
  • bootc-image-builder ツールを実行し、コンテナーを --privileged モードで実行して、イメージをビルドするための root アクセスがある。
  • コンテナーストレージにターゲットコンテナーイメージをプルした。

手順

  1. オプション: ユーザーアクセスを設定するための config.toml を作成します。次に例を示します。

    [[customizations.user]]
    name = "user"
    password = "pass"
    key = "ssh-rsa AAA ... user@email.com"
    groups = ["wheel"]
  2. コンテナーを実行する前に、出力 ディレクトリーを初期化してください。ディレクトリーがすでに存在する場合にコマンドが失敗しないようにするには、-p 引数を使用します。

    $ mkdir -p ./output
  3. bootc-image-builder を実行します。ユーザーアクセス設定を使用する場合は、config.toml を引数として渡します。このイメージは、registry.redhat.io/rhel10/bootc-image-builder:latest などのレジストリーからアクセスできる必要があります。

    $ sudo podman run \
        --rm \
        --it \
        --privileged \
        --pull=newer \
        --security-opt label=type:unconfined_t \
        -v /var/lib/containers/storage:/var/lib/containers/storage \
        -v ./config.toml:/config.toml \
        -v ./output:/output \
        registry.redhat.io/rhel10/bootc-image-builder:latest \
        --type raw \
        --config /config.toml \
      quay.io/<namespace>/<image>:<tag>

    .raw イメージは出力ディレクトリーにあります。

次のステップ

4.9. bootc-image-builder を使用した ISO イメージの作成

bootc-image-builder ツールを使用して起動可能な ISO イメージを生成し、Red Hat Enterprise Linux の bootc イメージを物理ハードウェアまたは仮想マシンにデプロイします。生成されたアーティファクトファイルを使用して、USB ドライブや仮想光学ディスクなどの標準的なインストールメディアのワークフローにより、システムをプロビジョニングできます。

重要

bootc-image-builder を使用した起動可能な ISO イメージの作成とデプロイメントは、テクノロジープレビューとして提供されます。このワークフローは、テクノロジープレビュー機能である %ostreecontainer キックスタートコマンドに依存しています。テクノロジープレビュー機能は、Red Hat 製品サポートのサービスレベルアグリーメント (SLA) ではサポートされておらず、機能的に完全ではない可能性があるため、Red Hat では実稼働環境での使用を推奨していません。詳細は、テクノロジープレビュー機能のサポート範囲を参照してください。

前提条件

  • ホストマシンに Podman がインストールされている。
  • ホストシステムがサブスクライブされているか、またはバインドマウントを使用してリポジトリー設定を注入して、イメージビルドプロセスが RPM を取得できるようにする。
  • bootc-image-builder ツールを実行し、コンテナーを --privileged モードで実行して、イメージをビルドするための root アクセスがある。

手順

  1. オプション: デフォルトの組み込みキックスタートを上書きして自動インストールを実行する config.toml ファイルを作成します。

    [customizations.installer.kickstart]
    contents = """
    text --non-interactive
    zerombr
    clearpart --all --initlabel --disklabel=gpt
    autopart --noswap --type=lvm
    network --bootproto=dhcp --device=link --activate --onboot=on
    """
  2. コンテナーを実行する前に、出力 ディレクトリーを初期化してください。ディレクトリーがすでに存在する場合にコマンドが失敗しないようにするには、-p 引数を使用します。

    $ mkdir -p ./output
  3. bootc-image-builder を実行してパブリックな ISO イメージを作成します。設定を追加しない場合は、-v ./config.toml:/config.toml 引数を省略します。このイメージは、registry.redhat.io/rhel10/bootc-image-builder:latest などのレジストリーからアクセスできる必要があります。

    $ sudo podman run \
        --rm \
        --it \
        --privileged \
        --pull=newer \
        --security-opt label=type:unconfined_t \
        -v /var/lib/containers/storage:/var/lib/containers/storage \
        -v ./config.toml:/config.toml \
        -v ./output:/output \
        registry.redhat.io/rhel10/bootc-image-builder:latest \
        --type iso \
        --config /config.toml \
      quay.io/<namespace>/<image>:<tag>

    .iso イメージファイルは出力ディレクトリーにあります。

次のステップ

  • ISO イメージは、USB スティックや Install-on-boot などの無人インストール方法で使用できます。インストール可能なブート ISO には、設定済みのキックスタートファイルが含まれます。Anaconda とキックスタートを使用してコンテナーイメージをデプロイする を参照してください。

    警告

    キックスタートはシステム上の最初のディスクを自動的に再フォーマットするように設定されています。そのため、既存のオペレーティングシステムまたはデータを有するマシンで ISO を起動すると、破壊的な結果を招く可能性があります。

  • イメージを更新し、変更をレジストリーにプッシュできます。Image Mode for RHEL bootable におけるファイルシステムの管理 を参照してください。

4.10. bootc-image-builder を使用したキックスタートファイルを含む ISO イメージのビルド

キックスタートファイルを使用すると、ユーザーの設定、パーティションのカスタマイズ、SSH 鍵の追加など、RHEL インストールプロセスのさまざまな部分を設定できます。ISO ビルドにキックスタートファイルを含めることで、ベースイメージのデプロイメントを除くインストールプロセスの任意の部分を設定できます。bootc コンテナーベースイメージを含む ISO の場合、キックスタートファイルを使用して、ostreecontainer コマンドを除くすべてのインストール設定を行うことができます。

たとえば、キックスタートを使用して、部分的なインストールやフルインストールを実行できます。ユーザーの作成を省略することもできます。bootc-image-builder を使用して、インストールプロセスを設定するためのカスタムキックスタートを含む ISO イメージをビルドします。

重要

bootc-image-builder を使用した起動可能な ISO イメージの作成とデプロイメントは、テクノロジープレビューとして提供されます。このワークフローは、テクノロジープレビュー機能である %ostreecontainer キックスタートコマンドに依存しています。テクノロジープレビュー機能は、Red Hat 製品サポートのサービスレベルアグリーメント (SLA) ではサポートされておらず、機能的に完全ではない可能性があるため、Red Hat では実稼働環境での使用を推奨していません。詳細は、テクノロジープレビュー機能のサポート範囲を参照してください。

前提条件

  • ホストマシンに Podman がインストールされている。
  • bootc-image-builder ツールを実行し、コンテナーを --privileged モードで実行して、イメージをビルドするための root アクセスがある。

手順

  1. キックスタートファイルを作成します。次のキックスタートファイルは、ユーザーの作成とパーティションの指示を含む、完全に自動のキックスタートファイル設定の例です。

    [customizations.installer.kickstart]
    contents = """
    lang en_GB.UTF-8
    keyboard uk
    timezone CET
    
    user --name <user> --password <password> --plaintext --groups <groups>
    sshkey --username <user> ssh-<type> <public key>
    rootpw --lock
    
    zerombr
    clearpart --all --initlabel
    autopart --type=plain
    reboot --eject
    """
  2. キックスタートコンテンツを注入するために、キックスタート設定を toml 形式で保存します。たとえば、config.toml です。
  3. bootc-image-builder を実行し、ISO ビルドに追加するキックスタートファイル設定を含めます。bootc-image-builder によって、コンテナーイメージをインストールする ostreecontainer コマンドが自動的に追加されます。

    $ sudo podman run \
        --rm \
        -it \
        --privileged \
        --pull=newer \
        --security-opt label=type:unconfined_t \
        -v /var/lib/containers/storage:/var/lib/containers/storage \
        -v ./config.toml:/config.toml \
        -v ./output:/output \
        registry.redhat.io/rhel10/bootc-image-builder:latest \
        --type iso \
        --config /config.toml \
      quay.io/<namespace>/<image>:<tag>

    .iso イメージファイルは出力ディレクトリーにあります。

次のステップ

  • ISO イメージは、USB スティックや Install-on-boot などの無人インストール方法で使用できます。インストール可能なブート ISO には、設定済みのキックスタートファイルが含まれます。Anaconda とキックスタートを使用してコンテナーイメージをデプロイする を参照してください。

    警告

    キックスタートはシステム上の最初のディスクを自動的に再フォーマットするように設定されています。そのため、既存のオペレーティングシステムまたはデータを有するマシンで ISO を起動すると、破壊的な結果を招く可能性があります。

  • イメージを更新し、変更をレジストリーにプッシュできます。RHEL bootable イメージの管理 を参照してください。

4.11. 高度なパーティションを使用した Image Mode RHEL のディスクイメージのビルド

bootc-image-builder を使用して、高度なパーティション構成を持つイメージモードディスクイメージを作成できます。RHEL Image Mode 用に作成するイメージモードディスクイメージには、カスタムマウントポイント、カスタムマウントオプション、LVM ベースのパーティション、および LVM ベースのスワップボリュームが含まれます。

これにより、config.toml ファイルなどを使用して / および /boot ディレクトリーのサイズを変更できます。RHEL Image Mode をベアメタルにインストールすると、Anaconda インストーラーで利用できるすべてのパーティション分割機能を活用できます。

前提条件

  • ホストマシンに Podman がインストールされている。
  • ホストマシンに virt-install がインストールされている。
  • bootc-image-builder ツールを実行し、コンテナーを --privileged モードで実行して、イメージをビルドするための root アクセスがある。

手順

  1. config.toml ファイルを作成してカスタムマウントオプションを設定します。次に例を示します。

    [[customizations.filesystem]]
    mountpoint = "/"
    minsize = "10 GiB"
    
    [[customizations.filesystem]]
    mountpoint = "/var/data"
    minsize = "20 GiB"
  2. config.toml を引数として渡して、bootc-image-builder を実行します。

    注記

    コンテナーストレージマウントがない場合は、イメージを公開する必要があります。

    以下はパブリックイメージを作成する例です。

    $ sudo podman run \
       --rm \
       -it \
       --privileged \
       --pull=newer \
       --security-opt label=type:unconfined_t \
       -v ./config.toml:/config.toml \
       -v ./output:/output \
       registry.redhat.io/rhel10/bootc-image-builder:latest \
       --type <image_type> \
       --config config.toml \
      quay.io/<namespace>/<image>:<tag>

次のステップ

4.12. オフライン環境およびエアギャップ環境での bootc イメージのビルド

インターネットや Red Hat コンテンツ配信ネットワークに接続しなくても、bootc コンテナーイメージを作成できます。ローカルミラーレジストリーと RPM リポジトリーを使用し、続いてコンテナーイメージを raw、AMI、ISO などの任意の仮想マシン形式に変換します。

非接続のインフラストラクチャーを使用する場合は、コンテナーイメージと RPM コンテンツをローカルレジストリーから取得するようにビルドを設定する必要があります。以下に例を示します。

  • プライベート Web サーバーまたは Red Hat Satellite 上でホストされる、プライベートコンテナーレジストリーおよび RPM リポジトリー。
  • ベースイメージはインターネットからではなく、ローカルリポジトリーから取得します。
  • Containerfile は、ベースイメージのローカルミラーレジストリーを指定し、RPM コンテンツにはローカル HTTP サーバーを使用する必要があります。

bootc-image-builder コマンドを使用してコンテナーをディスクイメージに変換した後、エアギャップ環境に起動可能な RHEL ベースのシステムをデプロイできます。

重要

構築中のコンテナーイメージ内でリポジトリー設定を定義します。bootc-image-builder では、ホストマシンのリポジトリー設定を使用することはできません。その代わりに、リポジトリーの設定をコンテナーイメージ内に直接指定する必要があります。

前提条件

  • 対象ハードウェア上に、Red Hat Enterprise Linux 10 がデプロイされた稼働中の RHEL システム。
  • container-tools メタパッケージがインストールされている。
  • レジストリーまたはローカルに保存されたコンテナーへのアクセス。

手順

  1. Containerfile を作成します。以下に例を示します。

    # Base image to point to your internal registry
    FROM example.com:1234/rhel10/rhel-bootc:10.2
    
    # Configure the local repo to use the files already present in the image
    # Assuming the repo data is located at /etc/pki/repos or similar inside the image
    RUN echo -e "[local-baseos]\n\
    name=Local RHEL 10 BaseOS\n\
    baseurl=file:///path/to/repo/in/image/BaseOS\n\
    enabled=1\n\
    gpgcheck=0" > /etc/yum.repos.d/local.repo
    
    # Install your required packages using the local file source
    RUN dnf install -y firewalld && \
       dnf clean all
    
    # Ensure the kernel and bootloader are present
    # In air-gapped bootc, BIB often fails because it expects to download these.
    # Pre-installing them ensures they are part of the 'bootc' transition.
    RUN dnf install -y kernel-bootc anaconda-dracut-modules && dnf clean all
  2. bootc-image-builder ツールを使用して、Containerfile を ISO、raw、QCOW2 などのブート可能な形式に変換します。bootc-image-builder を使用した bootc 互換ベースディスクイメージの作成 を参照してください。

トラブルシューティング

パッケージがすでにキャッシュされている場合は、raw ディスクイメージが正常に処理される可能性があります。ISO をビルドすると、osbuild-depsolve-dnf の依存関係解決プロセスがトリガーされる可能性があります。

.repo ファイルに gpgkey URL が含まれている場合、bootc-image-builder ツールはマニフェスト生成フェーズ中に gpg キーを取得しようとします。エアギャップ環境においては、以下の情報を確認してください。

  • gpgkey パラメーターが、到達可能なローカル HTTP サーバーまたはイメージ内にすでに存在するファイルパス (例: /etc/pki/rpm-gpg/) を指していることを確認してください。
  • コンテナーのビルド中に dnf install コマンドが動作したとしても、キーがすでにキャッシュまたはスキップされているため、ISO 作成プロセスでこれらのキーを再検証できます。URL が間違っていると、GPGKeyReadError404 Not Found などのエラーが発生します。
  • これらの問題を解決するには、GPG キーをローカルに保存します。GPG キーの参照にリモート URL を使用するのではなく、コンテナーイメージ内にキーを含め、.repo ファイル内では file:/ を使用してそれらを参照します。
  • cannot build manifest エラーが発生した場合は、コンテナーの /etc/yum.repos.d/ 内のすべてのリポジトリー URL と GPG URL が、bootc-image-builder が実行されているネットワークからアクセス可能であることを再度確認します。

次のステップ

第5章 ローカルソースを使用したコンテナー実行に関するベストプラクティス

RHEL bootc イメージを実行する場合、カスタムの Transport Layer Security (TLS) ルート証明書を必要とする内部レジストリーでホストされているコンテンツにアクセスできます。

ローカルリソースのみを使用してコンテナーにコンテンツをインストールするには、2 つの方法があります。1 つは、* バインドマウントを使用する方法です。このオプションは、コンテナーのストアをホストのストアでオーバーライドします。もう 1 つは、* 派生イメージオプションを使用する方法です。このオプションでは、Containerfile を使用してビルドすることにより、カスタム証明書を含む新しいコンテナーイメージを作成します。

必要に応じて、同じ手法を使用して bootc-image-builder コンテナーまたは bootc コンテナーを実行することもできます。

5.1. バインドマウントを使用してコンテナーにカスタム証明書をインポートする

バインドマウントを使用してカスタム証明書を Red Hat Enterprise Linux コンテナーにインポートするには、プライベート認証局に対する信頼を確立します。実行時に証明書を提供することで、アプリケーションは認証情報の更新のたびにコンテナーイメージを再ビルドすることなく接続を確立できます。

手順

  • bootc-image-builder コンテナーを実行し、バインドマウント (例 :-v/etc/pki:/etc/pki) を使用して、コンテナーのストアをホストのストアで上書きします。

    $ sudo podman run \
      --rm \
      -it \
      --privileged \
      --pull=newer \
      --security-opt label=type:unconfined_t \
      -v ./output:/output \
      -v /etc/pki:/etc/pki \
      registry.redhat.io/rhel10/bootc-image-builder:latest \
      --type iso \
      --config /config.toml \
      quay.io/<namespace>/<image>:<tag>

検証

  • ディスクイメージのビルドプロセスは、内部証明書にアクセスできます。

5.2. Containerfile を使用してイメージにカスタム証明書をインポートする

カスタム証明書を Containerfile 内で定義することにより、Red Hat Enterprise Linux コンテナイメージにインポートできます。ビルドプロセス中にこれらの証明書を追加することで、コンテナー化されたアプリケーションが、内部サービスやプライベート認証局との信頼された接続を確立できるようになります。

Containerfile を使用してカスタム証明書ルートをインストールする手順を含めます。

手順

  1. Containerfile を作成します。

    FROM <internal_repository>/<image>
    # Add certificate to the input set of anchors
    COPY additional-certificate-root.pem /etc/pki/ca-trust/source/anchors
    RUN update-ca-trust
  2. カスタムイメージをビルドします。

    $ sudo podman build -t <your_image> .
  3. <your_image> を実行します。

    $ sudo podman run -it --rm <your_image>

検証

  • マージして生成されたストアに証明書があることを確認します。

    # cat etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
    ...

第6章 RHEL bootc イメージのデプロイ

Red Hat Enterprise Linux の bootc イメージをデプロイして、物理ハードウェア、仮想マシン、またはクラウドプラットフォームにオペレーティングシステムをプロビジョニングします。デプロイメントにコンテナーネイティブイメージを使用することで、ハイブリッドインフラストラクチャー全体でシステム設定を標準化し、ライフサイクル管理を簡素化できます。

6.1. RHEL bootc イメージのデプロイに使用できる方法

Red Hat Enterprise Linux の bootc イメージのインストール可能なパスを特定し、インフラストラクチャーに最適なストラテジーを決定します。適切なデプロイメント方法を選択することで、物理環境、仮想環境、またはクラウド環境をまたいでコンテナー化されたオペレーティングシステムを正常にプロビジョニングできるようになります。

インフラストラクチャーとデプロイメントの要件に合わせて最適なインストール方法を選択できます。

  • bootc install: ターゲットシステムに bootc イメージをインストールします。bootc install コマンドは、パーティション分割、ブートローダーの設定、イメージの内容の抽出など、起動可能な状態にするためのタスクを処理します。
  • bootc-image-builder: bootc-image-builder を使用して、コンテナーイメージを bootc イメージに変換したり、ベアメタル環境やクラウド環境にデプロイするための事前設定済みディスクイメージを作成したりできます。使用可能な bootc イメージタイプは次のとおりです。

    • ISO (テクノロジープレビュー): USB ドライブまたは 起動時にインストールする 無人インストール方法。
    • QCOW2 (QEMU copy-on-write、仮想ディスク)
    • Raw (.dmg)
    • AMI (Amazon Cloud)
  • Anaconda (テクニカルプレビュー):RHEL インストーラーとキックスタートを使用して、Anaconda とキックスタートによる自動化により、レイヤードイメージをベアメタルまたは仮想マシンに直接インストールできます。これにはカスタマイズした ISO イメージは必要ありません。

    • Anaconda によるインストール - ベアメタル、仮想マシン、クラウドインスタンスのデプロイに適しています。
    • PXE(テクノロジープレビュー): 変更されたキックスタート設定を使用して、既存の Anaconda PXE ブート環境を使用できます。

      詳細は、Deploying a container image from the network by using Anaconda and Kickstart を参照してください。

重要

bootc-image-builder を使用して起動可能な ISO イメージを作成する Anaconda およびキックスタートワークフローは、テクノロジープレビューとして提供されます。これらの方法は、ostreecontainer の キックスタートコマンドに依存していますが、これは現在テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品サポートのサービスレベルアグリーメント (SLA) ではサポートされておらず、機能的に完全ではない可能性があるため、Red Hat では実稼働環境での使用を推奨していません。テクノロジープレビュー機能では、最新の製品機能をいち早く提供します。これにより、お客様は開発段階で機能をテストし、フィードバックを提供できます。テクノロジープレビュー機能のサポート範囲は、Red Hat カスタマーポータルの テクノロジープレビュー機能のサポート範囲 を参照してください。

インストール方法は 1 回だけ実行されます。イメージをデプロイすると、その後の更新は、更新の公開時にコンテナーレジストリーから直接適用されます。

6.2. PXE ブートでの ISO bootc イメージのデプロイ

PXE ブートを使用して Red Hat Enterprise Linux bootc ISO イメージをデプロイすることにより、ベアメタルシステムをプロビジョニングします。ネットワークベースのデプロイメントを使用することで、各マシンに物理メディアを必要とすることなく、起動可能なコンテナーイメージを効率的にインストールできます。

前提条件

手順

  1. RHEL インストール ISO イメージを、HTTP サーバーにエクスポートします。これにより、PXE ブートサーバーでは、PXE クライアントにサービスを提供する準備が整いました。
  2. クライアントを起動して、インストールを開始します。
  3. ブートソースを指定するよう求められたら、PXE ブートを選択します。ブートオプションが表示されない場合は、キーボードの Enter キーを押すか、起動画面が開くまで待ちます。
  4. Red Hat Enterprise Linux の起動画面で、必要なブートオプションを選択し、Enter キーを押します。
  5. ネットワークインストールを開始します。

次のステップ

  • このコンテナーイメージの更新バージョンをレジストリーにプッシュして、稼働中のシステムにオペレーティングシステムの更新を配信できます。RHEL bootc イメージの管理 を参照してください。

6.3. QEMU ディスクイメージを使用して KVM でコンテナーイメージをデプロイする

bootc-image-builder ツールを使用して、起動可能な RHEL bootc コンテナーイメージを QEMU ディスクイメージ (QCOW2) に変換した後、仮想化ソフトウェアを使用して、そのディスクイメージを仮想マシン (VM) で起動できます。

前提条件

手順

  • 以前コンテナーイメージから作成したディスクイメージを使用する仮想マシンを作成します。

    次の例では 、virt-install ユーティリティーを使用して、2 つの仮想 CPU と 4GB の RAM を持つ bootc という名前の仮想マシンを作成します。<qcow2/disk.qcow2> を、QCOW2 ディスクイメージへのパスに置き換えてください。

    $ sudo virt-install \
      --name bootc \
      --memory 4096 \
      --vcpus 2 \
      --disk <qcow2/disk.qcow2> \
      --import

検証

  • ディスクイメージを実行している仮想マシンに接続してください。手順については、仮想マシンへの接続を 参照してください。

次のステップ

  • このコンテナーイメージの更新バージョンをレジストリーにプッシュして、稼働中のシステムにオペレーティングシステムの更新を配信できます。RHEL bootc イメージの管理 を参照してください。

6.4. vSphere でのコンテナーイメージのデプロイと RHEL 仮想マシンの作成

bootc-image-builder ツールを使用して RHEL bootc イメージから仮想マシンディスク (VMDK) を作成した後、vSphere GUI クライアントを使用してそれを VMware vSphere にデプロイできます。デプロイメントにより、起動前にさらにカスタマイズできる仮想マシンが作成されます。

前提条件

  • コンテナーイメージを作成した。bootc-image-builder を使用した QCOW2 イメージの作成 を参照してください。
  • コンテナーイメージをアクセス可能なリポジトリーにプッシュした。
  • govc VMware CLI ツールクライアントを設定した。govc VMware CLI ツールクライアントを使用するには、環境で以下の値を設定する必要があります。

    • GOVC_URL
    • GOVC_DATACENTER
    • GOVC_FOLDER
    • GOVC_DATASTORE
    • GOVC_RESOURCE_POOL
    • GOVC_NETWORK

手順

  1. metadata.yaml ファイルを作成し、このファイルに次の情報を追加します。

    instance-id: cloud-vm
    local-hostname: vmname
  2. userdata.yaml ファイルを作成し、ファイルに次の情報を追加します。

    #cloud-config
    users:
    - name: admin
      sudo: "ALL=(ALL) NOPASSWD:ALL"
      ssh_authorized_keys:
      - ssh-rsa AAA...fhHQ== your.email@example.com

    ssh_authorized_keys は SSH 公開鍵です。~/.ssh/id_rsa.pub で SSH 公開鍵を確認できます。

  3. 以下のように gzip で圧縮し、base64 でエンコードして metadata.yamluserdata.yaml ファイルを環境にエクスポートします。これらのファイルは今後の手順で使用します。

    export METADATA=$(gzip -c9 <metadata.yaml | { base64 -w0 2>/dev/null || base64; }) \
    USERDATA=$(gzip -c9 <userdata.yaml | { base64 -w0 2>/dev/null || base64; })
  4. metadata.yaml および userdata.yaml ファイルを使用して vSphere でイメージを起動します。

    1. .vmdk イメージを vSphere にインポートします。

      $ govc import.vmdk ./composer-api.vmdk <foldername>
    2. 電源をオンにせずに vSphere に仮想マシンを作成します。

      govc vm.create \
      -net.adapter=vmxnet3 \
      -m=4096 -c=2 -g=rhel8_64Guest \
      -firmware=bios -disk="foldername/composer-api.vmdk” \
      -disk.controller=ide -on=false \
      vmname
    3. 仮想マシンを変更して、ExtraConfig 変数の cloud-init 設定を追加します。

      govc vm.change -vm vmname \
      -e guestinfo.metadata="${METADATA}" \
      -e guestinfo.metadata.encoding="gzip+base64" \
      -e guestinfo.userdata="${USERDATA}" \
      -e guestinfo.userdata.encoding="gzip+base64"
      .. Power-on the VM:
      govc vm.power -on vmname
    4. 仮想マシンの IP アドレスを取得します。

      HOST=$(govc vm.ip vmname)

検証

  • コンテナーイメージを実行している仮想マシンに接続します。詳細は、「仮想マシンへの接続」を参照してください。

    1. SSH を使用して、cloud-init ファイル設定に指定された user-data を使用して仮想マシンにログインします。

      $ ssh admin@HOST

次のステップ

  • このコンテナーイメージの更新バージョンをレジストリーにプッシュして、稼働中のシステムにオペレーティングシステムの更新を配信できます。RHEL bootc イメージの管理 を参照してください。

6.5. AMI ディスクイメージを使用した AWS へのコンテナーイメージのデプロイ

bootc-image-builder ツールを使用して bootc イメージから AMI を作成し、それを AWS s3 バケットにアップロードしたら、AMI ディスクイメージを使用してコンテナーイメージを AWS にデプロイできます。

前提条件

手順

  1. ブラウザーで Service→EC2 にアクセスし、ログインします。
  2. AWS コンソールのダッシュボードメニューで、正しいリージョンを選択します。イメージが正常にアップロードされたことを示すには、イメージが Available ステータスになっている必要があります。
  3. AWS ダッシュボードでイメージを選択し、Launch をクリックします。
  4. 新しく開いたウィンドウで、イメージを起動するために必要なリソースに応じて、インスタンスタイプを選択します。Review and Launch をクリックします。
  5. インスタンスの詳細を確認します。変更が必要な場合は、各セクションを編集できます。Launch をクリックします。
  6. インスタンスを起動する前に、インスタンスにアクセスするための公開鍵を選択します。既存のキーペアを使用するか、キーペアーを新規作成します。
  7. インスタンスを起動するには、Launch Instance をクリックします。Initializing と表示されるインスタンスのステータスを確認できます。

    インスタンスのステータスが Running になると、Connect ボタンが有効になります。

  8. Connect をクリックします。ウィンドウが表示され、SSH を使用して接続する方法の説明が表示されます。
  9. 次のコマンドを実行して、自分だけが読み取れるように秘密鍵ファイルのパーミッションを設定します。Connect to your Linux instance を参照してください。

    $ chmod 400 <your-instance-name.pem>
  10. パブリック DNS を使用してインスタンスに接続します。

    $ ssh -i <your-instance-name.pem>ec2-user@<your-instance-IP-address>
    注記

    インスタンスは停止しない限り実行され続けます。

検証

イメージを起動した後、次の操作を実行できます。

  • ブラウザーで http://<your_instance_ip_address> への接続を試行します。
  • SSH でインスタンスに接続している間にアクションが実行できるかどうかを確認します。

次のステップ

  • このコンテナーイメージの更新バージョンをレジストリーにプッシュして、稼働中のシステムにオペレーティングシステムの更新を配信できます。

6.6. 非接続環境でのカスタム ISO コンテナーイメージのデプロイ

bootc-image-builder を使用して bootc イメージを ISO イメージに変換すると、コンテナーイメージの内容が ISO ディスクイメージに埋め込まれる点を除き、ダウンロード可能な RHEL ISO に似たシステムが作成されます。インストール中にネットワークにアクセスする必要はありません。bootc-image-builder から作成した ISO ディスクイメージは、ベアメタルシステムにインストールできます。

前提条件

  • カスタマイズされたコンテナーイメージを作成した。

手順

  1. bootc-image-builder を使用して、カスタムインストーラー ISO ディスクイメージを作成します。bootc-image-builder を使用した ISO イメージの作成 を参照してください。
  2. ISO ディスクイメージを USB フラッシュドライブにコピーします。
  3. USB スティック内のコンテンツを使用して、非接続環境でベアメタルインストールを実行します。

次のステップ

  • コンテナーイメージをデプロイした後、このコンテナーイメージの更新バージョンをレジストリーにプッシュして、実行中のシステムにオペレーティングシステムの更新を配信できます。RHEL bootc イメージの管理 を参照してください。

6.7. to-filesystem および to-disk を使用した高度なインストール

高度なプロビジョニングシナリオをサポートするために、Red Hat Enterprise Linux Image Mode のコンテンツをマウントされたファイルシステムに直接インストールします。bootc-install-to-filesystem コマンドを使用することで、標準的なインストーラーの起動プロセスを必要とせずに、カスタムのパーティションレイアウトを設定したり、ブート可能なディスクイメージを生成したりできます。

bootc install コマンドには、bootc install to-diskbootc install to-filesystem という 2 つのサブコマンドが含まれています。

  • bootc-install-to-filesystem は、ターゲットファイルシステムへのインストールを実行します。
  • bootc install to-disk サブコマンドは、独自の低レベルツールのセットで構成されます。これらのツールは独立して呼び出すこともできます。コマンドを構成するツールは次のとおりです。

    • mkfs.$fs /dev/disk
    • mount /dev/disk /mnt
    • bootc install to-filesystem --karg=root=UUID=<uuid of /mnt> --imgref $self /mnt

6.8. bootc install を使用してコンテナーイメージをベアメタルにデプロイする

起動した ISO 環境内から、デバイスへのベアメタルインストールを実行できます。Bootc には基本的なビルドインストーラーが含まれており、bootc install to-disk または bootc install to-filesystem の方法で使用できます。

  • bootc install to-disk: この方法を使用すると、コンテナーイメージをデプロイするために追加の手順を実行する必要がなくなります。イメージに基本的なインストーラーが含まれているためです。
  • bootc install to-filesystem: この方法を使用すると、LVM などの任意のツールを使用して、ターゲットデバイスとルートファイルシステムを設定できます。

前提条件

  • ご使用のアーキテクチャー用の RHEL 10 ブート ISO を Red Hat からダウンロードした。RHEL ブートイメージのダウンロード を参照してください。
  • コンテナーイメージをローカルで利用できるようにしたか、レジストリーを使用してアクセスできる状態にしました。
  • 設定ファイルが作成されている。

手順

  • 起動した ISO 環境からインストールコマンドを実行してください。<your-bootc-container-image> を、たとえば `quay.io/<namespace>/my-rhel-bootc:latest` のように、ご使用の OCI イメージに置き換えてください。

    • bootc install to-disk を使用する場合:

      $ sudo podman run \
      --rm --privileged \
      --pid=host
      -v /dev:/dev \
      -v /var/lib/containers:/var/lib/containers \
      --security-opt label=type:unconfined_t
      <your-bootc-container-image>
      bootc install to-disk /dev/sda
    • bootc install to-filesystem を使用する場合:

      $ sudo podman run \
      --rm --privileged \
      --pid=host
      -v /:/target \
      -v /dev:/dev \
      -v /var/lib/containers:/var/lib/containers \
      --security-opt label=type:unconfined_t
      <your-bootc-container-image>
      bootc install to-filesystem /dev/sda

次のステップ

  • コンテナーイメージをベアメタル環境にデプロイした後、このコンテナーイメージの更新バージョンをレジストリーにプッシュして、実行中のシステムにオペレーティングシステムの更新を配信できます。RHEL bootable イメージの管理 を参照してください。

6.9. 1 つのコマンドを使用したコンテナーイメージのデプロイ

system-reinstall-bootc コマンドを使用して、コンテナーイメージを RHEL クラウドインスタンスにデプロイします。単一のコマンドで、bootc イメージを AWS 上の RHEL 10 などの新しい RHEL インスタンスにデプロイできます。セキュアなアクセスを確保するには、インスタンス起動時に SSH 鍵を選択または作成する必要があります。

system-reinstall-bootc コマンドは、bootc install to-existing root コマンドをラップする対話型 CLI を提供し、次の 2 つのアクションを実行できます。 

  • 提供されたイメージをプルして、SSH 鍵をセットアップしたり、システムにアクセスしたりする。
  • すべてのバインドマウントおよび SSH 鍵を設定して、bootc install to-existing-root コマンドを実行する。

前提条件

  • Red Hat アカウントまたは Red Hat RPM へのアクセス。
  • AWS 環境で実行されるパッケージベースの RHEL (9.6/10.0 以降) 仮想システム。
  • パッケージシステムに SSH で接続して破壊的な変更を行う機能と権限。

手順

  1. インスタンスが起動したら、インスタンスの作成時に選択したキーを使用して SSH でインスタンスに接続します。

    $ ssh -i <ssh-key-file> <cloud-user@ip>
  2. system-reinstall-bootc サブパッケージがインストールされていることを確認します。

    # rpm -q system-reinstall-bootc

    そうでない場合は、system-reinstall-bootc サブパッケージをインストールします。

    # dnf -y install system-reinstall-bootc
  3. bootc イメージを使用するようにシステムを変換します。

    # system-reinstall-bootc <image>

    Red Hat Ecosystem Catalog のコンテナーイメージ、または Containerfile から構築された bootc カスタマイズイメージを使用できます。

  4. a キーを押して、bootc イメージにインポートするユーザーを選択します。
  5. 選択内容を 2 回確認し、イメージがダウンロードされるまで待ちます。
  6. システムを再起動します。

    # reboot
  7. 指定された <ip> の保存されている SSH ホストキーを /.ssh/known_hosts ファイルから削除します。

    # ssh-keygen -R <ip>

    bootc システムは、新しい公開 SSH ホストキーを使用しています。ローカルに保存されているキーとは異なるキーを使用して同じ IP アドレスに接続しようとすると、SSH は警告を発するか、ホストキーの不一致により接続を拒否します。この変更は想定されているため、次のコマンドを使用して、既存のホストキーエントリーを ~/.ssh/known_hosts ファイルから安全に削除できます。

  8. bootc システムに接続します。

    # ssh -i <ssh-key-file> root@<ip>

検証

  • システムオペレーティングシステムが変更されたことを確認します。

    # bootc status

6.10. プライベート bootc コンテナーレジストリーへのアクセス

bootc デプロイメントでは、プライベートコンテナーレジストリーを使用できます。bootc イメージはプルシークレットを使用するため、プライベートイメージを使用してシステムプロビジョニングを管理できます。

6.10.1. プライベートレジストリーへアクセスできるように bootc を有効化する

bootc には、レジストリーへのアクセス時に TLS 検証を無効にする方法がありません。/etc/containers/registries.conf.d 設定ファイルを使用することで、プライベートレジストリーへのアクセス時に TLS 検証をグローバルに無効化できます。

前提条件

  • プライベートレジストリーにアクセスできる。

手順

  • TLS 検証を無効化します。

    # /etc/containers/registries.conf.d/local-registry.conf
    [[registry]]
    location="localhost:5000"
    insecure=true

検証

  • TLS 検証が無効化されたか確認します。

次のステップ

  • bootc を設定して、プライベートレジストリーにアクセスできるようにします。

6.10.2. プライベートレジストリーへアクセスできるように bootc を設定する

プライベートレジストリーからコンテナーイメージをプルするには、bootc ワークフローに有効な認証情報を提供する必要があります。bootc と Podman の認証情報パスを、コンテナーイメージに埋め込まれた共通の永続ファイルにシンボリックリンクすることで、環境全体でプルシークレットの single source of truth を維持できます。

前提条件

  • Bootc は、レジストリーへのプライベートアクセスを提供します。

手順

  1. /usr/lib/container-auth.json レジストリー認証ファイルを作成し、以下の内容を追加します。

    # Make /run/containers/0/auth.json (a transient runtime file)
    # a symlink to our /usr/lib/container-auth.json (a persistent file)
    # which is also symlinked from /etc/ostree/auth.json.
    d /run/containers/0 0755 root root -
    L /run/user/0/containers/auth.json - - - - ../../../../usr/lib/container-auth.json
  2. 同じディレクトリーに Containerfile を作成します。以下に例を示します。

    # This example expects a secret named "creds" to contain
    # the registry pull secret.  To build, for example
    # podman build --secret id=creds,src=$HOME/.docker/config.json ...
    FROM quay.io/<namespace>/<image>:_<tag>_
    # Use a single pull secret for bootc and podman by symlinking both locations
    # to a common persistent file embedded in the container image.
    # We just make up /usr/lib/container-auth.json
    COPY containers-auth.conf /usr/lib/tmpfiles.d/link-podman-credentials.conf
    RUN --mount=type=secret,id=creds,required=true cp /run/secrets/creds /usr/lib/container-auth.json && \
        chmod 0600 /usr/lib/container-auth.json && \
        ln -sr /usr/lib/container-auth.json /etc/ostree/auth.json

    これらの設定を組み込むことで、コンテナーイメージからプロビジョニングされるあらゆるシステムに対して、特定のカーネルオプションが一貫して適用されるようになります。これにより、デプロイ後の設定が不要になります。

  3. プライベートレジストリー認証を設定するには、container-auth.json ファイルを /etc/ostree/auth.json に配置します。

6.10.3. Anaconda スクリプトを使用したプライベート bootc コンテナーレジストリーの設定

Anaconda の %pre スクリプトを使用して、/etc/ostree/auth.json レジストリー認証ファイルを作成することで、プルシークレットを設定できます。

レジストリーの設定に加えて、プライベートレジストリーには認証が必要です。bootc インスタンス群をデプロイする際にプライベートリポジトリーを使用するには、以下の手順に従ってください。

前提条件

  • Bootc は、レジストリーへのプライベートアクセスを提供します。

手順

  1. auth.json レジストリー認証ファイルを作成します。

    %pre
    mkdir -p /etc/ostree
    cat > /etc/ostree/auth.json << 'EOF'
    {
            "auths": {
                    "quay.io": {
                            "auth": "<your secret here>"
                    }
            }
    }
    EOF
    %end
  2. プライベートレジストリー認証を設定するには、auth.json ファイルを /etc/ostree/auth.json に配置します。

6.10.4. Anaconda でプルシークレットを使用したプライベートレジストリーへのアクセス

デフォルトの Anaconda インストーラー ISO では、ネットワーク経由で対象のレジストリーを取得する際にそのレジストリーにアクセスするには、bootstrap 設定の複製コピーが必要です。目的の bootc コンテナーイメージを取得する前にインストール環境に任意の変更を加えるには、Anaconda の %pre コマンドを使用できます。

前提条件

  • Bootc は、レジストリーへのプライベートアクセスを提供します。

手順

  1. プルシークレットを設定します。以下に例を示します。

    %pre
    mkdir -p /etc/ostree
    cat > /etc/ostree/auth.json << 'EOF'
    {
            "auths": {
                    "quay.io": {
                            "auth": "<your secret here>"
                    }
            }
    }
    EOF
    %end
  2. セキュアでないレジストリーの TLS を無効にします。

    %pre
    mkdir -p /etc/containers/registries.conf.d/
    cat > /etc/containers/registries.conf.d/local-registry.conf << 'EOF'
    [[registry]]
    location="[IP_Address]:5000"
    insecure=true
    EOF
    %end

6.10.5. Anaconda によるプライベート bootc コンテナーレジストリーへのアクセス

デフォルトの Anaconda ISO を使用してネットワークベースのインストールを実行する場合、ターゲットの bootc コンテナーレジストリーがプライベートまたはセキュアでない場合、インストール環境自体がそのレジストリーにアクセスできません。

まず Anaconda が実行され、次にインストールする bootc コンテナーイメージを取得します。Anaconda は、認証が必要なプライベートレジストリー、または TLS が無効になっているセキュアでないレジストリーにイメージが存在する場合、デフォルトのブートストラップ設定がないため失敗します。

この問題を解決するには、イメージのプル前に、必要な設定の複製コピーをインストール環境に注入します。

以下のいずれかの方法でこの問題を解決できます。

  • Anaconda の %pre スクリプトを使用して、プルシークレットを設定します。
  • Anaconda の %pre スクリプトを使用して、セキュアでないレジストリーの TLS を無効化します。

6.11. オフライン環境およびエアギャップ環境でイメージモード更新をデプロイする

Image Mode for Red Hat Enterprise Linux を使用すると、コンテナーイメージを外部ストレージで転送することで、オフライン環境やエアギャップ環境の RHEL システムに対しても更新をデプロイできます。

イメージモードの更新をホストマシンにデプロイするには、レジストリーにアクセスして更新を取得するためのネットワーク接続が必要です。ただし、ハードウェア仕様、厳格なセキュリティー要件、場所に基づくネットワーク制限、リモートアクセスが利用できない場合のスケジュールされた更新など、運用環境で特定のアーキテクチャー要素が求められる場合は、システム更新を完全にオフラインかつエアギャップで実行できます。

注記

オフライン更新を多数のデバイスに対して実行する場合、多大な時間を要する可能性があります。また、更新のデプロイにはオンサイト対応が必要になる場合があります。

前提条件

  • システムに対して行いたい更新が実行中の RHEL システムに含まれている。
  • 対象ハードウェア上に、Red Hat Enterprise Linux 10 がデプロイされた稼働中の RHEL システム。
  • container-tools メタパッケージがインストールされている。meta-package には、Podman、Buildah、Skopeo などのすべてのコンテナーツールが含まれます。
  • レジストリーまたはローカルに保存されたコンテナーへのアクセス。
  • 更新が必要なコンテナー用の外部ストレージデバイス。

手順

  1. システムにすでに接続されているストレージデバイスを確認します。

    $ 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
  2. 外部ストレージを接続して、同じコマンドを実行します。2 つの出力結果を比較して、システム上の外部ストレージデバイスの名前を確認します。

    $ 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 ドライブには sda1 パーティションがあります。

    MOUNTPOINTS 列には、外部ストレージ上のパーティションのマウントポイントがリスト表示されます。システムが外部ストレージを自動的にマウントする場合、有効なマウントポイントはすでに存在します。ただし、マウントポイントがない場合は、デバイスに保存する前に、自身分でマウントする必要があります。

  3. パーティションをマウントするには、空のディレクトリーを作成するか、既存のディレクトリーを使用します。

    $ sudo mkdir /mnt/usb/
    1. デバイスのパーティションをマウントします。

      $ sudo mount /dev/sda1 /mnt/usb
    2. オプション: パーティションが正しく作成されたか確認します。

      $ lsblk
      NAME         MAJ:MIN    SIZE   RO TYPE  MOUNTPOINTS
      sda              8:0   28.9G    0 disk
      └─sda1          8:1   28.9G    0 part  /mnt/usb
      [...]

      外部ストレージデバイスにファイルをコピーする準備が整いました。

  4. 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/
      注記

      コンテナーのサイズによっては、これらのコマンドが完了するまで数分かかる場合があります。

  5. 外部ストレージをアンマウントし、取り出します。

    $ sudo umount /dev/sda1
    $ sudo eject /dev/sda1
  6. オフラインシステムのコンテナーに更新を適用します。
  7. 外部ストレージデバイスをオフラインシステムに接続します。ストレージデバイスが自動的にマウントされない場合は、mkdirmount コマンドを使用して外部ストレージの場所を特定し、マウントします。
  8. コンテナーを外部デバイスからオフラインシステムのローカルコンテナーレジストリーにコピーします。コンテナーをオフラインマシンのローカルコンテナーストレージにコピーします。

    $ skopeo copy --preserve-digests --all \
      oci://mnt/usb \
      containers-storage:rhel-update:latest

    この場合、外部ストレージのマウントポイントが OCI セクションへのパスとなります。containers-storage セクションの内容は、コンテナーに付ける名前やタグによって異なります。

  9. Podman を使用して、コンテナーがローカルに存在することを確認します。

    $ podman images
    REPOSITORY			        TAG     IMAGE ID  CREATED  SIZE
    example.io/library/rhel-update   latest  cdb6d...  1 min    1.48 GB
  10. bootc を使用して、オフラインシステムのコンテナーに更新をデプロイします。

    $ bootc switch --transport containers-storage \
    example.io/library/rhel-update:latest
    1. コンテナーをローカルストレージにコピーできない場合は、代わりに oci transport フラグとストレージデバイスへのパスを使用します。

      $ bootc switch --transport oci /mnt/usb

      bootc switch コマンドの --transport フラグを使用すると、コンテナーの代替ソースを指定できます。

      デフォルトでは、bootc はレジストリーからイメージをプルしようとします。これは、bootc-image-builder がレジストリーを使用して元のイメージをビルドするためです。bootc upgrade を使用する場合、更新の場所を指定できません。bootc switch を使用し、ローカルコンテナーストレージを使用することを指定することで、リモートレジストリーの必要性を排除できるだけでなく、将来的にこのローカルコンテナーを使用して更新をデプロイすることも可能になります。

      ローカルのコンテナーと更新が同じ場所に配置されている場合、bootc upgrade を正常に実行できるようになりました。今後、リモートリポジトリーの更新に切り替えたい場合は、再度 bootc switch を使用する必要があります。

検証

  1. 更新が正しくデプロイされたことを確認します。

    $ 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)

    出力には、現在起動中のイメージと、適用が予定されているステージングされた変更内容が表示されます。以前使用したコンテナーは表示されますが、ステージングされた変更は次回の再起動まで反映されません。出力結果から、更新がコンテナーストレージからプルされることも確認できます。

  2. システムを再起動します。

    $ 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)

    正しいイメージで起動したか確認できます。

    • 起動したイメージは、更新されたイメージです。
    • ロールバックイメージは、以前のイメージです。オフラインイメージモードの更新が正常に完了しました。

第7章 bootc イメージをゼロから作成する

bootc イメージをゼロから作成するには、既存の bootc ベースイメージをビルド環境として使用します。このプロセスでは、ユーザーの RPM パッケージを入力として受け取ります。したがって、RPM パッケージが変更された場合は、イメージを再ビルドする必要があります。bootc イメージをゼロから作成することで、基盤となるイメージコンテンツを制御し、システム環境を要件に合わせて調整できます。

最小限のイメージをビルドすることで、特定のワークロードに不可欠なパッケージのみを含めることができ、システムのフットプリントと攻撃対象領域を削減できます。

7.1. ピン留めされたコンテンツを使用してイメージをビルドする

再現性のあるビルドを維持するために、リポジトリーのスナップショットツールを使用して、ベースイメージを特定のパッケージバージョンに固定できます。これにより、rpm-md または yum リポジトリーと、プロジェクトのロックファイルの整合性を常に保つことができます。

bootc image from scratch 機能を使用すると、ミラーリング、ピン留め、またはスナップショットされたリポジトリーコンテンツを参照しながら、ソース RPM リポジトリー内のパッケージ情報を設定およびオーバーライドできます。その結果、パッケージのバージョンとその依存関係を制御できるようになります。

前提条件

  • 標準の bootc ベースイメージ。

手順

  • 次の例では、ピン留めされたコンテンツを含む bootc イメージをゼロから作成します。

    # Begin with a standard bootc base image that serves as a "builder" for our custom image.
    FROM registry.redhat.io/rhel10/rhel-bootc:latest as builder
    # Configure and override source RPM repositories, if necessary. The following step is required when referencing specific content views or target mirrored/snapshotted/pinned versions of content.
    RUN rm -rvf /etc/yum.repos.d; mkdir -p /etc/yum.repos.d/
    COPY mypinnedcontent.repo /etc/yum.repos.d/
    # The file must be copied to the /etc/yum.repos.d/ directory.
    # The mypinnedcontent.repo is your standard repository that ensures that your container will always be built with the exact same versions of software, preventing unexpected bugs or security issues from new updates.
    # Build the root file system using the specified repositories and non-RPM content from the "builder" base image.
    # If no repositories are defined, the default build will be used. You can modify the scope of packages in the base image by changing the manifest between the "standard" and "minimal" sets.
    # Add additional repositories to apply customizations to the image. However, referencing a custom manifest in this step is not currently supported without forking the code.
    RUN /usr/libexec/bootc-base-imagectl build-rootfs --manifest=standard /target-rootfs
    # Create a new, empty image from scratch.
    FROM scratch
    # Copy the root file system built in the previous step into this image.
    COPY --from=builder /target-rootfs/ /
    # Apply customizations to the image. This syntax uses "heredocs" https://www.docker.com/blog/introduction-to-heredocs-in-dockerfiles/ to pass multi-line arguments in a more readable format.
    RUN <<EORUN
    # Set pipefail to display failures within the heredoc and avoid false-positive successful builds.
    set -xeuo pipefail
    # Install necessary packages, run scripts, etc.
    dnf -y install NetworkManager emacs
    # Remove leftover build artifacts from installing packages in the final built image.
    dnf clean all
    rm /var/{log,cache,lib}/* -rf
    EORUN
    # Define required labels for this bootc image to be recognized as such.
    LABEL containers.bootc 1
    LABEL ostree.bootable 1
    # Optional labels that only apply when running this image as a container. These keep the default entry point running under systemd.
    STOPSIGNAL SIGRTMIN+3
    CMD ["/sbin/init"]
    # Run the bootc linter to avoid encountering certain bugs and maintain content quality. Place this command last in your Containerfile.
    RUN bootc container lint

検証

  1. イメージを保存してビルドします。

    $ podman build -t quay.io/<namespace>/<image>:<tag> . --cap-add=all --security-opt=label=type:container_runtime_t --device /dev/fuse
  2. カレントディレクトリーにある Containerfile を使用して <_image_> イメージをビルドします。

    $ podman build -t quay.io/<namespace>/<image>:<tag> .

7.2. 最小限からベースイメージをビルドする

高度なイメージのカスタマイズを行う場合は、標準のベースオペレーティングシステムイメージから派生した最小限の bootc イメージを生成できます。この軽量イメージには、bootc ツール、カーネル、および DNF パッケージマネージャーのみが含まれています。

最小限の bootc イメージは、後続のマルチステージビルドにおける基礎レイヤーとして機能するように設計されています。最終的なイメージコンテンツを制御できます。

注記

この最小限のイメージは、現在レジストリーにはビルド済みの状態で提供されていないため、ローカルで生成する必要があります。

前提条件

  • 標準の bootc ベースイメージ。

手順

  • 次の例では、カスタムの最小ベースイメージを作成します。

    # Begin with a standard bootc base image that is reused as a "builder" for the custom image.
    FROM registry.redhat.io/rhel10/rhel-bootc:latest as builder
    # Configure and override source RPM repositories, if necessary. This step is not required when building up from minimal unless referencing specific content views or target mirrored/snapshotted/pinned versions of content.
    # Add additional repositories to apply customizations to the image. However, referencing a custom manifest in this step is not currently supported without forking the code.
    # Build the root file system by using the specified repositories and non-RPM content from the "builder" base image.
    # If no repositories are defined, the default build will be used. You can modify the scope of packages in the base image by changing the manifest between the "standard" and "minimal" sets.
    RUN /usr/libexec/bootc-base-imagectl build-rootfs --manifest=minimal /target-rootfs
    # Create a new, empty image from scratch.
    FROM scratch
    # Copy the root file system built in the previous step into this image.
    COPY --from=builder /target-rootfs/ /
    # Apply customizations to the image. This syntax uses "heredocs" https://www.docker.com/blog/introduction-to-heredocs-in-dockerfiles/ to pass multi-line arguments in a more readable format.
    RUN <<EORUN
    # Set pipefail to display failures within the heredoc and avoid false-positive successful builds.
    set -xeuo pipefail
    # Install required packages for our custom bootc image.
    # Note that using a minimal manifest means we need to add critical components specific to our use case and environment.
    dnf -y install NetworkManager openssh-server
    # Remove package caches
    dnf clean all
    # Clean up all logs and caches
    rm /var/{log,cache,lib}/* -rf
    # Run the bootc linter to perform build-time verification. Keep this as the last command in your build instructions.
    bootc container lint
    # Close the shell command.
    EORUN
    # Define required labels for this bootc image to be recognized as such.
    LABEL containers.bootc 1
    LABEL ostree.bootable 1
    # Optional labels that only apply when running this image as a container. These keep the default entry point running under systemd.
    STOPSIGNAL SIGRTMIN+3
    CMD ["/sbin/init"]

7.3. 必要な権限の構築

ルートファイルシステムをゼロから生成する場合、内部のビルドプロセスで (マウント名前空間など) のネストされたコンテナ化技術を使用する必要がありますが、これらはデフォルトでは有効化されていません。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • podman build に少なくとも以下の引数を指定して、新しいルートファイルシステムを生成します。

    --cap-add=all --security-opt=label=type:container_runtime_t --device /dev/fuse

7.4. bootc イメージをゼロから生成する

Red Hat Enterprise Linux アプリケーションのための、効率的でセキュアな基盤を構築するために、カスタムの最小限のベースイメージを生成します。最小限のベースイメージを作成することで、最終的なデプロイメントに必要不可欠なパッケージのみが含まれるようにして、システム全体のフットプリントと攻撃対象領域を削減できます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  • Containerfile を作成します。以下に例を示します。

    # The following example reuses the default base image as a "builder" image. Optionally,  you can use the commented instructions to configure or override the RPM repositories in /etc/yum.repos.d to, for example, refer to pinned versions
    FROM registry.redhat.io/rhel10/rhel-bootc:latest as builder
    # RUN rm -rf /etc/yum.repos.d/*
    # COPY mycustom.repo /etc/yum.repos.d
    RUN dnf repolist && /usr/libexec/bootc-base-imagectl build-rootfs --manifest=minimal /target-rootfs
    # Create a new, empty image from scratch.
    FROM scratch
    # Copy the root file system built in the previous step into this image.
    COPY --from=builder /target-rootfs/ /
    # You can make arbitrary changes such as copying the systemd units and other tweaks from the baseconfig container image. This example uses the heredocs syntax, to improve and make it easy to add complex instructions, and install critical components
    RUN <<EORUN
    set -xeuo pipefail
    # Install networking support and SSH which are not in minimal
    dnf -y install NetworkManager openssh-server
    dnf clean all
    rm /var/{log,cache,lib}/* -rf
    bootc container lint
    EORUN
    # This label is required
    LABEL containers.bootc 1
    LABEL ostree.bootable 1
    # These labels are optional but useful if you want to keep the default of running under systemd when run as a container image.
    STOPSIGNAL SIGRTMIN+3
    CMD ["/sbin/init"]

次のステップ

  • Containerfile を作成すると、単一の tar ファイルの大きなレイヤーを持つイメージが取得されます。レジストリーへのプッシュ、クライアントへのプルなどのすべての変更により、単一の大きな tar ファイルがコピーされ、コンテナーイメージのサイズが増加します。作成したコンテナーイメージを小さいバージョンに最適化できます。

7.5. コンテナーイメージを小さいバージョンに最適化する

bootc-base-imagectl rechunk サブコマンドを使用して、入力されたコンテナーイメージを最適化します。これにより、ファイルシステムをコンテンツアドレス指定可能な再現可能なレイヤーへと分割し、事前に SELinux ラベルを計算して付与することができます。これにより、レイヤーの再利用 (重複排除) を最大化し、イメージビルド間のデータ転送を最小限に抑えることで、プッシュとプル両方においてネットワーク効率が向上します。

前提条件

  • 以前にビルドされたベースイメージがある。

手順

  • ベースイメージを再チャンク化するには、次のコマンドを実行します。

    $ sudo podman run --rm --privileged -v /var/lib/containers:/var/lib/containers \
          registry.redhat.io/rhel10/rhel-bootc:latest \
          /usr/libexec/bootc-base-imagectl rechunk \
              quay.io/exampleos/rhel-bootc:single \
              quay.io/exampleos/rhel-bootc:chunked

    rechunk 操作は、デフォルトの作成モード (FROM <rhel-bootc> を使用して新しいイメージを作成する手法) で生成されたイメージに対して機能します。これは、単一の大きな tar レイヤーのみを出力するスクラッチビルドと組み合わせて使用すると便利です。

    rechunk 操作を行わない場合、たとえばカーネルの更新など、入力に対する変更はすべて、bootc イメージの内容全体を含む新しいレイヤーの生成につながります。この新しいレイヤーは、プッシュされ、レジストリーに保存され、クライアントによってプルされる必要があります。

    bootc イメージに含まれる bootc-base-imagectl ユーティリティーは、コンテナー内で実行されます。ただし、機能させるには、ホストのコンテナーストレージをコンテナーにマッピングする必要があります。

第8章 bcvk を使用したブート可能なコンテナーのテストとデプロイ

コンテナー化されたシステムのアップデートを効果的に管理するには、bootc 仮想化キット (bcvk) をインストールしてください。このツールは、bootc コンテナーから直接一時的な仮想マシン (VM) を起動できるようにすることで、開発とデプロイメントの間のギャップを埋めます。

8.1. bootc コンテナー仮想化キット

bootc 仮想化キット (bcvk) は、コンテナー開発とハードウェアデプロイメントの間のギャップを埋めます。このツールを使用すると、bootc コンテナーから一時的な仮想マシン (VM) を起動して、起動可能なイメージをローカルでテストしたり、実稼働環境のフレームワーク用のディスクイメージを生成したりできます。

bcvk を 使用することで、開発環境で使用されるものと同じコンテナー化されたブート可能なイメージが仮想マシン上で実行されるため、環境全体の一貫性が維持されます。

仮想化モードの選択
デプロイする前に、どの bcvk モードが使用事例に適しているかを判断してください。
Expand
機能一時的な (実行)永続的 (libvirt)ディスクイメージ (to-disk)

主な用途

迅速なテストまたは反復

長期的な開発または生産

ベアメタルまたはクラウドインポート

永続性

なし (終了時に消去されます)

完全版 (再起動後も動作継続)

フルサイズ (単体イメージ)

Privileges

ルートレス (ユーザー空間)

libvirt グループメンバーシップ

ファイルにはルートレス、/dev/* にはルート権限が必要

速度

最速の起動時間

Moderate

処理速度が遅い (大規模なクエリーを作成するとプロセッサーの使用率が上昇する可能性がある)

8.2. bccvk ツールのインストール

コンテナー開発とハードウェアデプロイメントを連携させるために、EPEL リポジトリーから bcvk をインストールしてください。ローカル仮想マシンで起動可能なイメージをテストしたり、実稼働環境用のディスクイメージを作成したりするのに使用できます。開発からデプロイメントまでの一貫性を維持するためには、仮想化スタックが必要です。

前提条件

  • 仮想化スタック (QEMU、virtiofsd) を備えたホスト環境があります。
  • Podman をインストールしている。
  • オプション: 永続的な仮想マシン (VM) 管理のために、libvirt デーモンが必要です。

手順

  1. お使いのディストリビューションのリポジトリーを有効にしてください。たとえば、AppStream の場合:

    $ sudo subscription-manager repos --enable=rhel-10-for-x86_64-appstream-rpms
  2. Red Hat Enterprise Linux (RHEL) Extra Packages for Enterprise Linux (EPEL) リポジトリーを有効にします。

    $ sudo dnf install epel-release
  3. bcvk パッケージをインストールしてください。

    $ sudo dnf install bcvk

検証

  1. インストールを確認します。

    $ bcvk --version
  2. オプション: 永続的な仮想マシン管理に libvirt を使用している場合は、libvirtd サービスを開始してください。

    $ sudo systemctl enable --now libvirtd

    このコマンドは仮想化デーモンを初期化し、仮想マシンオーケストレーションのためのバックエンドインフラストラクチャーがアクティブであることを保証します。

8.3. 起動可能なコンテナーイメージの検出

効率的な環境を維持するために、bootc ワークフローと互換性のあるローカルコンテナーイメージを特定してください。

手順

  1. ローカルシステム上で、bootc で使用するために明示的にラベル付けされているイメージをリスト表示してください。

    $ bcvk images list

    このコマンドは、すべてのローカルイメージのメタデータをスキャンし、containers.bootc=1 ラベルを含むイメージのリストを返します。

    • コマンドがイメージをリスト表示した場合、それらはブート可能であることが検証され、bcvk ephemeralbcvk libvirt、または bcvk to-disk コマンドで使用できます。
    • コマンドを実行してもイメージが表示されない場合は、互換性のあるイメージ (たとえば、registry.redhat.io/rhel10/rhel-bootc) をプルしたか、カスタムビルドしたイメージの Containerfile に必要なラベルが含まれていることを確認してください。

      LABEL containers.bootc=1
  2. オプション: 特定のイメージが欠落している場合は、そのラベルを手動で確認してください。

    $ podman inspect --format '{{.Config.Labels}}' <image_name>

8.4. 一時的な仮想マシンの管理

bcvk ephemeral run コマンドを使用すると、迅速な反復とテストのために一時的な仮想マシン (VM) を起動できます。これらの仮想マシンはユーザー空間仮想化を使用するため、ルート特権は不要です。

前提条件

  • ホストシステムに bcvk ユーティリティーをインストールしました。
  • 機能的な仮想化スタック (QEMU、virtiofsd) を備えたホスト環境があります。
  • 現在のユーザー向けに Podman をインストールし、設定しました。
  • podman login コマンドを使用して registry.redhat.io への認証が完了しました。

手順

  1. bootc コンテナーを一時的な仮想マシンとして実行する:

    $ bcvk ephemeral run -d --rm -K --name my-test-vm registry.redhat.io/rhel10/rhel-bootc:latest
    -d
    仮想マシンをデタッチモード (バックグラウンド) で実行します。
    --rm
    仮想マシンが停止すると、自動的に削除され、リソースがクリーンアップされます。
    -K
    ホストの SSH キーを仮想マシンに自動的に挿入し、即座にアクセスできるようにします。
    --name
    インスタンスにカスタム名 (my-test-vm) を割り当てます。
  2. オプション: run-ssh コマンドを使用して、仮想マシンを起動して一度にログインすることもできます。

    $ bcvk ephemeral run-ssh registry.redhat.io/rhel10/rhel-bootc:latest

    このモードでは、仮想マシンはセッションベースのリソースとして扱われます。SSH シェルを終了すると、自動的に終了します。

  3. 仮想マシン環境内で必要なタスクを実行してください。
  4. セッションを終了する:

    $ exit
    注記

    終了時には、一時的な仮想マシン内のすべての変更は破棄され、リソースはホストによって解放されます。

8.5. libvirt と bcvk を使用した永続的な仮想化の設定

libvirtbcvk を併用することで、実稼働環境に必要な安定性と制御性を実現できます。この設定では、再起動後もシステムの状態が維持され、きめ細かなリソース割り当てが可能になるため、起動可能なイメージがターゲットハードウェアのパフォーマンスと制約を確実に反映します。

前提条件

  • ホストシステムに bcvk ユーティリティーをインストールしました。
  • libvirtd デーモンをインストール、有効化、起動しました。
  • あなたは libvirt ドメインを管理する権限を持っています。libvirt グループの典型的なメンバー設定。
  • あなたは registry.redhat.io コンテナーレジストリーへのアクセス権を持っています。

永続的な仮想化を設定するには、以下の手順を実行してください。

手順

  1. 以下のいずれかの方法を使用して、永続的な libvirt 仮想マシンを作成します。

    • デフォルト設定で基本的な仮想マシンを作成するには:

      libvirt run コマンドは、ネットワーク設定や SSH 設定を含む仮想マシンのプロビジョニングを自動化します。

      $ bcvk libvirt run registry.redhat.io/rhel10/rhel-bootc:latest
    • 特定のリソース制約を持つカスタマイズされた仮想マシンを作成するには:

      フラグを使用して、名前、メモリー容量 (MB 単位)、CPU 数、およびディスクサイズ (GB 単位) を定義します。

      $ bcvk libvirt run --name dev-vm --memory 4096 --cpus 4 --filesystem btrfs --disk-size 50G registry.redhat.io/rhel10/rhel-bootc:latest
  2. 仮想マシンのプロビジョニングが完了したら、bcvk libvirt サブコマンドを使用してその状態を管理します。

    Expand
    タスクコマンド

    仮想マシンのリストを表示

    bcvk libvirt リスト

    仮想マシンを起動する

    bcvk libvirt start <vm_name>

    仮想マシンを停止する

    bcvk libvirt stop <vm_name>

    仮想マシンを削除する

    bcvk libvirt rm -f <vm_name>

    SSH 経由でアクセス

    bcvk libvirt ssh <vm_name>

重要

bcvk ユーティリティーは、systemd の 認証情報を使用して SSH 鍵を挿入することにより、安全なアクセスを処理します。プロビジョニングプロセス中に生成される秘密鍵は、特定の仮想マシンに固有のものであり、ドメインメタデータ内に安全に保存されます。実稼働環境や長期開発の場合、bcvk は libvirt と直接統合されます。

8.6. bootc コンテナーからディスクイメージを生成する

bcvk ユーティリティーを to-disk コマンドと組み合わせて使用すると、bootc コンテナーイメージをベアメタルまたはクラウドデプロイメント用の物理ディスクまたは仮想ディスク形式に変換できます。.qcow2 などの特定の仮想ディスクファイルを作成するか、イメージをブロックデバイスに直接書き込みます。

  1. 前提条件

    • ホストシステムに bcvk ユーティリティーをインストールしました。
    • ローカルまたはリモートの bootc コンテナーイメージが利用可能です。
    • 生成されたイメージを保存するのに十分なディスク容量がホストマシン上にあります。
    • ブロックデバイスやシステムパスに直接書き込むには、root 権限 または sudo 特権が必要です。
  2. 手順

    • 以下のいずれかの方法を使用してディスクイメージを生成します。

      • 仮想ディスクイメージを作成する:

        $ bcvk to-disk --format=qcow2 localhost/my-image output-disk.qcow2
    • --format: 出力ディスクの種類を指定します。サポートされているフォーマット: qcow2raw (デフォルト)。
    • output-disk.qcow2: 生成されたディスクイメージの保存先ファイル名を指定します。

      • 物理デバイスに直接書き込む:

        $ bcvk to-disk registry.redhat.io/rhel10/rhel-bootc:latest /path/to/disk.img
        警告

        たとえば /dev/sdX の ようなブロックデバイスに直接書き込むと、そのデバイス上の既存のデータはすべて上書きされます。コマンドを実行する前に、ターゲットパスが正しいことを確認してください。

第9章 bootc イメージビルドで FIPS モードを有効にする

Federal Information Processing Standard (FIPS) 140 は、暗号化モジュールの要件を定義しています。これらの要件を満たすには、FIPS モードを有効にする必要があります。bootc コンテナーイメージのビルド中に FIPS モードを有効にできます。

9.1. FIPS 対応システム用のブート可能なディスクイメージの作成

Anaconda インストールを実行するときに、ディスクイメージを作成し、FIPS モードを有効化できます。ディスクイメージを起動するときに、fips=1 カーネル引数を追加する必要があります。

前提条件

  • ホストマシンに Podman がインストールされている。
  • ホストマシンに virt-install がインストールされている。
  • bootc-image-builder ツールを実行し、コンテナーを --privileged モードで実行して、イメージをビルドするための root アクセスがある。

手順

  1. 01-fips.toml を作成して FIPS の有効化を設定します。次に例を示します。

    # Enable FIPS
    kargs = ["fips=1"]
  2. 次の指示を含む Containerfile を作成して、fips=1 カーネル引数を有効にし、暗号化ポリシーを調整します。

    FROM quay.io/<namespace>/<image>:latest
    # Enable fips=1 kernel argument: https://bootc-dev.github.io/bootc/building/kernel-arguments.html
    COPY 01-fips.toml /usr/lib/bootc/kargs.d/
    # Install and enable the FIPS crypto policy
    RUN dnf install -y crypto-policies-scripts && update-crypto-policies --no-reload --set FIPS
  3. コンテナーを実行する前に、output フォルダーを初期化します。ディレクトリーがすでに存在する場合にコマンドが失敗しないようにするには、-p 引数を使用します。

    $ mkdir -p ./output
  4. カレントディレクトリーの Containerfile を使用して、bootc <image> と互換性のあるベースディスクイメージを作成します。

    $ sudo podman run \
        --rm \
        -it \
        --privileged \
        --pull=newer \
        --security-opt label=type:unconfined_t \
        -v ./config.toml:/config.toml \
        -v ./output:/output \
        -v /var/lib/containers/storage:/var/lib/containers/storage \
        registry.redhat.io/rhel10/bootc-image-builder:latest \
        --type iso \
        quay.io/<namespace>/<image>:<tag>
  5. システムのインストール中に FIPS モードを有効にします。

    1. RHEL Anaconda インストーラーを起動するときに、インストール画面で TAB キーを押して、fips=1 カーネル引数を追加します。インストール後に、システムは FIPS モードで自動的に起動します。

検証

  • システムにログインした後、FIPS モードが有効になっていることを確認します。

    $ cat /proc/sys/crypto/fips_enabled
    1
    $ update-crypto-policies --show
    FIPS

第10章 ブート可能なイメージのセキュリティー強化とコンプライアンス

Image Mode for RHEL は、セキュリティーコンプライアンス機能を提供し、準拠した設定を必要とするワークロードをサポートします。ただし、システムを強化し、コンプライアンスステータスを検証するプロセスは、パッケージモードの場合とは異なります。

Image Mode for RHEL を使用する際の重要な部分は、ブート可能なコンテナーイメージを作成することです。デプロイされたシステムはイメージをミラーリングします。したがって、ビルドされたイメージには、セキュリティーポリシーに必要なすべてのパッケージと設定が含まれている必要があります。

重要

ブート可能なイメージをコンテナーとして実行すると、一部の強化設定は有効になりません。セキュリティープロファイルに従って完全に設定されたシステムを取得するには、コンテナーとして実行するのではなく、ベアメタルまたは仮想マシンでイメージを起動する必要があります。コンテナーデプロイメントの主な違いは次のとおりです。

  • コンテナー内で systemd が実行されていないため、セキュリティープロファイルに必要な systemd サービスはコンテナー上で実行されません。したがって、コンテナーは関連するポリシー要件に準拠できません。
  • その他のサービスは、正しく設定されていても、コンテナー内で実行できません。つまり、oscap は、実行されていない場合でも、正しく設定されていると報告します。
  • コンプライアンスプロファイルによって定義された設定は強制されません。他のパッケージやインストール時のプリスクリプトからの要求によって、コンプライアンス状態が変更される可能性があります。インストールされた製品のコンプライアンスを常に確認し、要件に合わせて Containerfile を変更します。

10.1. 強化されたブート可能なイメージのビルド

Red Hat Enterprise Linux のデプロイメントにおいて、非常にセキュアな基盤を構築するには、セキュリティーを強化したブート可能なイメージを作成できます。組織の厳格な基準への準拠を確実にするため、セキュリティー設定をベースイメージに直接組み込むこともできます。

ブート可能なコンテナーイメージをビルドする際に使用する Containerfileoscap-im ツールを含めることで、セキュリティーを強化したブート可能なイメージをビルドできます。oscap-im ツールは任意の SCAP コンテンツを使用できますが、scap-security-guide の SCAP ソースデータストリームは、ブート可能なコンテナーと互換性があるように特別に調整およびテストされています。

前提条件

  • container-tools メタパッケージがインストールされている。
  • システムが準拠する必要があるベースライン内のプロファイルの ID を知っている必要があります。ID を見つけるには、設定コンプライアンスのプロファイルの表示 セクションを参照してください。

手順

  1. Containerfile を作成します。

    FROM quay.io/<namespace>/<image>:latest
    
    # Install OpenSCAP scanner and security content to the image
    RUN dnf install -y openscap-utils scap-security-guide && dnf clean all
    
    # Run scan and hardening
    RUN oscap-im --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
    
    # Because certain profiles prevent ssh root logins, add a separate sudo user with a password
    # Alternatively, you can add users with Kickstart, cloud-init, or other methods
    RUN useradd -G wheel -p "<password_hash>" <admin_user>

    <admin_user> はユーザー名に、<password_hash> は、選択したパスワードのハッシュに置き換えます。

    この Containerfile は次のタスクを実行します。

    • oscap-im ツールを提供する openscap-utils パッケージと、Security Content Automation Protocol (SCAP) コンテンツを含むデータストリームを提供する scap-security-guide パッケージをインストールします。
    • SSH ルートログインを阻止するプロファイルに sudoer 権限を持つユーザーを追加します。
    • 選択されたプロファイルに準拠して、イメージのスキャンと修復を行います。
  2. カレントディレクトリーにある Containerfile を使用してイメージをビルドします。

    $ podman build -t quay.io/<namespace>/<image>:<tag> .

検証

  • すべてのイメージをリスト表示します。

    $ podman images
    REPOSITORY                                  TAG      IMAGE ID       CREATED              SIZE
    quay.io/<namespace>/<image>                 <tag>   b28cd00741b3   About a minute ago   2.1 GB

次のステップ

  • 通常のブート可能イメージのデプロイメント方法のいずれかを使用して、強化されたブート可能イメージをデプロイできます。詳細は、RHEL bootc イメージのデプロイ を参照してください。

    ただし、デプロイメント方法は、対象システムのコンプライアンス状態に影響を与える可能性があります。

  • パッケージモード RHEL と同じ構文と使用法で oscap ツールを使用して、Image Mode RHEL で実行中のシステムのコンプライアンスを検証できます。詳細は、設定コンプライアンススキャン を参照してください。

10.2. 強化されたブート可能イメージのカスタマイズ

oscap-im ツールを使用して、カスタマイズされたプロファイルをブート可能なイメージに適用できます。セキュリティープロファイルをカスタマイズするには、特定のルール (パスワードの最小長など) のパラメーターを変更し、別の方法で対象とするルールを削除し、追加のルールを選択して内部ポリシーを実装できます。プロファイルをカスタマイズして新しいルールの定義はできません。

前提条件

手順

  1. Containerfile を作成します。

    FROM quay.io/<namespace>/<image>:latest
    
    # Copy a tailoring file into the Containerfile
    COPY tailoring.xml /usr/share/
    
    # Install OpenSCAP scanner and security content to the image
    RUN dnf install -y openscap-utils scap-security-guide && dnf clean all
    
    
    # Add sudo user 'admin' with password 'admin123'.
    # The user can be used with profiles that prevent
    # ssh root logins.
    RUN useradd -G wheel -p "\$6\$Ga6Zn
    IlytrWpuCzO\$q0LqT1USHpahzUafQM9jyHCY9BiE5/ahXLNWUMiVQnFGblu0WWGZ1e6icTaCGO4GNgZNtspp1Let/qpM7FMVB0" admin
    
    # Run scan and hardening including the tailoring file
    RUN oscap-im --tailoring-file /usr/share/tailoring.xml --profile stig_customized /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml

    この Containerfile は次のタスクを実行します。

    • イメージにテーラリングファイルを注入します。
    • oscap-im ツールを提供する openscap-utils パッケージと、Security Content Automation Protocol (SCAP) コンテンツを含むデータストリームを提供する scap-security-guide パッケージをインストールします。
    • SSH ルートログインを阻止するプロファイルに sudoer 権限を持つユーザーを追加します。
    • 選択されたプロファイルに準拠して、イメージのスキャンと修復を行います。
  2. カレントディレクトリーにある Containerfile を使用してイメージをビルドします。

    $ podman build -t quay.io/<namespace>/<image>:<tag> .

検証

  • すべてのイメージをリスト表示します。

    $ podman images
    REPOSITORY                                  TAG      IMAGE ID       CREATED              SIZE
    quay.io/<namespace>/<image>                 <tag>   b28cd00741b3   About a minute ago   2.1 GB

次のステップ

  • 通常のブート可能イメージのデプロイメント方法のいずれかを使用して、強化されたブート可能イメージをデプロイできます。詳細は、RHEL bootc イメージのデプロイ を参照してください。

    ただし、デプロイメント方法は、対象システムのコンプライアンス状態に影響を与える可能性があります。

    注記

    bootc-image-builder のブループリントや Anaconda のキックスタートでデプロイメント時に行われた一部のカスタマイズは、コンテナーイメージに含まれる設定と干渉する可能性があります。セキュリティーポリシーの要件と競合するカスタマイズは使用しないでください。

  • パッケージモード RHEL と同じ構文と使用法で oscap ツールを使用して、Image Mode RHEL で実行中のシステムのコンプライアンスを検証できます。詳細は、設定コンプライアンススキャン を参照してください。

第12章 RHEL bootc イメージの管理

RHEL bootc イメージをインストールしてデプロイした後、システムの変更や更新などの管理操作をコンテナーイメージに対して実行できます。システムは、デプロイメント後にロールバックが可能なインプレーストランザクション更新をサポートします。この種の管理は Day 2 管理ベースラインとも呼ばれ、コンテナーレジストリーから新しいオペレーティングシステムの更新をトランザクショナルに取得して、システムを起動します。同時に、障害発生時には手動または自動のロールバックをサポートします。

注記

rhel-bootc イメージは、RPM パッケージなどの基礎となる入力が更新されるたびに再ビルドされます。これらの再ビルドは少なくとも毎月実行されますが、重要な更新がリリースされた場合はより頻繁に実行されます。ユーザーは、更新イメージをプッシュするタイミングを完全に制御できます。新しく公開されたベースイメージでは、カスタムイメージの自動再ビルドまたは再デプロイメントはトリガーされません。更新の頻度を設定し、必要な場合にのみ変更をプッシュします。

12.1. コンテナーイメージ参照の切り替え

bootc switch コマンドを使用して、アップグレードに使用するコンテナーイメージ参照を変更できます。たとえば、ステージタグから実稼働タグに切り替えることができます。既存の ostree-based コンテナーイメージ参照を手動で切り替えるには、bootc switch コマンドを使用します。

前提条件

  • bootc を使用して起動したシステム。

手順

  • 以下のコマンドを実行します。

    $ sudo bootc switch [--apply] quay.io/<namespace>/<image>:<tag>

    システム変更時に再起動などのアクションを自動的に実行する場合は、必要に応じて --apply オプションを使用できます。

    注記

    bootc switch コマンドは bootc upgrade と同じ効果があります。唯一の違いは、コンテナーイメージ参照が変更されることです。これにより、ホスト SSH キーやホームディレクトリーなど、/etc および /var 内の既存の状態を保持できます。

12.2. bootc イメージ initramfs のコンテンツの追加または変更

rhel10/rhel-bootc イメージは、dracut インフラストラクチャーを使用して、イメージのビルド時に初期 RAM ディスク (initrd) を構築します。デフォルトの initrd は、コンテナーイメージ内の /usr/lib/modules/<kernel_version>/initramfs.img に構築および追加されます。

ドロップイン設定ファイルを使用すると、dracut の設定を拡張できます。このファイルは /usr/lib/dracut/dracut.conf.d/ に配置できます。これにより、追加する必要があるモジュールを使用して initrd が再作成されます。

前提条件

  • bootc を使用して起動したシステム。

手順

  • コンテナービルドの一部として initrd を再作成します。

    FROM <baseimage>
    COPY <custom_modules_list>.conf /usr/lib/dracut/dracut.conf.d
    RUN set -x; kver=$(cd /usr/lib/modules && echo *); dracut -vf /usr/lib/modules/$kver/initramfs.img $kver
    注記

    デフォルトでは、dracut コマンドは実行中のカーネルバージョンをプルしようとするため、エラーが発生します。エラーを回避するために、ターゲットのカーネルバージョンを dracut に明示的に渡してください。

12.3. インストールされたオペレーティングシステムからの更新の手動実行

Image Mode for RHEL では、変更をコンテナーレジストリーにプッシュすることで、システムの変更や更新など、その他の管理タスクを実行できます。

Image Mode for RHEL を使用する場合、システムを手動で更新することを選択できます。自動更新が有効な場合は、手動更新を実行するために自動更新をオフにする必要があります。これを行うには、次のいずれかの方法を使用します。

  • bootc upgrade コマンドの実行
  • systemd タイマーファイルの変更

12.3.1. 自動更新の無効化

手動更新を実行するには、自動更新をオフにする必要があります。手順で説明されている以下のいずれかのオプションを使用して、コンテナービルドのタイマーを無効にすることでこれを実行できます。

前提条件

  • bootc を使用して起動したシステム。

手順

  • コンテナービルドのタイマーを無効にします。

    • systemctl mask コマンドを実行します。

      $ systemctl mask bootc-fetch-apply-updates.timer
    • systemd タイマーファイルを変更します。systemd の "ドロップイン" を使用して、タイマーをオーバーライドします。次の例では、更新は週に 1 回スケジュールされています。

      1. 次の内容で updates.conf ファイルを作成します。

        [Timer]
        # Clear previous timers
        OnBootSec= OnBootSec=1w OnUnitInactiveSec=1w
      2. 作成したディレクトリーにファイルを追加します。

        $ mkdir -p /usr/lib/systemd/system/bootc-fetch-apply-updates.timer.d
        $ cp updates.conf /usr/lib/systemd/system/bootc-fetch-apply-updates.timer.d

12.3.2. インストールされたオペレーティングシステムの手動更新

レジストリーから手動で更新を取得し、新しい更新でシステムを起動するには、bootc upgrade コマンドを使用します。このコマンドは、インストールされたオペレーティングシステムからコンテナーイメージレジストリーへの、トランザクショナルなインプレース更新を取得します。

このコマンドはレジストリーを照会し、次回の起動のために更新されたコンテナーイメージをキューに追加します。このコマンドはベースイメージへの変更をステージングしますが、デフォルトでは実行中のシステムを変更しません。

前提条件

  • bootc を使用して起動したシステム。

手順

  • 以下のコマンドを実行します。

    $ bootc upgrade [--apply]

    apply 引数はオプションです。システム変更時に再起動などのアクションを自動的に実行する場合は、この引数を使用できます。

    注記

    bootc upgrade コマンドは bootc update のエイリアスです。どちらのコマンドも同じ効果があります。

    詳細は、システム上の bootc-upgrade の man ページを参照してください。

12.3.3. ダウンロード専用モードを使用したイメージのアップグレード

ダウンロード専用モードを使用すると、適用前の更新の検証、ネットワーク負荷の高いダウンロードを伴うフリート全体へのロールアウト管理、およびシステム変更を伴う再起動のタイミングが個別に発生するシナリオへの対応が可能になります。bootc upgrade コマンドに --download-only フラグを付けて使用することで、システムが再起動時に自動的に適用することなく、更新をダウンロードしてステージングすることができます。

デフォルトでは、bootc upgrade コマンドは新しいコンテナーイメージをダウンロードし、次回の再起動時に自動的に適用されるようにステージングします。ダウンロード専用モードを使用することで、ダウンロードフェーズと適用フェーズを分離できます。このモードは、厳格なメンテナンス期間が設定されている実稼働環境において、定期的な再起動中に意図しない更新が発生することを防ぎます。

前提条件

  • システムは bootc を使用して起動されます。
  • 自動更新は無効になっています。自動更新の無効化 を参照してください。

手順

  1. ダウンロード専用モードで更新をダウンロードします。

    $ bootc upgrade --download-only
  2. ステージング環境のデプロイメントのモードを確認します。

    $ bootc status --verbose
    Staged:
    Image: quay.io/example/rhel-guest:latest
    Version: 10.2.20260126
    download-only: yes

    出力に download-only: yes という行が表示されることからわかるように、次回の起動時にこのバージョンに自動的に切り替えることはできません。

  3. メンテナンス期間中は、ダウンロード専用モードで以下のいずれかの方法でステージングされた更新を適用できます。

    • イメージソースから取得せずに、ステージングされた更新を適用する場合:

      $ bootc upgrade --from-downloaded
    • ステージングされた更新を適用し、直ちに再起動する場合:

      $ bootc upgrade --from-downloaded --apply
    • より新しい更新を確認して適用する場合:

      $ bootc upgrade

      フラグを指定せずに bootc upgrade コマンドを実行すると、コンテナーイメージのソースからプルして更新を確認します。ステージングされたデプロイメントが利用可能な最新の更新と一致する場合、ステージングされたデプロイメントがロック解除されます。より新しい更新が利用可能な場合、そのより新しいバージョンがステージングされたデプロイメントを置き換えます。

検証

  • ステージングされたデプロイメントがダウンロード専用モードになっていることを確認するには、出力に download-only: yes という行が表示されていることを確認します。

    $ bootc status --verbose
    Staged:
    Image: quay.io/example/rhel-guest:latest
    Version: 10.2.20260126
    download-only: yes

12.4. 更新されたオペレーティングシステムからのロールバックの実行

bootc rollback コマンドを使用すると、以前のブートエントリーにロールバックしてシステムの変更を元に戻すことができます。このコマンドは、rollback 対象のデプロイメントを次回の起動のキューに追加することで、ブートローダーエントリーの順序を変更します。現在のデプロイメントはロールバックになります。

キュー内の適用されなかったアップグレードなどのステージングされた変更は、すべて破棄されます。ロールバックの完了後、1 - 3 時間以内に更新タイマーが作動します。これにより、システムは自動的に更新され、ロールバック元のイメージに再起動されます。

警告

ロールバックを実行すると、自動更新をオフにしない限り、システムは自動的に再度更新されます。自動更新の無効化 を参照してください。

たとえば、bootc rollback コマンドを使用してロールバックを実行すると、/etc ディレクトリー内のファイルに加えられた変更は、ロールバックされたデプロイメントには引き継がれません。代わりに、/etc ディレクトリー内のファイルは、以前のデプロイメント時の状態に戻ります。

bootc rollback コマンドは既存のデプロイメントの順序を変更しますが、新しいデプロイメントは作成しません。新しいデプロイメントが作成されると、/etc ディレクトリーがマージされます。

ロールバック後に使用できるように、変更された /etc ファイルを保持するには、/var (特定の <user>/var/home/<user> など) または root ユーザーの /var/root/ のディレクトリーに /etc の内容をコピーします。これらのディレクトリーにはユーザーコンテンツが保存されるため、ロールバックの影響を受けません。

一時的なロールバックまたは別の bootc ロールバックによって元の状態に戻ると、/etc ディレクトリーは元のデプロイメントの状態に戻ります。

または、ロールバックする問題が /etc ディレクトリー内の設定ファイルに関係していない場合は、bootc switch コマンドを使用して以前のデプロイメントに戻します。このコマンドは、必要な /etc マージを実行し、ソフトウェアの以前のバージョンをデプロイします。

前提条件

  • システムの更新を実行した。

手順

  • 以下のコマンドを実行します。

    $ bootc rollback [-h|--help] [-V|--version]
    注記

    bootc rollback コマンドは bootc upgrade と同じ効果があります。唯一の違いは、コンテナーイメージが追跡されることです。これにより、ホストの SSH 鍵やホームディレクトリーなど、/etc および /var 内の既存の状態を保持することが可能になります。

検証

  • systemd journal を使用して、検出されたロールバック呼び出しに関するログに記録されたメッセージを確認します。

    $ journalctl -b

    次のようなログが表示されます。

    MESSAGE_ID=26f3b1eb24464d12aa5e7b544a6b5468

    詳細は、システム上の bootc-rollback(8) の man ページを参照してください。

12.5. システムグループへの更新のデプロイ

Containerfile を変更することで、オペレーティングシステムの設定を変更できます。コンテナーイメージをビルドしてレジストリーにプッシュし、オペレーティングシステムを再起動すると、更新が適用されます。

bootc switch コマンドを使用して、コンテナーイメージソースを変更することもできます。コンテナーレジストリーの内容によって、RHEL Image Mode オペレーティングシステムの具体的な設定が決まります。コンテナーイメージ参照の切り替え を参照してください。

通常、システムグループに更新をデプロイする場合、セントラル管理サービスを使用できます。これにより、各システムにインストールされ、セントラルサービスに接続するクライアントを提供できます。多くの場合、管理サービスでは、クライアントが 1 回限りの登録を実行する必要があります。

以下は、システムグループに更新をデプロイする例です。必要に応じて、管理サービスの認証情報をイメージに注入して変更することで、永続的な systemd サービスを作成できます。

注記

理解しやすいように、以下の例の Containerfile は最適化されていません。たとえば、イメージ内に複数のレイヤーが作成されないように最適化するには、RUN を 1 回だけ呼び出します。

Image Mode for RHEL イメージにクライアントをインストールし、起動時にクライアントを実行してシステムを登録できます。

前提条件

  • 管理クライアントが、cron ジョブまたは別の systemd サービスを使用して、今後のサーバーへの接続を処理する。

手順

  • 次の特徴を持つ管理サービスを作成します。管理サービスは、システムをいつアップグレードするかを決定します。

    FROM registry.redhat.io/rhel10/rhel-bootc:latest
    # Management services determine when to upgrade the system.
    # Disable bootc-fetch-apply-updates.timer if it is included in the base image.
    RUN systemctl disable bootc-fetch-apply-updates.timer
    
    # Install the client from dnf, or some other method that applies for your client
    RUN dnf install management-client -y && dnf clean all
    
    # Inject the credentials for the management service into the image
    ARG activation_key=
    
    # The existence of .run_next_boot acts as a flag to determine if the
    # registration is required to run when booting
    RUN touch /etc/management-client/.run_next_boot
    
    COPY <<"EOT" /usr/lib/systemd/system/management-client.service
    [Unit]
    Description=Run management client at boot
    After=network-online.target
    ConditionPathExists=/etc/management-client/.run_client_next_boot
    
    [Service]
    Type=oneshot
    EnvironmentFile=/etc/management-client/.credentials
    ExecStart=/usr/bin/management-client register --activation-key ${CLIENT_ACTIVATION_KEY}
    ExecStartPre=/bin/rm -f /etc/management-client/.run_next_boot
    ExecStop=/bin/rm -f /etc/management-client/.credentials
    
    [Install]
    WantedBy=multi-user.target
    EOT
    
    # Link the service to run at startup
    RUN ln -s /usr/lib/systemd/system/management-client.service /usr/lib/systemd/system/multi-user.target.wants/management-client.service
    
    # Store the credentials in a file to be used by the systemd service
    RUN echo -e "CLIENT_ACTIVATION_KEY=${activation_key}" > /etc/management-client/.credentials
    
    # Set the flag to enable the service to run one time
    # The systemd service will remove this file after the registration completes the first time
    RUN touch /etc/management-client/.run_next_boot
    1. ベースイメージに bootc-fetch-apply-updates.timer が含まれている場合は無効にします。
    2. dnf を使用するか、クライアントに適用される他の方法を使用してクライアントをインストールします。
    3. 管理サービスの認証情報をイメージに注入します。

12.6. インベントリーの健全性の確認

Red Hat Enterprise Linux で管理されているノードのステータスを評価し、それらがオンラインでアクセス可能であることを確認します。インベントリーの健全性を確認することで、システムが中断することなく、更新や設定変更を受け取れる状態にあることを確認できます。コンテナーイメージとコンテナー内で実行中のイベントのシステム健全性を、手動で確認できます。

前提条件

  • コンテナーイメージをアクセス可能なリポジトリーにプッシュした。
  • container-tools メタパッケージがインストールされている。

手順

  • コンテナーのヘルスチェックステータスを表示します。

    • podman inspect または podman ps コマンドを使用します。

      $ podman inspect --format='{{json .State.Health.Status}}' <container>
      healthy
    • podman ps コマンドを使用します。

      $ podman healthcheck run <container>
      healthy
  • podman events コマンドを使用して、Podman で発生するイベントを監視および出力します。各イベントには、タイムスタンプ、タイプ、ステータス、名前 (該当する場合)、およびイメージ (該当する場合) が含まれます。

    $ now=$(date --iso-8601=seconds)
    $ podman events --since=now --stream=false
    healthy

12.7. 自動化と GitOps

CI/CD (継続的インテグレーションおよび継続的デリバリー) パイプラインを使用して、RHEL bootc イメージのビルドプロセスを自動化できます。CI/CD を使用すると、イベントによって更新 (アプリケーションの更新など) をトリガーできます。

このような更新を追跡して CI/CD パイプラインをトリガーする自動化ツールを使用できます。たとえば、GitHub Actions や GitLab CI などです。パイプラインは、トランザクショナルなバックグラウンドのオペレーティングシステム更新を使用して、システムを最新の状態に保ちます。

12.8. イメージモードシステムの工場出荷時設定へのリセットを実行する

システムを元の状態に復元し、/var/etc をコンテナーイメージの状態にリセットし、システムへの変更を元に戻すには、既存の bootc システムの非破壊的な工場出荷時設定へのリセットを実行できます。工場出荷時設定にリセットすると、システムは完全に初期状態に戻って再起動します。この状態では、/etc ディレクトリーにはコンテナーイメージからの設定のみが含まれており、/var ディレクトリーは空です。つまり、以前のシステムからのユーザーデータや状態はすべて失われます。

重要

イメージモードシステムの工場出荷時設定へのリセットは、テクノロジープレビューとして提供されます。テクノロジープレビュー機能は、Red Hat 製品サポートのサービスレベルアグリーメント (SLA) ではサポートされておらず、機能的に完全ではない可能性があるため、Red Hat では実稼働環境での使用を推奨していません。テクノロジープレビュー機能では、最新の製品機能をいち早く提供します。これにより、お客様は開発段階で機能をテストし、フィードバックを提供できます。

Red Hat Technology Preview 機能のサポート範囲の詳細は、Red Hat カスタマーポータルの Technology Preview 機能のサポート範囲を 参照してください。

前提条件

  • 起動可能なコンテナーシステムをお持ちです。
  • コンテナーレジストリーには、リセットしたいコンテナーイメージへのアクセス権があります。
警告

Anaconda や cloud-init などのツールによって追加されたユーザーを失う可能性があります。bootc-image-builder ツールや Anaconda などのインストーラーは、bootc install reset コマンドが削除する状態をイメージに追加します。

手順

  1. 工場出荷時設定にリセットしてください。目的に応じて、以下のいずれかのコマンドを実行してください。

    • 現在実行中のイメージと同じイメージにリセットするには:

      $ sudo bootc install reset --experimental
    • リセットして別のイメージに切り替えるには:

      $ sudo bootc install reset --experimental --target-imgref quay.io/example/myimage:latest
    • リセットしてすぐに再起動するには:

      $ sudo bootc install reset --experimental --apply
    • カスタムカーネル引数を追加するには:

      $ sudo bootc install reset --experimental --karg=console=ttyS0,115200n8
    • ルートファイルシステムのカーネル引数の継承をスキップするには:

      $ sudo bootc install reset --experimental --no-root-kargs

      新しいデプロイメントに再起動した後でも、/sysroot/ostree/deploy/<old-stateroot>/ 内のファイルを調べることで、古いシステムのデータにアクセスできます。

      注記

      工場出荷時設定にリセットして新しいステートルートに再起動した後も、古いステートルートは /sysroot/ostree/deploy/<old-stateroot>/ にディスク上に残ります。必要であれば、以前のシステムからファイルにアクセスできます。詳細は、古いステートルートのクリーンアップを 参照してください。

第13章 bootc システムでのカーネル引数の管理

カーネル引数を管理することで、Red Hat Enterprise Linux bootc システムの起動プロセスをカスタマイズできます。これらのパラメーターを設定することで、イメージのビルド時またはインストール段階で設定を適用し、パフォーマンスをチューニングしたり、ハードウェアの互換性を確保したりすることができます。

bootc を使用すると、カーネル引数を設定できます。bootc は、デフォルトで /boot/loader/entries に保存されているブートローダー設定ファイルを使用します。このディレクトリーは、Linux カーネルに提供される引数を定義します。このカーネル引数のセットは、マシン固有の状態ですが、カーネル引数はコンテナー更新を使用して管理することもできます。ブートローダーメニューのエントリーは、複数のオペレーティングシステム間で共有されます。ブートローダーは、1 つのデバイスにインストールされます。

注記

現在、ブートローダーエントリーは OSTree バックエンドによって書き込まれます。

13.1. bootc を使用してカーネル引数を注入するためのサポートの追加

bootc ツールは、汎用のオペレーティングシステムカーネルを使用します。/usr/lib/bootc/kargs.d に TOML 形式のカスタム設定を追加することで、カーネル引数を注入するサポートを追加できます。

前提条件

  • コンテナーイメージを作成した。

手順

  • たとえば、カーネルを注入するためのサポートを追加します。

    # /usr/lib/bootc/kargs.d/10-example.toml
    kargs = ["mitigations=auto,nosmt"]
  • オプション: match-architectures キーを使用して、これらのカーネル引数をアーキテクチャー固有にすることもできます。以下に例を示します。
# /usr/lib/bootc/kargs.d/00-console.toml
kargs = ["console=ttyS0,115200n8"]
match-architectures = ["x86_64"]

13.2. bootc インストール設定を使用したカーネル引数の変更

bootc インストール設定を使用してカーネル引数を変更するには、Red Hat Enterprise Linux デプロイメントの起動動作をカスタマイズします。これらのパラメーターにより、システム更新や再起動後も維持される、特定のハードウェア設定やパフォーマンスの最適化が可能になります。

bootc install コマンドを --karg オプションとともに使用すると、次の方法でインストール時にカーネル引数を注入できます。

  • コンテナーイメージにカーネル引数を追加する。
  • bootc install --karg コマンドを使用してカーネル引数を追加する。

Day 2 オペレーションでカーネル引数を使用するには、引数を追加し、切り替え、アップグレード、または編集操作時にその引数を適用します。

前提条件

  • コンテナーイメージを作成した。

手順

  1. カーネル引数を使用して /usr/lib/bootc/kargs.d 内にファイルを作成します。

    $ sudo tee /usr/lib/bootc/kargs.d/console.kargs << EOF
    console=tty0 console=ttyS0,115200n8
    EOF
  2. コンテナーイメージを取得して OSTree コミットを取得します。

    $ podman pull quay.io/<your_org>/<your_bootc_image>:latest
  3. OSTree コミットを使用してファイルツリーを返します。

    # bootc install to-filesystem --karg=root=<UUID>=<uuid of /mnt> --imgref $self /mnt
  4. /usr/lib/bootc/kargs.d カーネル引数ディレクトリーに移動します。

    cd /usr/lib/bootc/kargs.d
  5. カーネル引数ディレクトリー内の各ファイルを読み取ります。

    $ find /usr/lib/bootc/kargs.d -name ".kargs" -exec cat {} \;*
  6. kargs ファイルの内容を、必要なすべての kargs を含むファイルにプッシュします。

    $ CONSOLIDATED_KARGS="/tmp/all-kargs.txt"
  7. kargsstage() 関数に渡します。

    $ bootc kargs --append="$KARGS_STRING"
  8. 運用中に、切り替え、アップグレード、または編集操作に対してカーネル引数を適用します。

    $ bootc switch --transport=registry quay.io/<your_org>/<your_bootc_image>:latest

13.3. Containerfile へのカーネル引数の注入

イメージビルドプロセス中にブートパラメーターを設定するには、Red Hat Enterprise Linux の Containerfile にカーネル引数を注入します。これらの設定を組み込むことで、コンテナーイメージからプロビジョニングされるあらゆるシステムに特定のカーネルオプションが一貫して適用され、デプロイ後の設定が不要になります。

前提条件

  • コンテナーイメージを作成した。

手順

  • カーネル引数を注入します。

    FROM registry.redhat.io/rhel10/rhel-bootc:latest
    
    RUN mkdir -p /usr/lib/bootc/kargs.d
    RUN cat <<EOF >> /usr/lib/bootc/kargs.d/console.toml
    kargs = ["console=ttyS0,115200n8"]
    match-architectures = ["x86_64"]
    EOF
    
    RUN cat <<EOF >> /usr/lib/bootc/kargs.d/01-mitigations.toml
    kargs = ["mitigations=on", "systemd.unified_cgroup_hierarchy=0"]
    match-architectures = ["x86_64", "aarch64"]
    EOF

13.4. インストール時のカーネル引数の注入

--karg を指定した boot install を使用すると、インストール時にカーネル引数を注入できます。その結果、カーネル引数はマシンローカルの状態になります。つまり、その特定のマシンに固有の永続的な設定になります。

前提条件

  • コンテナーイメージを作成した。

手順

  • カーネル引数を注入します。

    # bootc install to-filesystem --karg=root=<UUID>=<uuid of /mnt> --imgref $self /mnt

13.5. bootc-image-builder を使用したインストール時のカーネル引数の追加

bootc-image-builder を使用して、Red Hat Enterprise Linux の bootc イメージにインストール時のカーネル引数を追加します。初期プロビジョニングプロセス中に必要なハードウェア固有の設定やコンソール出力を設定するために、customizations.kernel.append を使用してカーネルパラメーターを定義します。

前提条件

  • コンテナーイメージを作成した。

手順

  • 次のカスタマイズを使用して、bootc-image-builder でカーネル引数を追加します。

    {
      "customizations": {
        "kernel": {
          "append": "mitigations=auto,nosmt"
        }
      }
    }

13.6. kargs.d を使用したインストール後のカーネル引数の変化

kargs.d ファイルに加える変更をコンテナービルドに含めると、それらはインストール後に適用されます。カーネル引数のセット間の差分が、現在のブートローダー設定に適用されます。これにより、マシンローカルのカーネル引数が保持されます。

/boot/loader/entries ファイルは、任意のツールを使用して編集できます。これは標準化された形式のファイルです。/boot ファイルには、このファイルシステムに書き込むことができるツールセットを制限するために、読み取り専用アクセスが設定されています。

13.7. bootc システムでのカーネル引数の編集

マシンのローカル変更を実行するには、rpm-ostree kargs コマンドを使用して、bootc システムまたは rpm-ostree システム上のカーネル引数を編集することもできます。変更は user/lib/bootc/kargs.d パスを通じて行われます。このパスでは、最初のブートの変更に加えて Day 2 の変更も処理されます。

前提条件

  • コンテナーイメージを作成した。

手順

  • カーネル引数を追加します。次に例を示します。

    # rpm-ostree kargs --append debug
    Staging deployment... done
    Freed: 40.1 MB (pkgcache branches: 0)
    Changes queued for next boot. Run "systemctl reboot" to start a reboot
  • 詳細はヘルプを確認してください。

    # rpm-ostree kargs --help

    以下は、カーネル引数を追加、変更、または削除するために使用できるオプションです。

    rpm-ostree kargs

    --append=KEY=VALUE
    カーネル引数を追加します。たとえば、複数回使用できる console= などで便利です。引数には空の値を使用できます。
    --replace=KEY=VALUE=NEWVALUE
    既存のカーネル引数を置き換えます。引数にすでに 1 つの値が存在する場合にのみ、その引数を KEY=VALUE で置き換えることができます。
    --delete=KEY=VALUE
    特定のカーネルのキー値ペア引数、または 1 つのキー値ペアを持つ引数全体を削除します。
    --append-if-missing=KEY=VALUE
    カーネル引数を追加します。キーがすでに存在する場合は何も行いません。
    --delete-if-present=KEY=VALUE
    特定のカーネルのキー値ペア引数を削除します。キーがない場合は何も行いません。
    --editor
    エディターを使用してカーネル引数を変更します。

13.8. Image Mode for RHEL におけるサードパーティー製ドライバーの統合

ドライバーが更新後も確実に動作するようにするには、サードパーティー製のカーネルモジュールをコンテナーのビルドプロセスに直接含めます。これにより、ネットワークおよびセキュリティードライバーは、イメージの更新、アップグレード、再起動後も引き続き利用可能になります。

デフォルトの RHEL カーネルに含まれていないファイルシステム、ネットワーク、またはセキュリティーモジュールを使用するには、Image Mode for RHEL のワークフローを使用します。従来のパッケージモードでは、dnf を使用して稼働中のシステムにドライバーをインストールしますが、イメージモードではファイルシステムをイミュータブルとして扱います。

カスタムドライバーを含めるには、マルチステージビルドを使用できます。rhel-bootc イメージをビルドステージとして使用し、サードパーティー製のカーネルモジュールをインストールしてソースコードをコンパイルします。これにより、生成される起動可能イメージ内のカーネルとドライバーの互換性が保証されます。

前提条件

  • コンテナーのビルド中に depmod を自動的に使用して依存関係のマッピングを処理するために、.ko ファイルを RPM にラップしている。

手順

  1. ビルドホスト上で、ドライバーをコンパイルし、RPM パッケージをビルドします。

    1. 仕様を確認し、パッケージをビルドします。

      $ cat SPECS/hello.spec
    2. ドライバー RPM をビルドします。

      $ rpmbuild -ba SPECS/hello.spec
  2. オペレーティングシステムイメージにドライバーを追加するための Containerfile を作成します。rhel-bootc ベースイメージを使用します。以下に例を示します。

    # Copy the pre-built RPM into the build context
    COPY rpms/hello-<version>-<release>.el10.<arch>.rpm /tmp/

    または、ネットワーク上の場所から取得することもできます。

    # Install the RPM.
    # The %post scripts in the RPM triggers 'depmod' automatically inside the image.
    RUN dnf install -y /tmp/hello-<version>-<release>.el10.<arch>.rpm && \
       	dnf clean all && \
        	rm /tmp/hello-<version>-<release>.el10.<arch>.rpm
  3. コンテナーイメージをビルドして実行します。コンテナーのビルド を参照してください。

検証

  1. システムを再起動します。

    $ sudo reboot
  2. カーネルモジュールがシステム上で利用可能であることを確認します。

    $ sudo uname -r
    <kernel_version>
    
    $ sudo ls -l /lib/modules/<kernel_version>/extra/
    total 12
    -rwxr-xr-x. 1 root root 8512 Jan  1  1970 hello.ko
  3. イメージを確定する前にモジュールの依存関係が計算されていることを確認してください。そうしないと、modprobe が最初の起動時に失敗する可能性があります。

    $ sudo depmod -a <kernel-version>
  4. モジュールをロードできることを確認します。

    $ sudo modprobe /lib/modules/<kernel_version>/extra/hello.ko
    $ sudo lsmod | grep hello
       hello        12288  0
    $ sudo rmmod hello
    $ sudo dmesg
     ..snip..
    [   84.738633] hello: loading out-of-tree module taints kernel.
    [   84.738684] hello: module verification failed: signature and/or required key missing -tainting kernel.
    [   84.740548] Hello, world!
    [  138.206978] Goodbye!

第14章 Image Mode for RHEL でのファイルシステムの管理

Red Hat Enterprise Linux Image Mode のデプロイメントにおけるファイルシステムレイアウトとマウントポイントを設定します。これらのストレージ設定を管理することで、オペレーティングシステムが永続データをどのように処理するかを定義でき、システム更新や再起動後も、重要な情報が確実に利用できるようになります。

イメージモードでは、バックエンドとして OSTree が使用され、ストレージ用にデフォルトで composefs が有効になります。そのため、/opt などに書き込む派生コンテナーイメージに、サードパーティーのコンテンツをインストールできます。/opt/usr といったローカルパスは、プレーンディレクトリーであり、/var へのシンボリックリンクではないためです。

警告

サードパーティーのコンテンツを /opt にインストールすると、サードパーティーのコンポーネントも実行時に /opt 内のサブディレクトリーに書き込もうとする可能性があります。そのため、競合が発生する可能性があります。

14.1. /sysroot による物理ルートと論理ルートの概要

bootc システムが完全に起動すると、システムは chroot よって作成された環境と似た状態になります。つまり、オペレーティングシステムが、現在実行中のプロセスとその子プロセスの見かけ上のルートディレクトリーを変更します。物理ホストのルートファイルシステムは /sysroot にマウントされます。chroot ファイルシステムはデプロイメントルートと呼ばれます。

残りのファイルシステムパスは、システムブートの最終ターゲットとして使用されるデプロイメントルートの一部です。システムは、ostree=kernel 引数を使用してデプロイメントルートを検索します。

/usr
オペレーティングシステムのすべてのコンテンツは /usr に保存することが望ましいです。/bin などのディレクトリーは、/usr/bin へのシンボリックリンクとして機能します。このレイアウトにより、オペレーティングシステムとホスト固有のリソースが分離されます。
注記

composefs が有効な場合、/usr/ と変わりません。両方のディレクトリーは同じイミュータブルイメージの一部であるため、bootc システムで完全な UsrMove を実行する必要はありません。

/usr/local
bootc システムを使用すると、デフォルトのエントリーポイントとしてカスタムコンテナーイメージを作成できます。そのため、ベースイメージでは /usr/local が通常のディレクトリー、つまりデフォルトのディレクトリーとして設定されます。

デフォルトのファイルシステムレイアウトでは、/opt/usr/local の両方が通常のディレクトリーとして存在します。これらは、ビルド時には書き込み可能で、実行時には変更できません。これは、たとえば、これらのシンボリックリンクを /var に作成する RHEL CoreOS とは異なります。

/etc

/etc ディレクトリーにはデフォルトで変更可能な永続状態が含まれますが、etc.transient config オプションを有効にすることがサポートされています。ディレクトリーが変更可能な永続状態にある場合は、アップグレード全体で 3 方向のマージが実行します。

  • 新しいデフォルトの /etc をベースとして使用します
  • 現在の /etc と以前の /etc の差分を新しい /etc ディレクトリーに適用します。
  • 同じデプロイメントのデフォルトの /usr/etc とは異なる、ローカルで変更されたファイルを /etc に保持します。

ostree-finalize-staged.service は、新しいブートローダーエントリーを作成する前に、シャットダウン時にこれらのタスクを実行します。このような仕組みになっている理由は、Linux システムの多くのコンポーネントが、デフォルトの設定ファイルを /etc ディレクトリーに置いた状態で出荷されるためです。デフォルトのパッケージに含まれていない場合でも、ソフトウェアは /etc 内の設定ファイルのみをチェックします。

/etc の明確なバージョンが存在しないパッケージベースの更新システムでは、/etc はインストール時にのみ設定され、それ以降の変更は一切できません。これにより、/etc システムの状態が初期イメージバージョンの影響を受けるようになり、たとえば /etc/sudoers.conf に変更を適用する際に問題が発生し、外部からの介入が必要になる可能性があります。

/var
たとえば、/var ディレクトリーは 1 つしかありません。デフォルトでは、/var ディレクトリーに配置されたファイルとデータは、明示的に削除されるまで保持され、異なるセッションやシステムの再起動後も利用できます。/var パーティションまたはそのサブディレクトリーは、一時ファイルシステム (TMPFS) やネットワークマウントポイントのようなマウントポイントにすることもできます。/var に専用のパーティションを作成しない場合、システムによってバインドマウントが実行され、単一の共有の永続的な /ostree/deploy/$stateroot/var/var ディレクトリーに作成されます。これにより、両方のディレクトリーがデプロイメント間で同じデータを共有するようになります。

デフォルトでは、/var 内のコンテンツはボリュームとして機能します。コンテナーイメージの内容は、初期インストール時にコピーされ、その後は更新されません。

/var ディレクトリーと /etc ディレクトリーは異なります。小さな設定ファイルには /etc を使用でき、想定される設定ファイルは、多くの場合 /usr 内のオペレーティングシステムバイナリーにバインドされています。/var ディレクトリーには、システムログ、データベースなどの任意の大きさのデータが格納されます。デフォルトでは、オペレーティングシステムの状態がロールバックされても、このディレクトリーはロールバックされません。

たとえば、dnf downgrade postgresql などの更新を実行しても、/var/lib/postgres 内の物理データベースには影響しません。同様に、bootc update または bootc rollback を実行しても、このアプリケーションデータには影響しません。

/var が別になっている場合、新しいオペレーティングシステムの更新を適用する前に、それらをステージングする際にもスムーズに機能します。更新はダウンロード済みで準備は完了していますが、再起動後にのみ有効になります。同じことが Docker ボリュームにも当てはまり、アプリケーションコードとそのデータが切り離されます。

アプリケーションに /var/lib/postgresql などの事前に作成されたディレクトリー構造を持たせたい場合に、このケースを使用できます。これには systemd tmpfiles.d を使用します。ユニットで StateDirectory=<directory> を使用することもできます。

その他のディレクトリー
コンテナーイメージ内の /run/proc、またはその他の API ファイルシステム内のコンテンツを出荷することはサポートされていません。それ以外にも、/usr/opt などの他のトップレベルディレクトリーは、コンテナーイメージとともにライフサイクル化されます。
/opt
bootccomposefs を使用するため、/opt ディレクトリーは /usr などの他の最上位ディレクトリーと同様に読み取り専用になります。

ソフトウェアが /opt/exampleapp 内の独自のディレクトリーに書き込む必要がある場合は、ログファイルなどの操作のために、たとえば /var にリダイレクトするシンボリックリンクを使用するのが一般的なパターンです。

RUN rmdir /opt/exampleapp/logs && ln -sr /var/log/exampleapp /opt/exampleapp/logs

オプションで、これらのマウントを動的に実行するサービスを起動するように systemd ユニットを設定することもできます。以下に例を示します。

BindPaths=/var/log/exampleapp:/opt/exampleapp/logs
一時ルートを有効にする
一時的なルート権限を有効にすると、ソフトウェアが一時的に (次の再起動まで) /usr/opt を含むすべてのトップレベルディレクトリーに書き込むことができるようになります。永続的なコンテンツには、/var へのシンボリックリンクを使用します。デフォルトで完全に一時的な書き込み可能な rootfs を有効にするには、/usr/lib/ostree/prepare-root.conf で次のオプションを設定します。
[root]
transient = true

これにより、永続化する必要のあるコンテンツ用の /var へのシンボリックリンクを使用して、ソフトウェアが一時的に /opt に書き込めるようになります。

14.2. バージョンの選択と起動

Image Mode for RHEL では、IBM Z® アーキテクチャーを除き、デフォルトで GRUB が使用されます。現在システムで使用可能な Image Mode for RHEL の各バージョンには、メニューエントリーがあります。

メニューエントリーは 1 つの OSTree デプロイメントを指し示しています。OSTree デプロイメントは、Linux カーネル、initramfs、および OSTree コミットにリンクするハッシュで構成されています。このコミットは、ostree=kernel 引数を使用して渡すことができます。

起動時に、OSTree はカーネル引数を読み取り、ルートファイルシステムとして使用するデプロイメントを決定します。パッケージのインストール、カーネル引数の追加など、システムに対する更新または変更ごとに、新しいデプロイメントが作成されます。

これにより、更新によって問題が発生した場合に、以前のデプロイメントにロールバックできるようになります。

第15章 RHEL bootc イメージのソフトリブートを実行する

systemd ソフトリブートを実行して、Red Hat Enterprise Linux bootc システムに更新を適用します。このプロセスでは、ハードウェアの完全な再起動を必要とせずにオペレーティングシステムのコンポーネントをリロードするため、変更のデプロイメント処理が高速化され、メンテナンス時のダウンタイムが最小限に抑えられます。

15.1. RHEL bootc イメージへのソフトリブートの実行概要

ソフトリブートを使用すると、ハードウェアを完全に再起動することなく、Red Hat Enterprise Linux の bootc イメージに更新を適用できます。このプロセスでは、ファームウェアの初期化段階をスキップしてオペレーティングシステムのコンポーネントをリロードすることで、ダウンタイムを最小限に抑え、変更をより迅速に適用できます。

ソフトリブートでは、主にソフトウェア関連の一般的な問題が最小限のリスクで解決されます。これは、次のような問題に対する標準的なトラブルシューティングの手順です。

  • 軽微なソフトウェアの不具合: ソフトリブートにより、アプリケーションのフリーズ、クラッシュ、または誤動作の原因となる一時的なエラーが解決されます。
  • パフォーマンスの問題: 時間が経つにつれて、開いているアプリケーションやバックグラウンドプロセスがリソースを消費し、システムの速度が低下します。ソフトリブートによりこれらのプロセスがクリアされ、RAM が更新されるため、パフォーマンスが向上する可能性があります。
  • ネットワークの問題: 接続が切断されるなどの問題の場合、システムを再起動すると、ネットワーク設定が更新されます。
  • 更新の完了: 一部のシステム更新では、正常に完了するために再起動が必要です。

systemd を使用した RHEL 環境では、ソフトリブートによってカーネルとハードウェアを実行したままユーザー空間が再起動されるため、従来の完全なリブートに比べて大きな利点があります。

  • ダウンタイムの短縮: ソフトリブートでは、BIOS/UEFI、ブートローダー、カーネル、初期 RAM ディスク (initrd) などの時間のかかるブートプロセスが省略されるため、ダウンタイムが大幅に短縮されます。システムはすぐに再び応答可能になります。これは、ダウンタイムを最小限に抑えることが不可欠な重要なサーバーにとって重要です。
  • 運用効率の向上: カーネルに関係しないソフトウェアや設定の変更の場合、ソフトリブートを使用して、システム全体を再起動せずに更新を適用できます。これは、新しいルートファイルシステムのスナップショットを即座にアクティブ化できるコンテナー化されたシステムやイメージベースのシステムに特に役立ちます。

呼び出されると、systemd-soft-reboot.service システムサービスは次のアクションを実行します。

  • プロセスが終了するのを待たずに、実行中のすべてのプロセスに SIGTERM 信号を送信します。
  • 続いて、SIGKILL シグナルを送信して、すべてのプロセスを即座に停止させます。
  • /run/nextroot/ ディレクトリーが存在する場合 (これは通常のディレクトリー、ディレクトリーのマウントポイント、またはどちらかへのシンボリックリンクである可能性があります)、ファイルシステムのルートがそのディレクトリーに切り替えられます。
  • 更新されているルートファイルシステムからサービスマネージャーを再実行し、通常の再起動として新しいブートトランザクションをキューに登録します。
  • Soft-reboot.target は、このサービスをプルし、ユーザー空間のみの再起動操作を実行します。

15.2. パッケージおよびイメージモードでのソフトリブート動作

イメージモードで実行されているシステムは、ユーザー空間のみを再起動するパッケージモードシステムと同じ方法でソフトリブートを実行します。違いは、これらのパッケージとサービスの更新を最初にコンテナーイメージ上にビルドする必要があることです。

パッケージモードでのソフトリブート動作

パッケージベースのシステム (例: dnf を使用する RHEL システム) では、ソフトリブートプロセスで systemd ユニットをシャットダウンして再起動し、新しいライブラリーとバイナリーをロードします。最小限のダウンタイムで更新を適用できます。RHEL で dnf を使用して更新を適用すると、systemd はソフトリブート中のシステムの動作を管理します。主要なユニットと期待される動作は、以下のとおりです。

  • サービスの再起動: ソフトリブートにより、systemd は実行中のすべてのサービスを停止して再起動します。Web サーバーやデータベースなどのサービス用の更新されたパッケージは、サービスが再起動され、新しいバイナリーがリロードされる際にパッチを適用します。
  • ユニットの依存関係: systemd は、定義された依存関係と順序に基づいてユニットをシャットダウンおよび起動します。ソフトリブートにより、これらの関係が維持され、不適切なシャットダウンシーケンスが発生する可能性が最小限に抑えられます。
  • プロセスとライブラリー: glibcopenssl などの共有ライブラリーが更新されている場合、実行中のプロセスは、再起動されるまで引き続き、以前にマップされたライブラリーを使用します。ソフトリブートにより、すべてのプロセスが停止し、その後再起動して、ライブラリーの新しいバージョンにリンクされるようになります。
  • 最小限のダウンタイム: ソフトリブートではカーネルとハードウェアが再初期化されないため、ハードリブートよりも大幅に高速です。サービスの中断を最小限に抑えながら、大変のユーザー空間の更新を適用する場合に効果的です。
  • コマンドラインツール: dnf-plugins-core パッケージには、needs-restarting ツールが含まれています。dnf update の実行後、dnf needs-restarting コマンドを実行して、変更を適用するためにソフトリブートまたは特定のサービスの再起動が必要かどうかを確認できます。

ユーザー空間のパッチ適用は、ユーザー向けのアプリケーションと共有ライブラリーのセキュリティー上の脆弱性とバグに対処します。パッチを適用する場合、新しいコードをロードするにはソフトリブートまたはプロセスの再起動が必要です。以下に例を示します。

  • OpenSSL: 使用例: 重大な OpenSSL の脆弱性が発見されました。

Web サーバー、データベース、SSH デーモンなどの OpenSSL を使用するアプリケーションは、再起動しない限り脆弱性にさらされた状態が続き、引き続き脆弱な共有ライブラリーを使用します。

ソフトリブートソリューション: dnf update openssl の実行後にソフトリブートを実行すると、依存プロセスが停止します。その後、Systemd は、これらのサービスを再起動し、新しいパッチ適用済みの libssl.so および libcrypto.so ライブラリーを自動的にロードして、マシン全体を再起動せずにシステムを保護します。

  • Glibc: 使用例: GNU C ライブラリー (glibc) にバグまたはセキュリティー上の不具合が見つかりました。

問題: Glibc は、システム上のほぼすべてのプログラムが依存する基本的なユーザー空間コンポーネントです。glibc の脆弱性はシステム全体に影響を及ぼします。1 つか 2 つのサービスを再起動するだけでは不十分です。他の多くのプロセスは依然として脆弱なままだからです。

ソフトリブートによる解決策: dnf update glibc を実行してからソフトリブートを行うことが、すべてのプロセスが再起動して新しい glibc に再リンクされることを確実にする最も確実な方法です。これにより、システム全体の再起動が原因で長くなるダウンタイムを回避しながら、更新がすべての場所に適用されます。

  • dbus-broker:

使用例: セキュリティーまたはパフォーマンスのために dbus-broker デーモンを更新します。

問題: Dbus-broker は重要なシステムサービスです。通常更新しても影響はありませんが、プロトコルが敏感に反応するため、ブローカーと関連サービスを再起動する必要があります。

ソフトリブートソリューション: ソフトリブートは、dbus-broker とすべての依存サービスおよびアプリケーションを再起動し、systemd により、正常にシャットダウンおよび再初期化されます。

Image Mode for RHEL でのソフトリブート動作
RHEL Image Mode (bootc) では、systemd は高速なユーザー空間のみの再起動 (ソフトリブート) を実行します。Systemd-soft-reboot.service はこのプロセスを統括し、カーネルとハードウェアを動作させたままユーザー空間をリセットします。

イメージベースのシステムでは、次の 2 つの方法で更新を管理できます。

  • ステージングされた更新: システムはコンテナーレジストリーからこれらの更新を取得し、別のアクティブではないパーティションまたはファイルシステムにインストールします。再起動が開始されるまで、古いバージョンで実行され続けます。

ソフトリブートを実行すると、システムは新しくステージングされた更新済みのルートファイルシステムに切り替わり、ユーザー空間全体が一度に置き換えられます。システムは新しく更新されたオペレーティングシステムイメージで起動し、問題が発生した場合は、次回の起動時に以前のイメージにロールバックする機能が保持されます。

  • ステージングされていない更新: 設定の変更や単一のサービスの再起動など、実行中のユーザー空間に対する動的なインプレース更新。新しい完全なオペレーティングシステムイメージを作成して、そのイメージを起動する必要はありません。ソフトリブートでは、同じルートファイルシステムから現在のユーザー空間がリロードされます。新しい、更新されたオペレーティングシステムイメージをプルしたり、切り替えたりすることはありません。

これを使用すると、カーネルに触れることなく現在のソフトウェアの状態をリセットできます。これは、イメージレベル以外の変更を適用したり、ユーザー空間の問題を解決したりするのに役立ちます。

systemd のソフトリブートのメカニズムは、kexec のリブートとは異なります。kexec およびカーネル切り替え (kernel switching) 機能は、systemd のソフトリブートでは使用できません。ソフトリブートはユーザー空間のみを再起動し、カーネルはそのままの状態にするためです。これにより継続性が確保され、ハードウェアをリセットせずにカーネルを変更することで発生する可能性のある複雑さや不整合を回避できます。新しいカーネルバージョンを含む更新されたオペレーティングシステムイメージでは、従来どおりの完全な再起動が必要です。

15.3. ソフトリブートを開始する

Red Hat Enterprise Linux でソフトリブートを開始して、ハードウェアの完全な再起動を行わずにシステム更新を適用します。この方法は、ファームウェアの初期化プロセスをスキップしてオペレーティングシステムのコンポーネントをリロードすることで、ダウンタイムを最小限に抑えます。

システム管理者が bootc upgradebootc switch、または bootc rollback を実行すると、次の 2 つのオプションのいずれかを使用してシステムのソフトリブートを検出し、準備することができます。

  • --soft-reboot=auto: ソフトリブートが可能な場合はシステムを自動的に準備し、システムがソフトリブートに対応していない場合にはエラーを表示しません。
  • --soft-reboot=required: ソフトリブートが可能な場合はシステムを自動的に準備しますが、システムがソフトリブートに対応していない場合はエラーを表示します。

これらのオプションは、--apply 操作を停止させたり、bootc が正常に終了しなかった場合に再起動を行わないよう通知したりすることで、限られたダウンタイムが必要になるタイミングを管理するのに役立ちます。

前提条件

  • システムの現在の状態に関する情報が得られる。

手順

  1. bootc ツールを使用して新しいコンテナーイメージをステージングし、更新、切り替え、またはロールバック操作を実行します。実行しない場合は、ソフトウェアは現在のユーザー空間で再度実行されます。

    $ sudo bootc update --soft-reboot=required --apply
  2. たとえば、bootc スイッチの実行中にソフトリブートを開始します。

    $ sudo bootc switch --soft-reboot=required --apply quay.io/test_rh/soft-reboot:1

検証

  • ソフトリブートが完了したことを確認します。

    $ systemctl show --value --property SoftRebootsCount
    1
  • 新しい soft reboot:yes フラグを確認します。

    $ sudo bootc status --verbose

15.4. ソフトリブートの既知の制限

イメージモードで実行されるソフトリブートには、カーネルをそのままにしてユーザー空間を更新するように設計されているため、特定の制限があります。

既知の制限事項: * カーネルとハードウェアは変更されない: カーネル、ハードウェアドライバー、または低レベルのカーネルパラメーターへの変更は、ソフトリブート中には適用されません。これらの更新を有効にするには、システム全体を再起動する必要があります。また、sysctl を使用して構成されたカーネル設定などは、ソフトリブート中にリセットされません。システムは再起動前と同じ設定を引き続き使用します。

  • ファームウェアの初期化: ソフトリブート中に、オペレーティングシステム (OS) はファームウェアの初期化をスキップします。これは、オペレーティングシステムが制御をハードウェアに完全に明け渡すのを避け、制御を維持したまま、システムコールでカーネルを直接再起動するためです。kexec system call がこのプロセスを管理します。
  • ユーザー空間の変更に合わせてカーネルモジュールを調整するのはユーザーの責任である: Image Mode for RHEL でも、カスタムカーネルモジュールを再構築してユーザー空間の変更に合わせて調整する責任はユーザーに残っており、ソフトリブートではこれを回避できません。実際、ソフトリブートでは実行中のカーネルが維持されるため、ユーザー空間が更新されて異なるカーネルバージョンまたはモジュールセットが予期されている場合に互換性の問題が発生する可能性があります。

第16章 Image Mode for RHEL でのユーザー、グループ、SSH 鍵、シークレットの管理

Image Mode for Red Hat Enterprise Linux では、ユーザー、グループ、SSH キー、およびシークレットを管理することで、システムへのアクセスを制御できます。これらの認証情報を設定することで、コンテナーネイティブのオペレーティングシステムデプロイメントに対して、セキュアな認証および認可ポリシーを確立できます。

16.1. ユーザーとグループの設定

Red Hat Enterprise Linux の bootc イメージでユーザーとグループを設定し、システムアクセス制御と管理権限を確立します。イメージビルド時にこれらの設定を定義することで、そのイメージから派生したすべてのデプロイメントにおいて、一貫した認証ポリシーを確保できます。

汎用ベースイメージのユーザーとグループの設定
通常、ディストリビューションのベースイメージには設定がありません。セキュリティーリスクがあるため、汎用イメージ内の公開されている秘密鍵を使用してパスワードと SSH 鍵を暗号化しないでください。
systemd 認証情報を使用した SSH 鍵の注入
一部の環境では、systemd を使用して、root パスワードまたは SSH authorized_keys ファイルを注入できます。たとえば、System Management BIOS (SMBIOS) を使用して、SSH 鍵システムファームウェアを注入します。これは、qemu などのローカルな仮想化環境で設定できます。
cloud-init を使用したユーザーと SSH 鍵の注入
多くの Infrastructure as a Service (IaaS) および仮想化システムは、cloud-initignition などのソフトウェアによって一般的に処理されるメタデータサーバーを使用します。AWS instance metadata を参照してください。cloud-init または Ignition は、使用しているベースイメージに含まれる場合があります。または、独自の派生イメージにインストールすることもできます。このモデルでは、SSH 設定は bootc イメージの外部で管理されます。
コンテナーまたはユニットのカスタムロジックを使用したユーザーと認証情報の追加
cloud-init などのシステムには特権がありません。コンテナーイメージを起動する方法で、認証情報を管理するための任意のロジックを注入できます。たとえば、systemd ユニットを使用できます。認証情報を管理するには、FreeIPA などのカスタムのネットワークホストソースを使用できます。
コンテナービルドでのユーザーと認証情報の静的な追加

パッケージ指向のシステムでは、次のコマンドにより、派生ビルドを使用してユーザーと認証情報を注入できます。

RUN useradd someuser

shadow-utils のデフォルトの useradd 実装に問題がある場合があります。ユーザーとグループの ID が動的に割り当てられることにより、ドリフトが発生する可能性があります。

ユーザーとグループのホームディレクトリーと /var ディレクトリー

永続的に /home → /var/home に設定されたシステムの場合、最初のインストール後にコンテナーイメージで行われた /var への変更は、その後の更新には適用されません。

たとえば、コンテナービルドに /var/home/someuser/.ssh/authorized_keys を注入した場合、既存のシステムは更新された authorized_keys ファイルを取得しません。

systemd ユニットでの DynamicUser=yes の使用

システムユーザーの場合、可能な場合は systemd DynamicUser=yes オプションを使用します。

これは、潜在的な UID または GID のドリフトを回避できるため、パッケージのインストール時にユーザーまたはグループを割り当てるパターンよりもはるかに優れています。

nss-altfiles の使用

nss-altfiles は、システムユーザーを /usr/lib/passwd/usr/lib/group に分離します。この仕組みは、OSTree プロジェクトが /etc/passwd に関連する /etc の 3 方向マージを処理する方法と整合性を取るためのものです。現在、ローカルシステムで /etc/passwd ファイルが何らかの方法で変更された場合、その後コンテナーイメージの /etc/passwd に対して行われた変更は適用されません。

rpm-ostree によってビルドされたベースイメージでは、nss-altfiles がデフォルトで有効になっています。

また、ベースイメージには、UID または GID のドリフトを回避するために、NSS ファイルによって事前に割り当てられ、管理されるシステムユーザーがあります。

派生コンテナービルドでは、たとえば /usr/lib/passwd にユーザーを追加することもできます。sysusers.d または DynamicUser=yes を使用します。

systemd-sysusers の使用

たとえば、派生ビルドでは systemd-sysusers を使用します。詳細は、systemd -sysusers のドキュメントを参照してください。

COPY mycustom-user.conf /usr/lib/sysusers.d

sysusers ツールは、必要に応じて起動時に従来の /etc/passwd ファイルに変更を加えます。/etc が永続的であれば、UID または GID のドリフトを回避できます。つまり、UID または GID の割り当ては、特定のマシンがどのようにアップグレードされてきたかによって異なります。

ユーザーのマシンローカル状態

ファイルシステムのレイアウトは、ベースイメージによって異なります。

デフォルトでは、ユーザーデータはベースイメージに応じて、/etc/etc/passwd/etc/shadow および groups と、/home との両方に保存されます。ただし、いずれの汎用ベースイメージもマシンローカルな永続状態である必要があります。このモデルでは、/home/var/home/user へのシンボリックリンクです。

システムプロビジョニング時のユーザーと SSH 鍵の注入

/etc/var がデフォルトで永続化するように設定されたベースイメージの場合、Anaconda やキックスタートなどのインストーラーを使用してユーザーを注入できます。

通常、汎用インストーラーは 1 回限りのブートストラップ用に設計されています。その後、設定はミュータブルなマシンローカル状態になり、他のメカニズムを使用して Day 2 操作で変更できるようになります。

Anaconda インストーラーを使用して初期パスワードを設定できます。ただし、この初期パスワードを変更するには、passwd などの別のシステム内ツールが必要です。

これらのフローは bootc-compatible システムでも同様に機能します。異なるシステム内ツールに変更する必要なく、ユーザーが汎用ベースイメージを直接インストールすることをサポートします。

一時的なホームディレクトリー

多くのオペレーティングシステムのデプロイメントでは、永続的でミュータブルかつ実行可能な状態が最小限に抑えられます。これにより、ユーザーのホームディレクトリーが破損する可能性があります。

/home ディレクトリーを tmpfs として設定すると、再起動後にユーザーデータが確実に消去されます。このアプローチは、一時的な /etc ディレクトリーと組み合わせると特に効果的です。

たとえば、SSH authorized_keys やその他のファイルを注入するようにユーザーのホームディレクトリーをセットアップするには、systemd tmpfiles.d スニペットを使用します。

f~ /home/user/.ssh/authorized_keys 600 user user - <base64 encoded data>

SSH は、/usr/lib/tmpfiles.d/<username-keys.conf としてイメージ内に埋め込まれています。もう 1 つの例は、ネットワークからキーを取得して書き込むことができる、イメージに埋め込まれたサービスです。これは cloud-init で使用されるパターンです。

UID と GID のドリフト
/etc/passwd および同様のファイルは、名前と数値識別子間のマッピングです。マッピングが動的で、"ステートレス" なコンテナーイメージビルドと組み合わされると、問題が発生する可能性があります。各コンテナーイメージビルドでは、RPM のインストール順序やその他の理由により、UID が変更される場合があります。当該ユーザーが永続状態を維持する場合、これは問題になる可能性があります。このようなケースに対処するには、sysusers.d を使用するか、DynamicUser=yes を使用するように変換します。

16.2. Image Mode for RHEL でのシークレットの注入

Image Mode for RHEL でコンテナーレジストリーを認証し、システムサービスを保護するには、ビルド時の埋め込み、クラウドメタデータ、systemd 認証情報などの方法を使用してシークレットを注入します。これらのアプローチにより、bootc や Podman などのツールが保護されたイメージや更新にセキュアにアクセスできるようになります。環境に合った方法を選択することで、ホストシステムのセキュアなブートストラッププロセスを確立できます。

前提条件

  • containers-auth.conf ファイルを作成する。

    # Make /run/containers/0/auth.json (a transient runtime file)
    # a symlink to our /usr/lib/container-auth.json (a persistent file)
    # which is also symlinked from /etc/ostree/auth.json.
    d /run/containers/0 0755 root root -
    L /run/user/0/containers/auth.json - - - - ../../../../usr/lib/container-auth.json

手順

  1. bootc が認証の必要なレジストリーから更新を取得するには、ファイルにプルシークレットを含める必要があります。次の例では、creds シークレットにレジストリープルシークレットが含まれています。

    FROM quay.io/<namespace>/<image>:<tag>
    COPY containers-auth.conf /usr/lib/tmpfiles.d/link-podman-credentials.conf
    RUN --mount=type=secret,id=creds,required=true cp /run/secrets/creds /usr/lib/container-auth.json && \
      chmod 0600 /usr/lib/container-auth.json && \
      ln -sr /usr/lib/container-auth.json /etc/ostree/auth.json
  2. podman build コマンドを使用してイメージをビルドします。

    $ podman build --secret id=creds,src=$HOME/.docker/config.json

    コンテナーイメージに埋め込まれた共通の永続ファイル (例: /usr/lib/container-auth.json) へのシンボリックリンクを両方の場所に対して使用することで、bootc と Podman に単一のプルシークレットを使用します。

    コンテナービルドにシークレットを埋め込むことによるシークレットの注入
    レジストリーサーバーが適切に保護されている場合は、コンテナーイメージにシークレットを含めることができます。場合により、ブートストラップシークレットのみをコンテナーイメージに埋め込むことが実行可能なパターンになることがあります。特に、マシンをクラスターに対して認証するメカニズムと併用した場合が該当します。このパターンでは、プロビジョニングツールは、ホストシステムの一部として実行されるか、コンテナーイメージの一部として実行されるかに関係なく、ブートストラップシークレットを使用して SSH 鍵や証明書などの他のシークレットを注入または更新します。
    クラウドメタデータを使用したシークレットの注入
    実稼働環境の Infrastructure as a Service (IaaS) システムのほとんどは、シークレット (特にブートストラップシークレット) をセキュアにホストできる、メタデータサーバーまたは同等のものをサポートします。コンテナーイメージには、これらのシークレットを取得するための cloud-initignition などのツールを含めることができます。
    ディスクイメージにシークレットを埋め込むことによるシークレットの注入
    bootstrap secrets は、ディスクイメージにのみ埋め込むことができます。たとえば、AMI や OpenStack などの入力コンテナーイメージからクラウドディスクイメージを生成する場合、ディスクイメージには、実質的にマシンローカル状態であるシークレットが含まれることがあります。これらをローテーションするには、追加の管理ツールを使用するか、ディスクイメージを更新する必要があります。
    ベアメタルインストーラーを使用したシークレットの注入
    インストーラーツールは通常、シークレットを使用した設定の注入をサポートします。
    systemd 認証情報を使用したシークレットの注入

    systemd プロジェクトには、認証情報のデータをセキュアに取得してシステムやサービスに渡すための認証情報の概念があります。これは、一部のデプロイメント方法に適用されます。1 つ以上の認証情報が設定された状態でサービスが呼び出されると、環境変数 $CREDENTIALS_DIRECTORY が設定されます。この変数には、認証情報が格納されているディレクトリーへの絶対パスが含まれており、システムは設定された認証情報ごとに 1 つのファイルをこのディレクトリーに配置します。

    さらに、ユニットファイル内の %d 指定子は、サービスの認証情報ディレクトリーに解決され、システムはそれを $CREDENTIALS_DIRECTORY 環境変数と共にサービスプロセスに渡します。

16.3. レジストリーのプルシークレットの注入と TLS の無効化

コンテナー化された環境で、プライベートまたはセキュアでないレジストリーからイメージをプルできるように、コンテナーイメージを設定し、シークレットをプルし、システム内のレジストリーの TLS を無効にすることができます。

ベースイメージ内のレジストリーにアクセスするためのコンテナープルシークレットやその他の設定を含めることができます。ただし、Anaconda を使用してインストールする場合、ネットワーク経由で取得するときに対象のレジストリーにアクセスするために、インストール環境で "ブートストラップ" 設定の複製コピーが必要になる場合があります。

目的の bootc コンテナーイメージを取得する前にインストール環境に任意の変更を加えるには、Anaconda の %pre コマンドを使用できます。

手順

  1. プルシークレットを設定します。

    %pre
    mkdir -p /etc/ostree
    cat > /etc/ostree/auth.json << 'EOF'
    {
            "auths": {
                    "quay.io": {
                            "auth": "<your secret here>"
                    }
            }
    }
    EOF
    %end

    この設定では、システムが /etc/ostree/auth.json に保存されている指定の認証情報を使用して、quay.io からイメージをプルします。

  2. セキュアでないレジストリーの TLS を無効にします。

    %pre
    mkdir -p /etc/containers/registries.conf.d/
    cat > /etc/containers/registries.conf.d/local-registry.conf << 'EOF'
    
    [[registry]]
    location="[IP_Address]:5000"
    insecure=true
    EOF
    %end

    この設定では、システムが TLS で保護されていないレジストリーからコンテナーイメージをプルします。この設定は開発や社内ネットワークで使用できます。

    %pre は次の目的でも使用できます。

    • インストール環境に含まれているバイナリー (curl など) を使用して、ネットワークからデータを取得する。
    • update-ca-trust コマンドを使用して、信頼された認証局をインストール環境 /etc/pki/ca-trust/source/anchors に注入する。

      同様に、/etc/containers ディレクトリーを変更することで、セキュアでないレジストリーを設定できます。auth.json ファイルの形式と設定の詳細は、containers-auth.json(5) を参照してください。

16.4. コンテナープルシークレットの設定

コンテナーイメージを取得するには、ホストの更新を含むプルシークレットを使用してホストシステムを設定する必要があります。コンテナープルシークレットは、すでにビルドされたイメージに設定できます。ベアメタル用の Anaconda などの外部インストーラーや bootc-image-builder を使用する場合は、適切なプルシークレットを使用してシステムを設定する必要があります。ホストの bootc 更新では、rpm-ostree と共有される /etc/ostree/auth.json ファイルに設定が書き込まれます。

手順

  1. 単一のプルシークレットを使用するために、bootc と Podman の間にシンボリックリンクを作成します。シンボリックリンクを作成することにより、コンテナーイメージに埋め込まれる共通の永続ファイルに対する両方の場所を確保できます。

    FROM quay.io/<namespace>/<image>:<tag>
    COPY containers-auth.conf /usr/lib/tmpfiles.d/link-podman-credentials.conf
    RUN --mount=type=secret,id=creds,required=true cp /run/secrets/creds /usr/lib/container-auth.json && \
      chmod 0600 /usr/lib/container-auth.json && \
      ln -sr /usr/lib/container-auth.json /etc/ostree/auth.json
  2. containers-auth.conf ファイルを作成します。

    # Make /run/containers/0/auth.json (a transient runtime file)
    # a symlink to our /usr/lib/container-auth.json (a persistent file)
    # which is also symlinked from /etc/ostree/auth.json.
    d /run/containers/0 0755 root root -
    L /run/user/0/containers/auth.json - - - - ../../../../usr/lib/container-auth.json
  3. podman build コマンドを使用してイメージをビルドします。

    $ podman build --secret id=creds,src=$HOME/.docker/config.json

    Containerfile を実行すると、次の操作が実行されます。

    • この Containerfile は、containers-auth.conf を一時的なランタイムファイルとします。
    • containers-auth.conf へのシンボリックリンクを作成します。
    • また、永続ファイルも作成されます。このファイルにも、/etc/ostree/auth.json からのシンボリックリンクが設定されます。

      Podman にはシステム全体の認証情報がありません。Podman は、次のディレクトリー配下にある containers-auth の場所を受け付けます。

    • /run: このディレクトリーの内容は再起動時に消去されますが、不要なため消去されても問題ありません。
    • /root: root のホームディレクトリーの一部。デフォルトではローカルで変更可能な状態です。

      bootc と Podman の認証情報を統合するには、bootc と Podman の両方に単一のデフォルトのグローバルプルシークレットを使用します。次のコンテナービルドは、bootc と Podman の認証情報を統合する例です。この例では、creds という名前のシークレットに、ビルドするレジストリープルシークレットが含まれていることを想定しています。

第17章 システムの設定

Image Mode for RHEL は、コンテナーネイティブなアプローチを使用してオペレーティングシステムをビルド、デプロイ、管理します。イメージモードパッケージ、オペレーティングシステムおよびその設定は、registry.redhat.io/rhel10/rhel-bootc イメージをベースとしたコンテナイメージとして扱われます。このイメージには、イミュータブルなコンテナレイヤーとして、オペレーティングシステムとその設定が含まれています。

17.1. 一時的なランタイムの再設定

Red Hat Enterprise Linux Image Mode における一時的なランタイム再設定とは、稼働中のシステムに対して一時的な調整を行うことを指します。それらの変更内容をイミュータブルのコンテナーイメージに恒久的に組み込む前に、設定を安全にテストし、問題をトラブルシューティングすることができます。

ベースイメージ設定で動的な再設定を実行できます。たとえば、firewall-cmd --permanent コマンドを実行すると、再起動後も変更が永続的に適用されます。

警告

/etc ディレクトリーはデフォルトで永続的です。ツールを使用して変更を加える場合 (例: firewall-cmd --permanent)、システム上の /etc の内容がコンテナーイメージに記述されている内容と異なる可能性があります。

デフォルト設定では、まずベースイメージに変更を加えます。次に、稼働中のシステムを再起動せずに、変更内容をキューに追加します。最後に、既存のシステムに対してメモリー上でのみ変更を適用する書き込みを同時に実行します。

バインドマウントを使用すると、/etc ディレクトリーを一時的に設定できます。この場合、etc ディレクトリーはマシンのローカルルートファイルシステムの一部になります。たとえば、Anaconda キックスタートを使用して静的 IP アドレスを注入すると、アップグレード後もそのアドレスが保持されます。

システムはアップグレード全体にわたって 3 方向マージを適用し、各デプロイメントは /etc の独自のコピーを保持します。

/run ディレクトリー
/run ディレクトリーは、システムの再起動時に削除されるように定義されている API ファイルシステムです。/run ディレクトリーは一時ファイルに使用します。
動的な再設定モデル
プルモデルでは、ベースイメージまたは特権コンテナー内にコードを直接埋め込むことができます。このコードは、Podman API を使用してリモートネットワークサーバーに接続して設定を行い、その後、追加のコンテナーイメージを起動します。

Push モデルでは、一部のワークロードが Ansible などのツールによって実装されます。

systemd
/run/systemd ディレクトリーに書き込むことで、動的な一時再設定に systemd ユニットを使用できます。たとえば、systemctl edit --runtime myservice.service は、変更を永続化せずに、myservice.service ユニットの設定を動的に変更します。
NetworkManager
一時的なネットワーク設定を適用するには、/run/NetworkManager/conf.d ディレクトリーを使用します。変更をメモリーにのみ書き込むには、nmcli connection modify --temporary コマンドを使用します。--temporary オプションを指定しないと、コマンドによって永続的な変更が書き込まれます。
Podman
コンテナーの終了時にコンテナーを自動的に削除するには、podman run --rm コマンドを使用します。--rm オプションを指定しないと、システムの再起動後も保持されるコンテナーが podman run コマンドによって作成されます。

17.2. Image Mode for RHEL での DNF の使用

Containerfile 内の DNF ツールを使用して、Red Hat Enterprise Linux の bootc イメージのソフトウェアパッケージを管理します。これにより、すべての依存関係がビルド時に解決され、予測可能かつイミュータブルなデプロイメントが実現します。

rhel10/rhel-bootc コンテナーイメージには、dnf パッケージマネージャーが含まれています。dnf は、次のようなさまざまなユースケースで使用できます。

コンテナービルドの一部として dnf を使用する
Containerfile で RUN dnf install ディレクティブを使用できます。
実行時に dnf を使用する
警告

dnf のバージョンによって機能が異なります。error: can’t create transaction lock on /usr/share/rpm/.rpm.lock (Read-only file system) というエラーが発生する場合があります。

bootc-usr-overlay コマンドを使用すると、/usr ディレクトリー用の書き込み可能なオーバーレイファイルシステムを作成できます。dnf install はこのオーバーレイに書き込みを行い、デバッグツールのインストールに使用できます。再起動すると変更内容が失われる点に注意してください。

ストレージの設定

サポートされているストレージテクノロジーは次のとおりです。

  • xfs/ext4
  • 論理ボリューム管理 (LVM)
  • Linux Unified Key Setup (LUKS)

ホストシステムに他のストレージパッケージを追加できます。

  • bootc-image-builder を使用したストレージ: bootc-image-builder ツールを使用してディスクイメージを作成できます。パーティションとレイアウトに使用できる設定は、比較的固定されています。デフォルトのファイルシステムタイプは、コンテナーイメージの bootc インストール設定から取得されます。
  • bootc install を使用したストレージ: 一律のストレージ設定には、bootc install to-disk コマンドを使用できます。より高度なインストールには、bootc install to-filesystem コマンドを使用できます。詳細は to-filesystem を使用した高度なインストール を参照してください。

17.3. ネットワーク設定

デフォルトのイメージには、動的ネットワーク制御および設定システムである NetworkManager が含まれています。そのため、bootc は、接続されているすべてのインターフェイスにおいて、DHCP を使用して接続を試行します。/run/NetworkManager/conf.d ディレクトリーを設定することで、一時的なネットワーク設定を適用できます。

ただし、静的アドレス指定や、VLAN、ボンディング、ブリッジ、チームなどのより複雑なネットワークを使用する必要がある場合は、別の方法を使用できます。ネットワークを設定する方法に関係なく、NetworkManager の設定は NetworkManager キーファイルの形式を使用します。

ホストネットワーク設定オプション
複雑なネットワーク設定では、多くの場合、マシンごとの状態も必要です。たとえば、静的 IP アドレスが含まれたマシン固有のコンテナーイメージを生成できます。ホストの MAC アドレスを検査して、イメージ内からネットワーク設定を生成するコードを含めることもできます。
利用可能なネットワーク設定オプション

静的 IP を設定するために使用できるオプションと、設定方法は次のとおりです。

  • Containerfile を使用する: 静的 IP を持つコンテナーイメージを作成するか、MAC アドレスに基づいてイメージ内からネットワーク設定を生成するコードを含めます。

    • MAC アドレスまたはその他のアドレスをマッチさせるには、Device List Format で指定されている設定を使用します。
    • ネットワークを設定するには、起動済みのシステムで行うのと同様に、nmcli connection add を使用できます。ただし、ビルド時には、明示的に --offline 引数と組み合わせてコマンドを使用する必要があります。詳細は、nmcli を使用したイーサネット接続の設定 を参照してください。
    • ContainerFile 内の nmcli コマンドの前に、次のコマンドを追加してください。

      RUN nmcli --offline connection add
  • Anaconda を使用する場合: Anaconda キックスタートを使用して、ベアメタルインストール用に Wi-Fi を含むネットワークを設定できます。設定はデフォルトで /etc/NetworkManager/system-connections/ に保存され、基本的にマシン固有の状態として扱われます。
  • カーネル引数を使用する: 最初の起動時にカーネルパラメーターを追加して、ネットワーク設定を定義します。カーネル引数のほとんどは、dracut.cmdline の man ページで定義されています。さまざまな方法を使用して、最初の起動時にこれらのカーネル引数を適用できます。bootc install を使用する場合、--karg を使用してマシンごとにカーネル引数を設定することもできます。
  • NetworkManager キーファイルを使用する: nmcli または nm-initrd-generator
nmcli を使用して NetworkManager キーファイルを生成する

nmcli NetworkManager コマンドラインツールは、NetworkManager デーモンと通信せず、キーファイルの内容を標準出力に書き込むだけのオフラインモードを提供します。

  • 作成する接続プロファイルごとに nmcli ツールを実行します。

    $ nmcli --offline connection add \
            type ethernet ifname enp1s0 \
            ipv4.method manual ipv4.addresses 192.0.0.1/24 \
            ipv6.method disabled
    
    [connection]
    id=ethernet-enp1s0
    uuid=ff242096-f803-425f-9a77-4c3ec92686bd
    type=ethernet
    interface-name=enp1s0
    
    [ethernet]
    
    [ipv4]
    address1=192.0.0.1/24
    method=manual
    
    [ipv6]
    addr-gen-mode=default
    method=disabled
    [proxy]

nmcli を使用して指定できるプロパティーのリストについては、設定の man ページを参照してください。Bash の自動補完が利用可能です。

nm-initrd-generator を使用して NetworkManager キーファイルを生成する

NetworkManager には、dracut カーネル引数構文からキーファイルを生成できる nm-initrd-generator ツールが含まれています。このツールを使用すると、カーネル引数からキーファイルに変換したり、少量の入力でキーファイルを素早く生成して、より詳細な設定を変更したりすることができます。

  • nm-initrd-generator を使用してボンディングのキーファイルを生成します。

    $ sudo podman run --rm -ti quay.io/<namespace>/<image>:<tag> /usr/libexec/nm-initrd-generator -s -- "ip=bond0:dhcp" "bond=bond0:ens2,ens3:mode=active-backup,miimon=100" "nameserver=8.8.8.8"
    
    * Connection 'bond0' *
    
    [connection]
    id=bond0
    uuid=643c17b5-b364-4137-b273-33f450a45476
    type=bond
    interface-name=bond0
    multi-connect=1
    permissions=
    
    [ethernet]
    mac-address-blacklist=
    
    [bond]
    miimon=100
    mode=active-backup
    
    [ipv4]
    dns=8.8.8.8;
    dns-search=
    may-fail=false
    method=auto
    
    [ipv6]
    addr-gen-mode=eui64
    dns-search=
    method=auto
    
    [proxy]
    
    * Connection 'ens3' *
    
    [connection]
    id=ens3
    uuid=b42cc917-fd87-47df-9ac2-34622ecddd8c
    type=ethernet
    interface-name=ens3
    master=643c17b5-b364-4137-b273-33f450a45476
    multi-connect=1
    permissions=
    slave-type=bond
    
    [ethernet]
    mac-address-blacklist=
    
    * Connection 'ens2' *
    
    [connection]
    id=ens2
    uuid=e111bb4e-3ee3-4612-afc2-1d2dfff97671
    type=ethernet
    interface-name=ens2
    master=643c17b5-b364-4137-b273-33f450a45476
    multi-connect=1
    permissions=
    slave-type=bond
    
    [ethernet]
    mac-address-blacklist=

このコマンドは、各インターフェイスに対して、bond0ens3ens2 の 3 つのキーファイルを生成します。生成された出力を使用して、さらに設定を追加したり、既存の設定を変更したりして、ファイルをコンテナーイメージにコミットできます。

静的 IP の設定
  • 次の dracut カーネル引数を使用できます。

    テンプレート:

ip=${ip}::${gateway}:${netmask}:${hostname}:${interface}:none:${nameserver}

以下に例を示します。

ip=10.10.10.10::10.10.10.1:255.255.255.0:myhostname:ens2:none:8.8.8.8
コンテナーイメージに埋め込まれた設定を書き込む
この形式はイミュータブルのイメージ状態の一部であるため、コンテナーイメージに埋め込まれた NetworkManager 設定を /usr/lib/NetworkManager/system-connections/ に保存します。コンテナーイメージの一部として /etc/NetworkManager/system-connections/ に設定を書き込むこともできます。デフォルトの OSTree 3 方向マージ (つまり、古いデフォルト設定、アクティブな /etc システム、および新しいデフォルト設定の使用) は、マシン固有の設定に適用されます。

キーファイルには 600 の root 専用アクセス権限が必要です。そうでない場合、NetworkManager はこのファイルを無視します。

イーサネットデバイスの自動設定を無効にする

デフォルトでは、NetworkManager はケーブルが接続されているすべてのインターフェイスで DHCP または SLAAC アドレスを使用して自動設定を試みます。一部のネットワーク環境では、これは望ましくない場合があります。そのためには、/usr/lib/NetworkManager/conf.d/noauto.conf などの設定ファイルを追加して、NetworkManager の動作を変更することができます。

  • Ethernet デバイスの NetworkManager 自動設定を無効にする

    [main]
    # Do not do automatic (DHCP or SLAAC) configuration on ethernet devices
    # with no other matching connections.
    no-auto-default=*

17.4. Image Mode for RHEL でのホスト名の設定

システムにカスタムホスト名を設定するには、/etc/hostname ファイルを変更します。ホスト名は、Anaconda を使用するか、特権コンテナーを使用して設定できます。

システムを起動したら、hostnamectl コマンドを使用してホスト名を確認できます。

17.5. Image Mode for RHEL でのプロキシー経由のインターネットアクセスの設定

プロキシーを使用したインターネットアクセスを必要とする環境にデプロイする場合は、サービスが意図どおりにリソースにアクセスできるようにサービスを設定する必要があります。

これを行うには、必要な環境変数を含む単一のファイルを設定で定義し、systemd ドロップインユニットファイルを使用して、このファイルを参照します。

手順

  • 一般的なプロキシー環境変数を定義します。この共通ファイルは、その後、インターネットアクセスを必要とする各サービスによって明示的に参照される必要があります。

    # /etc/example-proxy.env
    https_proxy="http://example.com:8080"
    all_proxy="http://example.com:8080"
    http_proxy="http://example.com:8080"
    HTTP_PROXY="http://example.com:8080"
    HTTPS_PROXY="http://example.com:8080"
    no_proxy="*.example.com,127.0.0.1,0.0.0.0,localhost"
  • コアサービスのドロップインユニットを定義します。bootcpodman ツールは一般的にプロキシー設定を必要とし、bootc は必ずしも systemd ユニットとして実行されるとは限りません。

    # /usr/lib/systemd/system/bootc-fetch-apply-updates.service.d/99-proxy.conf
    [Service]
    EnvironmentFile=/etc/example-proxy.env
  • podman systemd ユニットのプロキシー使用の定義

    podman およびコンテナーのプロキシー設定と環境設定は、root ユーザーとして /etc/containers/containers.conf 設定ファイルで設定するか、非 root ユーザーとして $HOME/.config/containers/containers.conf 設定ファイルで設定できます。

第18章 bootc コンテナーイメージのソースコードの取得

オープンソースライセンスの義務を果たすため、Red Hat Enterprise Linux コンテナーイメージのソースコードを取得してください。ソースパッケージを使用すると、ソフトウェアの監査、来歴の検証、デバッグ目的でのコンポーネントの再ビルドを行うことができます。

bootc イメージのソースコードは、Red Hat Ecosystem Catalog で提供されています。

bootc コンテナーイメージのソースコードにアクセスする場合:

  1. Red Hat Ecosystem Catalog にアクセスし、rhel-bootc を検索します。
  2. Get this image タブで、Get the source をクリックし、指示に従います。
  3. 内容を展開すると、入力 RPM パッケージリストとその他のコンテンツリソースが extra_src_dir ディレクトリーで使用できるようになります。

    .tar ファイルは入力 Git リポジトリーのスナップショットであり、パッケージリストを含む YAML ファイルが含まれています。

第19章 bootc アップストリームプロジェクトへのコントリビューション

Image Mode for Red Hat Enterprise Linux に関連するアップストリームのオープンソースプロジェクトに貢献することで、共同でのツール開発が可能になります。これらのコミュニティーに参加することで、プロジェクトのメンテナーに対して直接、問題報告や修正コードの提出、さらには機能拡張の提案を行うことができます。

以下のアップストリーム bootc プロジェクトでは、コントリビューションを歓迎しています。

Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

Red Hat ドキュメントについて

Legal Notice

Theme

© 2026 Red Hat
トップに戻る