1.3. カーネルモジュールのノードへの追加
大半の一般的なハードウェアの場合、Linux カーネルには、コンピューターの起動時にそのハードウェアを使用するために必要となるデバイスドライバーモジュールが含まれます。ただし、一部のハードウェアの場合は、Linux でモジュールを利用できません。したがって、各ホストコンピューターにこれらのモジュールを提供する方法を確保する必要があります。この手順では、OpenShift Container Platform クラスターのノードにこれを実行する方法を説明します。
この手順に従ってカーネルモジュールを最初にデプロイする際、モジュールは現行のカーネルに対して利用可能になります。新規カーネルがインストールされると、kmods-via-containers ソフトウェアはモジュールを再ビルドし、デプロイしてそのモジュールの新規カーネルと互換性のあるバージョンが利用可能になるようにします。
この機能によって各ノードでモジュールが最新の状態に保てるようにするために、以下が実行されます。
- 新規カーネルがインストールされているかどうかを検出するために、システムの起動時に起動する各ノードに systemd サービスを追加します。
- 新規カーネルが検出されると、サービスはモジュールを再ビルドし、これをカーネルにインストールします。
この手順に必要なソフトウェアの詳細は、kmods-via-containers github サイトを参照してください。
以下の重要な点に留意してください。
- この手順はテクノロジープレビューです。
-
ソフトウェアのツールおよびサンプルは公式の RPM 形式で利用できず、現時点ではこの手順に記載されている非公式の
github.com
サイトからしか取得できません。 - この手順で追加する必要がある可能性のあるサードパーティーのカーネルモジュールは、Red Hat はサポートしません。
-
この手順では、カーネルモジュールのビルドに必要なソフトウェアは RHEL 8 コンテナーにデプロイされます。モジュールは、ノードが新規カーネルを取得する際に各ノードで自動的に再ビルドされることに注意してください。このため、各ノードには、モジュールの再ビルドに必要なカーネルと関連パッケージを含む
yum
リポジトリーへのアクセスが必要です。このコンテンツは、有効な RHEL サブスクリプションを使用して効果的に利用できます。
1.3.1. カーネルモジュールコンテナーのビルドおよびテスト
カーネルモジュールを OpenShift Container Platform クラスターにデプロイする前に、プロセスを別の RHEL システムでテストできます。カーネルモジュールのソースコード、KVC フレームワーク、および kmod-via-containers ソフトウェアを収集します。次にモジュールをビルドし、テストします。RHEL 8 システムでこれを行うには、以下を実行します。
手順
RHEL 8 システムを登録します。
subscription-manager register
# subscription-manager register
Copy to Clipboard Copied! RHEL 8 システムにサブスクリプションを割り当てます。
subscription-manager attach --auto
# subscription-manager attach --auto
Copy to Clipboard Copied! ソフトウェアとコンテナーのビルドに必要なソフトウェアをインストールします。
yum install podman make git -y
# yum install podman make git -y
Copy to Clipboard Copied! kmod-via-containers
リポジトリーのクローンを作成します。リポジトリーのフォルダーを作成します。
mkdir kmods; cd kmods
$ mkdir kmods; cd kmods
Copy to Clipboard Copied! リポジトリーのクローンを作成します。
git clone https://github.com/kmods-via-containers/kmods-via-containers
$ git clone https://github.com/kmods-via-containers/kmods-via-containers
Copy to Clipboard Copied!
RHEL 8 ビルドホストに KVC フレームワークインスタンスをインストールし、モジュールをテストします。これにより、
kmods-via-container
systemd サービスが追加され、読み込まれます。kmod-via-containers
ディレクトリーに移動します。cd kmods-via-containers/
$ cd kmods-via-containers/
Copy to Clipboard Copied! KVC フレームワークインスタンスをインストールします。
sudo make install
$ sudo make install
Copy to Clipboard Copied! systemd マネージャー設定を再読み込みします。
sudo systemctl daemon-reload
$ sudo systemctl daemon-reload
Copy to Clipboard Copied!
カーネルモジュールのソースコードを取得します。ソースコードは、制御下になく、他から提供されるサードパーティーモジュールをビルドするために使用される可能性があります。システムに対してクローン作成できる以下の
kvc-simple-kmod
サンプルのコンテンツと同様のコンテンツが必要になります。cd .. ; git clone https://github.com/kmods-via-containers/kvc-simple-kmod
$ cd .. ; git clone https://github.com/kmods-via-containers/kvc-simple-kmod
Copy to Clipboard Copied! この例では、設定ファイル
simple-kmod.conf
を編集し、Dockerfile の名前をDockerfile.rhel
に変更します。kvc-simple-kmod
ディレクトリーに移動します。cd kvc-simple-kmod
$ cd kvc-simple-kmod
Copy to Clipboard Copied! Dockerfile の名前を変更します。
cat simple-kmod.conf
$ cat simple-kmod.conf
Copy to Clipboard Copied! Dockerfile の例
KMOD_CONTAINER_BUILD_CONTEXT="https://github.com/kmods-via-containers/kvc-simple-kmod.git" KMOD_CONTAINER_BUILD_FILE=Dockerfile.rhel KMOD_SOFTWARE_VERSION=dd1a7d4 KMOD_NAMES="simple-kmod simple-procfs-kmod"
KMOD_CONTAINER_BUILD_CONTEXT="https://github.com/kmods-via-containers/kvc-simple-kmod.git" KMOD_CONTAINER_BUILD_FILE=Dockerfile.rhel KMOD_SOFTWARE_VERSION=dd1a7d4 KMOD_NAMES="simple-kmod simple-procfs-kmod"
Copy to Clipboard Copied!
この例ではカーネルモジュール
simple-kmod
のkmods-via-containers@.service
のインスタンスを作成します。sudo make install
$ sudo make install
Copy to Clipboard Copied! kmods-via-containers@.service
インスタンスを有効にします。sudo kmods-via-containers build simple-kmod $(uname -r)
$ sudo kmods-via-containers build simple-kmod $(uname -r)
Copy to Clipboard Copied! systemd サービスを有効にし、起動します。
sudo systemctl enable kmods-via-containers@simple-kmod.service --now
$ sudo systemctl enable kmods-via-containers@simple-kmod.service --now
Copy to Clipboard Copied! サービスのステータスを確認します。
sudo systemctl status kmods-via-containers@simple-kmod.service
$ sudo systemctl status kmods-via-containers@simple-kmod.service
Copy to Clipboard Copied! 出力例
● kmods-via-containers@simple-kmod.service - Kmods Via Containers - simple-kmod Loaded: loaded (/etc/systemd/system/kmods-via-containers@.service; enabled; vendor preset: disabled) Active: active (exited) since Sun 2020-01-12 23:49:49 EST; 5s ago...
● kmods-via-containers@simple-kmod.service - Kmods Via Containers - simple-kmod Loaded: loaded (/etc/systemd/system/kmods-via-containers@.service; enabled; vendor preset: disabled) Active: active (exited) since Sun 2020-01-12 23:49:49 EST; 5s ago...
Copy to Clipboard Copied!
カーネルモジュールがロードされていることを確認するには、
lsmod
コマンドを使用してモジュールをリスト表示します。lsmod | grep simple_
$ lsmod | grep simple_
Copy to Clipboard Copied! 出力例
simple_procfs_kmod 16384 0 simple_kmod 16384 0
simple_procfs_kmod 16384 0 simple_kmod 16384 0
Copy to Clipboard Copied! オプション: 他の方法を使用して
simple-kmod
のサンプルが機能していることを確認します。dmesg
を使用してカーネルリングバッファーで "Hello world" メッセージを探します。dmesg | grep 'Hello world'
$ dmesg | grep 'Hello world'
Copy to Clipboard Copied! 出力例
[ 6420.761332] Hello world from simple_kmod.
[ 6420.761332] Hello world from simple_kmod.
Copy to Clipboard Copied! /proc
でsimple-procfs-kmod
の値を確認します。sudo cat /proc/simple-procfs-kmod
$ sudo cat /proc/simple-procfs-kmod
Copy to Clipboard Copied! 出力例
simple-procfs-kmod number = 0
simple-procfs-kmod number = 0
Copy to Clipboard Copied! spkut
コマンドを実行して、モジュールの詳細情報を取得します。sudo spkut 44
$ sudo spkut 44
Copy to Clipboard Copied! 出力例
KVC: wrapper simple-kmod for 4.18.0-147.3.1.el8_1.x86_64 Running userspace wrapper using the kernel module container... + podman run -i --rm --privileged simple-kmod-dd1a7d4:4.18.0-147.3.1.el8_1.x86_64 spkut 44 simple-procfs-kmod number = 0 simple-procfs-kmod number = 44
KVC: wrapper simple-kmod for 4.18.0-147.3.1.el8_1.x86_64 Running userspace wrapper using the kernel module container... + podman run -i --rm --privileged simple-kmod-dd1a7d4:4.18.0-147.3.1.el8_1.x86_64 spkut 44 simple-procfs-kmod number = 0 simple-procfs-kmod number = 44
Copy to Clipboard Copied!
その後は、システムの起動時に、このサービスは新規カーネルが実行中であるかどうかをチェックします。新規カーネルがある場合は、サービスは新規バージョンのカーネルモジュールをビルドし、これをロードします。モジュールがすでにビルドされている場合は、これをロードします。
1.3.2. カーネルモジュールの OpenShift Container Platform へのプロビジョニング
OpenShift Container Platform クラスターの初回起動時にカーネルモジュールを有効にする必要があるかどうかに応じて、以下のいずれかの方法でデプロイするようにカーネルモジュールを設定できます。
-
クラスターインストール時のカーネルモジュールのプロビジョニング (day-1): コンテンツを
MachineConfig
として作成し、これをマニフェストファイルのセットと共に組み込み、これをopenshift-install
に提供できます。 - Machine Config Operator によるカーネルモジュールのプロビジョニング (day-2): カーネルモジュールを追加する際にクラスターが稼働するまで待機できる場合は、Machine Config Operator (MCO) を使用してカーネルモジュールソフトウェアをデプロイできます。
いずれの場合も、各ノードは、新しいカーネルが検出された際に、カーネルパッケージおよび関連するソフトウェアパッケージを取得できるようにする必要があります。該当するコンテンツを取得できるように各ノードをセットアップする方法はいくつかあります。
- 各ノードに RHEL エンタイトルメントを提供します。
-
/etc/pki/entitlement
ディレクトリーから、既存 RHEL ホストの RHEL エンタイトルメントを取得し、それらを Ignition 設定の作成時に提供する他のファイルと同じ場所にコピーします。 -
Dockerfile 内で、カーネルおよびその他のパッケージを含む
yum
リポジトリーへのポインターを追加します。これには、新たにインストールされたカーネルと一致させる必要があるため、新規のカーネルパッケージが含まれている必要があります。
1.3.2.1. MachineConfig オブジェクトを介したカーネルモジュールのプロビジョニング
MachineConfig
オブジェクトでカーネルモジュールソフトウェアをパッケージ化することで、インストール時に、または Machine Config Operator を使用して、そのソフトウェアをワーカーノードまたはコントロールプレーンノードに配信できます。
手順
RHEL 8 システムを登録します。
subscription-manager register
# subscription-manager register
Copy to Clipboard Copied! RHEL 8 システムにサブスクリプションを割り当てます。
subscription-manager attach --auto
# subscription-manager attach --auto
Copy to Clipboard Copied! ソフトウェアのビルドに必要なソフトウェアをインストールします。
yum install podman make git -y
# yum install podman make git -y
Copy to Clipboard Copied! カーネルモジュールおよびツールをホストするディレクトリーを作成します。
mkdir kmods; cd kmods
$ mkdir kmods; cd kmods
Copy to Clipboard Copied! kmods-via-containers
ソフトウェアを取得します。kmods-via-containers
リポジトリーのクローンを作成します。git clone https://github.com/kmods-via-containers/kmods-via-containers
$ git clone https://github.com/kmods-via-containers/kmods-via-containers
Copy to Clipboard Copied! kvc-simple-kmod
リポジトリーのクローンを作成します。git clone https://github.com/kmods-via-containers/kvc-simple-kmod
$ git clone https://github.com/kmods-via-containers/kvc-simple-kmod
Copy to Clipboard Copied!
-
モジュールソフトウェアを取得します。この例では、
kvc-simple-kmod
が使用されます。 先ほどクローン作成したリポジトリーを使用して、fakeroot ディレクトリーを作成し、Ignition 経由で配信するファイルをそのディレクトリーに追加します。
ディレクトリーを作成します。
FAKEROOT=$(mktemp -d)
$ FAKEROOT=$(mktemp -d)
Copy to Clipboard Copied! kmod-via-containers
ディレクトリーに移動します。cd kmods-via-containers
$ cd kmods-via-containers
Copy to Clipboard Copied! KVC フレームワークインスタンスをインストールします。
make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/
$ make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/
Copy to Clipboard Copied! kvc-simple-kmod
ディレクトリーに移動します。cd ../kvc-simple-kmod
$ cd ../kvc-simple-kmod
Copy to Clipboard Copied! インスタンスを作成します。
make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/
$ make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/
Copy to Clipboard Copied!
fakeroot ディレクトリーのクローンを作成し、以下のコマンドを実行してシンボリックリンクをターゲットのコピーに置き換えます。
cd .. && rm -rf kmod-tree && cp -Lpr ${FAKEROOT} kmod-tree
$ cd .. && rm -rf kmod-tree && cp -Lpr ${FAKEROOT} kmod-tree
Copy to Clipboard Copied! カーネルモジュールツリーを埋め込む Butane 設定ファイル (
99-simple-kmod.bu
) を作成し、systemd サービスを有効にします。注記Butane の詳細は、「Butane を使用したマシン設定の作成」を参照してください。
variant: openshift version: 4.14.0 metadata: name: 99-simple-kmod labels: machineconfiguration.openshift.io/role: worker storage: trees: - local: kmod-tree systemd: units: - name: kmods-via-containers@simple-kmod.service enabled: true
variant: openshift version: 4.14.0 metadata: name: 99-simple-kmod labels: machineconfiguration.openshift.io/role: worker
1 storage: trees: - local: kmod-tree systemd: units: - name: kmods-via-containers@simple-kmod.service enabled: true
Copy to Clipboard Copied! - 1
- コントロールプレーンノードでデプロイするには、
worker
をmaster
に変更します。コントロールプレーンおよびワーカーノードの両方にデプロイするには、それぞれのノードのタイプに対してこれらの残りの手順を 1 回ずつ実行します。
Butane を使用して、配信されるファイルおよび設定を含むマシン設定 YAML ファイルの
99-simple-kmod.yaml
を生成します。butane 99-simple-kmod.bu --files-dir . -o 99-simple-kmod.yaml
$ butane 99-simple-kmod.bu --files-dir . -o 99-simple-kmod.yaml
Copy to Clipboard Copied! クラスターがまだ起動していない場合は、マニフェストファイルを生成し、そのファイルを
openshift
ディレクトリーに追加します。クラスターがすでに実行中の場合は、ファイルを以下のように適用します。oc create -f 99-simple-kmod.yaml
$ oc create -f 99-simple-kmod.yaml
Copy to Clipboard Copied! ノードは
kmods-via-containers@simple-kmod.service
サービスを起動し、カーネルモジュールがロードされます。カーネルモジュールがロードされていることを確認するには、ノードにログインすることができます (
oc debug node/<openshift-node>
を使用してからchroot /host
を使用します)。モジュールをリスト表示するには、lsmod
コマンドを使用します。lsmod | grep simple_
$ lsmod | grep simple_
Copy to Clipboard Copied! 出力例
simple_procfs_kmod 16384 0 simple_kmod 16384 0
simple_procfs_kmod 16384 0 simple_kmod 16384 0
Copy to Clipboard Copied!