XenはThe Xen Projectが開発しているオープンソースの仮想化プラットフォームです。GNU/LinuxディストリビューションやFreeBSD・NetBSD上で動作します。XenはVirtualBoxやQEMUのような完全仮想化ではなく、ハードウェアのエミュレーションをおこなわない準仮想化を提供してくれます。「64bit用XenでもCPUが64bitに対応していさえすれば、ParaVirtualizationはIntel VT-xやAMD-Vと呼ばれる仮想化支援命令を持たないCPUでも問題なく動作する」[oshima]点が特徴です。
一方で「NetBSD/xen domain 0 kernel で multiprocessor の恩恵を受けることはできません」「X11 と併用するなど、 domain 0 に対して資源を振り向けたいケースも多いと思います。そのような場合に限って NetBSD/xen はあまり役に立ちません。 NetBSD/xen domain 0 は domain U の I/O サービス専用と割り切ってください」[clare]と言われるように、一般的にXenホスト(domain 0あるいはdom0と呼ばれる)に対してCPUやメモリを潤沢に割り振るようなことはしません。仮想化用のサーバとして扱うか、SSHでX11転送してXenゲスト(domU)を主に使うことになるでしょう。「NetBSDのDom0は、マルチコアに対応していない」[isihara]ため、FirefoxやLibreOfficeのような大規模ユーザアプリケーションをホストで実行するのは厳しいように思われます。
NetBSDをインストールした直後とします。インストール作業については省略します。パーティションなどは特別区切っておらずFull Installationをしたと仮定します。まずはGENERICカーネルからXen用のXEN3_DOM0カーネルへ入れ替える作業をおこないます。
# ftp ftp://ftp.jp.netbsd.org/pub/NetBSD/NetBSD-7.1/amd64/binary/sets/kern-XEN3_DOM0.tgz
# tar zxf kern-XEN3_DOM0.tgz
# mv netbsd /netbsd-XEN
ここで、/netbsd
をmv(1)
で上書きしていないことに注意してください。XEN3_DOM0カーネルの起動が失敗したときに備えて普通のGENERICカーネルでいつでも起動できるようにしておきます。
pkgsrcからsysutils/xenkernel48とsysutils/xentools48をインストールします。
# cd /usr/pkgsrc/sysutils/xenkernel48
# make install clean clean-depends
# cd /usr/pkgsrc/sysutils/xentools48
# make install clean clean-depends
ここではXenに最低限必要なデーモンの設定について述べます。/usr/pkg/share/examplesディレクトリ以下にあるRCスクリプトを/etc/rc.dディレクトリにコピーし、自動起動の設定をrc.conf(5)
に書きます。xencommonsデーモンを有効にしておかないと、XEN3_DOM0カーネルでブートする際ハングしてしまいます。必ずrc.conf(5)
に書き込んでおいてください。
# cp /usr/pkg/share/examples/rc.d/xencommons /etc/rc.d
# cp /usr/pkg/share/examples/rc.d/xendomains /etc/rc.d
# cp /usr/pkg/share/examples/rc.d/xen-watchdog /etc/rc.d
# echo "xencommons=YES" >> /etc/rc.conf
# echo "xendomains=YES" >> /etc/rc.conf
# echo "xen-watchdog=YES" >> /etc/rc.conf
Domain-U用にネットワークブリッヂを作ります。/etc/ifconfig.bridge0に以下の内容を記述します。
create
up
!brconfig bridge0 add wm0 up
文中のwm0は、使用しているマシンのネットワークインタフェース名に適宜置き換えてください。
/boot.cfgに以下の行を追加します。
menu=Boot Xen:load /netbsd-XEN console=pc; multiboot /usr/pkg/xen48-kernel/xen.gz dom0_mem=8192M
起動時に"Boot Xen"と書かれた行の番号をタイプすると、XENカーネルが使われ、標準の"Boot normally"などであればGENERICカーネルが使われるようになりました。
再起動し、XENカーネルを使うようブート時の画面で指定します。
xl
コマンドを使い、ゲスト(Domain-0)とホスト(Domain-U)の状態を確認できます。
# xl list
Name ID Mem VCPUs State Time(s)
Domain-0 0 8192 1 r----- 11.3
4GBのディスクを作ります。
# dd if=/dev/zero of=netbsd.img bs=1m count=4096
インストール用のDOMUカーネルと通常のDOMUカーネルをダウンロードします。
# ftp ftp://ftp.jp.netbsd.org/pub/NetBSD/NetBSD-7.1/amd64/binary/kernel/netbsd-XEN3_DOMU.gz
# ftp ftp://ftp.jp.netbsd.org/pub/NetBSD/NetBSD-7.1/amd64/binary/kernel/netbsd-INSTALL_XEN3_DOMU.gz
# gzip -d netbsd-INSTALL_XEN3_DOMU.gz
# gzip -d netbsd-XEN3_DOMU.gz
Domain-U用の設定ファイルを作ります。ここでは"xen_netbsd"という名前で以下のように書きました。
kernel = "/root/netbsd-INSTALL_XEN3_DOMU"
vcpus = 2
memory = 2048
name = "NetBSD"
vif = [ 'bridge=bridge0' ]
disk = [ 'file:/root/netbsd.img,0,w' ]
仮想コアは2つ、メモリは2GBにし、ディスクには /root/netbsd.imgを指定しています。vifのMACアドレスが必要であればifconfig(8)
を使い、ブリッヂしているネットワークインタフェースのMACアドレスを確認してください。
# xl create -c /root/xen_netbsd
sysinstの画面が出てきます。先にネットワークの設定をしてから、tarballをFTP経由でダウンロードすればよいでしょう。インストール終了後、sysinstのトップ画面から"x: Exit Install System"を選択し、halt -pで仮想マシンをシャットダウンします。
kernel = 行を書き換えます。
kernel = "/root/netbsd-XEN3_DOMU"
vcpus = 2
memory = 2048
name = "NetBSD"
vif = [ 'bridge=bridge0' ]
disk = [ 'file:/root/netbsd.img,0,w' ]
ふたたび起動します。
# xl create -c /root/xen_netbsd
Domain-UでSSHデーモンを動かしリモートログインができる状態にあるなど、コンソール画面が必要でない場合は-cオプションをつけずに実行します。
# xl create /root/xen_netbsd