xenの DomainU として FreeBSD を動かす

ようやく作業が完了したので、まとめてみます。

環境と目的

ubuntu あたりを Xen のサーバとして使うほうが楽なのですが、家にいてまで必要以上に Linux は触りたくないので NetBSD で。
ちなみにノート PC には ubuntu 入れて使っています。軽作業ならこれで十分ですしおすし。

Xen サーバ環境

NetBSD 5.1 AMD64 なホスト。メモリ 8GB でXenホストに 1GB割り当て。

NetBSD 5.1 (XEN3_DOM0) #0: Sun Dec 12 18:53:15 JST 2010  root@gomyway:/usr/obj/sys/arch/amd64/compile/XEN3_DOM0

CPU は Athlon X2 BE2350。これが今回の問題。

# grep model\ name /proc/cpuinfo
model name      : AMD Athlon(tm) X2 Dual Core Processor BE-2350
動かしたい DomainU

mpd で PC ルータとして動かすために FreeBSD
今なら Vyatta を入れるほうが楽かもしれませんが、そこはそれ。

準仮想化で動かすためにXen 用のカーネルを作る必要があります。
完全仮想化でも良いかもしれませんが、なんとなく…

構築手順

FreeBSDXenカーネルを作る。

FreeBSD xen の ML を見ると pmap で panic する修正が入っているとのことだったので、CURRENT で作ります。
このあたりの色々な修正は RELENG 8.2 へ MFC されていないので、おとなしく CURRENT です。
(STABLE へは MFC されてます)

CURRENT を作るのは先日の日記を参照。
http://d.hatena.ne.jp/po3/20110515/1305460610

Xen 用のディスクイメージを作る

下記 URL を参照しました。
http://forums.freebsd.org/showthread.php?t=10268

ただし、ディスクイメージを作るときは truncate ではなくて dd コマンドで作っています。

 # dd if=/dev/zero of=disk.img bs=1m count=2k

俗にいう穴あきファイル(sparse) はあんまりよく分からないし、VMWare でも qemu でもパフォーマンスがガタ落ちだったの dd でフルに容量を使って作成しています。
Linux だと virtio を使うとマシになるのですが、やっぱり根本的に遅いし、ディスクも安いのでキニシナイ!

作ったディスクイメージに色々するのは先日の日記を参照。
/etc/fstab を適当に弄って /etc/ttys に xc0 を追加してください。
http://d.hatena.ne.jp/po3/20110514/1305384444

Xen の設定ファイルを作る

これは単純に下記のようなファイルを用意します。

memory =  855
name = "FreeBSD_DOMU"
kernel = '/usr/home/xen/FreeBSD-CURRENT/xen.kernel'
disk = [
'file:/home/xen/FreeBSD-CURRENT/disk.img,hda1,w',
]
extra = 'boot_verbose,boot_single,kern.hz=100,machdep.idle_mwait=0,vfs.root.mountfrom=ufs:/dev/ad0s1a'
vcpus = 1
on_poweroff = 'destroy'
on_reboot = 'restart'
on_crash = 'restart'

machdep.idle_mwait=0 はもういらないかもしれない。

起動してみます。

gomyway# xm create ./xen.cfg -c
Using config file "././xen.cfg".
Started domain FreeBSD_DOMU
3DNow!>
  AMD Features2=0x11f<LAHF,CMP,SVM,ExtAPIC,CR8,Prefetch>
real memory  = 896532480 (855 MB)
avail memory = 866402304 (826 MB)
[XEN] IPI cpu=0 irq=128 vector=RESCHEDULE_VECTOR (0)
[XEN] IPI cpu=0 irq=129 vector=CALL_FUNCTION_VECTOR (1)
[XEN] xen_rtc_probe: probing Hypervisor RTC clock
rtc0: <Xen Hypervisor Clock> on motherboard
[XEN] xen_rtc_attach: attaching Hypervisor RTC clock
xenstore0: <XenStore> on motherboard
xc0: <Xen Console> on motherboard
Timecounters tick every 10.000 msec
xenbusb_front0: <Xen Frontend Devices> on xenstore0
[XEN] hypervisor wallclock nudged; nudging TOD.
xenbusb_back0: <Xen Backend Devices> on xenstore0
xctrl0: <Xen Control Device> on xenstore0
xbd0: 2048MB <Virtual Block Device> at device/vbd/769 on xenbusb_front0
xbd0: attaching as ad0
Timecounter "TSC" frequency 2109592000 Hz quality 800
WARNING: WITNESS option enabled, expect reduced performance.
Trying to mount root from ufs:/dev/ad0s1a []...
rtc0: [XEN] xen_rtc_gettime
rtc0: [XEN] xen_rtc_gettime: wallclock 1306675669 sec; 965899053 nsec
rtc0: [XEN] xen_rtc_gettime: uptime 665 sec; 6026720 nsec
rtc0: [XEN] xen_rtc_gettime: TOD 1306676334 sec; 971925773 nsec
Setting hostuuid: 0f12f2c1-8947-11e0-bda0-6389d0dd6e1d.
Setting hostid: 0x419c4544.
No suitable dump device was found.
Entropy harvesting: interrupts ethernet point_to_point kickstart.
Starting file system checks:
/dev/ad0s1a: FILE SYSTEM CLEAN; SKIPPING CHECKS
/dev/ad0s1a: clean, 835786 free (1474 frags, 104289 blocks, 0.1% fragmentation)
Mounting local file systems:.
/etc/rc: WARNING: $hostname is not set -- see rc.conf(5).
Starting Network: lo0.
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=3<RXCSUM,TXCSUM>
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
Starting devd.
add net ::ffff:0.0.0.0: gateway ::1
add net ::0.0.0.0: gateway ::1
add net fe80::: gateway ::1
add net ff02::: gateway ::1
Creating and/or trimming log files.
Starting syslogd.
/etc/rc: WARNING: Dump device does not exist.  Savecore not run.
ELF ldconfig path: /lib /usr/lib /usr/lib/compat
a.out ldconfig path: /usr/lib/aout /usr/lib/compat/aout
Clearing /tmp (X related).
Updating motd:.
Starting cron.
Starting background file system checks in 60 seconds.

Sun May 29 13:39:02 UTC 2011

FreeBSD/i386 (Amnesiac) (xc0)

login: 

なんとか起動しました。

TODO

とりあえず動かすところまではできましたが、メモリを 855MBよりも多くすると、また pmap で落ちます。
ルータとして動かすのでメモリはそんなにいらないので、この問題についてはスルーします。