2006年02月05日

Xenによる仮想マシンの導入 - 仮想マシンの設定と動作

これまで「ホストOSのインストール」および「ゲストOSのインストール」で準備を整えた。個人的にはディスククラッシュがあり、構築しなおす羽目になったが、このブログに手順をまとめてあったので、すぐに構築しなおせた。やはり手順は残すものだ。

ゲストOSのインストールについて補足。ブートローダーはインストールしないとは述べたが、実際には、追加設定やパッケージの追加で起動する必要があるので、ホストOS側の/boot/grub/menu.lst に直接記述して起動するとよい。

さて、とうとう仮想マシンを起動する段階に来た。現在、xm コマンドを打つと次のような状態になっている。

# xm list
Name              Id  Mem(MB)  CPU VCPU(s)  State  Time(s)
Domain-0           0      322    0      1   r----     18.0

メモリを買い足し、さらにビデオメモリとして share していた分量も調整し、メインメモリに322MBを確保できていることがわかる。しかしこれをホストOSに全部を割り当てると、仮想ホストを動作させることができない。それで次のように xm コマンドを実行し、メモリの使用量を調節する。

# xm mem-max 0 128
# xm mem-set 0 120

以上を実行すると、次のようになる。

# xm list
Name              Id  Mem(MB)  CPU VCPU(s)  State  Time(s)
Domain-0           0      120    0      1   r----     20.6

これで適正なメモリを設定できた。しかしこの設定は、Xenが起動するたびに必要だ。このメモリの値をどこでセットしよう。e-ueda が考えたのは、/etc/xen の下に scripts というディレクトリがあるので、そこに memory という名のスクリプトを置き、rc スクリプトの start および restart の条件の時に /etc/xen/scripts/memory を呼び出すことにした。

memory スクリプト (/etc/xen/scripts/memory)

#!/bin/bash
xm mem-max 0 128
xm mem-set 0 120

rc スクリプト (/etc/rc.d/init.d/xend)

・
中略
・
case "$1" in
  start)
        /usr/sbin/xend start
        await_daemons_up
        /etc/xen/scripts/memory  ←ここを追加
        ;;
・
中略
・

これでいいのか分からないが、もっとXenの流儀にかなったやり方を発見したら、あらためてご報告する。

次に仮想マシンの設定ファイルを記述する。/etc/xen/VM_1 を一台目の仮想ホスト用設定ファイルとする。ファイル名は任意の名前が付けられる。

kernel = "/boot/vmlinuz-2.6.12-1.1454_FC4xenU"       ← ゲストOS用カーネル
memory = 100                                         ← 割り当てるメモリの量
name = "VM1"                                         ← 仮想ホストの名前
disk = [ 'phy:hda3,hda3,w','phy:hda5,hda5,w' ]       ← 認識させるディスク
root = "/dev/hda5 ro"                                ← ルートデバイス

カーネルはホストOS側でインストールした /boot/vmlinuz-2.6.12-1.1454_FC4xenU を利用。いくつ仮想ホストを起動させようと、カーネルはひとつでよい(共用すればよい)ので、/boot にインストールしたゲストOS用カーネルを指定する。

以上の設定ファイルを記述し配置したら、xm コマンドで仮想ホストを起動させる。コンソールからでも、ssh のターミナルからでも起動できる。

# xm create -c VM_1

-c オプションは、カレントのコンソールに仮想ホストを起動する指定である。VM_1は設定ファイル名。/etc/xen/のパスはxmコマンドが補完する。設定に間違いがなければ、いとも簡単にゲストOSが起動する。

RAMDISK driver initialized: 16 RAM disks of 16384K size 1024 blocksize
Xen virtual console successfully installed as tty1
Event-channel device installed.
xen_blk: Initialising virtual block device driver
Registering block device major 3
xen_net: Initialising virtual ethernet driver.
xen_net: Using grant tables.
md: md driver 0.90.1 MAX_MD_DEVS=256, MD_SB_DISKS=27
NET: Registered protocol family 2
IP: routing cache hash table of 256 buckets, 4Kbytes
TCP established hash table entries: 4096 (order: 4, 65536 bytes)
TCP bind hash table entries: 4096 (order: 3, 49152 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
Initializing IPsec netlink socket
NET: Registered protocol family 1
NET: Registered protocol family 17
md: Autodetecting RAID arrays.
md: autorun ...
md: ... autorun DONE.
kjournald starting.  Commit interval 5 seconds
EXT3-fs: mounted filesystem with ordered data mode.
VFS: Mounted root (ext3 filesystem) readonly.
Freeing unused kernel memory: 156k freed
  ***************************************************************
  ***************************************************************
  ** WARNING: Currently emulating unsupported memory accesses  **
  **          in /lib/tls libraries. The emulation is very     **
  **          slow. To ensure full performance you should      **
  **          execute the following as root:                   **
  **          mv /lib/tls /lib/tls.disabled                    **
  ** Offending process: init (pid=1)                           **
  ***************************************************************
  ***************************************************************
  ***************************************************************
Continuing...
SELinux:  Disabled at runtime.
SELinux:  Unregistering netfilter hooks
INIT: version 2.85 booting
                Welcome to Fedora Core
                Press 'I' to enter interactive startup.
Starting udev:  [FAILED]
Initializing hardware...  storage network audio done[  OK  ]
Setting clock  (localtime): 2006 xx xx xx xx:04:10 JST [  OK  ]
Setting hostname Virtual_Server_1:  [  OK  ]
Setting up Logical Volume Management:   No volume groups found [  OK  ]
Checking filesystems
Checking all file systems.
[/sbin/fsck.ext3 (1) -- /] fsck.ext3 -a /dev/hda5
/backup: clean, 56898/526592 files, 304265/526120 blocks [  OK  ]
Remounting root filesystem in read-write mode:  [  OK  ]
Mounting local filesystems:  [  OK  ]
Enabling local filesystem quotas:  [  OK  ]
Enabling swap space:  [  OK  ]
INIT: Entering runlevel: 3
Entering non-interactive startup
Checking for new hardwaremmap /dev/mem: Resource temporarily unavailable
mmap /dev/mem: Resource temporarily unavailable  [  OK  ]
Bringing up loopback interface:  [  OK  ]
Bringing up interface eth0:  [  OK  ]
Starting system logger: [  OK  ]
Starting kernel logger: [  OK  ]
Starting automount: [  OK  ]
Starting sshd: [  OK  ]
Starting xinetd: [  OK  ]
Starting sendmail: [  OK  ]
Starting sm-client: [  OK  ]
Starting udev:  [FAILED]
Fedora Core release 4 (Stentz) Kernel 2.6.12-1.1454_FC4xenU on an i686
Virtual_Server_1:

あっけないほど簡単だ。起動途中に

modprobe: FATAL: Could not load /lib/modules/2.6.12-1.1454_FC4xenU/modules.dep: No such file or directory

というようなメッセージが出るので、ログインして、

# depmod

とやっておく。
いくつかコマンドを打ってみる。

# free
             total       used       free     shared    buffers     cached
Mem:         97204      36328      60876          0       3184      23076
-/+ buffers/cache:      10068      87136
Swap:       506036          0     506036

割り当てたとおり、およそ100MBのメモリを使用して、仮想ホストが動作していることが分かる。

# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hda5              2038472   1151112    782136  60% /
/dev/shm                 48600         0     48600   0% /dev/shm
# uname -a
Linux Virtual_Server_1 2.6.12-1.1454_FC4xenU #1 SMP Fri Sep 9 00:45:34 
EDT 2005 i686 athlon i386 GNU/Linux

基本コマンドを実行しても、問題なく動作しており、まるで仮想ホストであることを忘れさせる。

ホストOSに戻りたいときは、「Ctrl」キーを押しながら「 ] 」(要するにエスケープキャラクター)を押せばよい。
そうしたらxm コマンドで動作状況を見てみよう。

# xm list
Name              Id  Mem(MB)  CPU VCPU(s)  State  Time(s)
Domain-0           0      120    0      1   r----     77.9
VM1                2       99    0      1   -----     12.0


Domain-0の名がついたホストOSと、VM1という名の仮想ホストがちゃんと動作していることが分かる。
この状態から仮想ホストのコンソールに切り替えたいときは、次のようにする。

# xm console VM1

仮想ホスト側でシャットダウンをかけると、ホストOSのコンソールに戻る。

以上が仮想ホストの設定と動作である。思いのほか簡単である。簡単すぎてつまらない。しかし、これで満足してはいけない。使っているうちにいくつか不安定な現象に直面したし、正常に実行されないコマンドもある。それに仮想ホストを増やすために、いちいち新しいパーティションにインストールするなんてナンセンスだ。

今後は、不安定動作に対する対処を行ないたい。また、仮想ホストの雛形を作り、それをコピって使い回しができるような手法を見出したいと考えている。

Posted by e-ueda at 2006年02月05日 21:19