CentOS5+Xenでの仮想マシン構築(WindowsXP編)
Category : サーバ管理日記
Published by M-naka on 2007/4/22
念願の……。
 CentOS5ではXenが統合されたカーネルを標準で使用できる。

 AmatsuはIntel Core2Duo E6400で、「Intel-VT」すなわち仮想化支援機能を備えている。これとXenの組み合わせで「Full-Virtualization(完全仮想化環境)」の構築が可能で、これによりWindowsXPの動作が可能となる。

 CentOS5を導入した理由は正にこれ。で、手元に余ってるWindowsXP-Homeのライセンスが1つあるので、これを完全仮想環境で導入してみる。


1.Xen対応カーネルの導入状況確認
 CentOSアップグレード時には特に何もしていないので、ホントにXen対応カーネルが導入されているかどうかを確認する。
 # rpm -qa | grep kernel
この出力の中に、「kernel-xen」パッケージが含まれていれば、インストール済みであることになる。実際、インストール済みだった。ちなみに、
 # rpm -q xen
では「not installed」と出たので、Xen本体はこの時点では未導入。


2.yumでのXen導入
 Xen自体はyumで引っ張って来れるが、先にGPGキーをインポートしておかないと怒られてしまい(というか、怒られた)、インストールが上手くいかない。
 # rpm --import http://ftp.riken.go.jp/Linux/caos/centos/5.0/os/i386/RPM-GPG-KEY-CentOS-5
先にこうする。その上で、
 # yum -y install xen Virtualization-ja-JP
で、Xenと関連パッケージをインストールする。その上で
 # /sbin/chkconfig xend on
とし、XenサービスをOSブート時に自動起動させる。


3.Xen対応カーネルで起動
 /etc/grub.conf(実体は/boot/grub/menu.list)で、Xen対応カーネルで起動するよう、修正する。Xen対応カーネルでの起動を行うエントリ自体は、Xen対応カーネル自身のインストール時に書き加えられているようだ。具体的には「default=」の数値を、Xen対応カーネルのエントリに合う数字に書き換えるだけ。あと、Domain0(ホストOS)の使用メモリに上限を設け、DomainU(ゲストOS)が使えるメモリを確保する。搭載メモリ1GBのうち、Domain0に512MBを使わせる。これはkernel列dom0_mem=<容量> と記述することで実現する。

4.DomainU構成ファイルの準備
 先ず、DomainUで使用するハードディスク領域を確保する。専用のディスクパーティションを用意するか、仮想ハードディスクイメージを作成するか、のどちらかになる。パフォーマンス的には前者(直接パーティションを掴むため)で、ハンドリングが楽なのは後者(単一のimgファイルに過ぎないから)。実用する仮想サーバであれば専用パーティションにすべきだろうが、今回はクライアント用途なので仮想ハードディスクイメージを選択。以下で4GBの仮想ハードディスクイメージが作成される(置き場所は容量的に余裕のある録画用領域)。
 # dd if=/dev/zero of=/home/dvr/xenxp.img bs=1M count=4000
 そのあと、/etc/xenにDomainUの構成ファイルを置く。サンプルファイルがあるので、それをコピーして書き換えるだけでよい。こんな感じ。ちなみにWindowsXP-Homeのインストールディスクは、いったんisoファイルとしてリッピングし、それをドライブイメージとして指定している。上手くやれば物理的に接続されている光学ドライブをそのまま使えるらしいが、上手く行かなかった。
 なお、コツはVNCを切ることである。切らないとDomainUを起動してもDomainUのXウィンドウが開かない(←一晩ハマった人)。

5.DomainU起動
 ローカルでログインしてXを起動させた状態、もしくはVNCで接続した状態で、X上のターミナルから
 # xm create /etc/xen/xmxp.hvm boot=d
として起動。すると通常と同様、CD-ROM起動からWindowsXPのインストーラが立ち上がるので、あとは普通にWindowsXPをインストールしてやればよい。ネットワークは内部でブリッジが組まれているので、特に何もしなくても使える状態にある(外からは見えないが)。
 ちなみにVNC経由でKDE上で仮想WindowsXP機を表示させると、こんな感じ。

 マジ感動である。


6.ivtvドライバ
 Xen対応カーネルで起動させたあと、ivtvドライバもビルド&インストールし直しとなる(モジュール自体が通常カーネルと別物のため)。で、これをmodprobeでロードしたり、そのまま再起動を掛けて起動時にモジュールをロードしようとすると、何故かカーネルパニックを起こしてしまい、カーネルごと死ぬ(正確に言うと強制再起動が掛かる)。
 これは、/etc/grub.confのmodule列(カーネルイメージを指定している方)に、「swiotlb=force」を書き足すことで解決できる。

 最終的に/etc/grub.confの起動エントリは以下のようになる。

title CentOS (2.6.18-8.1.1.el5xen)
root (hd0,0)
kernel /xen.gz-2.6.18-8.1.1.el5 dom0_mem=512M
module /vmlinuz-2.6.18-8.1.1.el5xen ro root=/dev/md1 swiotlb=force rhgb quiet
module /initrd-2.6.18-8.1.1.el5xen.img


 実は暫く前にCentOS4.4でXen環境の構築を試してみたが、Xen対応カーネルではivtvドライバが動作せず、IOMMUエラーとかいうメモリ周りのエラーが出たため諦めていた(『swiotlb=force』でもダメだった)。CentOS5だとivtvドライバを従来どおり使いつつ、完全仮想マシン環境の構築もできているので、正直スゴい。