Linux-VServerをインストールする

Linux-VServerを使えば、物理的に1台のハードウェアで複数の仮想サーバを簡単に実行することができる。より複雑な仮想化のスキームほどの柔軟性はないものの、実装が容易でパフォーマンスにも優れている。

Linux-VServerや類似ソフトウェアのOpenVZでは「ライトウェイト(軽量)」な仮想化のアプローチをとり、基本的には1つのLinuxカーネル環境をセグメント化して、それぞれに別々のファイルシステム、プロセステーブル、ネットワークアドレスを持つ複数の仮想マシンに分割している。

この方法は”jail”アプローチと呼ばれることもある。FreeBSDオペレーティングシステムでおなじみの”jail”という機能にきわめて類似しているからである。このFreeBSDのjailは、Linuxカーネルも含めた多数のUNIXカーネルでサポートされてきたchroot jailの概念を拡張したものだ。

その方面に詳しい人なら、chrootシステムコールによって、プロセスのルートディレクトリをより大きなファイルシステムのサブツリーに変更できることをご存知だろう。この方法は、脆弱なサーバのプロセスをシステムの他の領域から隔離されたchroot jail内に置き、コンピュータのセキュリティを向上させるためによく使われる。たとえば、定評のあるBINDのDNSサーバを/chroot/namedのようなchroot jail内で実行するように設定することができる。

このchroot jail内では、たとえば/etc/passwdはメインファイルシステムの/chroot/named/etc/passwdにマッピングされている。こうすることの利点は、rootとしてコードを実行可能な権限を侵入者に与えてしまうようなBINDの弱点がたとえ見つかったとしても、侵入者は/chroot/named/の外側にあるファイルには手を出せないことだ。このchroot jailの概念は、制限された形の仮想化とみなすことができる。chroot jailは各プロセスに完全に分離されたファイルシステムを提供するものの、システムのそれ以外の面は分離されていない。たとえば、chroot jail内では、ホストシステムのすべてのプロセスが見え、各種ネットワークアドレスもホストシステムと共有されている。

FreeBSDのjailとLinux-VServerは、このchroot jailの概念をさらに深め、各仮想マシンに別のプロセステーブル、リソース制限、ターミナル、ネットワークアドレスを持たせている。とはいえ、ハードウェアのエミュレーションは一切行っていないので、ライトウェイトな仮想化であることに変わりはない。

そのため、しばしばセキュリティコンテキスト、あるいはLinux-VServerの用語でバーチャルプライベートサーバ(VPS)とも呼ばれるこうした仮想マシンは、根底にある物理的ハードウェアの最高速度に近いスピードで実行することができる。他の仮想化アプローチと違い、Linux-VServerの仮想サーバはすべて、同一のカーネルの制御下で実行される。実行するカーネルを1つにすることで達成されるパフォーマンスの向上は、多くの場合、この小さな制限を補って余りある。また、すべての仮想マシンが1つのカーネルに制限されるとはいえ、各仮想マシンで別々のLinuxディストリビューションを実行するには(選択したカーネルでそれらのディストリビューションが動作する限り)何の問題もない。

Linux-VServerは2つの要素で構成される。セキュリティコンテキストをサポートするためのカーネル内コードと、仮想サーバの生成と管理のためのユーザ空間ツールである。

通常、ユーザ空間ツールのインストールは、使用しているディストリビューションのパッケージ管理システムを使って簡単に行える。カーネルについては、VServerのセキュリティコンテキストをサポートしているカーネルを実行しなければならない。そのためには、セキュリティコンテキストをサポートするようにビルドされたカーネル、またはビルド前にカーネルソースコードに適用できるVServerのパッチのどちらかをダウンロードすればよい。

Linux-VServerのインストール

以下では、私がUbuntu 6.10(Edgy Eft)システム上にLinux-VServerをセットアップした方法を紹介する。この方法はDebianのほか、KnoppixやXandros、比較的新しいバージョンのMEPISなどDebianベースのディストリビューションでもそのまま、あるいはわずかな修正で使えるはずだ。その他のディストリビューションを使用している場合も、基本的に同じアプローチをとればよいが、別のパッケージを用いる必要があるかもしれない。

最初に私が行ったのは、VServerのパッチがあてられたビルド済みカーネルのダウンロードだった。独自カーネルをビルドする場合は、VServerのパッチをダウンロードしてカーネルソースに適用し、make-kpkgのようなコマンドを用いてカスタムカーネルのビルドを行えばよい。

Ubuntuの場合、VServerのパッチはkernel-patch-vserverというパッケージとして用意されている。Ubuntuのカスタムカーネルのコンパイルについての詳細は、Ubuntu WikiのKernelCustomBuildページを参照してもらいたい。

続いて、次のようなdpkgコマンドを用いてカーネルをインストールする。

sudo dpkg -i linux-image-2.6.15-27-686_2.6.15-27.45vs2.0.1+2.0.2rc26_i386.deb

カーネルのインストール後は、VServerが有効な新カーネルをロードするためにリブートを行う。

次に、VServerインスタンスの生成と管理を可能にするVServerユーティリティを次のようにしてインストールする。

sudo apt-get install util-vserver vserver-debiantools debootstrap

これでLinux-VServerのインストールは完了したので、続いてUbuntu 6.06 LTS(Dapper Drake)を実行する仮想サーバの生成方法を紹介しよう。

仮想サーバの構築

仮想サーバの構築はとても簡単で、次のようなvserverコマンドを使って行う。

vserver vserver1 build -n vserver1 --hostname vserver1.mydomain.com --interface eth0:192.168.1.31/24 -m debootstrap -- -d dapper

このコマンドによって、vserver1.mydomain.comというホスト名の仮想サーバ”vserver1″と、CIDR表記のプレフィックス長が24の192.168.1ネットワーク内のIPアドレス192.168.1.31を持つ仮想イーサネットデバイスが構築される。

この仮想サーバのパッケージデータベースとファイルシステムを配置するのが、debootstrapというコマンド(同名のパッケージから取得)で、Ubuntu Dapper Drakeのパッケージリポジトリからパッケージを取得するために引数dapperが渡されている。

この手順の実行には数々のパッケージのダウンロードとインストールが必要になるので少し時間がかかるが、本格的なディストリビューションのインストールを行う場合ほどではない。というのもdebootstrapは必要最小限のパッケージのダウンロードとインストールしか行わないからだ。その他のパッケージはあとでインストールすることができる。ただしdebootstrapが使えるのは、Debianベースのシステムのブートストラップ処理だけである。

Debianベースでないディストリビューションをインストールする場合は、別のツールを使う必要がある。RPMベースのディストリビューションのインストールには、rpmstrapを検討するとよい。

続いて以下のコマンドにより、新しく構築した仮想サーバを起動し、そのサーバに入る。

vserver vserver1 start
vserver vserver1 enter

これで仮想サーバ内に入ることができたわけだが(exitと入力すれば出られる)、最低限のパッケージしかインストールされていないことに注意が必要だ。topと入力すれば、この仮想サーバではプロセスがほとんど実行されていないことがわかる。またdfを実行すれば、ルートファイルシステムが仮想ブロックデバイスに用意されていることがわかる。この仮想ブロックデバイスの名は、おそらく/dev/hdv1になっているはずだ。

追加の設定

この時点で非常に基本的な仮想サーバができあがっているので、たいていは追加パッケージのインストールやシステムへのユーザ登録を行うことになるだろう。その方法は、ホストシステムで一般的に用いられているものと少しも変わらない。以下に、簡単だが役に立つ例を示す。

apt-get install ssh

adduser marc

これで仮想マシンに対してsshを実行できるようになる。Apache、BIND、SMTPといったサーバのインストールも同様に簡単で、それぞれのサーバプロセスでApache、BIND、SMTPなど種類の異なる仮想サーバを立てることもできる。

実際、これはセキュリティの点から見て非常に優れたアイデアである。というのは、こうしたプロセスのそれぞれを分離し、他のプロセスに悪影響が及ぶのを回避できるからだ(とはいえ、プロセスはすべて同じ物理的ハードウェア上で実行されているので、停電やハードウェア障害が起これば1つ残らず消滅してしまう)。

あるいは、DebianGentooのそれぞれの最新バージョンを試したい場合も、両者を別々の仮想マシン上にインストールすることができる。さらに、実験版のすべてのソフトウェアやアップグレードを別々の仮想マシンにインストールすることも可能で、そうすればシステムを破壊してしまう危険がなくなる。このように仮想化には数多くの用途がある。

まとめ

Linux-VServerによって、わずかなオーバーヘッドで優れたパフォーマンスを生み出し、それでいてセキュリティ性と障害分離性の向上も果たせるライトウェイトな仮想マシンを生成することができる。ハードウェアへの追加投資なしに、セキュアでフォールトトレラントなシステムを生成するのに利用できるわけだ。また、Linux-VServerを使えば、わざわざもう1台マシンを用意したりシステムの破壊について心配したりすることなく、他の開発環境の再現や最新のLinuxディストリビューションの試用も行える。

準仮想化と完全仮想化

仮想化といえば、ハードウェアのレベルに至るまで仮想マシンをエミュレートし、エミュレートされたハードウェア上でオペレーティングシステム(OS)を実行する完全仮想化(full virtualization)のソフトウェアを思い浮かべる人が多い。これは、VMwareQEMU、Bochsといった著名なソフトウェアパッケージが採用しているアプローチだ。

完全仮想化のソフトウェアでは、プロセッサ、BIOS、入出力デバイスなど、広い範囲にわたってハードウェアの仮想化を行っている。このアプローチの利点の1つは、どんなOSでも仮想化ハードウェア上で実行できることにある。欠点は、ハードウェアのレイヤまでエミュレートしているためにオーバーヘッドが大きく、多くの場合、ゲストおよびホストの両OSで著しくパフォーマンスが低下することだ。

近年、準仮想化(paravirtualization)と呼ばれるもう1つの仮想化手法に多くの関心が集まっている。準仮想化の場合、仮想マシンは仮想マシンモニタ(VMM)すなわちハイパーバイザ内で実行され、そのサービスへのアクセスはソフトウェアインタフェースを介して行われる。

準仮想化というのは、実はIBMのメインフレームの時代にまで遡る古い手法だが、最近、Parallels WorkstationやXenなどのソフトウェアを搭載したパーソナルコンピュータへの適用が増えつつある。しかし、準仮想化にも欠点はあり、ハイパーバイザをサポートするためのゲストOSの修正か、IntelやAMDの比較的新しいプロセッサによる特別なハードウェアのサポートのどちらかが通常必要になる。

ただし、ゲストOSをLinuxに限定すれば、より抽象度の高いレベルで仮想化を行い、パフォーマンスの向上をもたらすUser-mode Linux(UML)やLinux-VServerのような選択肢も考えられる。UMLを利用すれば、Linuxカーネルを(EmacsやVimのような他のLinuxのプロセスと同じように)ユーザプロセスとして「ホスト」側のLinux OSの内部で実行することができる。

この興味深いテクノロジには、UMLが有効な最近のカーネルから任意のものを選んで実行できる、ゲストシステムのカーネルを従来よりも容易にデバッグできる、といった数々の利点がある。

NewsForge.com 原文