Skip to content
Htkyama Blog

NetBSD 9.1でNVMMを動かす

NetBSD1 min read

NetBSD 9.0からリリース版で導入された新しいハイパーバイザー NVMM (NetBSD Virtual Machine Monitor) をNetBSD 9.1/amd64で動かしてみる。

基本的には以下の情報を参考。

  • NVMM
  • From Zero to NVMM

NVMMの有効化

NVMMを有効にするため、カーネルモジュールをロードする。

$ modload nvmm
$ dmesg|grep nvmm
nvmm0: attached, using backend x86-vmx

起動時に有効にするには、/etc/modules.confnvmmと設定しておく。

Qemuの起動

qemuをpkgsrcからインストール。最新のpkgsrcにはNVMM対応がマージされている。

$ pkgin install qemu

グループnvmmで動作するようにパーミッションを変える。

$ chown root:nvmm /usr/pkg/bin/qemu-system-x86_64
$ chmod g+s /usr/pkg/bin/qemu-system-x86_64

-accel nvmmのオプション付きでqemuを起動。

FreeBSDで配布されているqcow2のディスクイメージファイルをそのまま使ってみる。

$ qemu-system-x86_64 -smp 4 -m 8G FreeBSD-12.2-RELEASE-amd64.qcow2 -accel nvmm
NetBSD Virtual Machine Monitor accelerator is operational

無事、FreeBSDが起動。試してないが、Windows 10も動作するとのこと。

NPFを使ったVMとの通信

VMをtap(4)インタフェース経由で接続し、 ホスト側のNetBSDをルータとして動作させることにより、 VMから外部のネットワークと通信可能となる。

NetBSD 6.0から導入されたパケットフィルタ NPF (NetBSD Packet Filter)を使って、 ゲストのVM側からホストのWAN側を経由して通信ができるようにする。

NPFはパケットフィルターに加え、ステートフルインスペクションやNATも可能。

tapデバイスの有効化

/etc/ifconfig.tap0を設定し、tapインタフェースを使えるようにする。
NetBSDではtap0にIPアドレスをふることができる。ルータのLAN側ポートのアドレスと考えると分かりやすい。

/etc/ifconfig.tap0には以下を設定。

/etc/ifconfig.tap0
1up
2inet 192.168.0.1 netmask 255.255.255.0

パケットフォワーディングの有効化

tap0からWAN側にルーティングできるように、/etc/sysctl.confnet.inet.ip.forwarding=1を加える。

/etc/sysctl.conf
1# Enable Packet Forwarding
2net.inet.ip.forwarding=1

再起動することにより、パケットフォワーディングが有効となる。

NPFによるNAPT設定

NPFでVM側からWAN側に出られるように、NAPT (IPマスカレード)の設定をする。

NPFを有効にするには、/etc/rc.confnpf=YESを加え、 /etc/npf.confにルールを設定する。

VM側のネットワークアドレスを192.168.0.0/24、ゲートウェイアドレスを192.168.0.1 VM(ゲスト)のIPアドレスを192.168.0.2とする。

WAN側のインタフェースをiwn0とする場合、/etc/npf.confの例は以下。

/etc/npf.conf
1$ext_if = inet4(iwn0)
2$int_if = inet4(tap0)
3$localnet = { 192.168.0.0/24 }
4
5map $ext_if dynamic $localnet -> $ext_if
6
7group "external" on $ext_if {
8 pass stateful out final all
9 pass stateful in final all
10}
11
12group "internal" on $int_if {
13 pass in final all
14 pass out final all
15}
16
17group default {
18 pass final on lo0 all
19 block all
20}

ゲストとなるVMで、ゲートウェイアドレスを192.168.0.1に設定、DNSアドレスを1.1.1.18.8.8.8などの パブリックDNSを設定することで通信可能となる。

© 2023 All rights reserved.
RSS