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とし、解決。

バックアップ


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