[Xen]DomainUをさくっと作る方法
ジョグノートでは開発や実験を行うための環境として Xen を使っています。
Xen のバーチャルマシンは DomainU と呼ばれていて、DomainU の作成方法としてはここで紹介されているように virt-install を使う方法が一般的なようです。
しかし virt-install はいろいろな仮想化技術をラップするライブラリである libvirt を使っていて、Xen の DomainU を作成するために Xen 以外のソフトウエアのお世話になるのは少々大袈裟な気がします。
なので Xen の機能のみ使って DomainU を作成できればと思い、調べてみました。基本的にはここにある方法で作業を進めていきます。
以下は CentOS 5.0 が動いている Domain0 上で CentOS 4.6 がインストールされた DomainU を作成するための手順です。
DomainU を新規に作成する場合には OS のインストーラを DomainU として走らせる必要があり、まずはインストーラのための DomainU の設定ファイルを作成します。
インストーラのための設定ファイルを /etc/xen/centos4.installation として以下のように作成します。
ちなみに /etc/xen は root 以外はディレクトリの中に入ることもできないので、実際に作業をする時には sudo bash などして root 権限でシェルを立ち上げてから作業をしたほうがやりやすいでしょう。
kernel = "/var/lib/xen/images/vmlinuz-CentOS4.6-Installer" ramdisk = "/var/lib/xen/images/initrd-CentOS4.6-Installer.img" extra = "text ks=http://somewhere/devel-ks.cfg" name = "centos4.dev" memory = "256" disk = [ 'tap:aio:/var/lib/xen/images/centos4.dev.img,xvda,w', ] vif = [ 'mac=00:16:3e:5b:b3:ec, bridge=xenbr0', ] uuid = "722e88f7-99bd-47ac-b644-89dab714ee22" vcpus=1 on_reboot = 'destroy' on_crash = 'destroy'
設定ファイルの記述については man xmdomain.cfg で調べることができます。このインストーラを走らせるための設定ファイルの要点を見ていきます。
まず kernel と ramdisk にはインストーラ用のものを指定します。これは CentOS のインストーラの ISO9660 イメージに含まれていて、/images/xen/{vmlinuz,initrd.img} がそれぞれカーネルとシステムイメージになります。
これらは例えば次のようにして ISO9660 イメージから取り出して、設定ファイルで指定した場所にコピーしておきます。
% sudo mount -o loop /path/to/CentOS-4.6-i386-binDVD.iso /mnt % sudo cp /mnt/images/xen/vmlinuz /var/lib/xen/images/vmlinuz-CentOS4.6-Installer % sudo cp /mnt/images/xen/initrd.img /var/lib/xen/images/initrd-CentOS4.6-Installer.img
次に extra にはインストーラを起動する時に指定するパラメータを指定します。ここではコンソールでインストールを行うので text と、後述するインスールの自動化のための Kickstart ファイルへの PATH を指定しておきます。
name はこの DomainU につける名前で、他とかぶらないようなわかりやすい名前を適当につけておきます。memory は 256 を指定しています。これ以上少ないと確かインストーラにメモリが少ないと怒られたり、インストールした後も運用上問題があったような気がするので、256MB 以上を割り当てたほうがいいでしょう。
disk では DomainU がハードディスクとして扱うためのイメージファイルを指定します。ここで指定したファイルは実際に存在しなければいけないので、インストーラを走らせる前に作成しておきます。
参考にしたCentOSのWikiの記述によると、virt-install では
# dd if=/dev/zero of=/srv/xen/mailserver.img oflag=direct bs=1M seek=2047 count=1
のようにして 2GB のファイルを作成する場合でも、作成する時点では最小限の大きさにしておいて、ファイルへの書き込みと共にサイズが成長していくような作り方をしているようですが、この方法で作成するとインストール中とか yum update してる時とかファイルサイズが大きくなるような作業をしている時に膨大な時間がかかります。確かOSのインストールに4時間ほどの時間がかかりました。なので
# dd if=/dev/zero of=/srv/xen/mailserver.img oflag=direct bs=1M count=2048
のようにして、あらかじめ所定の大きさのファイルを作成しておいたほうが快適に DomainU を使うことができます。
なおディスクイメージのサイズですが、コンパイラなどの開発環境や Apache や MySQL などの動作環境をインストールすると 4GB でもすぐにいっぱいになってしまうので、8GB くらいで作成しておいたほうが後々の使い勝手がよいです。次のようにして 8GB のディスクイメージを作成します。
% sudo dd if=/dev/zero of=/var/lib/xen/images/centos4.dev.img oflag=direct bs=1M count=8192
vif ではネットワークインターフェースの設定をします。mac に指定する mac address はここで紹介されている、次のような Python のスクリプトを使って生成します。最初の 0x00, 0x16, 0x3e, は Xen が取得しているベンダコードです。
#! /usr/bin/python # macgen.py script generates a MAC address for Xen guests # import random mac = [ 0x00, 0x16, 0x3e, random.randint(0x00, 0x7f), random.randint(0x00, 0xff), random.randint(0x00, 0xff) ] print ':'.join(map(lambda x: "%02x" % x, mac))
これを macgen.py などと適当な名前で保存して、次のようにして実行します。
% python macgen.py 00:16:3e:1b:82:61
uuid には同一の Domain0 上で実行する他の DomainU とかぶらない一意な値を指定します。これは uuidgen コマンドを用いて作成することができます。
% uuidgen 722e88f7-99bd-47ac-b644-89dab714ee22
on_reboot と on_crash には destroy を指定しておきます。こうしておくとインストーラが終了すると DomainU も終了してくれます。
RedHat 系の Linux のインストーラである Anaconda はKickstart と呼ばれる設定ファイルを用意しておくことにより、インストールの手順を自動化することができます。Kickstart についてはここが参考になります。
ここでは次の内容で Kickstart ファイルを作成します。
install
url --url http://somewhere/centos
lang en_US.UTF-8
network --device eth0 --bootproto static --ip 192.168.109.49 --netmask 255.255.255.0 --gateway 192.168.109.254 --nameserver 192.168.109.1
rootpw itsasecret
firewall --enabled --trust=eth0 --port=22:tcp,80:tcp
authconfig --enableshadow --enablemd5
selinux --disabled
timezone --utc Asia/Tokyo
bootloader --location=mbr --driveorder=xvda --append="console=xvc0"
reboot
# Partitioning
clearpart --all --initlabel --drives=xvda
part /boot --fstype ext3 --size=100 --ondisk=xvda
part / --fstype ext3 --size=1024 --grow
part swap --fstype swap --size=512
%packages
@core
@development-libs
@development-tools
@legacy-software-development
この Kickstart ファイルも要所を見ていきます。
url には CentOS のインストールイメージがあるところを指定しておきます。外部のサイトを指定してもよいですが、それだとネットワークの回線が細いとインストールに時間がかかるので、インストーラの ISO9660 のイメージをダウンロードしておいて、上述のように ISO9660 イメージをシステムにマウントして、インストールイメージが入っているディレクトリが http で見えるように設定しておくといいでしょう。
lang には en_US.UTF-8 を指定します。日本語が通らないかもしれないコンソールで作業をすることが多いので、必ず表示できる設定を選んでおいたほうがよいかと思います。ただ、何故かここで un_US.UTF-8 を選んだのにインストールの時には確認のプロンプトが表示されました。ここは自動化しないのですかね。
network には静的にアドレスを割り振るように設定しました。DHCP Client にするための設定は上述のWikiに詳しい解説があります。
root のパスワードもここで指定します。
firewall は iptables の設定です。ここでは ssh と http の通信は通すように設定しておきます。
selinux は使わないので disabled を指定しておきます。
timezone は Asia/Tokyo を指定します。ここで指定できる値は、既にOSが入っている環境なら /usr/share/zoneinfo の中にあるファイルの名前を見れば一覧できます。
ハードディスクのパーティッションの切り方は clearpert と part によって指定します。
まずは全てのパーティッションを削除します。そして /boot に 100MB、スワップに 512MB、/ に残りの容量を割り当てます。
最近の RedHat 系の Linux はデフォルトで LVM を使ってパーティッションを構成していますが、DomainU として運用する場合、LVM のディスクイメージを Domain0 から見る場合に手順がいろいろと面倒なので、古典的な方法でパーティッションを切った方が運用しやすいです。
Domain0 から LVM で構成されたディスクイメージをマウントするための方法としてはこのへんが参考になります。
パッケージは必要最小限のものだけインストールします。本当に必要最小限のものだけなら core のみを指定すればいいのですが、それだと gcc をはじめとした開発環境がインストールされないので、development-libs, development-tools, legacy-software-development も指定しておきます。
作成した Kickstart ファイルは、インストーラが動く DomainU から http で見えるところに置いておきます。
ここまでできたら、インストーラを動かすための DomainU を作成します。
% sudo xm create -c /etc/xen/centos4.installation
Kickstart に記述した手順で次々とインストーラの画面が切り替わっていきます。
インストールが終了したら、DomainU の設定ファイルをインストーラ用のものから実際に運用するものに置き換えます。修正個所は次の通りです。
--- centos4.dev.installer 2008-06-04 16:14:33.000000000 +0900 +++ centos4.dev 2008-06-04 15:41:19.000000000 +0900 -kernel = "/var/lib/xen/images/vmlinuz-CentOS4.6-Installer" -ramdisk = "/var/lib/xen/images/initrd-CentOS4.6-Installer.img" -extra = "text ks=http://somewhare/devel-ks.cfg" name = "centos4.dev" memory = "256" disk = [ 'tap:aio:/var/lib/xen/images/centos4.dev.img,xvda,w', ] vif = [ 'mac=00:16:3e:5b:b3:ec, bridge=xenbr0', ] uuid = "722e88f7-99bd-47ac-b644-89dab714ee22" +bootloader="/usr/bin/pygrub" vcpus=1 -on_reboot = 'destroy' -on_crash = 'destroy' +on_reboot = 'restart' +on_crash = 'restart'
kernel と ramdisk の指定をやめて bootloader を指定します。これでハードディスクイメージにインストールされたカーネルから起動するようになります。extra もインストーラのための指定で実運用には必要ないので削除します。on_reboot と on_crash には restart を指定しておきます。
設定ファイルを作成したら、次のようにして起動します。
% sudo xm create -c /etc/xen/centos4
これでインストールした OS が正常に起動すれば DomainU 作成完了です。
以上、virt-install のお世話にならず Xen の機能のみを使って DomainU を作成する方法でした。