着実な進歩の道を選択したLinuxカーネル用の仮想化テクノロジ

仮想化テクノロジとは、システムを“仮想化”することによって単一ホストにおける複数システムの同時使用を可能とする技術のことであり、こうした概念自体は固体素子を用いたコンピューティングテクノロジと匹敵するくらい古くから存在している。そして近年、こうした仮想化テクノロジのブームが再燃しつつあり、例えばLinux系の大規模な仮想化プロジェクトでも10を超える団体がそうした活動を進めているところだ。ただしこのテクノロジを実現するには、カーネル、パッチ、ソフトウェアに特殊なカスタマイズを施す必要があるため、現状のLinuxカーネルについては初歩的なOSレベルの仮想化テクノロジが実装されている段階である。

「これは私見ですが、現在の仮想化テクノロジの発展状況は“革新的”というよりも“自然な進化”と表現すべきものでしょう」と語るのは、OpenVZのプロジェクトマネージャを務めるKir Kolyshkin氏であり、同プロジェクトはSWsoftの支援で進められるオープンソース系の仮想化プロジェクトという形態を取っている。「過去を振り返れば、シングルユーザからマルチユーザ化、そしてシングルタスクからマルチタスク化という変化がありました。そうした流れを受けて現在は、シングルOSからマルチOS化、あるいはシングルインスタンスからマルチVMないしマルチVEへの道をたどりつつあるのです」

仮想化テクノロジの用途としては、テストベッドや仮想サーバホスティングなど、様々な利用法が存在している。「現在のコンピュータは単一のアプリケーションを動かす以上の処理能力を有している、というのが主だった動機になっていますね」と語るのは、高速処理の求められるスーパーコンピューティング市場においてクラスタおよびシステムソフトウェアを操るカーネルハッカーとして名の知られたEric W. Biederman氏である。「そうした状況下で、単一マシン内に複数のサーバを統合しようというのは、極めて当然な発想です」

「最新のマシンに“通常”セットアップを施した場合、95%はアイドル時間に費やされるだけでしょう」と、Linux-VServerのプロジェクトリーダを務めるHerbert Poetzl氏も同様の見解を述べている。Poetzl氏によると、セキュリティ面でも仮想化テクノロジは重要だとのことだ。「必要な通信を妨げたり無用なオーバーヘッドを増やすことなく複数のサービスを分離できるのは、非常に高いメリットを有しています」と同氏は語る。「ライトウェイト(軽量)な分離をするだけでもリソースの共有で得られる節約分は大きなものとなりますし、分離することでサービスの安全性も高めることになります」

Biederman氏はまた、仮想化テクノロジによって実行プログラムをマイグレーションさせる可能性が開けるともしている。「すべてのグローバル情報(システムのIPアドレスやPIDなど)が持ち運べるようになって、マイグレーション後もそのまま利用可能なグローバル識別子として使えるようになれば、アプリケーション側に変更を加えることなく、こうした問題に対処できるようになります」

仮想化テクノロジの2つのアプローチ

Biederman氏の説明するところでは、現行のLinuxカーネルで利用可能な仮想化テクノロジには本質的に異なる2種類のアプローチが存在するとのことである。その1つはハイパーバイザ(hypervisor)というものを利用するタイプで、この場合はハイパーバイザにハードウェアコールを処理させることにより、複数の(ないしは異種)オペレーティングシステムをシステムが仮想サーバ上で同時使用できるようにするのである。こうした準仮想化(paravirtualization)と呼ばれるアプローチでは(Xenなどで用いられているタイプ)、カーネルあるいはOSに対して、仮想マシンの存在を認識させるための変更が必要となる。

もう1つのタイプは、ホストシステム内で分離した複数のセキュアな“コンテナ”内で複数のカーネルインスタンスを処理する、という機能をカーネル本体に与えるアプローチで、この場合はカーネルのネームスペースを仮想化するための措置が必要となる。

「基本的な考え方は、カーネルの扱う様々なオブジェクトには固有のグローバル識別子が付けられているので、こうした識別子を非グローバル化した上で、状況依存的にマッチングさせるようにすれば、オーバーヘッドを増やすことなく複数のUNIXインスタンスを利用できるのと同じになる、というものです」とBiederman氏は語る。「実質的にこれは、スーパーchroot機能を構築するのに相当します」

相互協力的な開発体制

現在有力と見なされているのはOSレベルの仮想化テクノロジの方であるが、このアプローチの場合、Linuxカーネルに実装するには大がかりな開発作業が必要であり、気軽に手を出せる性質のものではない。とは言うものの、先に挙げたBiederman氏を始め、Linux-VServer、OpenVZ、IBMなどの各種プロジェクトが、こうしたアプローチに基づくLinux仮想化テクノロジに取り組んでいる。中でもIBMは仮想化テクノロジにおける先駆者の1つであり、この分野における40年以上の蓄積があるため、同社による貢献には期待させられる点が非常に大きい。実際IBM自身も、同社における最新の技術革新の成果をLinuxカーネルに統合する作業を進めていることを認めており、それらは「弊社IBMのLinux Technology Centerで展開されている、重要な開発構想により得られたものです」と語っている。

Biederman氏によると、仮想化テクノロジの開発を始めるに当たり最初に行う必要があったのは、どのようにして共同作業を進めるべきかを関係者全員が理解することであった、としている。具体的には“異論の余地のない基本機能”を一番最初に実装すること、となる。「またこの作業は、増分的な開発アプローチという手法を実践させることにつながりました」と同氏は語り、このようにして新規に開発された基本機能を各自のソフトウェアで採用することがLinux-VServerおよびOpenVZからアナウンスされていることを紹介した。

昨年夏、仮想化テクノロジの開発活動を促す目的で、関係する主要な開発者の一部が、カナダのオタワで開催されたLinux Kernel Developers Summitに参集した。

「お互いの顔を見ながらのミーティングは非常に有益な手法なので、これからも頻繁に行うべきだと思いますよ」と語るのはKolyshkin氏であり、同氏は翌年度のKernel Summitにおける“仮想化テクノロジ・トラック”の開催を提案している。同氏によると、これまでの開発成果は単なる入り口段階レベルのものにすぎないとのことだ。

「一定の成果が出たと言うには、まだ時期が早すぎるでしょう」と同氏は語る。「現状はごく少数のビルディングブロックが存在するにすぎず、新規に作成された数も限られています」

現存する基本的なビルディングブロック

仮想化テクノロジの土台となるのは、これらの基本的なビルディングブロックである。現存するビルディングブロックのすべては、2006年中に提案およびその後の検討と構築作業が進められたもので、当座の処置としてLinuxカーネル開発者であるAndrew Morton氏のマージツリーに収められていたが、その後安定版の2.6カーネル(11月29日リリースの2.6.19)に取り込まれ、現在はメインストリームLinuxの一部として正式に統合されている。

「正確に言うと(問題のパッチセットは)現行のLinuxカーネルの挙動を変える訳ではありませんが、これらはOSレベルの仮想化テクノロジの道しるべを付ける存在です」とPoetzl氏は語る。

IPCの仮想化

Linuxのプロセス間におけるデータの交換や共有は、プロセス間通信(Inter-Process Communication: IPC)という機能で司られているが、このIPC機能を仮想化するために構築されたのがIPCの仮想化用パッチである。このパッチを適用すると、相互に認識可能なプロセスが同一の仮想コンテナにあるものだけに限られるようになり、プロセス間通信もそうした範囲内でのみ行えるようになる。

「IPCオブジェクト群(共有メモリセグメント、メッセージキュー、セマフォ)とは本来、実行中の各カーネルに1セットずつ存在する性質のものです」とKolyshkin氏は説明する。「最終的な目的はコンテナという独立した複数の環境を単一のカーネル上に作成することですが、その前段階として、異なるコンテナにある他のIPCオブジェクト群は認識できないという状態を作っておきたい訳です。そのために必要とされたのがIPCの仮想化であり、表現を変えれば、IPCネームスペースを構築する必要があった、ということになります」

PIDの仮想化

PIDの仮想化とは、個々のコンテナごとにPID(プロセスID)スペースを固有化させて、それぞれのコンテナ内部を外部のプロセスからは見えないよう遮蔽してしまうことである。

「UNIXシステムの場合、initプロセスのPIDは1という値に固定されています」とKolyshkin氏は説明する。「そしてコンテナが複数存在すればinitも複数存在することになり、これらのinitについてもすべてPID=1としなければなりません。そのために必要とされたのがPIDネームスペースであり、それがPIDの仮想化というテクノロジです」

Kolyshkin氏の説明によると、PIDの仮想化はその他の面でも有益に働くとのことだ。「異なるマシン間で一連のプロセスを移動させる際の、ライブ・マイグレーションというシナリオを考えてみましょう」と同氏は語る。「各タスクのPIDを途中で変更することはできないので、移動先のマシンでも同じPIDを使用し続けられるようにしなければなりません。PIDネームスペースの分離が行えると、そうした状況が扱えるようになるのです」

UTSの仮想化

UTSネームスペース用のパッチとはutsname構造体を仮想化するためのもので、この構造体はオペレーティングシステムおよびハードウェアの基本情報やhostnameを取得する際に使用される。そしてこのパッチを適用すると各コンテナごとにutsnameがローカル化されるのだが、これも仮想化テクノロジで必要とされる機能の1つなのである。

「すべてのコンテナで共通のhostnameを使わせる訳にはいきませんから」とKolyshkin氏は説明する。

パッチセットの開発元であるIBMの説明によると、その作成目的は単なる機能実装に限られるものではなく、同様の手法による仮想化を他のシステムリソースに施すための土台を築くことも想定している、とされている。こうした意図があるため、このパッチセットでは、必要な構造体やコードを提供することはもとより、具体的な使用例を示すことも配慮されているとのことだ。

実際IBMはそのステートメントの中で、「仮想サーバやアプリケーションマイグレーションの機能を実現するには、アプリケーションコンテナの構築が必要となりますが、弊社IBMが今回意図したのは、そうした開発活動を始める“きっかけ”を作ることでした」と述べている。「IBMは当該パッチを開発する際に、これらの機能構築に携わるすべてのプライベートな団体が協力体制を取れるよう、必要な配慮を行っております。こうした措置は、デザインやコードの問題に関する意見交換の窓口を広く開放することになり、結果として開発活動の速度やコードの品質を高める方向で寄与すると信じる次第です」

一方の準仮想化についても、そのテクノロジ開発は前進しつつある。「準仮想化機能のサポート態勢も、長期的に見れば、ゆっくりですが着実に進歩しています」とBiederman氏は語る。

準仮想化に関する実装パッチは、既にカーネル開発に取り込まれており、その他にも開発ツリーに取り込まれたパッチとしてKernel-based Virtual Machine(KVM)が存在している。これは/dev/kvmデバイスを作成して、システムによる仮想マシンの実行を可能にするためのものである。

Morton氏は、KVMおよび準仮想化の基本機能はいずれもLinux 2.6.20で取り込まれると予想しているとのことだ。「OSレベルの仮想化テクノロジは着実に進歩していくでしょう」とMorton氏は語る。「もっとも、その完成が確実か、あるいは何時になるかは分かりませんが」

次に訪れるもの

仮想化テクノロジの実現については、当座の間、すべての関係者が地道な開発活動を続けていくことになるだろう。「私個人の計画としては、PIDネームスペースの作業を終えてから、ネットワークネームスペースに着手するつもりです」とBiederman氏は語る。「プロセス間の分離が行えるようになると、このネームスペースはあたかも個別のシステムであるかのように振る舞うようになるため、ある意味非常に重要な存在だと見なせます」

IBMの場合、Linux仮想化テクノロジに関する今後の方針としては、フルOS、仮想サーバ、ライトウェイト・アプリケーション・セットという3つのレベルで機能の完全化を目指していくとのことだ。Kolyshkin氏の予想では、リソース管理および、チェックポインティングとライブマイグレーションの機能という2つの領域において大幅な前進が見られるだろうとしている。これらの機能がメインストリームLinuxに取り込まれるのは今日や明日の話ではないだろうが、堅実な開発過程が取られているが故に確実な現実化が進んでいると見ていいだろう。

「開発者間での意見交換を繰り返しつつ、着実な改善を施していく必要があるので、目標達成までの道のりは“ビット単位ないしはパッチ単位での前進”といった感じになるはずです」とKolyshkin氏は語る。「実際私たちは、そうした方針で活動しています。ゆっくりでも着実に前進すればいいのですから」

– Write for us – and get paid! –

NewsForge.com 原文