5.11. bootc-image-builder を使用したステートレス PXE イメージのビルド
bootc-image-builder ツールを使用すると、bootc コンテナーイメージを、カーネル、initrd、squashfs ルートファイルシステムなどのアーティファクトセットを含む pxe-tar-xz イメージタイプに変換できます。このイメージタイプはネットワークブートに適しています。
前提条件
- bootc コンテナー。
-
dracut-liveおよびsquashfs-toolsパッケージが Containerfile に含まれている。 -
コンテナーイメージが、
initramfsに組み込まれたdmsquash-liveモジュールを使用してビルドされている。例については、Containerfile を参照してください。 - 生成されたアーティファクトをホストするための正常に機能する TFTP または HTTP サーバー。
手順
Containerfile を作成します。
FROM quay.io/<namespace>/<image>:latest RUN dnf -y install dracut-live squashfs-tools && dnf clean all # Override using composefs for ostree (it is incompatible with the squashfs rootfs) RUN cat <<EOF > /usr/lib/ostree/prepare-root.conf [composefs] enabled = no [sysroot] readonly = true EOF # Include the dmsquash-live module in the initramfs RUN cat <<EOF > /usr/lib/dracut/dracut.conf.d/40-pxe.conf compress="xz" add_dracutmodules+=" qemu qemu-net livenet dmsquash-live " early_microcode="no" EOF # Rebuild the initrd RUN set -xe; kver=$(ls /usr/lib/modules); env DRACUT_NO_XATTR=1 dracut -vf /usr/lib/modules/$kver/initramfs.img "$kver" # Mask services that aren't compatible with running from the rootfs RUN systemctl mask bootc-generic-growpart.service bootc-publish-rhsm-facts.service RUN bootc container lintコンテナーイメージをビルドします。
$ podman build -f ./Containerfile -t bootc-dracutbootc-image-builderを実行してtarファイルを作成します。$ mkdir -p ./output$ sudo podman run \ --rm \ -it \ --privileged \ --pull=newer \ --security-opt label=type:unconfined_t \ -v ./config.toml:/config.toml:ro \ -v ./output:/output \ registry.redhat.io/rhel10/bootc-image-builder:latest \ --type pxe-tar-xz \ --local \ localhost/bootc-dracut:latestContainerfile がリモートシステム上にある場合は、
localhost/bootc-dracut:latestを正しい URL に置き換えてください。生成される
tarファイルは、パッケージベースのpxe-tar-xzイメージの場合と同じです。唯一の違いは、grub.cfgファイルのカーネルコマンドラインにostree=…が追加されていることと、およびrootfs.imgファイルがパッケージベースのシステムではなく OSTree システムであることです。
検証
デプロイする前に、コンテナーイメージが正しくビルドされており、必要な設定ファイルとモジュールがイメージに含まれていることを確認します。
作成したコンテナーを調べます。
$ podman run --rm -it localhost/bootc-dracut:latest /usr/bin/bash-
/usr/lib/ostree/prepare-root.confおよび/usr/lib/dracut/dracut.conf.d/40-pxe.confファイルが正しく作成されたことを確認します。 initramfs モジュールを確認し、
dmsquash-liveモジュールとostreeモジュールが存在することを確認します。$ lsinitrd --mod /usr/lib/modules//initramfs.img*
トラブルシューティング
- GRUB メニューが利用できない
- 原因: EFI バイナリーまたは設定ファイルが誤った場所に配置されています。
-
解決策:
grub.cfgファイルとgrubx64.efiファイルが同じディレクトリーにあることを確認します。BOOTX64.EFI、grubx64.efi、およびgrub.cfgファイルを、TFTP サーバーが指すディレクトリーのルートに配置します。
rootfs.imgファイルの読み込みに失敗する-
原因:
[FAILED] Failed to start initrd-switch-root.service - Switch Root. -
解決策: initramfs に
dmsquash-liveモジュールが含まれていることを確認します。 -
原因:
curlがrootfs.imgファイルのダウンロードを試みるループに陥っています。Warning: failed to download live image: error 253 -
解決策:
rootfs.imgファイルがgrub.cfgファイルのroot=live:…で指定されている場所に存在することを確認します。HTTP サーバーのログを確認し、リクエストパスが想定される場所と一致していることを確認します。
-
原因:
- OSTree ルートのマウントに失敗する
-
原因:
ostree-prepare-root: Couldn’t find specified OSTree root -
解決策:
grub.cfgファイルがrootfs.imgファイルと一致していることを確認します。つまり、両方のファイルが同じtarファイルに由来するものであることを確認します。grub.cfgファイルのostree=…エントリーが、rootfs.imgファイル内のパスを指している必要があります。通常、rootfs.imgファイルがgrub.cfgファイルと一致しない場合に不一致が発生するのは、ビルドプロセスが OSTree ディレクトリーからこの UUID を設定するためです。 -
原因:
Failed to mount composefs: composefs: failed to mount: Input/output error -
解決策:
prepare-root.confファイルでcomposefsが無効になっていることを確認します。
-
原因: