Image Mode for RHEL を使用したオペレーティングシステムのビルド、デプロイ、管理
Red Hat Enterprise Linux 10 での RHEL bootc イメージの使用
概要
Red Hat ドキュメントへのフィードバック (英語のみ) リンクのコピーリンクがクリップボードにコピーされました!
Red Hat は質の高いドキュメントを提供することに尽力しており、皆様からのフィードバックを大切にしています。改善にご協力いただくため、Red Hat Jira トラッキングシステムを通じてご提案やエラー報告をお寄せください。
手順
Jira の Web サイトにログインします。
アカウントがない場合、アカウント作成オプションを選択します。
- 上部のナビゲーションバーで Create をクリックします。
- Summary フィールドにわかりやすいタイトルを入力します。
- Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも追加してください。
- ウィンドウ下部の 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 は、次のコンテナーイメージ形式とディスクイメージ形式をサポートします。
| イメージタイプ | ターゲット環境 |
|---|---|
|
| 物理環境、仮想環境、クラウド環境、エッジ環境。 |
|
| Amazon Machine Image。 |
|
| QEMU (Red Hat OpenStack、Red Hat OpenStack services for OpenShift、OpenShift Virtualization などの環境を対象)、Libvirt (RHEL)。 |
|
| VMDK for vSphere。 |
|
| 最初に見つかったディスクにインストールする無人 Anaconda インストーラー。 |
|
| フォーマットされていない raw ディスク。QEMU および Libvirt でもサポートされる。 |
|
| 仮想 PC 用の VHD など。 |
|
| 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 つのデプロイメントモードがあります。どちらも、デプロイメント時の安定性、信頼性、パフォーマンスは同様です。相違点を参照してください。
-
パッケージモード: オペレーティングシステムは RPM パッケージを使用し、
dnfパッケージマネージャーを使用して更新されます。ルートファイルシステムはミュータブルです。ただし、オペレーティングシステムをコンテナー化されたアプリケーションとして管理することはできません。 -
イメージモード: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 Quay をデプロイする詳細な手順については、Red Hat Quay のデプロイ - 高可用性を 参照してください。
- OpenShift 環境に Red Hat Quay をデプロイする詳細な手順については、OpenShift Container Platform への Red Hat Quay Operator のデプロイを 参照してください。
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コンテナーイメージは、podmanやdockerなどのコンテナーランタイムを使用してこのイメージを実行するときには、コンテナー設定セクション (Config) を無視しません。
2.2. コンテナーツールで再現可能なコンテナーイメージをビルドする リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Enterprise Linux は、Podman と Buildah を使用した再現可能なコンテナービルドをサポートします。これにより、一貫した入力によって時間経過に伴うイメージの差異を削減できます。この機能により、イメージの更新時にレジストリーから取得するデータが削減されます。これは、サプライチェーンのセキュリティー、信頼性の高いソフトウェアのデプロイメント、効果的なデバッグにとって極めて重要です。
以前は、tar ファイルの作成とコンテナーイメージサイズの拡大に関する課題により、基盤となるデータが変更されていない場合でもストレージの負担が増加し、不要なレイヤープルが発生して、rhel-bootc や RHEL AI などの環境での更新が高速化されませんでした。RHEL コンテナーの再現可能なビルドを使用すると、レジストリーストレージが削減され、更新ペイロードが小さくなり、イメージレイヤーの一貫性が維持されるためダウンロードが高速化されます。
詳細は、再現可能なコンテナービルドの概要 を参照してください。
2.3. コンテナーイメージのビルド リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Enterprise Linux コンテナーイメージをビルドして、オペレーティングシステムの設定とアプリケーションを単一のアーティファクトにカプセル化します。カスタムイメージを作成することで、標準的なコンテナーツールを使用してシステムライフサイクルを管理し、ハイブリッドインフラストラクチャー全体で一貫したデプロイメントを確保できます。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
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 ゲストシステムに使用できます。現在のディレクトリーの
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メタパッケージがインストールされている。
手順
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”現在のディレクトリーの
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メタパッケージがインストールされている。
手順
- 論理的にバインドするイメージを選択します。
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.container定義で、以下を使用します。GlobalArgs=--storage-opt=additionalimagestore=/usr/lib/bootc/storageこの
Containerfileの例では、/usr/lib/bootc/bound-images.dディレクトリーに、.imageファイルまたは.containerファイルを参照するシンボリックリンクを作成することにより、論理的にバインドされるイメージが選択されます。bootc upgradeコマンドを実行します。$ bootc upgradebootc upgrade では、次の主な手順が実行されます。
- イメージリポジトリーから新しいベースイメージを取得します。コンテナープルシークレットの設定 を参照してください。
- 新しいベースイメージのルートファイルシステムを読み取り、論理的にバインドされたイメージを検出します。
-
新しい bootc イメージで定義されている、検出された論理的にバインドされたイメージを、bootc が所有する
/usr/lib/bootc/storageイメージストレージに自動的にプルします。
バインドされたイメージを Podman などのコンテナーランタイムで使用できるようにします。そのためには、バインドされたイメージが "追加のイメージストア" として bootc ストレージを参照するように明示的に設定する必要があります。以下に例を示します。
podman --storage-opt=additionalimagestore=/usr/lib/bootc/storage run <image>重要/etc/containers/storage.confで/usr/lib/bootc/storageイメージストレージをグローバルに有効にしないでください。論理的にバインドされたイメージには bootc ストレージだけを使用してください。bootc image storeはbootcが所有します。論理的にバインドされたイメージは、/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 コンテナーレジストリーの認証 を参照してください。
手順
ログインして、
registry.redhat.ioに対する認証を行います。$ sudo podman login registry.redhat.iobootc-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 TOML JSON [[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 TOML JSON [customizations.kernel] name = "kernel-debug" append = "nosmt=force"{ "customizations": { "kernel": { "append": "mitigations=auto,nosmt" } } }- ファイルシステムの設定
カスタマイズのファイルシステムセクションを使用して、
/や/bootなどのベースパーティションの最小サイズを設定したり、/varの下にマウントポイントを持つ追加のパーティションを作成したりできます。Expand TOML JSON [[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) 引数は、ソースコンテナーのデフォルト値をオーバーライドします。また、ext4、xfs、およびbtrfsタイプのすべての追加マウントポイントのファイルシステムタイプも設定します。サポートされているマウントポイントとサイズには、
rootfsがbtrfsでない限り、次の制限とルールが適用されます。-
/を指定すると、ルートファイルシステムの最小サイズを設定できます。起動したシステムの/sysrootにマウントされるファイルシステムの最終的なサイズは、この設定で指定した値、またはベースコンテナーのサイズを 2 倍にした値のうち、どちらか大きい方になります。 -
/bootを指定すると、ブートパーティションの最小サイズを設定できます。/varのサブディレクトリーも指定できますが、/var内のシンボリックリンクは指定できません。たとえば、/var/homeと/var/runはシンボリックリンクであり、それ自体ではファイルシステムにはなりません。 -
/var自体はマウントポイントにはなりません。rootfsオプションは、ルートファイルシステムのファイルシステムタイプを定義します。 -
現在、ビルド時に
btrfsサブボリュームを作成することはサポートされていません。したがって、rootfsがbtrfsの場合、/var配下にカスタムマウントポイントを作成することはサポートされていません。/と/bootのみを設定できます。
-
- Anaconda ISO (インストーラー) の設定オプション
任意のインストールコマンドを含むキックスタートファイルを作成します。その後、ISO ビルドにキックスタートファイルを追加して、フルカスタマイズおよび自動化されたインストールメディアを作成します。
注記[customizations.user]と[customizations.installer.kickstart]を組み合わせたカスタマイズはサポートされていません。キックスタートを追加するときは、TOML形式の設定ファイルを使用してください。複数行の文字列ではエラーが発生しやすいためです。Expand TOML JSON [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 コンテナーイメージが使用できる。
手順
オプション: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 鍵の注入 を参照してください。コンテナーを実行する前に、
出力ディレクトリーを初期化する必要があります。ディレクトリーがすでに存在する場合にコマンドが失敗しないようにするには、-p引数を使用します。$ mkdir -p ./output必要なイメージがシステムストレージにプルされていることを確認してください。
$ quay.io/<namespace>/<image>:<tag>ローカルイメージは、以下のいずれかになります。
- Containerfile を使用して構築したイメージ
- ログインが必要な、アクセス制限付きのプライベートレジストリーから取得したイメージ
-
.tarファイルから読み込んだイメージ
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イメージファイルが作成されていることを確認してください。
次のステップ
-
.qcow2イメージは出力ディレクトリーにあります。このイメージを使用して、イメージをデプロイできます。QCOW2 ディスクイメージを使用した KVM でのコンテナーイメージのデプロイ を参照してください。 - イメージを更新し、変更をレジストリーにプッシュできます。RHEL bootc イメージの管理 を参照してください。
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コンテナーイメージをプルした。
手順
次の内容の
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.servicebootc イメージをビルドします。
$ sudo podman build . -t localhost/rhel-bootc-vmdkコンテナーを実行する前に、
出力ディレクトリーを初期化してください。ディレクトリーがすでに存在する場合にコマンドが失敗しないようにするには、-p引数を使用します。$ mkdir -p ./output以前に作成した 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:latestbootc イメージの 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 アクセスがある。
手順
オプション: ユーザーアクセスを設定するための
config.tomlを作成します。次に例を示します。[[customizations.user]] name = "user" password = "pass" key = "ssh-rsa AAA ... user@email.com" groups = ["wheel"]コンテナーを実行する前に、
出力ディレクトリーを初期化してください。ディレクトリーがすでに存在する場合にコマンドが失敗しないようにするには、-p引数を使用します。$ mkdir -p ./outputbootc-image-builderを実行します。必要に応じて、ユーザーアクセス設定を使用する場合は、config.tomlを引数として渡します。このイメージは、registry.redhat.io/rhel10/bootc-image-builder:latestなどのレジストリーからアクセスできる必要があります。以下は
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イメージは出力ディレクトリーにあります。
次のステップ
- イメージを更新し、変更をレジストリーにプッシュできます。RHEL bootc イメージの管理 を参照してください。
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サービスロールが設定されている。
手順
bootc イメージからディスクイメージを作成します。
- Containerfile でユーザーの詳細を設定します。このユーザーには、必ず sudo アクセス権限を割り当ててください。
- Containerfile で設定したユーザーを使用して、カスタマイズされたオペレーティングシステムイメージをビルドします。パスワードなしの sudo アクセス権限を持つデフォルトユーザーが作成されます。
オプション:
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により、インスタンスメタデータを使用してユーザーや設定を追加することもできます。bootc イメージをビルドします。たとえば、イメージを
x86_64AWS マシンにデプロイするには、次のコマンドを使用します。$ podman build -t quay.io/<namespace>/<image>:<tag> . $ podman push quay.io/<namespace>/<image>:<tag> .コンテナーを実行する前に、
出力ディレクトリーを初期化してください。ディレクトリーがすでに存在する場合にコマンドが失敗しないようにするには、-p引数を使用します。$ mkdir -p ./outputbootc-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 バケットに登録します。
-
次のステップ
- イメージをデプロイできます。AMI ディスクイメージを使用したコンテナーイメージの AWS へのデプロイ を参照してください。
- イメージを更新し、変更をレジストリーにプッシュできます。RHEL bootc イメージの管理 を参照してください。
トラブルシューティング
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 アクセスがある。 - コンテナーストレージにターゲットコンテナーイメージをプルした。
手順
オプション: ユーザーアクセスを設定するための
config.tomlを作成します。次に例を示します。[[customizations.user]] name = "user" password = "pass" key = "ssh-rsa AAA ... user@email.com" groups = ["wheel"]コンテナーを実行する前に、
出力ディレクトリーを初期化してください。ディレクトリーがすでに存在する場合にコマンドが失敗しないようにするには、-p引数を使用します。$ mkdir -p ./outputbootc-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イメージは出力ディレクトリーにあります。
次のステップ
- イメージをデプロイできます。QCOW2 ディスクイメージを使用した KVM でのコンテナーイメージのデプロイ を参照してください。
- イメージを更新し、変更をレジストリーにプッシュできます。RHEL bootc イメージの管理 を参照してください。
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 アクセスがある。
手順
オプション: デフォルトの組み込みキックスタートを上書きして自動インストールを実行する
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 """コンテナーを実行する前に、
出力ディレクトリーを初期化してください。ディレクトリーがすでに存在する場合にコマンドが失敗しないようにするには、-p引数を使用します。$ mkdir -p ./outputbootc-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 アクセスがある。
手順
キックスタートファイルを作成します。次のキックスタートファイルは、ユーザーの作成とパーティションの指示を含む、完全に自動のキックスタートファイル設定の例です。
[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 """-
キックスタートコンテンツを注入するために、キックスタート設定を
toml形式で保存します。たとえば、config.tomlです。 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 アクセスがある。
手順
config.tomlファイルを作成してカスタムマウントオプションを設定します。次に例を示します。[[customizations.filesystem]] mountpoint = "/" minsize = "10 GiB" [[customizations.filesystem]] mountpoint = "/var/data" minsize = "20 GiB"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メタパッケージがインストールされている。 - レジストリーまたはローカルに保存されたコンテナーへのアクセス。
手順
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-
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 が間違っていると、GPGKeyReadErrorや404 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 を使用してカスタム証明書ルートをインストールする手順を含めます。
手順
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カスタムイメージをビルドします。
$ sudo podman build -t <your_image> .<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)
-
ISO (テクノロジープレビュー): USB ドライブまたは
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 イメージをデプロイすることにより、ベアメタルシステムをプロビジョニングします。ネットワークベースのデプロイメントを使用することで、各マシンに物理メディアを必要とすることなく、起動可能なコンテナーイメージを効率的にインストールできます。
前提条件
- Red Hat から、ご使用のアーキテクチャー用の RHEL 10 ブート ISO をダウンロードした。RHEL ブートイメージのダウンロード を参照してください。
サーバーが PXE ブート用に設定されている。以下のいずれかのオプションを選択します。
- HTTP クライアントの場合は、HTTP ブートおよび PXE ブート用の DHCPv4 サーバーの設定 を参照してください。
- UEFI ベースのクライアントの場合は、UEFI ベースのクライアント向けに TFTP サーバーを設定する を参照してください。
- BIOS ベースのクライアントの場合は、BIOS ベースのクライアント向けに TFTP サーバーを設定する を参照してください。
- クライアント (ISO イメージをインストールするシステムとも呼ばれる) がある。
手順
- RHEL インストール ISO イメージを、HTTP サーバーにエクスポートします。これにより、PXE ブートサーバーでは、PXE クライアントにサービスを提供する準備が整いました。
- クライアントを起動して、インストールを開始します。
- ブートソースを指定するよう求められたら、PXE ブートを選択します。ブートオプションが表示されない場合は、キーボードの Enter キーを押すか、起動画面が開くまで待ちます。
- Red Hat Enterprise Linux の起動画面で、必要なブートオプションを選択し、Enter キーを押します。
- ネットワークインストールを開始します。
次のステップ
- このコンテナーイメージの更新バージョンをレジストリーにプッシュして、稼働中のシステムにオペレーティングシステムの更新を配信できます。RHEL bootc イメージの管理 を参照してください。
6.3. QEMU ディスクイメージを使用して KVM でコンテナーイメージをデプロイする リンクのコピーリンクがクリップボードにコピーされました!
bootc-image-builder ツールを使用して、起動可能な RHEL bootc コンテナーイメージを QEMU ディスクイメージ (QCOW2) に変換した後、仮想化ソフトウェアを使用して、そのディスクイメージを仮想マシン (VM) で起動できます。
前提条件
-
bootc-image-builderを使用して QEMU ディスクイメージ (QCOW2) を作成した。手順は、bootc-image-builder を使用して QCOW2 イメージを作成する を参照してください。
手順
以前コンテナーイメージから作成したディスクイメージを使用する仮想マシンを作成します。
次の例では
、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
手順
metadata.yamlファイルを作成し、このファイルに次の情報を追加します。instance-id: cloud-vm local-hostname: vmnameuserdata.yamlファイルを作成し、ファイルに次の情報を追加します。#cloud-config users: - name: admin sudo: "ALL=(ALL) NOPASSWD:ALL" ssh_authorized_keys: - ssh-rsa AAA...fhHQ== your.email@example.comssh_authorized_keysは SSH 公開鍵です。~/.ssh/id_rsa.pubで SSH 公開鍵を確認できます。以下のように
gzipで圧縮し、base64でエンコードしてmetadata.yamlとuserdata.yamlファイルを環境にエクスポートします。これらのファイルは今後の手順で使用します。export METADATA=$(gzip -c9 <metadata.yaml | { base64 -w0 2>/dev/null || base64; }) \ USERDATA=$(gzip -c9 <userdata.yaml | { base64 -w0 2>/dev/null || base64; })metadata.yamlおよびuserdata.yamlファイルを使用して vSphere でイメージを起動します。.vmdkイメージを vSphere にインポートします。$ govc import.vmdk ./composer-api.vmdk <foldername>電源をオンにせずに 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仮想マシンを変更して、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仮想マシンの IP アドレスを取得します。
HOST=$(govc vm.ip vmname)
検証
コンテナーイメージを実行している仮想マシンに接続します。詳細は、「仮想マシンへの接続」を参照してください。
SSH を使用して、
cloud-initファイル設定に指定された user-data を使用して仮想マシンにログインします。$ ssh admin@HOST
次のステップ
- このコンテナーイメージの更新バージョンをレジストリーにプッシュして、稼働中のシステムにオペレーティングシステムの更新を配信できます。RHEL bootc イメージの管理 を参照してください。
関連情報
6.5. AMI ディスクイメージを使用した AWS へのコンテナーイメージのデプロイ リンクのコピーリンクがクリップボードにコピーされました!
bootc-image-builder ツールを使用して bootc イメージから AMI を作成し、それを AWS s3 バケットにアップロードしたら、AMI ディスクイメージを使用してコンテナーイメージを AWS にデプロイできます。
前提条件
- bootc イメージから Amazon Machine Image (AMI) を作成した。bootc-image-builder を使用した AMI イメージの作成および AWS へのアップロード を参照してください。
-
以前に作成した Containerfile で
cloud-initが使用でき、ユースケースに合わせたレイヤーイメージを作成できる。
手順
- ブラウザーで Service→EC2 にアクセスし、ログインします。
- AWS コンソールのダッシュボードメニューで、正しいリージョンを選択します。イメージが正常にアップロードされたことを示すには、イメージが Available ステータスになっている必要があります。
- AWS ダッシュボードでイメージを選択し、 をクリックします。
- 新しく開いたウィンドウで、イメージを起動するために必要なリソースに応じて、インスタンスタイプを選択します。 をクリックします。
- インスタンスの詳細を確認します。変更が必要な場合は、各セクションを編集できます。 をクリックします。
- インスタンスを起動する前に、インスタンスにアクセスするための公開鍵を選択します。既存のキーペアを使用するか、キーペアーを新規作成します。
インスタンスを起動するには、 をクリックします。Initializing と表示されるインスタンスのステータスを確認できます。
インスタンスのステータスが Running になると、 ボタンが有効になります。
- をクリックします。ウィンドウが表示され、SSH を使用して接続する方法の説明が表示されます。
次のコマンドを実行して、自分だけが読み取れるように秘密鍵ファイルのパーミッションを設定します。Connect to your Linux instance を参照してください。
$ chmod 400 <your-instance-name.pem>パブリック 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 ディスクイメージは、ベアメタルシステムにインストールできます。
前提条件
- カスタマイズされたコンテナーイメージを作成した。
手順
-
bootc-image-builderを使用して、カスタムインストーラー ISO ディスクイメージを作成します。bootc-image-builder を使用した ISO イメージの作成 を参照してください。 - ISO ディスクイメージを USB フラッシュドライブにコピーします。
- USB スティック内のコンテンツを使用して、非接続環境でベアメタルインストールを実行します。
次のステップ
- コンテナーイメージをデプロイした後、このコンテナーイメージの更新バージョンをレジストリーにプッシュして、実行中のシステムにオペレーティングシステムの更新を配信できます。RHEL bootc イメージの管理 を参照してください。
6.7. to-filesystem および to-disk を使用した高度なインストール リンクのコピーリンクがクリップボードにコピーされました!
高度なプロビジョニングシナリオをサポートするために、Red Hat Enterprise Linux Image Mode のコンテンツをマウントされたファイルシステムに直接インストールします。bootc-install-to-filesystem コマンドを使用することで、標準的なインストーラーの起動プロセスを必要とせずに、カスタムのパーティションレイアウトを設定したり、ブート可能なディスクイメージを生成したりできます。
bootc install コマンドには、bootc install to-disk と bootc 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/sdabootc 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 で接続して破壊的な変更を行う機能と権限。
手順
インスタンスが起動したら、インスタンスの作成時に選択したキーを使用して SSH でインスタンスに接続します。
$ ssh -i <ssh-key-file> <cloud-user@ip>system-reinstall-bootcサブパッケージがインストールされていることを確認します。# rpm -q system-reinstall-bootcそうでない場合は、
system-reinstall-bootcサブパッケージをインストールします。# dnf -y install system-reinstall-bootcbootc イメージを使用するようにシステムを変換します。
# system-reinstall-bootc <image>Red Hat Ecosystem Catalog のコンテナーイメージ、または Containerfile から構築された bootc カスタマイズイメージを使用できます。
-
aキーを押して、bootc イメージにインポートするユーザーを選択します。 - 選択内容を 2 回確認し、イメージがダウンロードされるまで待ちます。
システムを再起動します。
# reboot指定された
<ip>の保存されている SSH ホストキーを/.ssh/known_hostsファイルから削除します。# ssh-keygen -R <ip>bootc システムは、新しい公開 SSH ホストキーを使用しています。ローカルに保存されているキーとは異なるキーを使用して同じ IP アドレスに接続しようとすると、SSH は警告を発するか、ホストキーの不一致により接続を拒否します。この変更は想定されているため、次のコマンドを使用して、既存のホストキーエントリーを
~/.ssh/known_hostsファイルから安全に削除できます。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は、レジストリーへのプライベートアクセスを提供します。
手順
/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同じディレクトリーに 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これらの設定を組み込むことで、コンテナーイメージからプロビジョニングされるあらゆるシステムに対して、特定のカーネルオプションが一貫して適用されるようになります。これにより、デプロイ後の設定が不要になります。
-
プライベートレジストリー認証を設定するには、
container-auth.jsonファイルを/etc/ostree/auth.jsonに配置します。
6.10.3. Anaconda スクリプトを使用したプライベート bootc コンテナーレジストリーの設定 リンクのコピーリンクがクリップボードにコピーされました!
Anaconda の %pre スクリプトを使用して、/etc/ostree/auth.json レジストリー認証ファイルを作成することで、プルシークレットを設定できます。
レジストリーの設定に加えて、プライベートレジストリーには認証が必要です。bootc インスタンス群をデプロイする際にプライベートリポジトリーを使用するには、以下の手順に従ってください。
前提条件
-
Bootcは、レジストリーへのプライベートアクセスを提供します。
手順
auth.jsonレジストリー認証ファイルを作成します。%pre mkdir -p /etc/ostree cat > /etc/ostree/auth.json << 'EOF' { "auths": { "quay.io": { "auth": "<your secret here>" } } } EOF %end-
プライベートレジストリー認証を設定するには、
auth.jsonファイルを/etc/ostree/auth.jsonに配置します。
6.10.4. Anaconda でプルシークレットを使用したプライベートレジストリーへのアクセス リンクのコピーリンクがクリップボードにコピーされました!
デフォルトの Anaconda インストーラー ISO では、ネットワーク経由で対象のレジストリーを取得する際にそのレジストリーにアクセスするには、bootstrap 設定の複製コピーが必要です。目的の bootc コンテナーイメージを取得する前にインストール環境に任意の変更を加えるには、Anaconda の %pre コマンドを使用できます。
前提条件
-
Bootcは、レジストリーへのプライベートアクセスを提供します。
手順
プルシークレットを設定します。以下に例を示します。
%pre mkdir -p /etc/ostree cat > /etc/ostree/auth.json << 'EOF' { "auths": { "quay.io": { "auth": "<your secret here>" } } } EOF %endセキュアでないレジストリーの 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 などのすべてのコンテナーツールが含まれます。 - レジストリーまたはローカルに保存されたコンテナーへのアクセス。
- 更新が必要なコンテナー用の外部ストレージデバイス。
手順
システムにすでに接続されているストレージデバイスを確認します。
$ 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 つの出力結果を比較して、システム上の外部ストレージデバイスの名前を確認します。
$ 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列には、外部ストレージ上のパーティションのマウントポイントがリスト表示されます。システムが外部ストレージを自動的にマウントする場合、有効なマウントポイントはすでに存在します。ただし、マウントポイントがない場合は、デバイスに保存する前に、自身分でマウントする必要があります。パーティションをマウントするには、空のディレクトリーを作成するか、既存のディレクトリーを使用します。
$ sudo mkdir /mnt/usb/デバイスのパーティションをマウントします。
$ sudo mount /dev/sda1 /mnt/usbオプション: パーティションが正しく作成されたか確認します。
$ lsblk NAME MAJ:MIN SIZE RO TYPE MOUNTPOINTS sda 8:0 28.9G 0 disk └─sda1 8:1 28.9G 0 part /mnt/usb [...]外部ストレージデバイスにファイルをコピーする準備が整いました。
skopeoコマンドを使用して、ローカルに保存されているコンテナーをマウントされたデバイスにコピーし、コンテナーのパスと名前を自身の環境に合わせて変更します。ローカルストレージの場合:
$ sudo skopeo copy --preserve-digests --all \ containers-storage:localhost/rhel-container:latest \ oci://mnt/usb/リモートレジストリーに保存されているコンテナーの場合:
$ sudo skopeo copy --preserve-digests --all \ docker://quay.io/example:latest \ oci://mnt/usb/注記コンテナーのサイズによっては、これらのコマンドが完了するまで数分かかる場合があります。
外部ストレージをアンマウントし、取り出します。
$ sudo umount /dev/sda1 $ sudo eject /dev/sda1- オフラインシステムのコンテナーに更新を適用します。
-
外部ストレージデバイスをオフラインシステムに接続します。ストレージデバイスが自動的にマウントされない場合は、
mkdirとmountコマンドを使用して外部ストレージの場所を特定し、マウントします。 コンテナーを外部デバイスからオフラインシステムのローカルコンテナーレジストリーにコピーします。コンテナーをオフラインマシンのローカルコンテナーストレージにコピーします。
$ skopeo copy --preserve-digests --all \ oci://mnt/usb \ containers-storage:rhel-update:latestこの場合、外部ストレージのマウントポイントが
OCIセクションへのパスとなります。containers-storageセクションの内容は、コンテナーに付ける名前やタグによって異なります。Podman を使用して、コンテナーがローカルに存在することを確認します。
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE example.io/library/rhel-update latest cdb6d... 1 min 1.48 GBbootcを使用して、オフラインシステムのコンテナーに更新をデプロイします。$ bootc switch --transport containers-storage \ example.io/library/rhel-update:latestコンテナーをローカルストレージにコピーできない場合は、代わりに
oci transportフラグとストレージデバイスへのパスを使用します。$ bootc switch --transport oci /mnt/usbbootc switchコマンドの--transportフラグを使用すると、コンテナーの代替ソースを指定できます。デフォルトでは、
bootcはレジストリーからイメージをプルしようとします。これは、bootc-image-builderがレジストリーを使用して元のイメージをビルドするためです。bootc upgradeを使用する場合、更新の場所を指定できません。bootc switchを使用し、ローカルコンテナーストレージを使用することを指定することで、リモートレジストリーの必要性を排除できるだけでなく、将来的にこのローカルコンテナーを使用して更新をデプロイすることも可能になります。ローカルのコンテナーと更新が同じ場所に配置されている場合、
bootc upgradeを正常に実行できるようになりました。今後、リモートリポジトリーの更新に切り替えたい場合は、再度bootc switchを使用する必要があります。
検証
更新が正しくデプロイされたことを確認します。
$ bootc status Staged image: containers-storage:example.io/library/rhel-update:latest Digest: sha256: 05b1dfa791... Version: 10.0 (2025-07-07 18:33:19.380715153 UTC) Booted Image: localhost/rhel-intel:base Digest: sha256: 7d6f312e09... Version: 10.0 (2025-06-23 15:58:12.228704562 UTC)出力には、現在起動中のイメージと、適用が予定されているステージングされた変更内容が表示されます。以前使用したコンテナーは表示されますが、ステージングされた変更は次回の再起動まで反映されません。出力結果から、更新がコンテナーストレージからプルされることも確認できます。
システムを再起動します。
$ bootc status Booted image: containers-storage:example.io/library/rhel-update:latest Digest: sha256: 05b1dfa791... Version: 10.0 (2025-07-07 18:33:19.380715153 UTC) Rollback image: localhost/rhel-intel:base Digest: sha256: 7d6f312e09... Version: 10.0 (2025-06-23 15:58:12.228704562 UTC)正しいイメージで起動したか確認できます。
- 起動したイメージは、更新されたイメージです。
- ロールバックイメージは、以前のイメージです。オフラインイメージモードの更新が正常に完了しました。
第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
検証
イメージを保存してビルドします。
$ podman build -t quay.io/<namespace>/<image>:<tag> . --cap-add=all --security-opt=label=type:container_runtime_t --device /dev/fuseカレントディレクトリーにある
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:chunkedrechunk操作は、デフォルトの作成モード (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モードが使用事例に適しているかを判断してください。
| 機能 | 一時的な (実行) | 永続的 (libvirt) | ディスクイメージ (to-disk) |
|---|---|---|---|
| 主な用途 | 迅速なテストまたは反復 | 長期的な開発または生産 | ベアメタルまたはクラウドインポート |
| 永続性 | なし (終了時に消去されます) | 完全版 (再起動後も動作継続) | フルサイズ (単体イメージ) |
| Privileges | ルートレス (ユーザー空間) |
|
ファイルにはルートレス、 |
| 速度 | 最速の起動時間 | Moderate | 処理速度が遅い (大規模なクエリーを作成するとプロセッサーの使用率が上昇する可能性がある) |
8.2. bccvk ツールのインストール リンクのコピーリンクがクリップボードにコピーされました!
コンテナー開発とハードウェアデプロイメントを連携させるために、EPEL リポジトリーから bcvk をインストールしてください。ローカル仮想マシンで起動可能なイメージをテストしたり、実稼働環境用のディスクイメージを作成したりするのに使用できます。開発からデプロイメントまでの一貫性を維持するためには、仮想化スタックが必要です。
前提条件
-
仮想化スタック (QEMU、
virtiofsd) を備えたホスト環境があります。 - Podman をインストールしている。
-
オプション: 永続的な仮想マシン (VM) 管理のために、
libvirtデーモンが必要です。
手順
お使いのディストリビューションのリポジトリーを有効にしてください。たとえば、AppStream の場合:
$ sudo subscription-manager repos --enable=rhel-10-for-x86_64-appstream-rpmsRed Hat Enterprise Linux (RHEL) Extra Packages for Enterprise Linux (EPEL) リポジトリーを有効にします。
$ sudo dnf install epel-releasebcvkパッケージをインストールしてください。$ sudo dnf install bcvk
検証
インストールを確認します。
$ bcvk --versionオプション: 永続的な仮想マシン管理に
libvirtを使用している場合は、libvirtdサービスを開始してください。$ sudo systemctl enable --now libvirtdこのコマンドは仮想化デーモンを初期化し、仮想マシンオーケストレーションのためのバックエンドインフラストラクチャーがアクティブであることを保証します。
8.3. 起動可能なコンテナーイメージの検出 リンクのコピーリンクがクリップボードにコピーされました!
効率的な環境を維持するために、bootc ワークフローと互換性のあるローカルコンテナーイメージを特定してください。
手順
ローカルシステム上で、
bootcで使用するために明示的にラベル付けされているイメージをリスト表示してください。$ bcvk images listこのコマンドは、すべてのローカルイメージのメタデータをスキャンし、
containers.bootc=1ラベルを含むイメージのリストを返します。-
コマンドがイメージをリスト表示した場合、それらはブート可能であることが検証され、
bcvk ephemeral、bcvk libvirt、またはbcvk to-diskコマンドで使用できます。 コマンドを実行してもイメージが表示されない場合は、互換性のあるイメージ (たとえば、
registry.redhat.io/rhel10/rhel-bootc) をプルしたか、カスタムビルドしたイメージのContainerfileに必要なラベルが含まれていることを確認してください。LABEL containers.bootc=1
-
コマンドがイメージをリスト表示した場合、それらはブート可能であることが検証され、
オプション: 特定のイメージが欠落している場合は、そのラベルを手動で確認してください。
$ podman inspect --format '{{.Config.Labels}}' <image_name>
8.4. 一時的な仮想マシンの管理 リンクのコピーリンクがクリップボードにコピーされました!
bcvk ephemeral run コマンドを使用すると、迅速な反復とテストのために一時的な仮想マシン (VM) を起動できます。これらの仮想マシンはユーザー空間仮想化を使用するため、ルート特権は不要です。
前提条件
-
ホストシステムに
bcvkユーティリティーをインストールしました。 -
機能的な仮想化スタック (QEMU、
virtiofsd) を備えたホスト環境があります。 - 現在のユーザー向けに Podman をインストールし、設定しました。
-
podman loginコマンドを使用してregistry.redhat.ioへの認証が完了しました。
手順
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) を割り当てます。
オプション:
run-sshコマンドを使用して、仮想マシンを起動して一度にログインすることもできます。$ bcvk ephemeral run-ssh registry.redhat.io/rhel10/rhel-bootc:latestこのモードでは、仮想マシンはセッションベースのリソースとして扱われます。SSH シェルを終了すると、自動的に終了します。
- 仮想マシン環境内で必要なタスクを実行してください。
セッションを終了する:
$ exit注記終了時には、一時的な仮想マシン内のすべての変更は破棄され、リソースはホストによって解放されます。
8.5. libvirt と bcvk を使用した永続的な仮想化の設定 リンクのコピーリンクがクリップボードにコピーされました!
libvirt と bcvk を併用することで、実稼働環境に必要な安定性と制御性を実現できます。この設定では、再起動後もシステムの状態が維持され、きめ細かなリソース割り当てが可能になるため、起動可能なイメージがターゲットハードウェアのパフォーマンスと制約を確実に反映します。
前提条件
-
ホストシステムに
bcvkユーティリティーをインストールしました。 -
libvirtdデーモンをインストール、有効化、起動しました。 -
あなたは
libvirtドメインを管理する権限を持っています。libvirtグループの典型的なメンバー設定。 -
あなたは
registry.redhat.ioコンテナーレジストリーへのアクセス権を持っています。
永続的な仮想化を設定するには、以下の手順を実行してください。
手順
以下のいずれかの方法を使用して、永続的な
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
仮想マシンのプロビジョニングが完了したら、
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 などの特定の仮想ディスクファイルを作成するか、イメージをブロックデバイスに直接書き込みます。
前提条件
-
ホストシステムに
bcvkユーティリティーをインストールしました。 -
ローカルまたはリモートの
bootcコンテナーイメージが利用可能です。 - 生成されたイメージを保存するのに十分なディスク容量がホストマシン上にあります。
-
ブロックデバイスやシステムパスに直接書き込むには、
root 権限またはsudo特権が必要です。
-
ホストシステムに
手順
以下のいずれかの方法を使用してディスクイメージを生成します。
仮想ディスクイメージを作成する:
$ bcvk to-disk --format=qcow2 localhost/my-image output-disk.qcow2
-
--format: 出力ディスクの種類を指定します。サポートされているフォーマット:qcow2、raw(デフォルト)。 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 アクセスがある。
手順
01-fips.tomlを作成して FIPS の有効化を設定します。次に例を示します。# Enable FIPS kargs = ["fips=1"]次の指示を含む 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コンテナーを実行する前に、
outputフォルダーを初期化します。ディレクトリーがすでに存在する場合にコマンドが失敗しないようにするには、-p引数を使用します。$ mkdir -p ./outputカレントディレクトリーの
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>システムのインストール中に FIPS モードを有効にします。
-
RHEL Anaconda インストーラーを起動するときに、インストール画面で TAB キーを押して、
fips=1カーネル引数を追加します。インストール後に、システムは FIPS モードで自動的に起動します。
-
RHEL Anaconda インストーラーを起動するときに、インストール画面で TAB キーを押して、
検証
システムにログインした後、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 のデプロイメントにおいて、非常にセキュアな基盤を構築するには、セキュリティーを強化したブート可能なイメージを作成できます。組織の厳格な基準への準拠を確実にするため、セキュリティー設定をベースイメージに直接組み込むこともできます。
ブート可能なコンテナーイメージをビルドする際に使用する Containerfile に oscap-im ツールを含めることで、セキュリティーを強化したブート可能なイメージをビルドできます。oscap-im ツールは任意の SCAP コンテンツを使用できますが、scap-security-guide の SCAP ソースデータストリームは、ブート可能なコンテナーと互換性があるように特別に調整およびテストされています。
前提条件
-
container-toolsメタパッケージがインストールされている。 - システムが準拠する必要があるベースライン内のプロファイルの ID を知っている必要があります。ID を見つけるには、設定コンプライアンスのプロファイルの表示 セクションを参照してください。
手順
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権限を持つユーザーを追加します。 - 選択されたプロファイルに準拠して、イメージのスキャンと修復を行います。
-
カレントディレクトリーにある
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 ツールを使用して、カスタマイズされたプロファイルをブート可能なイメージに適用できます。セキュリティープロファイルをカスタマイズするには、特定のルール (パスワードの最小長など) のパラメーターを変更し、別の方法で対象とするルールを削除し、追加のルールを選択して内部ポリシーを実装できます。プロファイルをカスタマイズして新しいルールの定義はできません。
前提条件
-
container-toolsメタパッケージがインストールされている。 - プロファイルのカスタマイズファイルがある。詳細は、autotailor を使用したセキュリティープロファイルのカスタマイズ を参照してください。
手順
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権限を持つユーザーを追加します。 - 選択されたプロファイルに準拠して、イメージのスキャンと修復を行います。
カレントディレクトリーにある
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 で実行中のシステムのコンプライアンスを検証できます。詳細は、設定コンプライアンススキャン を参照してください。
第11章 Image Mode for RHEL を使用した実行時のルートレベルのディレクトリーとシンボリックリンクの作成 リンクのコピーリンクがクリップボードにコピーされました!
特権ユーザーは、transient-ro オプションを使用することで、ファイルシステムをデフォルトで読み取り専用の状態に維持しながら、実行時に動的なトップレベルのマウントポイントを作成できます。これは、プラットフォーム固有のホストパスや動的なホストパスのバインドマウントを必要とするアプリケーションに役立ちます。
この機能は、次のユースケースに対応します。
- バインドマウント用に特定の絶対ホストパスを必要とするアプリケーション。
-
特定のマウントポイント (例:
/users) を必要とするプラットフォーム。 - デプロイ後、アプリケーションの起動前に動的マウントポイントを作成する必要がある。
- セキュリティー要件として、すべての通常のプロセスに対してルートファイルシステムを読み取り専用に維持する必要がある。
11.1. transient-ro true オプションの動作 リンクのコピーリンクがクリップボードにコピーされました!
ステートレスなデプロイメントを実現するには、Red Hat Enterprise Linux の bootc イメージで transient-ro=true オプションを有効にします。この設定では、ファイルシステムへの書き込みを一時ストレージに振り向け、システム再起動時にランタイムの変更を破棄します。
次のワークフローは、ブートプロセスの変更内容を説明したものです。
transient-ro=trueは、デフォルトではoverlayfsの上位ディレクトリーをread-onlyモードでマウントします。-
これにより、
rootやsystemdサービスなどの特権プロセスが、新しいプライベートなマウント名前空間内に限り、ルートファイルシステムをread-writeとして再マウントできるようになります。
-
これにより、
- このプライベートな名前空間内であれば、特権プロセスは、マウントポイントとして機能する新しいトップレベルディレクトリーの作成などの変更を実行できます。
- マウントポイントはシステムが起動している間は保持されますが、再起動後やアップグレード後は保持されません。
-
システム上の他の通常プロセスはすべて、元の変更されていない
read-onlyのルートファイルシステムを引き続き参照します。
セキュリティー上の理由から、これらのマウントポイントを作成できるのは特権ユーザー (root) のみです。
- マウントポイントは一時的なものであり、再起動後は保持されません。
-
ファイルシステムは、非特権プロセスに対しては
read-onlyのまま維持されます。
util-linux の制限により、transient-ro オプションを使用してマウント操作を実行する場合は、環境変数 LIBMOUNT_FORCE_MOUNT2=always を設定する必要があります。この変数は、transient-ro が必要とするマウント名前空間の機能に影響を与えます。
11.2. transient-ro による動的マウントポイントの作成 リンクのコピーリンクがクリップボードにコピーされました!
root ユーザーは、bootc の root.transient-ro 機能を使用することで、デフォルトでは read-only であるルートファイルシステムの上に一時的なオーバーレイを構築し、動的なトップレベルのマウントポイントを作成して、必要に応じてファイルシステムを read-write として再マウントすることができます。
root.transient-ro 機能を使用する場合は、アプリケーションがホストディレクトリーに適切にアクセスし、read-only ファイルシステム上に必要なマウントポイントを作成できるように、以下のように考慮すべき点がいくつかあります。
- アプリケーションは、ホストの絶対パスに一致するホストディレクトリーをバインドマウントする必要があります。
-
macOS の
/Usersなど、プラットフォーム固有のマウントポイントが必要です。 - デプロイ後、アプリケーションの起動前に動的マウントポイントを作成します。
-
ファイルシステムは、通常のプロセスに対しては
read-onlyのまま維持されます。
前提条件
-
container-toolsメタパッケージがインストールされている。
手順
transient-root-example.serviceサービスを作成し、readおよびwrite権限を持つディレクトリーを作成します。次の例では、/etc/afsが存在するものとします。[Unit] Description=Transient Root Example - Dynamic Mount Point Creation After=local-fs.target ConditionPathExists=/etc/afs DefaultDependencies=no [Service] Type=oneshot RemainAfterExit=yes MountFlags=slave # LIBMOUNT_FORCE_MOUNT2=always is required for mount command compatibility # See: https://github.com/util-linux/util-linux/issues/3171 Environment=LIBMOUNT_FORCE_MOUNT2=always ExecStart=/usr/bin/bash -c "echo 'Transient root example: Detected /etc/afs, remounting root as read-write'; mount -o remount,rw /; mkdir -p /afs; echo 'Created /afs directory for AFS mount point'" [Install] WantedBy=multi-user.targetContainerFile に次の設定を追加します。
# Copy the systemd service unit that demonstrates dynamic mount point creation # The service will: # 1. Check for existence of /etc/afs (ConditionPathExists) # 2. Use MountFlags=slave for proper mount propagation # 3. Set LIBMOUNT_FORCE_MOUNT2=always for mount command compatibility # 4. Remount root as read-write and create /afs directory when triggered COPY transient-root-example.service /usr/lib/systemd/system/ # Enable the service to start automatically on boot RUN systemctl enable transient-root-example.serviceコンテナービルドプロセス中に
transient-roオプションを有効にするには、イメージ内の/usr/lib/ostree/prepare-root.confファイルに次の設定を作成します。RUN echo -e '[root]\ntransient=true' > /usr/lib/ostree/prepare-root.conf && \ set -x; kver=$(cd /usr/lib/modules && echo *); dracut -vf /usr/lib/modules/$kver/initramfs.img $kver注記ファイルシステムの設定を変更する場合は、initramfs イメージを再生成する必要があります。
一時的なルートファイルシステムを使用して bootc イメージをビルドします。
$ podman build --cap-add SYS_ADMIN -t transient-root-ro:test .これにより、ビルド中の
ostree操作においてbootcが必要とするSYS_ADMINケーパビリティーが追加されます。
検証
ビルドしたイメージで
transient-ro = true設定ファイルが正しく設定されていることを確認します。$ sudo podman run --rm transient-root-ro:test cat /usr/lib/ostree/prepare-root.conf以下のような出力が表示されます。
[root] transient-ro = true稼働中のシステムで、実行時の機能を検証します。
- イメージを起動します。
/etc/afsテストディレクトリーを作成します。$ sudo mkdir -p /etc/afsサービスを再起動し、動的マウントポイントの作成をトリガーします。
$ systemctl restart transient-root-example.serviceサービスにより、ルートが
read-writeとして再マウントされ、/afsディレクトリーが作成されます。
systemdサービスなしで機能をテストするために、実行中のシステムで root としてテストディレクトリーを作成します。$ sudo export LIBMOUNT_FORCE_MOUNT2=always $ sudo unshare -m -- /bin/sh -c 'mount -o remount,rw / && mkdir /transient-test'ディレクトリーが作成されたかどうかを検証します。
$ sudo ls -d /transient-test /transient-testルートファイルシステムへの書き込みを試行して、他のプロセスにとっては
read-onlyステータスであることを検証します。$ touch /another-test-file touch: cannot touch '/another-test-file': Read-only file system
第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.timersystemdタイマーファイルを変更します。systemdの "ドロップイン" を使用して、タイマーをオーバーライドします。次の例では、更新は週に 1 回スケジュールされています。次の内容で
updates.confファイルを作成します。[Timer] # Clear previous timers OnBootSec= OnBootSec=1w OnUnitInactiveSec=1w作成したディレクトリーにファイルを追加します。
$ 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 を使用して起動されます。
- 自動更新は無効になっています。自動更新の無効化 を参照してください。
手順
ダウンロード専用モードで更新をダウンロードします。
$ bootc upgrade --download-onlyステージング環境のデプロイメントのモードを確認します。
$ bootc status --verboseStaged: Image: quay.io/example/rhel-guest:latest Version: 10.2.20260126 download-only: yes出力に
download-only: yesという行が表示されることからわかるように、次回の起動時にこのバージョンに自動的に切り替えることはできません。メンテナンス期間中は、ダウンロード専用モードで以下のいずれかの方法でステージングされた更新を適用できます。
イメージソースから取得せずに、ステージングされた更新を適用する場合:
$ bootc upgrade --from-downloadedステージングされた更新を適用し、直ちに再起動する場合:
$ bootc upgrade --from-downloaded --applyより新しい更新を確認して適用する場合:
$ bootc upgradeフラグを指定せずに
bootc upgradeコマンドを実行すると、コンテナーイメージのソースからプルして更新を確認します。ステージングされたデプロイメントが利用可能な最新の更新と一致する場合、ステージングされたデプロイメントがロック解除されます。より新しい更新が利用可能な場合、そのより新しいバージョンがステージングされたデプロイメントを置き換えます。
検証
ステージングされたデプロイメントがダウンロード専用モードになっていることを確認するには、出力に
download-only: yesという行が表示されていることを確認します。$ bootc status --verboseStaged: 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-
ベースイメージに
bootc-fetch-apply-updates.timerが含まれている場合は無効にします。 -
dnfを使用するか、クライアントに適用される他の方法を使用してクライアントをインストールします。 - 管理サービスの認証情報をイメージに注入します。
-
ベースイメージに
12.6. インベントリーの健全性の確認 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Enterprise Linux で管理されているノードのステータスを評価し、それらがオンラインでアクセス可能であることを確認します。インベントリーの健全性を確認することで、システムが中断することなく、更新や設定変更を受け取れる状態にあることを確認できます。コンテナーイメージとコンテナー内で実行中のイベントのシステム健全性を、手動で確認できます。
前提条件
- コンテナーイメージをアクセス可能なリポジトリーにプッシュした。
-
container-toolsメタパッケージがインストールされている。
手順
コンテナーのヘルスチェックステータスを表示します。
podman inspectまたはpodman psコマンドを使用します。$ podman inspect --format='{{json .State.Health.Status}}' <container> healthypodman 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 コマンドが削除する状態をイメージに追加します。
手順
工場出荷時設定にリセットしてください。目的に応じて、以下のいずれかのコマンドを実行してください。
現在実行中のイメージと同じイメージにリセットするには:
$ 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 オペレーションでカーネル引数を使用するには、引数を追加し、切り替え、アップグレード、または編集操作時にその引数を適用します。
前提条件
- コンテナーイメージを作成した。
手順
カーネル引数を使用して
/usr/lib/bootc/kargs.d内にファイルを作成します。$ sudo tee /usr/lib/bootc/kargs.d/console.kargs << EOF console=tty0 console=ttyS0,115200n8 EOFコンテナーイメージを取得して OSTree コミットを取得します。
$ podman pull quay.io/<your_org>/<your_bootc_image>:latestOSTree コミットを使用してファイルツリーを返します。
# bootc install to-filesystem --karg=root=<UUID>=<uuid of /mnt> --imgref $self /mnt/usr/lib/bootc/kargs.dカーネル引数ディレクトリーに移動します。cd /usr/lib/bootc/kargs.dカーネル引数ディレクトリー内の各ファイルを読み取ります。
$ find /usr/lib/bootc/kargs.d -name ".kargs" -exec cat {} \;*各
kargsファイルの内容を、必要なすべてのkargsを含むファイルにプッシュします。$ CONSOLIDATED_KARGS="/tmp/all-kargs.txt"kargsをstage()関数に渡します。$ bootc kargs --append="$KARGS_STRING"運用中に、切り替え、アップグレード、または編集操作に対してカーネル引数を適用します。
$ 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 にラップしている。
手順
ビルドホスト上で、ドライバーをコンパイルし、RPM パッケージをビルドします。
仕様を確認し、パッケージをビルドします。
$ cat SPECS/hello.specドライバー RPM をビルドします。
$ rpmbuild -ba SPECS/hello.spec
オペレーティングシステムイメージにドライバーを追加するための
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- コンテナーイメージをビルドして実行します。コンテナーのビルド を参照してください。
検証
システムを再起動します。
$ sudo rebootカーネルモジュールがシステム上で利用可能であることを確認します。
$ 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イメージを確定する前にモジュールの依存関係が計算されていることを確認してください。そうしないと、
modprobeが最初の起動時に失敗する可能性があります。$ sudo depmod -a <kernel-version>モジュールをロードできることを確認します。
$ 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-
bootcはcomposefsを使用するため、/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は、定義された依存関係と順序に基づいてユニットをシャットダウンおよび起動します。ソフトリブートにより、これらの関係が維持され、不適切なシャットダウンシーケンスが発生する可能性が最小限に抑えられます。 -
プロセスとライブラリー:
glibcやopensslなどの共有ライブラリーが更新されている場合、実行中のプロセスは、再起動されるまで引き続き、以前にマップされたライブラリーを使用します。ソフトリブートにより、すべてのプロセスが停止し、その後再起動して、ライブラリーの新しいバージョンにリンクされるようになります。 - 最小限のダウンタイム: ソフトリブートではカーネルとハードウェアが再初期化されないため、ハードリブートよりも大幅に高速です。サービスの中断を最小限に抑えながら、大変のユーザー空間の更新を適用する場合に効果的です。
-
コマンドラインツール:
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 upgrade、bootc switch、または bootc rollback を実行すると、次の 2 つのオプションのいずれかを使用してシステムのソフトリブートを検出し、準備することができます。
-
--soft-reboot=auto: ソフトリブートが可能な場合はシステムを自動的に準備し、システムがソフトリブートに対応していない場合にはエラーを表示しません。 -
--soft-reboot=required: ソフトリブートが可能な場合はシステムを自動的に準備しますが、システムがソフトリブートに対応していない場合はエラーを表示します。
これらのオプションは、--apply 操作を停止させたり、bootc が正常に終了しなかった場合に再起動を行わないよう通知したりすることで、限られたダウンタイムが必要になるタイミングを管理するのに役立ちます。
前提条件
- システムの現在の状態に関する情報が得られる。
手順
bootcツールを使用して新しいコンテナーイメージをステージングし、更新、切り替え、またはロールバック操作を実行します。実行しない場合は、ソフトウェアは現在のユーザー空間で再度実行されます。$ sudo bootc update --soft-reboot=required --applyたとえば、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 パスワードまたは SSHauthorized_keysファイルを注入できます。たとえば、System Management BIOS (SMBIOS) を使用して、SSH 鍵システムファームウェアを注入します。これは、qemuなどのローカルな仮想化環境で設定できます。 cloud-initを使用したユーザーと SSH 鍵の注入-
多くの Infrastructure as a Service (IaaS) および仮想化システムは、
cloud-initやignitionなどのソフトウェアによって一般的に処理されるメタデータサーバーを使用します。AWS instance metadata を参照してください。cloud-initまたは Ignition は、使用しているベースイメージに含まれる場合があります。または、独自の派生イメージにインストールすることもできます。このモデルでは、SSH 設定は bootc イメージの外部で管理されます。 - コンテナーまたはユニットのカスタムロジックを使用したユーザーと認証情報の追加
-
cloud-initなどのシステムには特権がありません。コンテナーイメージを起動する方法で、認証情報を管理するための任意のロジックを注入できます。たとえば、systemdユニットを使用できます。認証情報を管理するには、FreeIPA などのカスタムのネットワークホストソースを使用できます。 - コンテナービルドでのユーザーと認証情報の静的な追加
パッケージ指向のシステムでは、次のコマンドにより、派生ビルドを使用してユーザーと認証情報を注入できます。
RUN useradd someusershadow-utilsのデフォルトのuseradd実装に問題がある場合があります。ユーザーとグループの ID が動的に割り当てられることにより、ドリフトが発生する可能性があります。- ユーザーとグループのホームディレクトリーと
/varディレクトリー 永続的に
/home → /var/homeに設定されたシステムの場合、最初のインストール後にコンテナーイメージで行われた/varへの変更は、その後の更新には適用されません。たとえば、コンテナービルドに
/var/home/someuser/.ssh/authorized_keysを注入した場合、既存のシステムは更新されたauthorized_keysファイルを取得しません。systemdユニットでの DynamicUser=yes の使用システムユーザーの場合、可能な場合は
systemdDynamicUser=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.dsysusersツールは、必要に応じて起動時に従来の/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やその他のファイルを注入するようにユーザーのホームディレクトリーをセットアップするには、systemdtmpfiles.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
手順
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.jsonpodman 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-initやignitionなどのツールを含めることができます。 - ディスクイメージにシークレットを埋め込むことによるシークレットの注入
-
bootstrap secretsは、ディスクイメージにのみ埋め込むことができます。たとえば、AMI や OpenStack などの入力コンテナーイメージからクラウドディスクイメージを生成する場合、ディスクイメージには、実質的にマシンローカル状態であるシークレットが含まれることがあります。これらをローテーションするには、追加の管理ツールを使用するか、ディスクイメージを更新する必要があります。 - ベアメタルインストーラーを使用したシークレットの注入
- インストーラーツールは通常、シークレットを使用した設定の注入をサポートします。
systemd認証情報を使用したシークレットの注入systemdプロジェクトには、認証情報のデータをセキュアに取得してシステムやサービスに渡すための認証情報の概念があります。これは、一部のデプロイメント方法に適用されます。1 つ以上の認証情報が設定された状態でサービスが呼び出されると、環境変数$CREDENTIALS_DIRECTORYが設定されます。この変数には、認証情報が格納されているディレクトリーへの絶対パスが含まれており、システムは設定された認証情報ごとに 1 つのファイルをこのディレクトリーに配置します。さらに、ユニットファイル内の
%d指定子は、サービスの認証情報ディレクトリーに解決され、システムはそれを$CREDENTIALS_DIRECTORY環境変数と共にサービスプロセスに渡します。
16.3. レジストリーのプルシークレットの注入と TLS の無効化 リンクのコピーリンクがクリップボードにコピーされました!
コンテナー化された環境で、プライベートまたはセキュアでないレジストリーからイメージをプルできるように、コンテナーイメージを設定し、シークレットをプルし、システム内のレジストリーの TLS を無効にすることができます。
ベースイメージ内のレジストリーにアクセスするためのコンテナープルシークレットやその他の設定を含めることができます。ただし、Anaconda を使用してインストールする場合、ネットワーク経由で取得するときに対象のレジストリーにアクセスするために、インストール環境で "ブートストラップ" 設定の複製コピーが必要になる場合があります。
目的の bootc コンテナーイメージを取得する前にインストール環境に任意の変更を加えるには、Anaconda の %pre コマンドを使用できます。
手順
プルシークレットを設定します。
%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からイメージをプルします。セキュアでないレジストリーの 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 ファイルに設定が書き込まれます。
手順
単一のプルシークレットを使用するために、
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.jsoncontainers-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.jsonpodman buildコマンドを使用してイメージをビルドします。$ podman build --secret id=creds,src=$HOME/.docker/config.jsonContainerfile を実行すると、次の操作が実行されます。
-
この 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という名前のシークレットに、ビルドするレジストリープルシークレットが含まれていることを想定しています。
-
この Containerfile は、
第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 キーファイルを生成するnmcliNetworkManager コマンドラインツールは、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=
このコマンドは、各インターフェイスに対して、bond0、ens3、ens2 の 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"コアサービスのドロップインユニットを定義します。
bootcとpodmanツールは一般的にプロキシー設定を必要とし、bootcは必ずしもsystemdユニットとして実行されるとは限りません。# /usr/lib/systemd/system/bootc-fetch-apply-updates.service.d/99-proxy.conf [Service] EnvironmentFile=/etc/example-proxy.envpodman
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 コンテナーイメージのソースコードにアクセスする場合:
-
Red Hat Ecosystem Catalog にアクセスし、
rhel-bootcを検索します。 - Get this image タブで、Get the source をクリックし、指示に従います。
内容を展開すると、入力 RPM パッケージリストとその他のコンテンツリソースが
extra_src_dirディレクトリーで使用できるようになります。.tarファイルは入力 Git リポジトリーのスナップショットであり、パッケージリストを含む YAML ファイルが含まれています。
第19章 bootc アップストリームプロジェクトへのコントリビューション リンクのコピーリンクがクリップボードにコピーされました!
Image Mode for Red Hat Enterprise Linux に関連するアップストリームのオープンソースプロジェクトに貢献することで、共同でのツール開発が可能になります。これらのコミュニティーに参加することで、プロジェクトのメンテナーに対して直接、問題報告や修正コードの提出、さらには機能拡張の提案を行うことができます。
以下のアップストリーム bootc プロジェクトでは、コントリビューションを歓迎しています。
- アップストリームの git リポジトリーは CentOS Stream にあります。
- CentOS Stream のソースは、Fedora アップストリームプロジェクト の内容を反映しています。