12.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!