qemu-system-x86_64のmicrovmマシンで、NetBSD/amd64-currentを起動させてみる

この記事は、NetBSD Advent Calendar 2024の20日目の記事です。

はじめに

qemu-system-x86_64には、エミュレートされるマシンとて数多くの種類が用意されています。 Qemu 10.0.0では、66種類を指定することができます。その内2つ(pcとq35)は、他のタイプのエイリアスになっているので、 実際には64種類のマシンがエミュレートできます。 ただ、例えばpc-q35-9.2とpc-q35-9.1で、どこまで差があるか分かりませんが…。 その中に、microvmというのがあります。 NetBSDでは、NetBSD Wikiの記事/にあるように 利用することができます。 2025年1月15日に最初のコミットがされています。

microvmマシンで起動させるNetBSD/amd64-currentを用意する

Qemuのmicrovmマシンで起動できるカーネルは、MICROVMというkernel configuration fileで定義されています。 ですが、https://nycdn.netbsd.org/pub/NetBSD-daily/HEAD/以下で ダウンロードできるビルド済みの配布物には、MICROVM kernel configuration fileでビルドしたカーネルは含まれていません。 ですが、ユーザーランドは利用できます。 さきほどのNetBSD Wikiの記述に従ってライブイメージファイルを利用することにします。 私は、最新のNetBSD-10.99.14-amd64-live.img.gzを ダウンロードして利用することにします。

カーネルはビルド済みのものは入手できません。そこで、私は以下のように自分でビルドしました。

$ cd /usr/src
$ ./build.sh -U -T /usr/world/10.99/amd64/tools -O /usr/world/10.99/amd64/obj -j 16 kernel=MICROVM

これにより、/usr/world/10.99/amd64/obj/sys/arch/amd64/compile/MICROVM/netbsdとしてmicrovmマシン用のELF形式のカーネルがビルドできました。 このカーネルと、さきほどダウンロードしておいたライブイメージファイルを、作業用のディレクトリーを作って置いておきます。  今回は~/VMs/netbsd-microvmというディレクトリーを作って、そこを利用することにします。

$ mkdir -p ~/VMs/netbsd-microvm
$ cd ~/VMs/netbsd-microvm
$ /usr/world/10.99/amd64/obj/sys/arch/amd64/compile/MICROVM/netbsd netbsd-10.99.14
# mv ~/Downloads/NetBSD-10.99.14-amd64-live.img.gz NetBSD-10.99.14-amd64-live_202505230650Z.img.gz
$ gunzip NetBSD-10.99.14-amd64-live_202505230650Z.img.gz

また、NetBSD Wikiの記事を参考に、以下のようなシェルスクリプトを作って、実行可能権限を付与しておきます。 ただし、今回はホストもNetBSD/amd64 10.99.14なので、accel=kvmは利用できません。accel=nvmmに変更しておきます。 また、ライブイメージファイルは、GPTでパーティショニングされていますので、ルートファイルシステムをld0aではなくdk1に変更しておきます。

$ cat microv,sh
#!/bin/sh

KERNEL=netbsd-10.99.14
NBIMG=NetBSD-10.99.14-amd64-live_202505230650Z.img

qemu-system-x86_64 -M microvm,rtc=on,acpi=off,pic=off,accel=nvmm \
  -cpu host,+invtsc -kernel ${KERNEL} -append "root=dk1 console=com rw -z" \
  -device virtio-blk-device,drive=hd0 -drive file=${NBIMG},format=raw,id=hd0 \
  -device virtio-net-device,netdev=net0 -netdev user,id=net0,ipv6=off,hostfwd=::2322-:22 \
  -global virtio-mmio.force-legacy=false -display none -serial stdio
$ chown 755 microvm.sh

Qemu microvmマシンで、NetBSD/amd64-currentのMICROVMカーネルを起動させてみる

ここまでで、起動に必要なものは準備できました。 nvmmを有効にした上で、実際に起動させてみます。 私のホストマシンはAMD製のCPUを搭載していますので、x86-svnバックエンドを利用するような表示になっています。 Intel製のCPUを搭載したマシンがホストマシンであれば、表示は異なるでしょう。

# modload nvmm
nvmm0: attached, using backend x86-svm
$ ./microvm.sh
NetBSD Virtual Machine Monitor accelerator is operational
[   1.0000000] WARNING: system needs entropy for security; see entropy(7)
[   1.0000000] entropy: ready
[   1.0000000] NetBSD 10.99.14 (MICROVM)       Notice: this software is protected by copyright
[   1.0000000] Detecting hardware... (QBOOT    000000000000)
qemu-system-x86_64: NVMM: Unexpected RDMSR 0x250, ignored
qemu-system-x86_64: NVMM: Unexpected RDMSR 0x258, ignored
qemu-system-x86_64: NVMM: Unexpected RDMSR 0x259, ignored
qemu-system-x86_64: NVMM: Unexpected RDMSR 0x268, ignored
qemu-system-x86_64: NVMM: Unexpected RDMSR 0x269, ignored
qemu-system-x86_64: NVMM: Unexpected RDMSR 0x26a, ignored
qemu-system-x86_64: NVMM: Unexpected RDMSR 0x26b, ignored
qemu-system-x86_64: NVMM: Unexpected RDMSR 0x26c, ignored
qemu-system-x86_64: NVMM: Unexpected RDMSR 0x26d, ignored
qemu-system-x86_64: NVMM: Unexpected RDMSR 0x26e, ignored
qemu-system-x86_64: NVMM: Unexpected RDMSR 0x26f, ignored
qemu-system-x86_64: NVMM: Unexpected WRMSR 0x250 [val=0x0], ignored
qemu-system-x86_64: NVMM: Unexpected WRMSR 0x258 [val=0x0], ignored
qemu-system-x86_64: NVMM: Unexpected WRMSR 0x259 [val=0x0], ignored
qemu-system-x86_64: NVMM: Unexpected WRMSR 0x268 [val=0x0], ignored
qemu-system-x86_64: NVMM: Unexpected WRMSR 0x269 [val=0x0], ignored
qemu-system-x86_64: NVMM: Unexpected WRMSR 0x26a [val=0x0], ignored
qemu-system-x86_64: NVMM: Unexpected WRMSR 0x26b [val=0x0], ignored
qemu-system-x86_64: NVMM: Unexpected WRMSR 0x26c [val=0x0], ignored
qemu-system-x86_64: NVMM: Unexpected WRMSR 0x26d [val=0x0], ignored
qemu-system-x86_64: NVMM: Unexpected WRMSR 0x26e [val=0x0], ignored
qemu-system-x86_64: NVMM: Unexpected WRMSR 0x26f [val=0x0], ignored
[   1.0041608]  done.
[   1.0078656] kernel boot time: 300ms
Not resizing / (NAME=NBImgRoot): already correct size
The following components reported failures:
    /etc/rc.d/resize_gpt
See /var/run/rc.log for more information.
Sat May 24 11:07:26 UTC 2025

NetBSD/amd64 (netbsd) (constty)

login:

UEFIやBIOSを使わないというもあるのかもしれませんが、触れ込み通りに非常に高速に起動しました。 ほぼ一瞬であると言っても良いでしょう。

おわりに

Qemu 10.0.0のqemu-system-x86_64のmicrovmマシンで、NetBSD/amd64 10.99.14のMICROVMカーネルを起動させてみました。 OSとしてのNetBSDに焦点を当てていると言うより、NetBSD上で動くソフトウェアに焦点を当てている場合には、起動が早いので非常に有用な気がします。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

NetBSD上でDeepSeek R1 LLMを動かしてみる

この記事は、 NetBSD Advent Calendar 2024 の21日目の記事です。 はじめに 中国のHangzhou DeepSeek Artificial Intelligence Basic Technology Research Co., L...