Linux 4.0では、OSの再起動は不要になるかもしれない。
多くの管理者がLinuxを使う理由の1つに、再起動が必要な機会が少ないことがある。もちろん、重要なパッチの適用には再起動が必要だが、再起動なしで数カ月使い続けることも珍しくはない。しかし、最新のLinuxカーネルでは、その期間が数年単位に延びるかもしれない。
実はこの機能は、2009年のLinuxにはあった。この機能を実現する「Ksplice」というプログラムは、古いカーネルとパッチ後のカーネルを比較し、カスタマイズされたカーネルモジュールを使用して、実行中のカーネルに新しいコードを適用する。Kspliceに対応するカーネルでは、パッチを適用する関数に特別なフラグを付ける。Kspliceのプロセスはその関数を監視して、サーバを動かしたまま、その関数が使用されていない瞬間にパッチを適用する。
ところが、Oracleが2011年にKspliceを買収すると、この機能を「Red Hat Enterprise Linux」(RHEL)のクローンである「Oracle Linux」と、RHELユーザー向けのトライアルなどとしてのみ提供することにしたため、他のLinuxディストリビューションは元の状態に戻った。
その後、KernelCareもほとんどのエンタープライズ向けLinuxディストリビューションに対応した同様の機能をリリースしたが、このプログラムは月額料金が必要なサービスとしてしか提供されず、多くのLinuxシステム管理者を満足させることはなかった。
これを受けて、Red HatとSUSEが完全なオープンソースとして、再起動なしにパッチを適用する機能の実現に取り組み始めた。Red Hatのものは「kpatch」、SUSEのものは「kGraft」と名付けられた。
この2つは異なるアプローチを取っている。Kpatchはstop_machine()コマンドを使用し、ftraceを使用して既存のプロセスのスタックを調べ、パッチを安全に適用できる場合は、実行中のコードをパッチ後の関数にリダイレクトしてから古いコードを削除する。
Kgraftもftraceを使用するが、こちらはスレッドレベルで機能する。古いスレッドが呼び出されると、そのスレッドが新しい関数に切り替えられるかどうかを確認する。
最終的に得られる結果は同じだが、性能には大きな違いがある。kpatchの実行は1ミリ秒から40ミリ秒で済むが、Kgraftは数分間かかる可能性がある。ただしこちらは、ダウンタイムは1ミリ秒もない。
2014年10月のLinux Plumber Conferenceで、この2つのグループが集まり、両者のよいところを合わせてLinuxに再起動なしでパッチを適用する手段を追加する取り組みを始めた。最終的には、Linux 4.0のカーネルに、kpatchとkGraftの両方の機能が取り込まれた。
最近公開されたLinux 4.0のリリース候補版には、リファレンスアーキテクチャとしてx86版だけが実装されているが、PowerPC、s390、ARMのサポートについても対応中であり、これらのアーキテクチャ用のコードもすでに存在する。
コードが書かれたというのは、まだ始まりに過ぎない。この機能を利用するには、使用しているディストリビューションのパッチがこれに対応していなくてはならない。だが、Red HatとSUSEが対応している以上、この方法はすぐに主要な企業向けLinuxディストリビューションでは当たり前になるだろう。
この記事は海外CBS Interactive発の記事を朝日インタラクティブが日本向けに編集したものです。