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 システムでこれを行うには、以下を実行します。

手順

  1. RHEL 8 システムを登録します。

    # subscription-manager register
  2. RHEL 8 システムにサブスクリプションを割り当てます。

    # subscription-manager attach --auto
  3. ソフトウェアとコンテナーのビルドに必要なソフトウェアをインストールします。

    # yum install podman make git -y
  4. kmod-via-containers リポジトリーのクローンを作成します。

    1. リポジトリーのフォルダーを作成します。

      $ mkdir kmods; cd kmods
    2. リポジトリーのクローンを作成します。

      $ git clone https://github.com/kmods-via-containers/kmods-via-containers
  5. RHEL 8 ビルドホストに KVC フレームワークインスタンスをインストールし、モジュールをテストします。これにより、kmods-via-container systemd サービスが追加され、読み込まれます。

    1. kmod-via-containers ディレクトリーに移動します。

      $ cd kmods-via-containers/
    2. KVC フレームワークインスタンスをインストールします。

      $ sudo make install
    3. systemd マネージャー設定を再読み込みします。

      $ sudo systemctl daemon-reload
  6. カーネルモジュールのソースコードを取得します。ソースコードは、制御下になく、他から提供されるサードパーティーモジュールをビルドするために使用される可能性があります。システムに対してクローン作成できる以下の kvc-simple-kmod サンプルのコンテンツと同様のコンテンツが必要になります。

    $ cd .. ; git clone https://github.com/kmods-via-containers/kvc-simple-kmod
  7. この例では、設定ファイル simple-kmod.conf を編集し、Dockerfile の名前を Dockerfile.rhel に変更します。

    1. kvc-simple-kmod ディレクトリーに移動します。

      $ cd kvc-simple-kmod
    2. Dockerfile の名前を変更します。

      $ cat simple-kmod.conf

      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"

  8. この例ではカーネルモジュール simple-kmodkmods-via-containers@.service のインスタンスを作成します。

    $ sudo make install
  9. kmods-via-containers@.service インスタンスを有効にします。

    $ sudo kmods-via-containers build simple-kmod $(uname -r)
  10. systemd サービスを有効にし、起動します。

    $ sudo systemctl enable kmods-via-containers@simple-kmod.service --now
    1. サービスのステータスを確認します。

      $ sudo systemctl status kmods-via-containers@simple-kmod.service

      出力例

      ● 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...

  11. カーネルモジュールがロードされていることを確認するには、lsmod コマンドを使用してモジュールをリスト表示します。

    $ lsmod | grep simple_

    出力例

    simple_procfs_kmod     16384  0
    simple_kmod            16384  0

  12. オプション: 他の方法を使用して simple-kmod のサンプルが機能していることを確認します。

    • dmesg を使用してカーネルリングバッファーで "Hello world" メッセージを探します。

      $ dmesg | grep 'Hello world'

      出力例

      [ 6420.761332] Hello world from simple_kmod.

    • /procsimple-procfs-kmod の値を確認します。

      $ sudo cat /proc/simple-procfs-kmod

      出力例

      simple-procfs-kmod number = 0

    • spkut コマンドを実行して、モジュールの詳細情報を取得します。

      $ sudo spkut 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

その後は、システムの起動時に、このサービスは新規カーネルが実行中であるかどうかをチェックします。新規カーネルがある場合は、サービスは新規バージョンのカーネルモジュールをビルドし、これをロードします。モジュールがすでにビルドされている場合は、これをロードします。

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 を使用して、ワーカーノードまたはコントロールプレーンノードに配信できます。

手順

  1. RHEL 8 システムを登録します。

    # subscription-manager register
  2. RHEL 8 システムにサブスクリプションを割り当てます。

    # subscription-manager attach --auto
  3. ソフトウェアのビルドに必要なソフトウェアをインストールします。

    # yum install podman make git -y
  4. カーネルモジュールおよびツールをホストするディレクトリーを作成します。

    $ mkdir kmods; cd kmods
  5. kmods-via-containers ソフトウェアを取得します。

    1. kmods-via-containers リポジトリーのクローンを作成します。

      $ git clone https://github.com/kmods-via-containers/kmods-via-containers
    2. kvc-simple-kmod リポジトリーのクローンを作成します。

      $ git clone https://github.com/kmods-via-containers/kvc-simple-kmod
  6. モジュールソフトウェアを取得します。この例では、kvc-simple-kmod が使用されます。
  7. fakeroot ディレクトリーを作成し、先にクローン作成したリポジトリーを使用して Ignition で配信するファイルを使用してこれを設定します。

    1. ディレクトリーを作成します。

      $ FAKEROOT=$(mktemp -d)
    2. kmod-via-containers ディレクトリーに移動します。

      $ cd kmods-via-containers
    3. KVC フレームワークインスタンスをインストールします。

      $ make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/
    4. kvc-simple-kmod ディレクトリーに移動します。

      $ cd ../kvc-simple-kmod
    5. インスタンスを作成します。

      $ make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/
  8. fakeroot ディレクトリーのクローンを作成し、以下のコマンドを実行してシンボリックリンクをターゲットのコピーに置き換えます。

    $ cd .. && rm -rf kmod-tree && cp -Lpr ${FAKEROOT} kmod-tree
  9. カーネルモジュールツリーを埋め込む 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 1
    storage:
      trees:
        - local: kmod-tree
    systemd:
      units:
        - name: kmods-via-containers@simple-kmod.service
          enabled: true
    1
    コントロールプレーンノードでデプロイするには、workermaster に変更します。コントロールプレーンおよびワーカーノードの両方にデプロイするには、それぞれのノードのタイプに対してこれらの残りの手順を 1 回ずつ実行します。
  10. Butane を使用して、配信されるファイルおよび設定を含むマシン設定 YAML ファイルの 99-simple-kmod.yaml を生成します。

    $ butane 99-simple-kmod.bu --files-dir . -o 99-simple-kmod.yaml
  11. クラスターがまだ起動していない場合は、マニフェストファイルを生成し、そのファイルを openshift ディレクトリーに追加します。クラスターがすでに実行中の場合は、ファイルを以下のように適用します。

    $ oc create -f 99-simple-kmod.yaml

    ノードは kmods-via-containers@simple-kmod.service サービスを起動し、カーネルモジュールがロードされます。

  12. カーネルモジュールがロードされていることを確認するには、ノードにログインすることができます (oc debug node/<openshift-node> を使用してから chroot /host を使用します)。モジュールをリスト表示するには、lsmod コマンドを使用します。

    $ lsmod | grep simple_

    出力例

    simple_procfs_kmod     16384  0
    simple_kmod            16384  0

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.