kexec

kexecは、カーネル2.5/2.6で導入が検討されている、高速なリブートを実現する新機能である。ブート時に時間がかかるBIOSのチェック時間をスキップさせて、直接新しいカーネルのコードを実行させる事により、リブートやHotSwap時のマシンの停止時間を最小とする事を目標に、開発が進められている。カーネル2.6では、多くのエンタプライズ・システムやサーバ向けの新機能が導入される事になっているが、今回はsysfsとも関係があるカーネルの新機能として、このkexecを取り上げる。

kexecとは

kexecは元々、Eric W. Biedermanによって、高速なリブートを必要とする、ディスクレスノードでの使用のために開発、提案されてきている。kexecは開発段階から、Linux限定のブート・イメージの実行に機能制限するよりも、整形されたELFバイナリ・イメージを起動することをサポートする事を目的としていた。開発段階ではこの原理により、非Linuxのイメージであっても、BIOSを動作させる事なく、再起動させることができている。

kexecの現在の適用先は、エンタプライズ・システムやサーバ向けを主に想定している。これは、SCSIディスクやRAIDを接続しているエンタプライズ・システムでは、ターン・アラウンド・タイムが重要な役割を持つにもかかわらず、リブート時のBIOSチェックにおいて、かなりの時間を費やす事が判明しているからである。

Eric W. Biedermanによる開発は現在でも続いているが、kexecの最新な安定版については、Linus Torvaldsが最近移ったOSDLにおいて、Andy Pfifferが中心になって開発、配布が行われている。2003年4月24日には、Andy Pfifferによって" Reducing System Reboot Time With kexec" と題したWhite paperがアナウンスされた。以降、カーネル・リリースに合わせて、kexec機能を付加するPatchが着実にAndy Pfifferからリリースされている。

動作概要

kexecは、動作しているLinuxシステムがプラットホーム・ファームウェア(BIOS)を再実行することなく、新しいカーネルをロードして動作させるのを許可するカーネルと、ユーザ空間コードの組合せである。機能的には、LILOやGrubといった他のブートローダと同様であるが、革新的な実装が行われている点が異なる。

kexec対応カーネルでは、kexecのユーザモード・コンポーネントだけによって使用される、新しいシステムコールを定義して、実装している。システムコールはユーザから要求されたときに、起動可能なLinuxイメージをカーネル・メモリに展開して、後でそのカーネルが動作できるような設定を行う。

カーネル・メモリに、ブート可能なカーネルイメージを配置することは、比較的簡単である。しかし、BIOSを呼び出さずにx86 PC互換機においてストアされたカーネルを立ち上げる事は、かなり複雑な作業である。kexecではブートするカーネルの全てのBIOS呼び出しを避けて、カーネル32ビット・エントリーポイントに直接ジャンプする。通常BIOSから得ている情報は、代わりに現在のカーネルから集める。BIOSメモリ・マップのようなものを、動作しているカーネルから綿密に拾うことは、挑戦的であるが、必要な試みである。BIOSに代わるデバイスの検知と設定にはsysfsツリーの使用が検討されている。

kexecはまだ開発中であるため、全てのプラットフォームで機能するというわけではないが、開発元のOSDLのシステムでは、このコードが数ヶ月間動作していて、限られたシステムでは目的が達成されることを確認している。

実際の動作

カーネル2.5.73で実際に動作を確認した。正常に起動するカーネルのほかに必要なファイルは以下から入手できる。

kexecの使用に際しては、kexecがカーネル・ツリーに取り込まれていないため、適正なバージョンのカーネルPatchを入手して当てる必要がある。kexec-tools-1.8は、再起動を行うコマンドである"kexec"を含むユーザモード・アプリケーションとライブラリであるが、入手後Makefileを適当に修正する等して、"kexec"コマンドをコンパイルする必要がある。同様のファイルは、Eric W. Biedermanのサイトにもあるが、やや古いようなので試していない。

sample-usage.shを一般的なデスクトップシステムで動作できるように、次のように修正して実行したところ、確かにBIOSに落ちずにカーネルが再起動し、その後も問題なく動作する事を確認した。kexecはbzImage圧縮形式も問題なく扱える。ただし、このシェルの実行だけではRunLevelの変更やサービスの停止、ファイルシステムのアンマウント等といった事は一切行わずに、リブートのシーケンスに入り、リブート後はファイルシステムチェックを実行してしまうので、実際の使用場面では工夫が必要になる。

kexec --force --debug --command-line="auto BOOT_IMAGE=vmlinuz-2.5.73kexec 
\ro root=/dev/hda2" /boot/vmlinuz-2.5.73kexec

kexecの今後

kexecの実行時には、LILOやGrubと同様のカーネル・パラメータを記述する事ができるようになっているため、起動するカーネルやブート・パーティション等も指定する事が可能である。また、システム・パニック時や問題解決のためにデバッガや他のシステムを起動する事もできるであろう。このようにkexecの導入では、単なるリブート時間の短縮だけではなく、応用範囲が広がっていく可能性もある。

現在はまだ動作確認が取れているプラットフォームが限定されているため、カーネルの各リリースに対するPatchの形式で配布されているが、LinusもKexecのアイデア自体は認めているため、いずれはカーネル・リリースに取り込まれるのではないかと思われる。計画されているkexecコマンドのrebootコマンドとのマージや作業、sysfsツリーのデバイス・エントリが完備する事とともに、適用されるプラットフォームの条件も広がっていく事と推測される。