NetBSD/amd64 on CloudCore VPS

【追記 2013-03-19】以下は書いた当時の情報であり、2013年3月現在、ここに書いたような方法(x86_errata()の無効化)を用いてもCloudCore VPSでNetBSDは動作しません。

KDDI Web Communications の CloudCore VPS、最安とまではいかないがそこそこ安いのと(トップにある945円/月は1年契約のときの値段ですが)、「提供予定」に普段使っているNetBSDが入っていたので様子を見ていたところ、

CentOS 5.8/CentOS 6.2/Fedora 16/Scientific Linux 6.2/Ubuntu 12.04 提供開始のお知らせ

なお、かねてよりOSインストール機能の一環にて提供予定としておりました、
「NetBSD」につきましてご報告させていただきます。

お客様からのご要望も高く、ご期待に添えるべく技術検証を重ねてまいりましたが、
サービスとして提供できるレベルに至らず、提供を見合わせることとなりました。
ご期待を寄せていただいていたお客様方へは深くお詫び申し上げます。
誠に申し訳ございませんでした。

とまあ、残念なお知らせが載っていたので、雲野コアさんに愛を伝えるべくどういう問題かを把握すべく試用してみました。

Back Street Net(神戸さんのサイト)のさくらVPSの例(とてもわかりやすくて助かります)を参考に if_wm.c にパッチをあてて、イメージを作成。
(VNCコンソールなのでinstallbootのオプション,console=com0,speed=115200は削りました。)

イメージの書き込みは、他のサポートされているOSのインストーラを途中で止めて、ネットワークの設定をしてイメージを転送してddでディスクに書き込むだけなので、特にトリッキーなテクニックを使う必要もなく比較的簡単です。私はFreeBSDのインストーラを使いました。(今後ISOイメージからの起動ができるようになるそうなので、もっと簡単になりそうです。)

すると、…起動に失敗します。

理由は、多分以下のスレッドのものと同じですが、
Current-Users archive: Boot fail as kvm guest
要は、sys/arch/x86/x86/errata.cのx86_errata()でCPUがAMDと判定されるとMSRへのアクセスがありますが、KVM上では通らないという事のようです。今のところ、AMDのCPU以外では何もしないようになっているので、さくらVPS(IntelのCPUに見える)等では問題ないということでしょう。

「KVM上の場合は何もしない」というコードをどう書くのが正しいかわからないので、x86_errata()が何もしないようにソースを直接書き換えて、再度コンパイルしてイメージを作り、さらにACPIとSMPをdisable(起動メニューの4番)したところ起動しました

一応、インストールした後負荷をかけてみたりしましたが、動いているようです。ただ、「サービスとして提供できるレベルに至らず」という文面が気になるところです。

契約して使うかどうかは迷っています。

何処をどう直すのがスジかという話ですが、KVMとかハイパバイザの類の上でどうせCPU依存の特殊なことはできないのであれば、それらがCPUの種類を隠蔽してくれるのがいい気がしますが、どうでしょうか。


おまけ1: dmesg

NetBSD 6.0_BETA2 (GENERIC) #2: Mon Jul 2 13:07:49 JST 2012
        ***@***:/***/sys/arch/amd64/compile/GENERIC
total memory = 2047 MB
avail memory = 1972 MB
timecounter: Timecounters tick every 10.000 msec
timecounter: Timecounter "i8254" frequency 1193182 Hz quality 100
Bochs Bochs
mainbus0 (root)
cpu0 at mainbus0: AMD Phenom(tm) 9550 Quad-Core Processor, id 0x100f23
pci0 at mainbus0 bus 0: configuration mode 1
pci0: i/o space, memory space enabled, rd/line, rd/mult, wr/inv ok
pchb0 at pci0 dev 0 function 0: vendor 0x8086 product 0x1237 (rev. 0x02)
pcib0 at pci0 dev 1 function 0: vendor 0x8086 product 0x7000 (rev. 0x00)
piixide0 at pci0 dev 1 function 1: Intel 82371SB IDE Interface (PIIX3) (rev. 0x00)
piixide0: bus-master DMA support present
piixide0: primary channel wired to compatibility mode
piixide0: primary channel interrupting at irq 14
atabus0 at piixide0 channel 0
piixide0: secondary channel wired to compatibility mode
piixide0: secondary channel interrupting at irq 15
atabus1 at piixide0 channel 1
uhci0 at pci0 dev 1 function 2: vendor 0x8086 product 0x7020 (rev. 0x01)
uhci0: interrupting at irq 11
usb0 at uhci0: USB revision 1.0
piixpm0 at pci0 dev 1 function 3: vendor 0x8086 product 0x7113 (rev. 0x03)
timecounter: Timecounter "piixpm0" frequency 3579545 Hz quality 1000
piixpm0: 24-bit timer
piixpm0: interrupting at irq 9
iic0 at piixpm0: I2C bus
vga0 at pci0 dev 2 function 0: vendor 0x1013 product 0x00b8 (rev. 0x00)
wsdisplay0 at vga0 kbdmux 1: console (80x25, vt100 emulation)
wsmux1: connecting to wsdisplay0
drm at vga0 not configured
virtio0 at pci0 dev 4 function 0
virtio0: Virtio Memory Balloon Device (rev. 0x00)
viomb0 at virtio0
virtio0: allocated 8192 byte for virtqueue 0 for inflate, size 128
virtio0: allocated 8192 byte for virtqueue 1 for deflate, size 128
virtio0: interrupting at irq 11
wm0 at pci0 dev 5 function 0: Intel i82540EM 1000BASE-T Ethernet (rev. 0x03)
wm0: interrupting at irq 10
wm0: 32-bit 33MHz PCI bus
wm0: 64 word (6 address bits) MicroWire EEPROM
wm0: Ethernet address 00:16:36:eb:e7:06
makphy0 at wm0 phy 1: Marvell 88E1011 Gigabit PHY, rev. 0
makphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
isa0 at pcib0
com0 at isa0 port 0x3f8-0x3ff irq 4: ns16550a, working fifo
pckbc0 at isa0 port 0x60-0x64
pckbd0 at pckbc0 (kbd slot)
pckbc0: using irq 1 for kbd slot
wskbd0 at pckbd0: console keyboard, using wsdisplay0
pms0 at pckbc0 (aux slot)
pckbc0: using irq 12 for aux slot
wsmouse0 at pms0 mux 0
attimer0 at isa0 port 0x40-0x43
pcppi0 at isa0 port 0x61
midi0 at pcppi0: PC speaker
sysbeep0 at pcppi0
fdc0 at isa0 port 0x3f0-0x3f7 irq 6 drq 2
attimer0: attached to pcppi0
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
uhub0 at usb0: vendor 0x8086 UHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub0: 2 ports with 2 removable, self powered
wd0 at atabus0 drive 0
wd0: <QEMU HARDDISK>
wd0: drive supports 16-sector PIO transfers, LBA48 addressing
wd0: 100 GB, 208050 cyl, 16 head, 63 sec, 512 bytes/sect x 209715200 sectors
wd0: 32-bit data port
wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 5 (Ultra/100)
wd0(piixide0:0:0): using PIO mode 4, DMA mode 2 (using DMA)
Kernelized RAIDframe activated
pad0: outputs: 44100Hz, 16-bit, stereo
audio0 at pad0: half duplex, playback, capture
boot device: wd0
root on wd0a dumps on wd0b
root file system type: ffs
clock: unknown CMOS layout
wsdisplay0: screen 1 added (80x25, vt100 emulation)
wsdisplay0: screen 2 added (80x25, vt100 emulation)
wsdisplay0: screen 3 added (80x25, vt100 emulation)
wsdisplay0: screen 4 added (80x25, vt100 emulation)

おまけ2: bytebench

                     INDEX VALUES
TEST                                        BASELINE     RESULT      INDEX

Dhrystone 2 using register variables        116700.0 18544548.3     1589.1
Double-Precision Whetstone                      55.0     2170.5      394.6
Execl Throughput                                43.0     1106.7      257.4
File Copy 1024 bufsize 2000 maxblocks         3960.0    50893.0      128.5
File Copy 256 bufsize 500 maxblocks           1655.0    17865.0      107.9
File Copy 4096 bufsize 8000 maxblocks         5800.0    79506.0      137.1
Pipe Throughput                              12440.0  1690691.4     1359.1
Pipe-based Context Switching                  4000.0    38947.1       97.4
Process Creation                               126.0     2582.3      204.9
Shell Scripts (8 concurrent)                     6.0      360.7      601.2
System Call Overhead                         15000.0  1324855.3      883.2
                                                                 =========
     FINAL SCORE                                                     326.0

File Copyだけ(他のVPSより)遅い…ですよね?

File Read 1024 bufsize 2000 maxblocks|30|KBps|1811010|1810995|3
File Write 1024 bufsize 2000 maxblocks|30|KBps|53888|53883|3
File Copy 1024 bufsize 2000 maxblocks|30|KBps|50897|50893|3

File Read 256 bufsize 500 maxblocks|30|KBps|618317|618307|3
File Write 256 bufsize 500 maxblocks|30|KBps|19122|19121|3
File Copy 256 bufsize 500 maxblocks|30|KBps|17869|17865|3

File Read 4096 bufsize 8000 maxblocks|30|KBps|1887458|1834838|3
File Write 4096 bufsize 8000 maxblocks|30|KBps|107289|107263|3
File Copy 4096 bufsize 8000 maxblocks|30|KBps|79506|79506|3

読み出しは手持ちの実機と同じくらいですが、書き込みが遅いです。実用になる範囲だとは思いますが。