この記事は、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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。