#author("2025-11-23T17:48:08+09:00;2025-11-22T09:43:38+09:00","default:kaw","kaw")
#author("2025-11-24T12:31:36+09:00;2025-11-22T09:43:38+09:00","default:kaw","kaw")
#topicpath
* vmm/vmd: OpenBSDの仮想環境 [#b3d87950]
RIGHT:EBUG 第95回会合 2025年11月22日 ~
川俣吉広、kaw@on.rim.or.jp

#contents
** 構成要素 [#wcb67309]
- [[vmm(4)>man:vmm]] - 仮想機械モニタ(カーネル内ドライバ)
- [[vmd(8)>man:vmd]] - 仮想機械デーモン(仮想CPUスレッドの生成と制御)
- [[vmctl(8)>man:vmctl]] - vmdの操作ユティリティ
- [[vm.conf(8)>man:vm.conf]] - 設定ファイル

資料: [[OpenBSD FAQ - Virtualization>https://www.openbsd.org/faq/faq16.html]]

** 特徴 [#d68cb14e]
- シンプル。

- 以下の制限がある。
-- アーキテクチャ: i386, amd64 (UEFI未対応。Legacy BIOSのみ)

-- 仮想CPUはUniprocessorのみ

-- ビデオ出力未対応(シリアルコンソールかネットワークからアクセス)

-- 対応OS: OpenBSD, Linux

-- 以下の機能は未実装: ゲストSMPサポート、ハードウェアパススルー、ホスト間のライブマイグレーション、ライブハードウェア変更

** 準備 [#ac0b2012]
ハードウェアが対応しているか確認
 # 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
 
** 起動 [#g91a5165]
** 起動 (手動で) [#g91a5165]
(ネットワークブリッジを使用しなければ)設定ファイルなしで動く。

*** OSのインストール [#o971b974]
 # vmctl start -c -i 1 -L -m 2G -B cdrom -r install78.iso -d OpenBSD78.img obsd78

*** インストール後、起動 [#r64c4513]
 # vmctl start -i 1 -L -m 2G -d OpenBSD78.img obsd78

** 設定 [#l74ad5a9]
*** vm.confの設定 [#m05e9d72]
設定を/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がある場合は以下同様に記述)

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

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

/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

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

** 起動 [#f2c45f7d]
** 起動 (ネットワーク等を設定) [#f2c45f7d]
 # 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)>man:cu]]を呼び出している。

** 事例 [#a740b23a]
*** 河豚板開発・ビルド環境の移行 [#f4dc4eee]

CENTER:従来環境(実機)は、{7.7,7.8}×{i386,amd64}のクアッドブート

|区画|OS|マウントポイント|用途|h
|sd0a|河豚板7.1||ブートセレクタ/メンテ用|
|sd0b|>|swap|スワップ|
|sd0d|>||河豚板の環境保存用|
|sd0e|COLOR(red):OpenBSD 7.8/i386 | / |ビルド環境|
|sd0f|COLOR(green):OpenBSD 7.8/amd64| / |ビルド環境|
|sd0g|OpenBSD 7.8      | /opt/build |生成物|
|sd0k|OpenBSD 7.7/i386 | / |ビルド環境|
|sd0l|OpenBSD 7.7/amd64| / |ビルド環境|
|sd0m|OpenBSD 7.7      | /opt/build |生成物|

CENTER:↓~
↓
|CENTER:ホスト|CENTER:ゲストOS|CENTER:VM ID|h
|河豚板-7.8-amd64&br;Core i7 2.6GHz*6CPU&br;mem 32GB&br;HDD 1.8TB+1TB|COLOR(red):OpenBSD 7.8/i386|build32|
|~|COLOR(green):OpenBSD 7.8/amd64|build64|
|~|COLOR(blue):OpenBSD 7.8-current/amd64|build64c|
CENTER:↑~
↑
|区画|OS|マウントポイント|用途|h
|MFS|COLOR(blue):河豚板7.8-current|/ram|OpenBSD-currentビルド用&br;(すべてオンメモリ)|

- 7.7/* (一つ前のリリース)は保持しないこととした
-- ビルドシステムの改良により、いわゆる[[秘伝のタレ>EBUG勉強会/20240217_BuildFuguIta#m1e1e501]]がほぼ無くなった。それにより、ビルドが以前より簡易に行えるようになったため
-- 一つ前のリリースに戻っての対応が必要となる事例はいままで発生しなかったため

- シリアルコンソール設定
-- OpenBSD: bootプロンプトで
 boot> set tty com0
インストール時に、
 Change the default console to com0?
に対し''yes''を指定する

-- 河豚板: シリアルが有効になっていると[[自動的に対応>EBUG勉強会/20190223_SerialConsole]]する(特に設定項目はなし)。

*** IoTサーバの移行 [#f4dc4eee]
|CENTER:&ref(TempSensors1.png,,25%);&ref(TempSensors2.png,,25%);|

CENTER:↓~
COLOR(red){開発兼予備サーバ}をVMに移行~
↓
|CENTER:基盤|CENTER:VM|CENTER:ID|h
|河豚板-7.8-amd64&br;|OpenBSD 7.8/i386|build32|
|~|OpenBSD 7.8/amd64|build64|
|~|OpenBSD 7.8-current/amd64|build64c|
|~|COLOR(red):河豚板-7.1-i386|COLOR(red):tempsensor|

*** Linuxをguestとする [#t252de14]
実験&学習目的でLinuxを追加

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

CENTER:↓~
↓
|CENTER:基盤|CENTER:VM|CENTER:ID|h
|河豚板-7.8-amd64|OpenBSD 7.8/i386|build32|
|~|OpenBSD 7.8/amd64|build64|
|~|OpenBSD 7.8-current/amd64|build64c|
|~|河豚板-7.1-i386|tempsensor|
|~|COLOR(red):Debian12 Linux|COLOR(red):debian12|

- シリアルコンソール対応
-- インストール時、GRUB2でKernel Command Lineに"console=ttyS0,115200n8"を追加
-- インストール後には/etc/defaults/grubに同様に追加。~
併せて、/etc/systemd/system/serial-getty@ttyS0.service.d/override.confにServiceエントリを追加
 [Service]
 ExecStart=
 ExecStart=-/sbin/agetty -o '-p -- \\u' --keep-baud 115200,9600 ttyS0 - $TERM
その後、systemctl enable/start

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

** 雑多なトピック [#g1e00997]
*** トラブル(シューティング) [#o6c371ba]
構築中に、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
などとなっていれば、より迅速にトラブルシューティングできたと思われる~
→ '''''エラーメッセージの表示方法、重要'''''

*** 電力収支 [#z88a0fb2]
|>|>|>|BGCOLOR(#D0D8E0):CENTER:従来(実機)|
||min(W)|max(W)|運用形態|
|河豚板ビルドシステム|18|60|通常はminに近い|
|河豚板ビルドシステム(-current)|55|135|数時間/週程度|
|温度測定IoTサーバ|19|45|通常はminとmaxの中間程度|
|トータル|38|113||
|>|>|>||
|>|>|>|BGCOLOR(#D0D8E0):CENTER:更新後(仮想)|
||min(W)|max(W)|運用形態|
|仮想基盤|55|135|通常はminに近い|

これより、集約によって著しく電力効率が改善されたわけでも、悪化したわけでもない。~
ただし、河豚板のビルドだけに限ってみると、概ね
- 従来: 18時間(i386) + 18時間(amd64) = 36時間
- 現在: 13時間(i386, amd64並列)

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

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

*** バックアップ [#u92fd080]
河豚板のファイルシステム構成に沿った設計とした。
- OS本体~
→ immutable(配布系から不変)なので、バックアップせず

- ホストの動作環境(MFS上)~
→ usbfadm sync でUSBメモリにバックアップ (定期的に usbfadm archive)~
→ 定期的に予備HDD (1TB)にコピー

- VMのイメージファイル~
→ 予備HDD (1TB) に rsync で差分コピー

*** [[SAG]]によるモニタリング [#scd5b028]
仮想基盤の動作モニタ結果
- 現時点で各リソースは概ね足りている。

- 興味深いのはメモリの使用状況。activeが常に1GB以下と非常に低い値で、かつ、VMの活動に影響されない。~
逆にcacheがVMの稼働に伴い大幅に変化しており、VMへははホストのcacheからメモリを割り当てているようだ。

|&ref(0001la.png,,70%);|&ref(0001procs.png,,70%);|
|CENTER:付加平均|CENTER:プロセス起動数|
|&ref(0005mem.png,,70%);|&ref(0100df.png,,70%);|
|CENTER:メモリ使用状況|CENTER:ストレージ使用状況|
|&ref(0001net.png,,70%);||
|CENTER:ネットワーク流量||
|&ref(0005timeofs.png,,70%);|&ref(0100time.png,,70%);|
|CENTER:時刻同期|CENTER:カーネルクロック|

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

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

Front page   Edit Diff History Attach Copy Rename Reload   New Page list Search Recent changes   Help   RSS of recent changes