/ クレア工房 / NetBSD

NetBSD/xen Configuration

できること、できないこと

NetBSD/xen domain 0 kernel で multiprocessor の恩恵を受けることはできません。 NetBSD/xen domain U kernel で multiprocessor の恩恵を受けることはできます。 この違いは重要です。 インフラストラクチャの設計の前に この制限が何を意味するのかよく噛み締めてください。 必要なら Linux または既成の市販パッケージを domain 0 として利用することを検討してください。

X11 と併用するなど、 domain 0 に対して資源を振り向けたいケースも多いと思います。 そのような場合に限って NetBSD/xen はあまり役に立ちません。 NetBSD/xen domain 0 は domain U の I/O サービス専用と割り切ってください。 I/O は CPU 資源を振り向けられない domain 0 に依存しますので、 ハードウェアを目いっぱい使い切ろうという用途にも向きません。 システムコンパイルなどのCPUを食うインフラについては domain U で構築するか別途に鯖を建てることをお勧めします。

必要なツールは xenkernel と xentools です。 これらを pkgsrc からインストールします。 xen まわりは依存パッケージの数がやたらと多く、 pkgsrc に頼らないビルドはやめたほうが無難と思います。

Booting Xen kernel (domain 0)

NetBSD freak であれば NetBSD/xen の DOM0 kernel のビルドまでは、 類推の効く範囲ですから別段のドキュメントがなくても問題なくできると思います。

master として boot して制御を渡したいのは xen.gz ですので、 /boot に指示を与える必要があります。 /boot.cfg に次のように記述します。

menu=Boot with Xen:load /netbsd-dom0.gz console=pc; multiboot /xen.gz dom0_mem=3840M

NetBSD domain 0 kernel を module として load させていること、 Xen kernel を multiboot していること、 それからそれぞれに必要なパラメタを渡していることがミソです。 dom0_mem の指定は domain U のためにメモリを空けておく必要がありますから、 これも当然のように必要です。 ファイルを gzip で圧縮するのはオプションです。 最近の NetBSD の /boot であれば xen kernel を multiboot できるので、 以前のように grub は必要ありません。

もしシリアルコンソールを使いたいと思った場合、次のようにします。 まず、bootloader のコンソールをシリアルに設定します。

# installboot -v -o console=com0,speed=115200 /dev/rwd0a /usr/mdec/bootxx_ffsv1
File system:         /dev/rwd0a
Primary bootstrap:   /usr/mdec/bootxx_ffsv1
Boot options:        timeout 5, flags 0, speed 115200, ioaddr 0, console com0

同様にして kernel にもシリアルコンソールを指示します。 NetBSD kernel は com0 を使用します。 Xen kernel に指示する com1 は NetBSD 的には com0 と等価です。 先に Xen kernel に制御が渡され、NetBSD kernel はモジュール扱いですので、 console speed 等のパラメタは Xen kernel に渡します。 間違えないようにしましょう。 下記は複数行に分けていますが、実際には1行にまとめます。

menu=Boot with Xen:rndseed /var/db/entropy-file; \
	load /netbsd-dom0 console=com0; \
	multiboot /xen.gz dom0_mem=4096M console=com1 com1=115200,8n1

boot できたら xencommons を rc.conf に書き足します。

xencommons=YES

kernfs を mount するのを忘れないようにしましょう。

$ grep kern /etc/fstab
none            /kern           kernfs  rw

Xen が kernfs を必要とする点は文献でもあまり触れられておらず、 わかりづらいです。

xencommons を起動すると、 xentools42 パッケージの場合は xl コマンドが使えるようになります。

# /etc/rc.d/xencommon start
# xl list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  3840     1     r-----       8.6

通常は domain U のために network interface を植えておく必要があります。 このために bridge ドライバを使います。 domain U には専用の interface を割り当てることにして、 domain 0 で使う管理用の interface とは別個にしておいたほうがよいでしょう。

# cat /etc/ifconfig.bridge0
create
!/sbin/brconfig $int add vge0 up

Memory Allocations

仮想マシンには 1〜2GiB 程度を割り当てれば十分だと思います。

Booting domain U

NetBSD/xen の domain U としては、 NetBSD/amd64 とするか NetBSD/i386 とするかの選択があります。 後者を選ぶときは Xen kernel との ABI の都合上、 PAE enabled kernel を用意します。

Configure

domain U の config は python script で与えます。

$ cat /etc/xen/dom1
# -*- mode: python -*-
kernel = "/netbsd-domu"
memory = 1024
name   = "netbsd1"
vcpus  = 2
nics   = 1
vif    = ['mac=aa:00:00:00:00:01, bridge=bridge0']
disk   = ['phy:/dev/raid0e,0x01,w']
root   = "xbd0"

memory の値は MiB 単位です。 Xen kernel と domain-0 kernel が確保した残りの空きスペースから割り当てられます。 domain-U への割り当てはアプリケーションを swap free で走らせるための最小限度にして、 残りは domain-0 に disk buffer cache として使わせる等の戦略が考えられます。

vif には network interfaces を割り当てます。 mac に指定する MAC アドレスについては、 まず MAC アドレスの先頭バイトの LSB 2ビットには特別な意味があり、 0b10 (+2 = locally administrated, +1 = multicast/unicast#) になるように選びます。 残りの (48-2=) 46 ビットには /dev/urandom あたりを読んだ乱数を割り付けてしまいましょう。 こうして選んだ乱数 MAC アドレスについては、 誕生日攻撃による偶発的な衝突を除いては、 既存の NIC と衝突しないことが保証されています。 つまり 223 ノードぐらいまでは確率的に衝突しません。 複数名が参加する組織的な LAN につなぎこむ場合は もう少し面倒な MAC アドレス管理をする必要があるかもしれませんが、 たいていは DB に照会するなりサイコロを振りなおすだけで済むでしょう。

vif をどの bridge に組み込むかの指定は重要です。

disk はどのストレージを仮想化ブロックデバイスとして見せるかを指定します。 phy は domain 0 で見えているブロックデバイスをそのままリダイレクトして domain U に見せることを指示しています。 phy のかわりに file を指定することで、 ファイルシステム上の任意の通常ファイルを指定できます。 パスに続く 0x01 は定数で変更しません。

root は disk で指定したデバイスの名前を指定します。 domain U からの視点では xbd ドライバが仮想化ブロックデバイスを担当しますので、 root に与える文字列は xbd0 になります。

Booting, Stopping, and Console

xl create コマンドでドメインを起動します。

# xl create /etc/xen/dom1
Parsing config from /etc/xen/dom1
Daemon running with PID 919

xl list コマンドで起動中のドメインIDを列挙できます。 ドメインID 自体はドメインを再起動すると変わりますので、 変わらないように見えてもスクリプト等にハードコードしてはいけません。 ドメイン名はそのためにあります。

# xl list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  2694     1     r-----     918.9
netbsd4                                      7  1024     2     -b----      11.9
netbsd2                                      9  1024     2     -b----      11.9
netbsd3                                     10  1024     2     -b----      12.6
netbsd1                                     11  1024     2     -b----       2.2

xl console コマンドで起動中のドメインのコンソールにアクセスできます。 中断するときは ^] をタイプします。

# xl console 11
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014
    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 6.99.43 (XEN3_DOMU) #0: Sat Jun  7 21:45:58 UTC 2014
        clare@apart.csel.org:/export/stage/hack/src/sys/arch/amd64/compile/XEN3_DOMU
total memory = 1024 MB
avail memory = 982 MB
mainbus0 (root)
hypervisor0 at mainbus0: Xen version 4.2.4
vcpu0 at hypervisor0: Intel(R) Celeron(R) CPU 1037U @ 1.80GHz, id 0x306a9
vcpu1 at hypervisor0: Intel(R) Celeron(R) CPU 1037U @ 1.80GHz, id 0x306a9
xenbus0 at hypervisor0: Xen Virtual Bus Interface
xencons0 at hypervisor0: Xen Virtual Console Driver
xenbus: can't get state for device/suspend/event-channel (2)
xbd0 at xenbus0 id 1: Xen Virtual Block Device Interface
xennet0 at xenbus0 id 0: Xen Virtual Network Interface
xennet0: MAC address aa:00:00:**:**:**
balloon0 at xenbus0 id 0: Xen Balloon driver
balloon0: current reservation: 1048576 KiB
xennet0: using RX copy mode
xenbus: can't get state for device/suspend/event-channel (2)
balloon0: current reservation: 262144 pages => target: 262145 pages
balloon0: memory 'hot-plug' unsupported - clipping reservation 1 => 0 pages.
balloon0: WARNING: balloon could not reach target 262145 (current 262144)
ignore shutdown request:
xenbus: can't get state for device/suspend/event-channel (2)
boot device: xbd0
root on xbd0a dumps on xbd0b
Your machine does not initialize mem_clusters; sparse_dumps disabled
root file system type: ffs
Sun Jun  8 22:19:06 GMT 2014
Starting root file system check:
/dev/rxbd0a: file system is clean; not checking
swapctl: adding /dev/xbd0b as swap device at priority 0
Starting file system checks:
/dev/rxbd0e: file system is clean; not checking
/dev/rxbd0f: file system is clean; not checking
Loaded entropy from /var/db/entropy-file.
Setting tty flags.
Setting sysctl variables:
ddb.onpanic: 1 -> 0
Starting network.
Hostname: xxx
IPv6 mode: host
Configuring network interfaces:.
Adding interface aliases:.
Waiting for DAD completion for statically configured addresses...
Building databases: dev, utmp, utmpx.
Starting syslogd.
Mounting all filesystems...
Clearing temporary files.
Checking quotas: done.
Starting virecover.
Checking for core dump...
savecore: no core dump
Starting local daemons:.
Updating motd.
Starting powerd.
Starting inetd.
Starting cron.
Sun Jun  8 22:19:12 UTC 2014

NetBSD/amd64 (xxx) (console)

login:

xl destroy コマンドで起動中のドメインを強制終了できます。

kernel のインストールは以上で終わりです。 OS userland のインストール作業のために vnconfig してむにゃむにゃしてもよいのですが、 xbd0 から boot するかわりに、 xennet0 から boot して DHCP/BOOTP で root on NFS する方法が手っ取り早いでしょう。 root on NFS によるインストールは実機でも頻繁に使うテクニックですから。


Copyright © 2014, 2017 clare. All rights reserved.