NetBSD/xen環境の構築

目標とする環境

Xenというと、いきなり他のOSだとか、hvmでWindowsだとか言い出す輩が多いが、最初はやはり基本に乗っ取って最も簡単な構成を作り、そこでまずは概要を掴むべきだと思う。そんなわけでまずは以下の構成を基本とする。

これ以外の環境も、この応用になるのでまずは上記の環境が動くことを目標とする。

準備

まずは必要な物を揃える。

ハードウェア関連

最後のはハードウェアじゃないが、純粋にソフトウェアというわけではないのでこっちに上げておく。

参考までにここで例として使っている環境は以下のような物である。

CPUIntel Celeron 2.8GHz (LGA775)
Memory3GByte
ChipSetIntel 865G
HDD160GB 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/i386のインストール

必要な物が揃ったら、まずは普通に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しておく。

xen Domain-0用NetBSDカーネルの準備

インストールメディアから次のファイルを取得する。

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 /

pkgsrcの展開

/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のインストール

grubのインストール

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

xenkernel3のインストール

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

xentools3のインストール

pkgsrcからsysutils/xentools3をmake installする。

# cd /usr/pkgsrc/sysutils/xentools3
# make install

grubの設定

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割り当てている。もちろん実際の実メモリに合わせてこの大きさは変更すればよい。

Domain-0上の作業

Domain-0の起動

grubの設定まで終わったら、xen kernelを起動する。

# shutdown -r now

画面上はgrubのメニューが起動する。ここでNetBSD/xen i386を選択すればxen kernelが起動し、続いてNetBSDの起動メッセージが画面上に流れる。

無事にlogin:プロンプトが出力されたら、今後はDomain-0上の作業に移る。

ここでうまく起動できなければ、PCをリセットし、Chain loaderを選択して起動する。これは従来通りGENERICカーネルのi386であるため、ここでファイル等設定を見直す。

Xen用の設定

うまく起動したら次にxen関係のdaemonを起動するように設定する。/etc/rc.confに以下を追加する。

xend=YES
xenbackendd=YES

また、起動スクリプトを/etc/rc.dにコピーする。

# cp /usr/pkg/share/examples/rc.d/{xend,xenbackendd} /etc/rc.d

xen用daemonの起動

システム全体を再起動してもいいが、次のように直接起動もできる。

/etc/rc.d/xend start
/etc/rc.d/xenbackendd start

これらは仮に非Xen環境で起動した場合にはdaemon自体は起動に失敗するが、システム的には害を与えない。

Domain-0の確認

うまくdaemonまで起動していれば次のように状態を見られる。

# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0   512     1     r-----     20.0

これは1つだけのDomain-0が起動していることを意味している。

Domain-Uのインストール

とりあえずDomain-0が起動できれば、実際にはXen自体は動いている。ここからはDomain-Uと呼ばれる複数のOSを同時に動かすための設定になる。

Domain-U用kernelの準備

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用のイメージファイルの準備

Domain-Uのインストール先となる領域をここではファイルとして作成する。

# dd if=/dev/zero of=/xendata/netbsd/netbsd.img bs=1m count=4096 

これで4Gのファイルができる。seekを指定して部分だけを作っても良いかもしれないが、ここでは明示的に作った。部分だけだと、どうも後述のsysinstでdisklabelがかけなかったりする場合があるような気がする。

Xen設定ファイルの作成

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の起動

用意できたら実際に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: 

Domain-U側の設定

起動してしまえば普通のNetBSDと同じであるが、とりあえずインストール時に指定して/に置かれているカーネルが動いている物と違うため何か問題があるかもしれないので、Domain-0側のカーネルをDomain-Uのルートにnetbsdというファイル名でコピーしておくと良いかもしれない。コピーはネットワーク経由で持ってくれば良いだろう。

違いはいわゆるハードディスクがxbd0というデバイス名であること、ネットワークデバイスがxennet0になっているだけ。その他は本当に普通のNetBSDなのでpkgsrcもそのまま使えるし、ユーザランドについてはNetBSD/i386そのものである。

Xen仮想ハードウェアは標準的なPC/AT機とはデバイスが異なるため、設定もそれに合わせる部分がある。

/etc/rc.confの設定

Domain-Uのコンソールは通常のPC/ATのwsconsolleではない。基本的にはttyコンソールと同等といえる。sysinstでinstallすると、wscons(4)が有効になっているのでrc.confで無効にする。

wscons=NO

wsconsの行そのものを消してしまってもかまわない。

/etc/ttysの設定

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)することができる。

Domain-Uの停止

Domain-UのOS側から停止させる

通常の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側から停止させる

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側から強制停止させる

暴走時など、とにかく仮想マシンを今すぐ停止したい場合はDomain-0から停止させる。

# xm destroy NetBSD_DOMU

仮想マシン側では突然停止する。実際のマシンにおいて電源コードを突然抜いたのと同じ状態であり、そのため次回起動時にはfsckが走る。

参考情報


$Id: xen.html,v 1.8 2008/03/22 06:08:25 oshima Exp $