vmm/vmd: OpenBSDの仮想環境

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

構成要素

資料: OpenBSD FAQ - Virtualization

特徴

準備

# #ハードウェアが対応しているか確認
# dmesg | egrep '(VMX/EPT|SVM/RVI)'
# #vmdを有効化
# rcctl enable vmd
# rcctl start vmd
# #ディスクイメージを作成
# vmctl create -s 4G OpenBSD78.img  # raw or 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をブリッジに接続し、外のネットワークに出られるようにしている。 これについて、ネットワークの追加設定が必要

# cat /etc/hostname.veb  # veb(4) (Virtual Ethernet Bridge)の設定
add re0
add vport0
up
# cat /etc/hostname.re0  # 実機のNICの設定
up  # 有効化するだけ
# cat /etc/hostname.vport  # vebに接続する仮想ポート。実機のアドレス設定はここで
inet autoconf              # 実H/WのNICvebを接続するとアドレスを割り振れなくなるため
inet alias 192.168.1.32 255.255.255.0
inet6 autoconf

イメージ図
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生成物

基盤VMID
河豚板-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
7.7/* (一つ前のリリース)は保持しないこととした

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
時刻同期カーネルクロック

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