Xenというと、いきなり他のOSだとか、hvmでWindowsだとか言い出す輩が多いが、最初はやはり基本に乗っ取って最も簡単な構成を作り、そこでまずは概要を掴むべきだと思う。そんなわけでまずは以下の構成を基本とする。
これ以外の環境も、この応用になるのでまずは上記の環境が動くことを目標とする。
まずは必要な物を揃える。
最後のはハードウェアじゃないが、純粋にソフトウェアというわけではないのでこっちに上げておく。
参考までにここで例として使っている環境は以下のような物である。
CPU | Intel Celeron 2.8GHz (LGA775) |
---|---|
Memory | 3GByte |
ChipSet | Intel 865G |
HDD | 160GB S-ATA Maxtor 6V160E0 |
インストールメディアはCDでもいいし、Internet環境でもいい。4.0のリリースでもいいし、currentのdaily snapshotでもよい。とりあえずここではNetBSD-4.0の正式インストールCDメディアを使用する。ちなみに用意するのはNetBSD/i386用。NetBSD/xen専用のインストールメディアなんてものは無い(必要ない)。
pkgsrcはNetBSDのftpサイトからtar ballで取得したり、cvsで取得したりできる。とりあえず新しめの方が良い。ここではpkgsrcのcurrentのものを使った。なお、binary packageで取得できるものもいくつかあるが、時期の問題もあるのでここでは必要な物は全てpkgsrcからmakeする。
必要な物が揃ったら、まずは普通にNetBSDをインストールする。ここでは先に述べたとおり、NetBSD/i386を普通にインストールする。
ここでは160GBのHDを全て/の1パーティションとし、他にswapのみを作成する。他のOSとの共存はとりあえず考えない。
インストール前にハードウェアの時計はUTCに合わせて置いた方が後々悩まずに済むので、BIOSの時計は世界標準時にしておく。
NetBSD/i386のBoot CDから起動し、メニューに答えていくだけだが、インストールする配布セットはX関係だけは何も入れない。入れてもいいが、最近のハードウェアだとXserverが起動しないとか面倒が起こる可能性があるため、混乱を避けるため。どっちみちXenを動かすのにXは必須ではない。
インストールが終わったら再起動させる。
再起動後に、いくつかOSの初期設定を行う。基本的には好みで行えばいいが、最低限以下。
ユーザはuseraddコマンドで作成しておけば良い。rootで作業のために/etc/groupのwheelユーザに追加しておく。passwdで初期パスワードを作成しておくのも忘れずに。
他の設定の多くは/etc/rc.confファイルに設定する。とりあえず今回は以下を追加した。
hostname="n386" dhclient=YES dhclient_flags="fxp0" sshd=YES
これ以外に、XenのDomain-U用にネットワークブリッジの設定をしておく。これは以下の内容の/etc/ifconfig.bridge0を作成する。
create !brconfig bridge0 add fxp0 up
fxp0の部分は実際に自分が使うハードウェアに合わせて名前を変更する(例えばwm0とかbge0とか色々)
NetBSD 4.0ではxen用のdeviceが全て作られないようなので、以下のようにdevice fileを作成する。
# cd /dev # ./MAKEDEV xen
設定が終わったら一旦rebootしておく。
インストールメディアから次のファイルを取得する。
i386/binary/kernel/netbsd-XEN3_DOM0.gz
これを展開し、/に置く。例えばCDからなら以下のように実行する。
# mount -t cd9660 /dev/cd0a /mnt # cp /mnt/i386/binary/kernel/netbsd-XEN3_DOM0.gz /tmp # gzip -d /tmp/netbsd-XEN3_DOM0.gz # cp /tmp/netbsd-XEN3_DOM0 /
/usr/pkgsrcにpkgsrcを展開する。
# cd /tmp # ftp ftp://ftp.netbsd.org/pub/NetBSD/packages/current-src/pkgsrc.tar.gz # tar zxf pkgsrc.tar.gz -C /usr
pkgsrcからsysutils/grubをmake installする。
# cd /usr/pkgsrc/sysutils/grub # make install
NetBSD 4.0の場合、pkg_install等のコマンドを更新する必要があるかもしれない。この場合はメッセージが出力されるのでそれに従う。
# cd /usr/pkgsrc/pkgtools/pkg_install # make install
pkgsrcからsysutils/xenkernel3をmake installする。
# cd /usr/pkgsrc/sysutils/xenkernel3 # make install
xen kernelは/usr/pkg/xen3-kernelにインストールされるので、これを/にコピーする。 grub loadとの関係でgzが展開できない場合があるのであらかじめ展開しておく。
# cp /usr/pkg/xen3-kernel/xen.gz / # gzip -d /xen.gz
pkgsrcからsysutils/xentools3をmake installする。
# cd /usr/pkgsrc/sysutils/xentools3 # make install
xen kernelの起動にはgrubが必要なので、次のようにgrubを実際にハードディスクに書き込む。
# grub-install --no-floppy /dev/wd0d
grubの設定ファイルを/grub/menu.lstとして以下の内容で作成する。
# default=0 timeout=15 title NetBSD/xen i386 root (hd0,0) kernel (hd0,a)/xen dom0_mem=512m vga=text-80x25 module (hd0,a)/netbsd-XEN3_DOM0 root=/dev/hda1 ro console=pc title Chain root (hd0,0) chainloader +1
ここではDomain-0にメモリを512m割り当てている。もちろん実際の実メモリに合わせてこの大きさは変更すればよい。
grubの設定まで終わったら、xen kernelを起動する。
# shutdown -r now
画面上はgrubのメニューが起動する。ここでNetBSD/xen i386を選択すればxen kernelが起動し、続いてNetBSDの起動メッセージが画面上に流れる。
無事にlogin:プロンプトが出力されたら、今後はDomain-0上の作業に移る。
ここでうまく起動できなければ、PCをリセットし、Chain loaderを選択して起動する。これは従来通りGENERICカーネルのi386であるため、ここでファイル等設定を見直す。
うまく起動したら次にxen関係のdaemonを起動するように設定する。/etc/rc.confに以下を追加する。
xend=YES xenbackendd=YES
また、起動スクリプトを/etc/rc.dにコピーする。
# cp /usr/pkg/share/examples/rc.d/{xend,xenbackendd} /etc/rc.d
システム全体を再起動してもいいが、次のように直接起動もできる。
/etc/rc.d/xend start /etc/rc.d/xenbackendd start
これらは仮に非Xen環境で起動した場合にはdaemon自体は起動に失敗するが、システム的には害を与えない。
うまくdaemonまで起動していれば次のように状態を見られる。
# xm list Name ID Mem VCPUs State Time(s) Domain-0 0 512 1 r----- 20.0
これは1つだけのDomain-0が起動していることを意味している。
とりあえずDomain-0が起動できれば、実際にはXen自体は動いている。ここからはDomain-Uと呼ばれる複数のOSを同時に動かすための設定になる。
NetBSDのインストールメディアから以下のファイルを取り出す。
i386/binary/kernel/netbsd-XEN3_DOMU.gz i386/binary/kernel/netbsd-INSTALL_XEN3_DOMU.gz
これを適当なディレクトリに置く。
# mount -t cd9660 /dev/cd0a /mnt # cp /mnt/i386/binary/kernel/netbsd-XEN3_DOMU.gz /xendata/netbsd/ # cp /mnt/i386/binary/kernel/netbsd-INSTALL_XEN3_DOMU.gz /xendata/netbsd/ # gzip -d /xendata/netbsd-XEN3_DOMU.gz # gzip -d /xendata/netbsd-INSTALL_XEN3_DOMU.gz
Domain-Uのインストール先となる領域をここではファイルとして作成する。
# dd if=/dev/zero of=/xendata/netbsd/netbsd.img bs=1m count=4096
これで4Gのファイルができる。seekを指定して部分だけを作っても良いかもしれないが、ここでは明示的に作った。部分だけだと、どうも後述のsysinstでdisklabelがかけなかったりする場合があるような気がする。
Domain-U用の設定ファイルをDomain-0上で作成する。普通のテキストファイルで最低限以下の行があればいい。 ここでは/usr/pkg/etc/xen/netbsdを作成する。
# kernel = "/xendata/netbsd/netbsd-INSTALL_XEN3_DOMU" memory = 256 name = "NetBSD_DOMU" vif = [ 'mac=00:16:3e:00:00:15,bridge=bridge0' ] disk = [ 'file:/xendata/netbsd/netbsd.img,0x3,w']
kernelはINSTALL用カーネルを展開したものをフルパスで指定。memはこのドメインに割り当てる量を指定。もちろん実際に使える量(実メモリ量-Domain-0の使用量-xenカーネル自身の使用量)を超えて指定すると起動できない。
nameは好きなように。スペースとかは指定しない方がいい。
vifはゲスト側で使える仮想NICのMacアドレス。適当でいいが当然自セグメントで重なると不味い。複数のドメインを作成する場合は気をつける。なお、ここでmacとbridgeを指定しているが、その間の','前後にはスペースを入れないように気をつける。
diskは仮想ディスクにファイルを使う指定。実パーティションもできるらしいが後々面倒なのでとりあえずファイル。ファイル名の後の0x3はデバイスのマイナー番号。NetBSDではディスク全体を示すパーティションは'd'なので3になる。ちなみにDomainU側から見たときのディスクデバイスは'/dev/xbd0'になる。ここでも','前後にはスペースを入れないように気をつける。
用意できたら実際にDomain-Uを起動する。
# xm create -c /usr/pkg/etc/xen/netbsd
うまく行けば見慣れたNetBSDのインストーラ(sysinst)画面が出現する。
あとは普通にインストールするだけ。 なお、ここでインストール時に選択するKernelはとりあえずなので何でも良い。 ただし上記の設定ではインストール元にCD-ROMなどを直接使えない。そのためNetworkからのインストールになる。Internet上のオフィシャルサイトからでも良いし、Domain-0上にftpやnfs環境を作ってやってもいい。CD-ROMからのインストールも工夫すればできると思うが、ここではとりあえずやっていない。
インストールが終わったらsysinstのメニューからExitを選んでshellプロンプトにしておく。 Domain-0側でrebootなどを実行すると再度起動してしまうので、Domain-0から次のように確認してから終了させる。
# xm list Name ID Mem VCPUs State Time(s) Domain-0 0 512 1 r----- 64.7 NetBSD_DOMU 1 256 1 -b---- 27.6 # xm shtudown NetBSD_DOMU
再度xm listで停止したことを確認する。 どうしても終了しなければ以下のように強制終了もできる。
# xm destroy NetBSD_DOMU
Domain-0上でDomain-U用設定ファイルを以下のように変更する。
# kernel = "/xen/netbsd/netbsd-XEN3_DOMU" memory = 256 name = "NetBSD_DOMU" vif = [ 'mac=00:16:3e:00:00:15,brdige=bridge0' ] disk = [ 'file:/xen/netbsd/netbsd.img,0x3,w']
要はkernelをインストールカーネルから通常のカーネルに切り替えるだけ。
これで起動すると、普通のNetBSD/i386とほとんど同じNetBSDが起動する。
# xm create -c /usr/pkg/etc/xen/netbsd Using config file "/usr/pkg/etc/xen/netbsd". Started domain NetBSD_DOMU Loaded initial symtab at 0xc048a97c, strtab at 0xc04b8068, # entries 11558 Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. All rights reserved. Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. NetBSD 4.0 (XEN3_DOMU) #0: Sun Dec 16 01:26:00 PST 2007 builds@wb34:/home/builds/ab/netbsd-4-0-RELEASE/i386/200712160005Z-obj/home/builds/ab/netbsd-4-0-RELEASE/src/sys/arch/i386/compile/XEN3_DOMU total memory = 256 MB avail memory = 247 MB timecounter: Timecounters tick every 10.000 msec mainbus0 (root) hypervisor0 at mainbus0 vcpu0 at hypervisor0: (uniprocessor) vcpu0: Intel (686-class), 2800.10 MHz, id 0xf49 vcpu0: features bfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR> vcpu0: features bfebfbff<PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX> vcpu0: features bfebfbff<FXSR,SSE,SSE2,SS,HTT,TM,SBF> vcpu0: I-cache 12K uOp cache 8-way vcpu0: ITLB 4K/4M: 128 entries vcpu0: DTLB 4K/4M: 64 entries debug virtual interrupt using event channel 3 xenbus0 at hypervisor0: Xen Virtual Bus Interface xencons0 at hypervisor0: Xen Virtual Console Driver xencons0: console major 143, unit 0 xencons0: using event channel 2 npx0 at hypervisor0: using exception 16 timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0 Xen clock: using event channel 4 timecounter: Timecounter "xen_system_time" frequency 1000000000 Hz quality 10000 crypto: assign driver 0, flags 2 crypto: driver 0 registers alg 1 flags 0 maxoplen 0 crypto: driver 0 registers alg 2 flags 0 maxoplen 0 crypto: driver 0 registers alg 3 flags 0 maxoplen 0 crypto: driver 0 registers alg 4 flags 0 maxoplen 0 crypto: driver 0 registers alg 5 flags 0 maxoplen 0 crypto: driver 0 registers alg 17 flags 0 maxoplen 0 crypto: driver 0 registers alg 6 flags 0 maxoplen 0 crypto: driver 0 registers alg 7 flags 0 maxoplen 0 crypto: driver 0 registers alg 15 flags 0 maxoplen 0 crypto: driver 0 registers alg 8 flags 0 maxoplen 0 crypto: driver 0 registers alg 16 flags 0 maxoplen 0 crypto: driver 0 registers alg 9 flags 0 maxoplen 0 crypto: driver 0 registers alg 10 flags 0 maxoplen 0 crypto: driver 0 registers alg 13 flags 0 maxoplen 0 crypto: driver 0 registers alg 14 flags 0 maxoplen 0 crypto: driver 0 registers alg 11 flags 0 maxoplen 0 crypto: driver 0 registers alg 18 flags 0 maxoplen 0 raidattach: Asked for 8 units Kernelized RAIDframe activated xenbus0: using event channel 1 xbd0 at xenbus0 id 3: Xen Virtual Block Device Interface xbd0: using event channel 5 xennet0 at xenbus0 id 0: Xen Virtual Network Interface xennet0: MAC address 00:16:3e:00:00:15 xennet0: using event channel 6 unknown type console at xenbus0 id 0 not configured xbd0: 4096 MB, 512 bytes/sect x 8388608 sectors Searching for RAID components... boot device: xbd0 root on xbd0a dumps on xbd0b mountroot: trying lfs... mountroot: trying ffs... unknown type console at xenbus0 id 0 not configured root file system type: ffs unknown type console at xenbus0 id 0 not configured init: copying out path `/sbin/init' 11 Sat Feb 2 22:00:01 JST 2008 swapctl: adding /dev/xbd0b as swap device at priority 0 Checking for botched superblock upgrades: done. Starting file system checks: /dev/rxbd0a: file system is clean; not checking Setting tty flags. Setting sysctl variables: Starting network. Hostname: netbsdXen IPv6 mode: host Configuring network interfaces: xennet0. Adding interface aliases: Starting dhclient. Internet Systems Consortium DHCP Client V3.0.3 Copyright 2004-2005 Internet Systems Consortium. All rights reserved. For info, please visit http://www.isc.org/products/DHCP Listening on BPF/xennet0/00:16:3e:00:00:15 Sending on BPF/xennet0/00:16:3e:00:00:15 Sending on Socket/fallback DHCPDISCOVER on xennet0 to 255.255.255.255 port 67 interval 7 DHCPOFFER from XXX.XXX.XXX.XXX DHCPREQUEST on xennet0 to 255.255.255.255 port 67 DHCPACK from XXX.XXX.XXX.XXX bound to XXX.XXX.XXX.XXX -- renewal in 242073 seconds. Building databases... wsconscfg: Cannot open `/dev/ttyEcfg': Device not configured wsconscfg: Cannot open `/dev/ttyEcfg': Device not configured wsconscfg: Cannot open `/dev/ttyEcfg': Device not configured wsconscfg: Cannot open `/dev/ttyEcfg': Device not configured Starting syslogd. Checking for core dump... savecore: /dev/wd0a: Device not configured Feb 2 22:00:08 netbsdXen savecore: /dev/wd0a: Device not configured Mounting all filesystems... Clearing /tmp. Creating a.out runtime link editor directory cache. Checking quotas: done. Starting virecover. Starting local daemons:. Updating motd. postfix: rebuilding /etc/mail/aliases (missing /etc/mail/aliases.db) postfix/postfix-script: starting the Postfix mail system Starting inetd. Starting cron. Sat Feb 2 22:00:09 JST 2008 Feb 2 22:00:11 netbsdXen getty[628]: /dev/ttyE3: Device not configured Feb 2 22:00:11 netbsdXen getty[375]: /dev/ttyE1: Device not configured Feb 2 22:00:11 netbsdXen getty[632]: /dev/ttyE2: Device not configured NetBSD/i386 (netbsdXen) (console) login:
起動してしまえば普通のNetBSDと同じであるが、とりあえずインストール時に指定して/に置かれているカーネルが動いている物と違うため何か問題があるかもしれないので、Domain-0側のカーネルをDomain-Uのルートにnetbsdというファイル名でコピーしておくと良いかもしれない。コピーはネットワーク経由で持ってくれば良いだろう。
違いはいわゆるハードディスクがxbd0というデバイス名であること、ネットワークデバイスがxennet0になっているだけ。その他は本当に普通のNetBSDなのでpkgsrcもそのまま使えるし、ユーザランドについてはNetBSD/i386そのものである。
Xen仮想ハードウェアは標準的なPC/AT機とはデバイスが異なるため、設定もそれに合わせる部分がある。
Domain-Uのコンソールは通常のPC/ATのwsconsolleではない。基本的にはttyコンソールと同等といえる。sysinstでinstallすると、wscons(4)が有効になっているのでrc.confで無効にする。
wscons=NO
wsconsの行そのものを消してしまってもかまわない。
wsconsを使わないので、/etc/ttysでgetty(8)を動作させるttyを設定する。sysinstでinstallするとwscons用のttyE?が有効になっているので、これを変更する。
console "/usr/libexec/getty Pc" vt100 on secure ttyE0 "/usr/libexec/getty Pc" vt220 off secure ttyE1 "/usr/libexec/getty Pc" vt220 off secure ttyE2 "/usr/libexec/getty Pc" vt220 off secure ttyE3 "/usr/libexec/getty Pc" vt220 off secure
これで/dev/consoleからlogin(1)することができる。
通常のNetBSDと同じようにshutdownコマンドで停止できる。ここで-pオプションを使用すると、その仮想マシン自体が停止、終了する。
# shutdown -p now
-hだとosはhaltするが仮想マシンはそのまま存在したままになり、xen consoleからキーインするとrebootする。rebootすると仮想マシンは一旦終了し、新しく作られる。このため、XenのDomain ID番号は以前とは変わる。以下はxen console上から操作したパターン。
# shutdown -h now Shutdown NOW! : About to run shutdown hooks... Stopping cron. Waiting for PIDS: 509. Stopping inetd. Waiting for PIDS: 504. Removing block-type swap devices swapctl: removing /dev/xbd0b as swap device Sat Mar 22 14:40:13 JST 2008 Done running shutdown hooks. Mar 22 14:40:18 netbsdXen syslogd: Exiting on signal 15 syncing disks... done unmounting file systems... unmounting /kern (kernfs)... unmounting / (/dev/xbd0a)... done The operating system has halted. Please press any key to reboot. (何かキーを押すと) rebooting...
Domain-0のxmコマンドで停止させることができる。
# xm shutdown NetBSD_DOMU
この場合、Domain-U側には、Powerボタンを押された時と同じような割り込みが上がる。そのため、NetBSDをインストールした直後だと、syncしてOSが終了し、仮想マシンが終了する。コンソールには以下のように表示される。
xenbus: power button pressed, shutting down! syncing disks... done unmounting file systems... unmounting /kern (kernfs)... unmounting / (/dev/xbd0a)... done
正常にshutdownを実行することもできる。これにはpowerdを起動するようにしておく。
/etc/rc.confに以下のように書いておく。
powerd=YES
これで起動時にpowerdが起動する。手動で起動するには/etc/rc.d/powerd startとする。この状態で、Domain-0からxm shutdown すると、Domain-Uではshutdownコマンドが実行されて終了する。
Domain-0側: # xm shutdown NetBSD_DOMU Domain-U側のコンソール: Mar 22 10:54:55 shutdown: halt by root: power button pressed Mar 22 10:54:55 netbsdXen shutdown: halt by root: power button pressed Mar 22 10:55:06 netbsdXen syslogd: Exiting on signal 15 syncing disks... done unmounting file systems... unmounting /kern (kernfs)... unmounting / (/dev/xbd0a)... done
暴走時など、とにかく仮想マシンを今すぐ停止したい場合はDomain-0から停止させる。
# xm destroy NetBSD_DOMU
仮想マシン側では突然停止する。実際のマシンにおいて電源コードを突然抜いたのと同じ状態であり、そのため次回起動時にはfsckが走る。