Xenによる仮想化環境構築ログ

Xen


会社のチームでの開発(Webアプリ)作業は全てLinux上で行っています。で、そのLinuxは、基盤をXenにした仮想OS上で行っています。

1人あたり1仮想OSを割り当てているため、開発メンバは好きなように自分好みの環境を作ることが出来ます。


で、メンバの誰もが使うようなミドルウェアやライブラリなどは、全員が共通のディスク領域をマウントし、そちらを使ってもらうようにしています。こうしておくことで、ミドルウェアやライブラリのバージョンアップをするときは、一箇所だけバージョンアップをすれば、全員がその恩恵を受けることができ、なかなか便利。


ちなみ、Xenとは?については以下のリンクがよくまとまっていると思います。


この環境は、もう今年の1月から稼動させていて、今のところ思っていたよりは遥かに安定して稼動してくれています。

その時の構築作業ログを社内で公開していたのですが、外から確認したくなることもあり、こっちにも書いておこうと。

環境

こんなマシンを一台使いました。

CPU Pentium4 2.8GHz
Memory 2GB
Disk 80GB x 2 (RAID1)
OS Debian GNU/Linux Etch (testing) [kernel 2.6.18-3]

このスペックのマシン上で、ドメイン0、ドメインUともに動かしてみることにします。

ちなみに、この物理ハードウェアの上で、仮想マシン(ドメインU)を4台稼動させていますが快調ですよ。
当時は、Debianのetchも、まだtestingディストリビューションだったのでした。

Debianで必要となるパッケージの確認

Xenを動かす上で必要となるパッケージを用意する必要があります。

尚、下記のパッケージ(debootstrapは除く)はXenのインストーラでも、存在しているかどうかをチェックしてくれるので、無いと言われてからインストールしてもOKだと思います。


# debootstrapはチェックしてくれないので注意。
# 無くても問題ないけど、あった方がドメインUの構築が圧倒的に楽。


必要なパッケージや、有無の確認方法、なかった場合のインストール方法などを簡単にまとめておきます。

必要パッケージ一覧

  • bridge-utils
  • iproute
  • hotplug
  • python
  • zlib1g
  • debootstrap

パッケージ有無の確認方法

$ dpkg -l {パッケージ名}

パッケージのインストール方法

$ sudo apt-get install {パッケージ名} 

Xenインストールログ

さて、では早速Xenそのものをインストールしてみたいと思います。

$ mkdir ~/install
$ cd ~/install
$ wget http://bits.xensource.com/Xen/latest/xen-3.0.2-install-x86_32.tgz
$ tar zxvf xen-3.0.2-install-x86_32.tgz
$ cd xen-3.0.2-2-install/
$ sudo ./install.sh

こんな感じでインストール完了の旨が出力されると思います。ここで、必要なパッケージの有無が確認されていることが分かると思います。

Installing Xen from './install' to '/'... 
 - installing for udev-based system
 - modifying permissions
All done.
Checking to see whether prerequisite tools are installed...
Xen CHECK-INSTALL  2007年 1月 10日 水曜日 17:35:43 JST
Checking check_brctl: OK 
Checking check_hotplug: OK
Checking check_iproute: OK
Checking check_python: OK
Checking check_zlib_lib: OK
All done.

ドメイン0の構築(設定)

では、ドメイン0(つまりホストOS)を設定していきたいと思います。

initrdの作成

面倒くさいので、ここからはrootにsuして作業。

# su -
# depmod -a -v 2.6.16-xen
# mkinitramfs -o /boot/initrd.img-2.6.16-xen /lib/modules/2.6.16-xen/

GRUBの設定

最下部にこんな感じで追記します。

# vi /boot/grub/menu.lst

内容はこんな感じで。

※ 今回の物理ハードウェア上ではソフトウェアRAIDを組んでいるのでデバイスが/dev/md0となっています。注意してください。非RAIDであれば/dev/hda0(プライマリIDE)とか/dev/sda0(SCSI)とかかな。

title           Xen-3.0.2-2
root            (hd0,0)
kernel          /boot/xen-3.0.gz dom0_mem=524288
module          /boot/vmlinuz-2.6-xen root=/dev/md0 ro console=tty1
module          /boot/initrd.img-2.6.16-xen
savedefault
boot

「dom0_mem」にはドメイン0で利用するメモリ容量を指定します。(単位 : KB)

xendの自動起動を設定

このあたりは、恒例の作業ですね。

# update-rc.d xend defaults 99

うまくいったら、こんな感じで表示されると思います。

 Adding system startup for /etc/init.d/xend ...
   /etc/rc0.d/K99xend -> ../init.d/xend
   /etc/rc1.d/K99xend -> ../init.d/xend
   /etc/rc6.d/K99xend -> ../init.d/xend
   /etc/rc2.d/S99xend -> ../init.d/xend
   /etc/rc3.d/S99xend -> ../init.d/xend
   /etc/rc4.d/S99xend -> ../init.d/xend
   /etc/rc5.d/S99xend -> ../init.d/xend 

/lib/tlsのディレクトリ名変更

これはお約束の模様。やらなくても動くのだが、Warningが出ることとパフォーマンスの低下が発生するらしい。

# mv /lib/tls /lib/tls.disabled

再起動&動作確認

ここまででドメイン0の設定作業は完了。再起動。

# shutdown -r  now

再起動後、GRUBのメニュー画面で、「Xen-3.0.2-2」を選択。
起動後、ログインし以下のコマンドを発行してみる。

# uname -r 
2.6.16-xen
# xm list
Name                              ID Mem(MiB) VCPUs State  Time(s)
Domain-0                           0      512     2 r-----    13.2

Xen用のカーネルであがってきてますね。ドメイン0。

うまくいくことを確認したら、GRUBの設定でメニュー画面で自動でXen用カーネルが選択されるように設定しておくと良いです。

ドメインUを構築

では、ドメイン0が出来上がったところで、仮想OSイメージを作成して、ドメインU(仮想マシン, 仮想OS)を動かしたいと思います。

イメージファイルの作成

これまでのチームの開発状況をみて、1人あたり1.5〜2GB程度の利用状況のようなので、4GBほど確保しておくことにします。
# この辺のパラメータは適宜変更しちゃってください。

$ sudo mkdir -p /home/virtual_machines/rx7
$ sudo chown sonic:sonic /home/virtual_machines/rx7
$ dd if=/dev/zero of=/home/virtual_machines/rx7/debian-root.img bs=1024k count=4096

実行すると、こんな感じで出力されて、、、

4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 93.169 seconds, 46.1 MB/s

4GBのイメージが出来上がりました。
同じようにswap領域の分も。512MBくらいでよいかな。

$ dd if=/dev/zero of=/home/virtual_machines/rx7/debian- swap.img bs=1024k count=512

同じように、こんな感じで出力されて、、、

512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 8.91269 seconds, 60.2 MB/s

出来上がり。
次に、作ったイメージをmkfsでLinuxのファイルシステム(ext3)にします。

$ /sbin/mkfs.ext3 /home/virtual_machines/rx7/debian-root.img 

インタラクティブに進めていきます。以下のような感じで入力。

mke2fs 1.40-WIP (14-Nov-2006)
/home/virtual_machines/rx7/debian-root.img is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2) 
Fragment size=4096 (log=2)
524288 inodes, 1048576 blocks
52428 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1073741824
32 block groups
32768 blocks per group, 32768 fragments per group 
16384 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 

This filesystem will be automatically checked every 38 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

swap領域も同じような感じで作成。

$ /sbin/mkswap /home/virtual_machines/rx7/debian-swap.img 

こんな感じで、こっちはすぐに出来ちゃいます。

Setting up swapspace version 1, size = 536866 kB
no label, UUID=b611d5e9-e0c1-4b2c-896f-51afddf02f70

最後の仕上げです。作ったイメージ(FS)をマウントして動かせる状態にします。
マウントして、debootstrapでOS稼動に必要なファイルをインストールしましょう。

$ su
# mkdir /mnt/debian.img
# mount -o loop /home/virtual_machines/rx7/debian- root.img /mnt/debian.img
# debootstrap --arch i386 etch /mnt/debian.img http://ftp.jp.debian.org/debian 

すると、ざーっとインストールが始まって、、、

〜〜〜省略〜〜〜
I: Base system installed successfully.

こんな感じで、最後に「Base system installed successfully」が出れば成功。
ここまでで、イメージファイルのベース部分の作成が完了です。

ドメインUのシステム設定

あと、ドメインUとして動かすために設定しなければいけないのは、以下のファイルとなります。

  • /etc/fstab
  • /etc/hostname
  • /etc/hosts
  • /etc/network/interfaces
  • /etc/apt/sources.list

というわけで、一つずつチャチャッとやっていきます。
まずは、/etc/fstabから。

# cd /mnt/debian.img 
# vi etc/fstab

以下の内容で書き換え。

/dev/sda1  /      ext3  defaults  0 1
/dev/sda2  swap   swap  defaults  0 0
proc       /proc  proc  defaults  0 0

次、/etc/hostname。

# vi etc/hostname

以下の内容で書き換え。この辺は任意の文字列でOK。

rx7-xenU

次、/etc/hosts。

# vi etc/hosts

以下の内容で作成。さっきのhostnameと合わせておきましょう。(hostnameの部分は書かなくても良いけど)

127.0.0.1 localhost rx7-xenU

次はNICまわり。

# vi etc/network/interfaces

以下の内容で書き換え。↓はDHCPからIPアドレスをもらう場合ね。静的に振るときはdhcpじゃなくてstaticと書いて、IPアドレスやらネットワークアドレス、ブロードキャストアドレスやらを書いていきましょう。詳しくはGoogle先生に聞いてみるととたくさん教えてくれると思います。

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp

次にaptまわり。

# vi etc/apt/sources.list

以下の内容で作成。

deb http://ftp.jp.debian.org/debian/ etch main contrib non-free
deb-src http://ftp.jp.debian.org/debian/ etch main contrib non-free 

deb http://security.debian.org/ etch/updates main contrib
deb-src http://security.debian.org/ etch/updates main contrib

最後に、ドメイン0と同じく、/lib/tlsを使われないようにしておく、と。

# mv lib/tls lib/tls.disabled

そして、作業が終わったので、ゲストOSのイメージをアンマウント。

# cd /
# umount /mnt/debian.img

仕上げに、XenのゲストOS用設定ファイルを作成。

# vi /etc/xen/rx7-debian

以下の内容で作成します。

name="rx7-debian"
memory=384
kernel="/boot/vmlinuz-2.6.16-xen"
nics=1
ramdisk="/boot/initrd.img-2.6.16-xen"
disk=['file:/home/virtual_machines/rx7/debian-root.img,sda1,w','file:/home/virtual_machines/rx7/debian-swap.img,sda2,w']
root="/dev/sda1 ro"

さて、いよいよドメインUを起動してみます。

# xm create -c /etc/xen/rx7-debian

これで、しばらくすると、ドメインUのコンソールが出てきて、ログインできるようになると思います。


オープンソース徹底活用Xen3.0による仮想化サーバの構築

オープンソース徹底活用Xen3.0による仮想化サーバの構築