簡易的なLinux用仮想化プラットフォームとしてのLguest

 これまでのところLinuxカーネルのメインラインツリーには3種類のハイパーバイザ(hypervisor)が取り込まれており、まず最初がカーネル2.6.20段階でのKVMで、その次に2.6.23リリースにおけるXenおよびlguestという順番になる。ここで言うハイパーバイザとは、ホストシステム上で複数のオペレーティングシステムを実行させる技術のことである。これら3つの選択肢の中で、操作と実装という観点から見た場合に最も簡単なのがlguestであり、これから仮想化テクノロジの動作する原理を学習したいというユーザに適したオプションだと言えるだろう。

 lguestは比較的新しいソフトウェアであるが、成熟の進んだ他のLinux用仮想化プラットフォームに見られる一部の高度な機能は装備されていない。例えばlguestの基本構成は、カーネルモジュールおよびクライアントランチャという2つに分けられるが、lguestランチャを用いてLinuxホスト上で仮想的に実行できるゲストOSは、ホストのカーネルバージョンと一致するLinuxゲストが1つだけという制約が付いている。またlguestは、ゲストOS側からのX出力をサポートしておらず、ネットワーク上の他のマシンで使われているハイパーバイザの別インスタンスにゲストOSを移動させるVMの移植機能も装備されていない。これらの欠如は重要な不備と見なさざるを得ないが、それでもシステムを再起動させることなく設定の異なるカーネルを試用したい場合など、lguestは有用なツールとして機能してくれるはずである。

 lguestプロジェクトの管理するコードベースは現状で6,000行程度でしかない。しかしながら新規のカーネルハッカーや仮想化マシンのモニタ開発者がシンプルなハイパーバイザの動作原理を学習するにあたっての有用かつ貴重な素材を提供しているのは、こうした小規模な構成のコード群なのである。先に触れたようにlguestには他のハイパーバイザにおける実装済みの各種機能が未だ装備されていないが、それ故にコード開発者達が各自の成果をメインラインのカーネルに取り込む際において、比較的扱いやすいテストベッドとなっているとも言えるだろう。

lguestの使用法

準仮想化
 準仮想化(paravirtualization)は完全な仮想化よりも高速なパフォーマンスを発揮できるテクノロジであるが、これはゲストOSに自分が仮想化環境にて実行されていることを自覚させることにより、それを踏まえたシステムリソース要求が行われるようになるためである。これに対して完全な仮想化を行うハイパーバイザの場合、ゲストOSの行うI/Oオペレーションなどの特権的な呼び出しを常に監視して、ゲストOS上で必要なシミュレーションを実施しなければならない。

 lguestは準仮想化ハイパーバイザであるため、そこで実行するゲストカーネルに対しては仮想化環境上で実行されていることを認識させるための変更を施して、システムリソースへの無許可アクセスを行わせないようにしておく必要がある。

 lguestの実行時には、ホストおよびゲスト双方のカーネル設定において下記のオプションを有効化しておかなくてはならない。いずれにせよ、ホストとゲスト側で同じカーネルを使用させることで、設定の変更は大幅に簡単化されている。

  • CONFIG_HIGHMEM64G=n――lguestはハイメモリのサポートで問題を起こす可能性があるため、この機能は無効化しておく方が無難である
  • CONFIG_TUN=y/m――TUN/TAPデバイスドライバのサポート。“y”とするとカーネル中に作成され、“m”とするとローダブルモジュールとして作成される
  • CONFIG_EXPERIMENTAL=y――開発中ないし未完成のコードおよびドライバに関するプロンプト。これを“y”にすると、ユーザに対して以降のオプション確認が行われるようになる
  • CONFIG_PARAVIRT=y――カーネル中の準仮想化コードは開発中とのステータス付けがされているが、lguestを使用する際には必要となる
  • CONFIG_lguest=y/m――Linuxハイパーバイザのサンプルコードをカーネルないしローダブルモジュールとして作成させる。これによりlguestのコアであるlgモジュールが得られる
  • CONFIG_lguest_GUEST=y――lguestによるゲストのサポート
XenおよびKVMに対するlguestの相違点
 現行リリースのLinuxカーネルにはXenおよびKVMというハイパーバイザも取り込まれている。このうちKVMの実態は、Intel(VT:Virtualization Technology)およびAMD(AMD-V:AMD Virtualization)プロセッサで新規に実装されたハードウェア仮想化テクノロジにLinuxカーネルを対応させるためのパッチである。これは完全な仮想化に属するため、KVM上で使用するゲストOSについては事前の変更が不要であり、またLinux以外のゲストOSをホストインストレーション上で実行させることもできる。ただしVTないしAMD-V対応プロセッサを用いた仮想化を前提としているため、lguestとは異なりそれらに対応するハードウェアが必要となる。

 一方のXenはlguestと同様の準仮想化モデルを採用しているため、ホスト上で実行させるゲストOSにはパッチを適用しなくてはならない。Xenはハードウェア上で直接動作する関係上、オペレーティングシステムの全インスタンスをゲストとしてロードするようになっているが、その中にはホストOSも含まれるため、パフォーマンスがある程度低下する場合がある。なお最近リリースされたXenでは、VTないしAMD-V対応の新型プロセッサ搭載マシンという制限付きで、ゲストを変更不要でロードできるようになっている。この意味においてXenは、準仮想化と完全な仮想化の双方をカバーした混成型のハイパーバイザであると言うこともできる。

 設定変更後のカーネルについては再コンパイルしてから起動をさせるが、いずれかのカーネル設定オプションにて“y”ではなく“m”が選択してある場合は、「make modules_install」によるモジュールのインストールが必要となる。

 ランチャプログラムのlguest.cは、Documentation/lguest/lguest.cのカーネルソースツリーに置かれているが、これはゲストカーネルのセットアップと設定に使用する。そのビルドにあたっては、当該ディレクトリにてmakeを実行すればいい。

 lguestではブータブルCD/DVDからの起動は行えないため、X Window環境を含めたLinuxディストリビューション一式をインストールしておく必要がある。こうしたLinuxディストリビューションのインストールは、ハードドライブ上に別途確保したプライマリパーティションにて行う必要があるが、あるいはQEMUを使用していれば、仮想化環境にてこうしたディストリビューションの複数インスタンスをlguestに実行をさせることも可能となる。

 ゲストカーネルを起動させるには、カーネルソースツリーのDocumentation/lguestにて下記のコマンドを実行する。

./lguest 64m ../../vmlinux --block=rootfile root=/dev/lgba

 ここで64mにはゲストに割り当てるメモリ量を指定する。その次の../../vmlinuxは、ビルドディレクトリにあるカーネルイメージの指定部である。そしてrootfileは、ゲスト環境において/dev/lgbaとするファイルないしブロックデバイスであるが、具体的にはQEMUを用いてインストールしたイメージか、あるいはゲストのLinuxディストリビューションをインストールしたプライマリパーティションを指定すればいい。最後に残された/dev/lgbaはゲストカーネルに渡されるブートパラメータで、ここでは/dev/lgbaをルートデバイスとして使用させることを指定している。

 すべてが問題なく進行すれば、ゲストOSへのログイン画面が表示されるはずである。

lguestの細部を解説したドキュメント

 drivers/lguest/ディレクトリに用意されているのはREADMEファイルだけでしかない。ただしこのREADMEファイルの末尾には、上級ユーザを対象としたlguestを使いこなすためのヒントが記載されている。このファイルの最終2行を注意深く読み進めると「make Preparation!」という記述があるのに気づくだろうが、実はこの場合、まさしくこの文面どおりにmakeのターゲットとして“Preparation”が用意されているのである。すなわちこのディレクトリにて「make Preparation」を実行すると、lguestソースファイルからのドキュメント作成が行われて、その内容がコンソール出力にダンプされるようになっており、このドキュメントこそがlguestの初心者ユーザをその詳細な動作原理へと導くガイドとして機能するのである。

 業務ないし研究的なニーズを満たすのに適した仮想化プラットフォームというのは、lguestの有用性を示すごく一部でしかない。確かに各種機能の欠落を始め、複数ゲストプラットフォームの未サポートなど、拡張の余地はまだまだ残されている。しかしながらlguestは、ハイパーバイザを試用してみたいというユーザに対して、過剰な負担を強いることなく実際に動作する仮想化環境を提供できる格好の素材なのである。あるいはそれなりの力量のあるユーザであれば、lguestを自力でフォーキングさせて、1つの完成されたハイパーバイザに仕上げるというのも良いのではなかろうか。

Linux.com 原文