Top/EBUG勉強会/20251122_vmmvmd

vmm/vmd: OpenBSDの仮想環境

EBUG 第95回会合 2025年11月22日
川俣吉広、kaw@on.rim.or.jp

構成要素

資料: OpenBSD FAQ - Virtualization

特徴

準備

ハードウェアが対応しているか確認

# dmesg | egrep '(VMX/EPT|SVM/RVI)'

ファームウェアをインストール

# fw_update -v  # vmm-firmwareがインストールされるのを確認

vmdを有効化

# rcctl enable vmd
# rcctl start vmd

ディスクイメージを作成

# vmctl create -s 4G OpenBSD78.img  # フォーマットは raw か qcow2

起動

(ネットワークブリッジを使用しなければ)設定ファイルなしで動く。

OSのインストール

# vmctl start -c -i 1 -L -m 2G -B cdrom -r install78.iso -d OpenBSD78.img obsd78

インストール後、起動

# vmctl start -i 1 -L -m 2G -d OpenBSD78.img obsd78

設定

vm.confの設定

設定を/etc/vm.confに記述する。

# cat /etc/vm.conf
switch "uplink" {
        interface veb0
}

vm "obsd78" {
    disable
    memory 2G
    disk "/opt/vmd/OpenBSD78.img"
    interfaces 1
    interface { switch "uplink" }
}
(他にもVMがある場合は以下同様に記述)

ネットワークの設定

前項のvm.confの設定ではVMをブリッジに接続し、外のネットワークに出られるようにしている。 これについて、ネットワークの追加設定が必要。

OpenBSDでは汎用ブリッジデバイス/仮想ポートとしてbridge(4)vether(4)があるが、ここでは、vmm/vmd用に特化されたveb(4)vport(4)を使用する。

/etc/hostname.veb0 - veb(4) (Virtual Ethernet Bridge)の設定

add re0
add vport0
up

/etc/hostname.re0 - 実機のNICの設定

up  # 有効化するだけ

/etc/hostname.vport0 - vebに接続する仮想ポート。vebに接続した実機のNICではアドレス設定ができないため、このvportに設定する。

inet autoconf   # DHCP
inet6 autoconf  # SLAAC

イメージ図
ebug_vm_veb.png
VMが起動すると、tap(4)経由でveb0に接続される。

起動

# vmctl start obsd78
vmctl: started vm 1 successfully, tty /dev/ttyp1
# vmctl status
      ID   PID VCPUS  MAXMEM  CURMEM     TTY        OWNER    STATE NAME
       1 25809     1    516M    156M   ttyp1         root  running obsd78

/dev/ttyp1はVMのシリアルコンソール。以下のようにアクセスする。

# vmctl console obsd78

または、起動時に、

# vmctl start -c obsd78

内部的にcu(1)を呼び出している。

事例

河豚板開発・ビルド環境の移行

従来環境(実機)は、{7.7,7.8}×{i386,amd64}のクアッドブート
区画OSマウントポイント用途
sd0a河豚板7.1ブートセレクタ/メンテ用
sd0bswapスワップ
sd0d河豚板の環境保存用
sd0eOpenBSD 7.8/i386/ビルド環境
sd0fOpenBSD 7.8/amd64/ビルド環境
sd0gOpenBSD 7.8/opt/build生成物
sd0kOpenBSD 7.7/i386/ビルド環境
sd0lOpenBSD 7.7/amd64/ビルド環境
sd0mOpenBSD 7.7/opt/build生成物

ホストゲストOSVM ID
河豚板-7.8-amd64
Core i7 2.6GHz*6CPU
mem 32GB
HDD 1.8TB+1TB
OpenBSD 7.8/i386build32
OpenBSD 7.8/amd64build64
OpenBSD 7.8-current/amd64build64c

区画OSマウントポイント用途
MFS河豚板7.8-current/ramOpenBSD-currentビルド用
(すべてオンメモリ)

IoTサーバの移行

TempSensors1.pngTempSensors2.png

開発兼予備サーバをVMに移行
基盤VMID
河豚板-7.8-amd64
OpenBSD 7.8/i386build32
OpenBSD 7.8/amd64build64
OpenBSD 7.8-current/amd64build64c
河豚板-7.1-i386tempsensor

Linuxをguestとする

実験&学習目的でLinuxを追加

RHEL系 (Alma Linux or Rocky Linux)
バージョン10(現行)UEFI起動のみサポート起動不可
バージョン9, 8カーネル起動途中でpanic
Debian
バージョン13カーネル起動途中でpanic
バージョン12起動成功

基盤VMID
河豚板-7.8-amd64OpenBSD 7.8/i386build32
OpenBSD 7.8/amd64build64
OpenBSD 7.8-current/amd64build64c
河豚板-7.1-i386tempsensor
Debian12 Linuxdebian12

※)今回は行わなかったが、過去にPlamo Linux, Alpine Linuxも動作実績あり。

雑多なトピック

トラブル(シューティング)

構築中に、VMが最大4つまでしか起動できず、5個目からはエラーとなる現象に遭遇した。

現象の再現状況:

# rcctl start vmd
vmd(ok)
# vmctl status
   ID   PID VCPUS  MAXMEM  CURMEM     TTY        OWNER    STATE NAME
    1     -     1    512M       -       -         root  stopped OpenBSD-7.8-01
    2     -     1    512M       -       -         root  stopped OpenBSD-7.8-02
    3     -     1    512M       -       -         root  stopped OpenBSD-7.8-03
    4     -     1    512M       -       -         root  stopped OpenBSD-7.8-04
    5     -     1    512M       -       -         root  stopped OpenBSD-7.8-05
    6     -     1    512M       -       -         root  stopped OpenBSD-7.8-06
    7     -     1    512M       -       -         root  stopped OpenBSD-7.8-07
    8     -     1    512M       -       -         root  stopped OpenBSD-7.8-08
# vmctl start 1
vmctl: started vm 1 successfully, tty /dev/ttyp1
# vmctl start 2 
vmctl: started vm 2 successfully, tty /dev/ttyp2
# vmctl start 3 
vmctl: started vm 3 successfully, tty /dev/ttyp3
# vmctl start 4 
vmctl: started vm 4 successfully, tty /dev/ttyp4
# vmctl start 5 
vmctl: start vm command failed: No such file or directory
# vmctl start 6 
vmctl: start vm command failed: No such file or directory
# vmctl start 7 
vmctl: start vm command failed: No such file or directory
# vmctl start 8 
vmctl: start vm command failed: No such file or directory
# vmctl status  
   ID   PID VCPUS  MAXMEM  CURMEM     TTY        OWNER    STATE NAME
    4 32605     1    516M    123M   ttyp4         root  running OpenBSD-7.8-04
    3 31865     1    516M    123M   ttyp3         root  running OpenBSD-7.8-03
    2  7926     1    516M    156M   ttyp2         root  running OpenBSD-7.8-02
    1 25809     1    516M    156M   ttyp1         root  running OpenBSD-7.8-01
    5     -     1    512M       -       -         root  stopped OpenBSD-7.8-05
    6     -     1    512M       -       -         root  stopped OpenBSD-7.8-06
    7     -     1    512M       -       -         root  stopped OpenBSD-7.8-07
    8     -     1    512M       -       -         root  stopped OpenBSD-7.8-08

ネットワークの設定を行わないと、正常に起動することが判明した。

vm.conf

vm "OpenBSD-7.8-05" {
    disable
       memory 512M
    disk "/home/vmtest/OpenBSD-7.8-05.raw"
    # interfaces 1                   ←コメントアウトすると
    # interface { switch "uplink" }  ←動く
}

この現象をOpenBSD ML (misc@、あるいはbugs@)に報告するべく、報告の英訳と推敲のためのやりとりをAIと行っているなかで「そういえば/dev/tap?はどうなっている?」となり、調査。

$ ls -l /dev/tap*
crw-------  1 root  wheel  93, 0 Nov  8 08:59 /dev/tap0
crw-------  1 root  wheel  93, 1 Nov  8 08:59 /dev/tap1
crw-------  1 root  wheel  93, 2 Nov  8 08:59 /dev/tap2
crw-------  1 root  wheel  93, 3 Nov  8 08:59 /dev/tap3

tap(4)のデバイスファイルが4つまでしか作られていないのが原因と判明。MAKEDEV tap4とし、解決。

先に説明したように、vmctlのエラーメッセージは、

vmctl: start vm command failed: No such file or directory

となっていた。これが、

vmctl: start vm command failed: /dev/tap4: No such file or directory

などとなっていれば、より迅速にトラブルシューティングできたと思われる
エラーメッセージの表示方法、重要

電力収支

従来(実機)
min(W)max(W)運用形態
河豚板ビルドシステム1860通常はminに近い
河豚板ビルドシステム(-current)55135数時間/週程度
温度測定IoTサーバ1945通常はminとmaxの中間程度
トータル38113
更新後(仮想)
min(W)max(W)運用形態
仮想基盤55135通常はminに近い

これより、集約によって著しく電力効率が改善されたわけでも、悪化したわけでもない。
ただし、河豚板のビルドだけに限ってみると、概ね

となり、処理時間が短縮された分、効率は上がった。

VMが増設されれば、改善する方向にゆくと思われる。

バックアップ

河豚板のファイルシステム構成に沿った設計とした。

SAGによるモニタリング

仮想基盤の動作モニタ結果

0001la.png0001procs.png
付加平均プロセス起動数
0005mem.png0100df.png
メモリ使用状況ストレージ使用状況
0001net.png
ネットワーク流量
0005timeofs.png0100time.png
時刻同期カーネルクロック

終わりに

前半で紹介したように、OpenBSDのvmm/vmdは、基本的な動作のみに機能を厳選された、極めてシンプルな実装だ。

しかしながら、実例で示したように、適切な範囲での用途を想定すれば、十分に実用的であることがわかった。
今後、運用を続けていく上で、新たな知見等あれば、引き続き報告してゆく。


Front page   New Page list Search Recent changes   Help   RSS of recent changes