Red Hat Enterprise Linux 7.2 以降における kpatch のガイド
コンテンツ
- kpatch の概要
- kpatch のサポート範囲の概要
- カーネルのライブパッチのアクセスおよび配信
- 制限事項
- kpatch を有効にして使用する
- kpatch はどのように機能しますか?
- サードパーティのライブパッチソリューションはサポートされますか?
kpatch の概要
kpatch は、プロセスを再起動しなくても実行中のカーネルにパッチを当てることができるカーネルのライブパッチソリューションです。これを使用すれば、システム管理者は重大なセキュリティパッチを即座にカーネルに適用することができるため、ログオフや、予定されている再起動を行うのに、長期的に実行しているタスクが完了するのを待つ必要がなくなります。また、これにより、セキュリティや安全性に影響を及ぼさずにアップタイムを制御することができます。
警告: kpatch と、カーネルのサブコンポーネントとの間に、不一致が見られるものがあります。kpatch を使用する前に、制限事項セクションを注意してお読みください。
kpatch のサポート範囲の概要
- kpatch を使用したカーネルのライブパッチは、Red Hat Enterprise Linux 7.2 以降でサポートされています。
- カーネルのライブパッチサポートは、プレミアムの SLA サブスクリプションをお持ちのお客様に提供しております。
- カーネルのライブパッチは、 現在の非同期エラータフェーズ内にある、アクティブな Red Hat Enterprise Linux 7 メンテナンスストリームでのみサポートされます。現在のサポートフェーズの詳細は、Red Hat Enterprise Linux ライフサイクルを参照してください。
- 現在、Extended Update Support (EUS) ではカーネルのライブパッチが利用できません。
- 現在、Red Hat Enterprise Linux Realtime (RT) カーネルでは kpatch がサポートされません。
- kpatch は、Red Hat Enterprise Linux 5 および Red Hat Enterprise Linux 6 ではサポートされません。
- カーネルのライブパッチは、常にカーネルに 1 つだけインストールすることができます。
- ハードウェアの有効化などの一部の問題は、カーネルのライブパッチに含まれない場合があります。
カーネルのライブパッチのアクセスおよび配信
- カーネルのライブパッチ機能は、RPM パッケージとして配信されたカーネルモジュール (kmod) から実装されます。ライブパッチのインストールや削除に、kpatch ユーティリティを使用することができます。
- プレミアムサブスクリプションをお持ちのお客様は、早期修正ソリューションの一環として、Red Hat サポートにライブパッチを要求することができます。
- 通常、再起動が必要な
hotfixカーネルを使用していたプレミアムのサブスクリプションをお持ちのお客様は、ダウンタイムを必要としない kpatch kmod を要求できます。kpatchパッチは、その修正を含むエラータがリリースされてから 30 日間、hotfixカーネルと同じようにサポートされます。 - 適切な早期修正オプションについては、Red Hat カスタマーポータルでサポートケースを作成してお問い合わせください。
制限事項
- kpatch は、カーネルの汎用的なアップグレードメカニズムではありません。これは、システムがすぐに再起動できない場合にセキュリティおよびバグ修正のアップデートを適用するのに使用されます。
- パッチのロード時、またはロード後に、SystemTap または kprobe ツールを使用しないでください。プローブが削除されるまで、パッチを有効にすることはできません。
- (cat
/sys/kernel/debug/tracing/traceを実行するなど)、ftrace の出力ファイルに直接アクセスしないでください。代わりにtrace-cmdユーティリティの使用がサポートされます。 - kpatch を使用する際にシステムをサスペンドまたはハイバーネートしないでください。これにより、一時的にパッチが無効になる場合があります。
注意: Red Hat は、今後のリリースで kpatch に関する多くの制限事項を削除できるように、積極的に対応しています。
kpatch を有効にして使用する
kpatch には、以下のコンポーネントが含まれます。
- systemd 統合ポイント
kpatch.serviceと呼ばれるsystemdサービスはmultiuser.targetで必要です。これは、システムの起動時に kpatch モジュールをロードします。
- パッチモジュール
- 新しいカーネルコードに対する配信メカニズム
- これは、適用する kpatch に一致するために命名された別のカーネルモジュールです。
- このパッチモジュールには、そのカーネルに配信されている最新のホットフィックスからコンパイルしたコードが含まれます。
- このパッチは、コアモジュール
kpatch.koで登録し、置換される機能の情報を提供します。また、置換される機能に一致するポインターも含まれます。
- kpatch ユーティリティ
- パッチモジュールを管理するためのコマンドラインツール
kpatch ツールをインストールする
kpatch モジュールをインストールする前に、kpatch ツールパッケージをインストールする必要があります。そのためには、シェルプロンプトから、root 権限で以下のコマンドを実行します。
# yum install kpatch
kpatch のホットフィックスをインストールする
kpatch ホットフィックスをインストールするには、提供された kpatch-patch RPM パッケージを yum コマンドでインストールします。たとえば、kpatch-patch-7.0-1.el7.x86_64.rpm をインストールするには、root 権限で次のコマンドを実行します。
# yum install kpatch-patch-7.0-1.el7.x86_64.rpm
インストールした 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 に保存されていることが示されます。
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 フラグ (ビット 15に相当)、TAINT_OOT_MODULE (ビット 12 に相当)、および TAINT_TECH_PREVIEW (ビット 29 に相当) が設定されます。カーネルにパッチが当てられているかどうかを確認するには、cat コマンドを実行して /proc/sys/kernel/tainted の内容を表示し、値を確認します。別の taint フラグが設定されている場合を除き、カーネルにパッチが当たっている場合は 536907776 (0x20009000) になるはずです。
kpatch ホットフィックスを削除する
実行カーネルから kpatch モジュールをアンロードするには、kpatch unload コマンドで、パッチモジュールの名前を指定します。たとえば、kpatch_7_0_2_el7 をアンロードするには、シェルプロンプトから、root 権限で次のコマンドを実行します。
# kpatch unload kpatch_7_0_2_el7
また、以下のように kpatch uninstall コマンドを実行して、/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 を明示的に呼び出す必要があります。
kpatch はどのように機能しますか?
kpatch ユーティリティは既存の ftrace 機能を使用して、カーネル機能へのポインターの任意の再マッピングを有効にします。カーネルのライブパッチをシステムに適用すると、以下が発生します。
- モジュールで新たにコンパイルしたコードが
/var/lib/kpatchにコピーされ、システムの次回起動時にsystemdからカーネルへの再適用が登録されます。 - 実行中のカーネルに kpatch モジュールがロードされ、 新しいコードのメモリーメモリー内への場所を指定するポインターを使用して、新しい機能が
ftraceメカニズムに登録されます。 - パッチが当てられた機能にカーネルがアクセスすると、
ftraceメカニズムにリダイレクトされます。これにより、元々の機能は回避され、カーネルをパッチを当てたカーネルのバージョンにリダイレクトされます。

サードパーティのライブパッチソリューションはサポートされますか?
他にも、カーネルのライブパッチを提供するサードパーティまたはプロプライエタリのツールが利用できますが、Red Hat がサポートするのは kpatch と、Red Hat サポート契約から提供される RPM モジュールに限定されます。Red Hat は、サードパーティのライブパッチにサポートを提供しませんが、エンジニアリングと公式な Red Hat kpatch への依頼は常に受け付けています。
サードパーティのライブパッチに対しては、以下の基準を満たしているかどうかを Red Hat が確認するために、ソースコードを提供していただく必要があります。
- 失敗したカーネルと同じサブシステムとコードパスに影響する
- 適用可能なストリームで、サポートされた方法で同じパッチを適用すると、失敗しない。
原因特定が必要になるため、調査を開始時にライブパッチのベンダーに対してサポートケースを作成することが推奨されます。これにより、ベンダーの許可が得られた場合はソースコードを提供できるようになり、Red Hat サポートが調査を行う前に、ベンダーの協力により原因特定が可能になります。
サードパーティのライブパッチでシステムを実行している場合は、Red Hat が提供し、サポートするソフトウェアでこの問題が再現できるかどうかを Red Hat より依頼される場合があります。再現できない場合は、同じ挙動が見られるかどうかを確認するために、ライブパッチが適用されていないテスト環境にデプロイされたのと同様のシステムとワークロードが必要になります。
サードパーティソフトウェアのサポートポリシーに関する情報は、How does Red Hat Global Support Services handle third-party software, drivers, and/or uncertified hardware/hypervisors or guest operating systems? を参照してください。
