Xen のゲスト環境を手動で構築する方法

Fedora Core 6 の Xen 3.0.3 でゲスト環境を構築してみる。FC6 には python-virtinst というパッケージがあって、それに含まれる virt-install コマンドを使うと、5 つの質問に答えるだけで簡単に設定ファイルを作ってくれる。さらに、即座にゲストドメインを作って、Anaconda*1 を起動してくれるので環境構築も楽チン。そこで、ここではあえて virt-install を使わないでゲスト環境を構築する、男のやり口を紹介する。

インストール先の作成

まずはゲストをインストールする場所を作成する。ここでは LVM を使っているが、SAN 上やイメージファイルでもかまわない。その場合は適宜読み替えてほしい。

lvcreate --name mint --size 8G vg_xen
mkfs.ext3 /dev/vg_xen/mint
lvcreate --name mint_swap --size 512M vg_xen
mkswap /dev/vg_xen/mint_swap

環境整備

マウント

インストール先ができたら、マウントして環境を構築していく。後々パッケージをインストールするときに /proc や /sys が参照されることがあるので、アクセスできるようにする。

mkdir /mnt/xen
mount /dev/vg_xen/mint /mnt/xen
mkdir /mnt/xen/{proc,sys}
mount -o bind /proc /mnt/xen/proc
mount -o bind /sys /mnt/xen/sys
cd /mnt/xen
各種システムファイル
for i in console null zero tty1 tty2 tty3 tty4 tty5 tty6 tty7 tty8; do MAKEDEV -d dev/ -x $i; done
mkdir etc
cp /etc/resolv.conf etc
cat << 'HERE'> etc/fstab
/dev/xvda1              /                       ext3    defaults        1 1
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
sysfs                   /sys                    sysfs   defaults        0 0
/dev/xvda2              swap                    swap    defaults        0 0
HERE
インストール

yum コマンドの --installroot オプションでインストール先を指定する。このとき、yum コマンドはインストール先配下の設定ファイルを読むようになるので、リポジトリの設定ファイルなどをコピーしておく。

cp -a /etc/yum.* etc

適宜コピーした設定ファイルを修正する。注意点として、設定ファイル内の $releasever が Null に変換されるので、あらかじめ置換しておくこと。
編集したら Bese グループのパッケージをインストールする。

yum --installroot=/mnt/xen -y groupinstall Base
仕上げ

chroot 環境に移行し、構築を完了する。

chroot /mnt/xen /bin/bash
rm -f /etc/localtime
ln -s /usr/share/zoneinfo/Japan /etc/localtime
cat << 'HERE'> /etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=false
ARC=false
HERE
  • 言語設定
cat << 'HERE'> /etc/sysconfig/i18n
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
HERE
  • ネットワーク設定
cat << 'HERE'> /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=mint.some.domain.org
GATEWAY=192.168.1.2
HERE
cat << 'HERE'> /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1       mint.some.domain.org mint localhost.localdomain localhost
1 mint.some.domain.org mint localhost.localdomain localhost
HERE
cat << 'HERE' > /etc/sysconfig/network-scripts/ifcfg-eth0
# Xen Virtual Ethernet
DEVICE=eth0
BROADCAST=192.168.255.255
IPADDR=192.168.8.111
IPV6ADDR=
IPV6PREFIX=
NETMASK=255.255.0.0
NETWORK=192.168.0.0
ONBOOT=yes
HERE
  • ファイアーウォール設定
 cat << 'HERE'> /etc/sysconfig/iptables
 # iptables firewalling
 *filter
 :INPUT DROP [0:0]
 :FORWARD DROP [0:0]
 :OUTPUT ACCEPT [0:0]
 -A INPUT -i lo -j ACCEPT
 -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
 -A INPUT -p tcp -m tcp --dport ssh -j ACCEPT
 -A INPUT -j REJECT --reject-with icmp-host-prohibited
 COMMIT
 HERE
  • モジュール設定

xenblk を読み込むように設定するのがミソ。詳しくは後述。

cat << 'HERE'>> /etc/modprobe.conf
alias eth0 xennet
alias scsi_hostadapter xenblk
HERE
  • カーネル
yum -y install kernel-xen
yum -y remove kernel
  • その他
pwconv
passwd
cp /etc/skel/.* ~
  • 完了
exit
cd

ドメイン設定

Domain 0 に Xen 用カーネルをインストールすると作成される initrd イメージでは、xenblk.ko というモジュールが足りず Domain U を起動することができない。ゲスト環境の構築で、モジュール設定をしてから Xen 用カーネルをインストールすると、ゲスト上に適切な initrd イメージが作成されるので、それをコピーして使う。

cp /mnt/xen/boot/initrd-2.6.19-1.2911.fc6xen.img /boot/initrd-2.6.19-1.2911.fc6xenU.img
  • アンマウント
umount /mnt/xen/sys
umount /mnt/xen/proc
umount /mnt/xen
ドメイン設定ファイル

今回構築した環境のための設定ファイルなので適宜読み替えてほしい。ちなみに、MAC アドレスの 00-16-3e というベンダ ID は、Xensource, Inc. として登録されている。

# Xen config file for domain Mint
name = "mint"
kernel = "/boot/vmlinuz-2.6.19-1.2911.fc6xen"
ramdisk = "/boot/initrd-2.6.19-1.2911.fc6xenU.img"
memory = "128"
disk = [ 'phy:/dev/vg_xen/mint,xvda1,w','phy:/dev/vg_xen/mint_swap,xvda2,w', ]
vif = [ 'mac=00:16:3e:08:6e:6f, bridge=xenbr0', ]
root = "/dev/xvda1 ro"
extra = "selinux=0"

起動

これでゲスト環境は完成した。後は起動するだけである。

xm create -c mint.conf

しかし、今のところ起動自体に問題はないが、login: プロンプトが表示されない。SSH がパスワード認証でログインできる状態で起動しているので、Ctrl + ] で一度コンソールから切断するなり、別の端末からログインするなりして SSH で接続する必要がある。この問題に関しては目下調査中であり、原因がわかり次第報告する。
以上。

*1:Fedora Core 6 のインストーラ