第6章 kpatch の使用

6.1. kpatch とは?

kpatch は、ライブのカーネルパッチソリューションで、プロセスをリブートまたは再起動することなしに、実行中のカーネルにパッチを当てることができます。kpatch は、長時間のタスク完了、ユーザーのログオフ、計画ダウンタイムなどを待機せずに、システム管理者が重要なセキュリティーパッチをカーネルに即座に適用することができます。セキュリティーや安定性を犠牲にすることなく、システムの稼働時間中に制御できるようになります。

警告

kpatch と他のサブコンポーネントで、互換性がない場合があります。「制限」 セクションを注意深く読んでから、kpatch を使用するようにしてください。

6.2. kpatch のサポート範囲

  • kpatch を使用したライブでのカーネルパッチの適用は Red Hat Enterprise Linux 7.2 以降でサポートされています。
  • ライブでのカーネルパッチの適用については、Premium SLA サブスクリプションをご契約のお客様を対象としてサポートしています。
  • ライブでのカーネルパッチ適用は、アクティブな Red Hat Enterprise Linux 7 メンテナンスストリーム (現在の非同期エラータフェーズに含まれる) で のみ サポートされます。現在のサポートフェーズに関する情報は、「Red Hat Enterprise Linux ライフサイクル」 を参照してください。
  • Red Hat Enterprise Linux for SAP Solutions サブスクリプションをお持ちの場合は、Extended Update Support リリース のみ、ライブカーネルパッチを利用できます。
  • kpatch は、Red Hat Enterprise Linux Realtime (RT) カーネルではサポート されていません
  • kpatch は、Red Hat Enterprise Linux 5 または Red Hat Enterprise Linux 6 ではサポート されていません
  • カーネルに、ライブでカーネルパッチを適用できるのは、一度に 1 つ のみです。
  • ハードウェアイネーブルメントなど、すべての問題がライブでのカーネルパッチで対応されているかは不明です。

6.3. アクセスおよび配信

ライブのカーネルパッチ機能は、RPM パッケージとして提供されるカーネルモジュール (kmod) で実装されます。kpatch ユーティリティーは、ライブカーネルパッチ用のカーネルモジュールをインストールおよび削除するのに使用します。

Premium サブスクリプションを契約されているお客様は、Red Hat サポートが提供する迅速化された修正ソリューションの一部として、ライブのカーネルパッチをリクエストしていただけます。

Premium サブスクリプションを契約されているお客様で、再起動を必要とする hotfix カーネルを通常使用する場合は、ダウンタイムを必要としない kpatch kmod をリクエストすることが可能です。kpatch パッチは、hotfix カーネルと同じ方法で、修正が含まれるエラータがリリースされてから 30 日間サポートされます。

お客様は、Red Hat カスタマーポータル から直接サポートケースを起票して、適切かつ迅速な修正オプションについて相談していただけます。

6.4. 制限

kpatch は、汎用のカーネルアップグレードメカニズムではありません。システムをすぐに再起動できない場合など、単純なセキュリティーおよびバグ修正の更新を適用する場合に使用します。

パッチを読み込み中または読み込み後に、SystemTap または kprobe を使用 しないでください。パッチは、プローブが削除されるまで、適用されない可能性があります。

cat /sys/kernel/debug/tracing/trace を実行して ftrace 出力ファイルに直接アクセス しないでください。代わりに、trace-cmd ユーティリティーがサポートされています。

kpatch を使用時には、システムを一時停止またはハイバネート しないようにしてください。一時停止またはハイバネートすると、短期間パッチが一時的に無効になってしまいます。

注記

Red Hat は、今後のリリースに向けて積極的に kpatch の制約の多くをなくすように努めています。

6.5. kpatch の有効化および使用方法

kpatch のコンポーネントは以下の通りです。

kpatch のコンポーネント

systemd の統合ポイント
kpatch.service と呼ばれる systemd サービス。kpatch モジュールを起動時に読み込む multiuser.target で必要です。
パッチモジュール

  • 新しいカーネルコードの配信メカニズム
  • これは、適用される kpatch と一致するように名前がつけられた別のカーネルモジュールです。
  • パッチモジュールには、カーネルに対する最新のホットフィックスからコンパイルされたコードが含まれます。
  • パッチモジュールは、コアモジュール kpatch.ko で登録し、置き換えられるオリジナル機能の情報を提供します。また、置換される機能に一致するポインターも含まれます。
kpatch ユーティリティー
パッチモジュールを管理するためのコマンドラインツール

6.5.1. kpatch ツールのインストール

kpatch モジュールをインストールする前に、kpatch ツールパッケージをインストールする必要があります。シェルプロンプトで root として以下を入力し、インストールします。

# yum install kpatch

6.5.2. kpatch ホットフィックスのインストール

kpatch ホットフィックスをインストールするには、yum で提示の kpatch-patch RPM パッケージをインストールします。たとえば、kpatch-patch-7.0-1.el7.x86_64.rpm するには、root として以下のコマンドを実行します。

# yum install kpatch-patch-7.0-1.el7.x86_64.rpm

6.5.3. インストールされた kpatch ホットフィックスの一覧表示

パッチが読み込まれ、インストールされていることを確認するには、root として kpatch list コマンドを実行します。

# kpatch list
Loaded patch modules:
kpatch_7_0_1_el7
Installed patch modules:
kpatch-7-0-1-el7.ko (3.10.0-121.el7.x86_64)
kpatch-7-0-1-el7.ko (3.10.0-123.el7.x86_64)

上記の出力では、モジュールがカーネルに読み込まれていることがわかります。つまり、カーネルは、kpatch-patch-7.0-1.el7.x86_64.rpm パッケージに含まれる最新のホットフィックスが適用されたことになります。また、今後カーネルバージョン 3.10.0-121 と 3.10.0-123 の再起動を行う際に、systemd が読み込めるように /var/lib/kpatch に保存されたことがわかります。

6.5.4. kpatch ホットフィックスの更新

新規バージョンの kpatch-patch RPM パッケージが後にリリースされた場合には、yum で、適用したパッチをアップグレードしてください。たとえば、kpatch-patch-7.0-2.el7.x86_64.rpm にアップグレードするには、root として以下を実行します。

# yum update kpatch-patch-7.0-2.el7.x86_64.rpm

RPM パッケージをアップグレードすると、実行中のカーネルのパッチモジュールが自動的に置き換えられ、再起動時に systemd により使用される /var/lib/kpatch 構造が更新されます。

注記

kpatch-patch RPM パッケージのパッチモジュールは累積パッチです。したがって、kpatch-patch-7.0-2 を利用できる場合は、kpatch-patch-7.0-1 をインストールせずに代わりに kpatch-patch-7.0-2 をインストールすることもできます。

パッチモジュールを読み込むと、TAINT_LIVEPATCH カーネルの taint フラグ (ビット 15 に相当) および TAINT_OOT_MODULE (ビット 12 に相当) が設定されます。カーネルにパッチが当てられているかどうかを確認するには、cat コマンドを実行して /proc/sys/kernel/tainted の内容を表示し、ファイルの値を確認します。別の taint フラグが設定されている場合を除き、カーネルにパッチが当たっている場合は、値が 36864 になります。

6.5.5. kpatch ホットフィックスの削除

実行中のカーネルから kpatch モジュールをアンロードするには、kpatch unload コマンドを使用し、パッチモジュールの名前を指定します。たとえば、kpatch_7_0_2_el7 をアンロードするには、シェルプロンプトから root 権限で次のコマンドを実行します。

# kpatch unload kpatch_7_0_2_el7

また、以下のように kpatch アンインストール コマンドを実行して、/var/lib/kpatch からパッチモジュールをアンインストールする必要があります。

# kpatch uninstall kpatch_7_0_2_el7

このコマンドは、デフォルトで現バージョンのカーネルに相当するカーネルから kpatch をアンインストールしますが、kernel-version オプションを使用すれば別のバージョンのカーネルを指定することもできます。

# kpatch uninstall --kernel-version 3.10.0-121.el7.x86_64 kpatch_7_0_2_el7

あるいは、kpatch-patch RPM パッケージをアンインストールすることができます。これにより、/var/lib/kpatch からパッチモジュールも削除されます。

注記

RPM パッケージをアンインストールしても、カーネルから kpatch モジュールはアンロードしません。上に示すように、kpatch unload を明示的に呼び出す必要があります。

6.6. kpatch はどのように機能しますか?

kpatch ユーティリティーは、ftrace を使用して、カーネル機能へのポインターの任意の再マッピングを有効にします。カーネルのライブパッチをシステムに適用すると、以下が発生します。

  1. モジュールで新たにコンパイルしたコードが /var/lib/kpatch にコピーされ、次回の起動時に systemd からカーネルへの再適用が登録されます。
  2. 実行中のカーネルに kpatch モジュールがロードされ、新しいコードのメモリー内の場所を指定するポインターを使用して、新しい機能が ftrace メカニズムに登録されます。
  3. パッチが当てられた機能にカーネルがアクセスすると、ftrace メカニズムにリダイレクトされます。これにより、元々の機能は回避され、パッチを当てたバージョンの機能にカーネルをリダイレクトします。

図6.1 kpatch の仕組み

Diagram showing the change in syscall flow when using kpatch.

6.7. サードパーティーのライブパッチソリューションはサポートされますか?

カーネルのライブパッチを提供するサードパーティーまたはプロプライエタリーのツールをいつくか利用できますが、Red Hat がサポートするのは kpatch と、Red Hat サポート契約から提供される RPM モジュールに限定されます。Red Hat は、サードパーティーのライブパッチにサポートを提供しませんが、エンジニアリングと公式な Red Hat kpatch への依頼は常に受け付けています。

サードパーティーのライブパッチに対する任意の Red Hat のレビューについては、以下の基準を満たしているかどうかを判定するため、ソースコードの提供が必要です。

  1. 異常発生時にカーネルが経験したものと同じサブシステムとコードパスに影響します。
  2. 該当するストリーム内にて、サポートしている方法で同じパッチを適用すると失敗しません。

根本原因の特定が必要なため、調査の開始時にカーネルのライブパッチのベンダーと話すことを Red Hat では推奨しています。これにより、ベンダーの許可が得られた場合はソースコードを提供できるようになります。また、Red Hat サポートが調査に乗り出す前に、ベンダーのサポート組織が原因特定のために協力できることになります。

サードパーティーのカーネルのライブパッチでシステムを実行している場合は、Red Hat が提供し、サポートしているソフトウェアでこの問題を再現するよう依頼する権利を Red Hat は保有しています。再現できない場合は、同じ挙動が見られるかどうかを確認するために、ライブパッチが適用されていないテスト環境にデプロイされたのと同様のシステムとワークロードが必要になります。

サードパーティーソフトウェアのサポートポリシーに関する情報は、https://access.redhat.com/articles/1067 のナレッジベースにある 「Red Hat グローバルサポートサービスは、サードパーティーのソフトウェア、ドライバー、そして認定されていないハードウェアおよびハイパーバイザー、もしくはゲストのオペレーティングシステムについてどのようなサポートを提供していますか?」 を参照してください。