OpenBSDハイパーバイザvmm(4)
2015年8月、OpenBSDの開発者であるMike Larkin氏がOpenBSDのtechメーリングリストに「virtualization support」というメールを投函しました。これはOpenBSD向けのネイティブなハイパーバイザの開発を進めていることを発表したもので、関係者の大きな関心を引きました。
このメールからほぼ3ヵ月後となる2015年11月22日、同じくMike Larkin氏がメーリングリストに投函した「vmm update」によって、ハイパーバイザvmm(4)の最初のコードがCURRENTツリーにコミットされたことが伝えられました。カーネルおよびユーザランドの双方に対してハイパーバイザ関連のコードがコミットされています。vmm(4)を構成する主なデバイスドライバや管理コマンド、設定ファイルなどは次のとおりです。
- vmm(4):仮想マシンモニタサブシステム
- vmm.conf(5):仮想マシン設定ファイル
- vmmctl(8):仮想マシンモニタサブシステム制御コマンド
- vmd(8):仮想マシンデーモン
- virtio(4):VirtIOドライバ
今回コミットされた内容にはまだ修正すべき点と改善すべき点がいくつか残っていることから、デフォルトでこの機能は無効になっています。しかし、試験的に使ってみるためには十分な機能が実装されていると説明があり、興味があるユーザは使ってみてほしいとしています。
現在のvmm(4)はBIOSをエミュレートしていないため、vmd(8)デーモンに組み込まれたブートローダおよびカーネルローダを経由してシステムを起動する必要があり、今のところOpenBSDカーネルのみが起動できるとのことです(NetBSDの起動もそう難しくはなさそうです)。
今回のコミットではハイパーバイザを使用するための細かい設定やコマンドの使い方などの説明は省略されています。それは近いうちに何度か実装を変更することが予想されるため、現段階で使い方を紹介しても有用性が低いからといった理由があげられています。一般利用はまだ先の話、特に半年後のOpenBSD 5.9がリリースされてからということになるかと思いますが、今後の発展が楽しみな機能です。
vmm(4) 仮想マシンモニタサブシステム
ハイパーバイザの中核をなすドライバがvmm(4)です。これはCPUの提供する仮想化機能(仮想化機能、ネスト/エクステンドページ機能)を活用して仮想マシンサービスを提供するというものです。アイディアはFreeBSDのハイパーバイザbhyve(4)とよく似ています。
vmm(4)は作成される仮想マシンに対して次のハードウェアリソースを割り当てます。
- 仮想CPU
- 仮想ネットワークインターフェース
- 仮想ディスクイメージ
- 仮想シリアルポート
作成される仮想マシンやホスト環境はそれぞれ独立していますが、ネットワーク通信などを通じて相互にインタラクションが可能です。
vmm.conf(5) 仮想マシンモニタおよび仮想マシン設定ファイル
vmm.conf(5)設定ファイルが仮想マシンモニタサブシステムの設定ファイルです。設定ファイルの内容は主にマクロ、仮想マシンモニタ設定、仮想マシン設定の3つのセクションで構成されています。基本的に1設定1行ですが、行末にバックスラッシュを配置することで複数行に展開することができます。#でコメントを表現します。
vmm.conf(5)の書き方は今後変更が入るように思いますが、現在公開されているソースから判断する感じでは、次のような書き方ができるようです。
vm {}で囲まれた中身が仮想マシンの設定になっていて、それぞれ次の意味があるとされています。
- enable:起動時に自動的に仮想マシンを起動
- disable:仮想マシンを無効化
- disk:ディスクイメージファイルパス
- kernel:カーネルファイルパス
- memory:メモリサイズ
- interface:割り当てるネットワークインターフェースの数
vmm.conf(5)に記載できる内容は今後の開発で増えていくのではないかと思います。vmm(4)を起動時に有効化するかどうかは/etc/rc.conf.localに設定を追加することになると見られます。
vmmctl(8) 仮想マシンモニタおよび仮想マシン制御コマンド
vmmctl(8)は仮想マシンモニタサブシステムを制御するコマンドです。ホストで動作している仮想マシンモニタサブシステムおよび仮想マシンの制御機能を提供します。仮想マシンモニタサブシステム向けには次のサブコマンドが用意されています。
- enable 仮想マシンモニタサブシステムを有効化
- disable 仮想マシンモニタサブシステムの無効化
- load vmm.conf(5)設定ファイルの読み込み
vmmctl(8)コマンドの主な用途は仮想マシンの制御になってくると思います。主に次の制御サブコマンドが提供されています。
- create:仮想ディスクの作成(create path size number)
- start:仮想ディスクの起動(start name disk path kernel path memory size interfaces count)
- terminate:仮想マシンの停止
- show info:動作している仮想マシン一覧の表示
今のところだいぶシンプルな制御コマンドです。
vmd(8)
ホストで仮想マシンを実行するための責務を負うデーモンがvmd(8)です。起動時に仮想マシンを起動してカーネルを実行状態に持っていく作業を担うほか、vmmctl(8)経由で仮想マシンを制御する機能を提供します。
virtio(4)
準仮想化デバイスの機能を提供するデバイスドライバがvirtio(4)です。現在のところ次の5つが用意されています。
- vio(4):ネットワークデバイス
- vioblk(4):仮想ディスクデバイス
- viomb(4):仮想メモリバルーンドライバ
- viornd(4):仮想乱数デバイス
- vioscsi(4):仮想SCSIアダプタドライバ
VirtIOはvmm(4)のために導入されたデバイスドライバではなく、KVMやQEMUのゲストとして高速荷動作するために導入されたデバイスドライバですが、vmm(4)でもその恩恵を受けることができます。
今後の発展が楽しみなハイパーバイザ
OpenBSD vmm(4)はFreeBSD bhyve(4)と比較してもさらにシンプルな印象を受けます。bhyve(4)の制御コマンドであるbhyvectl(8)はより多種多様な制御オプションを提供していますし、使用するネットワークインターフェースもFreeBSDカーネルの提供している別の機能を利用して用意します。
一方、OpenBSD vmmctl(8)はよりシンプルです。幅広い選択肢を用意するというよりも、まずはOpenBSDカーネルを動作させるための整った実装を用意し、シンプルなコマンドを提供するといった状態にあるように見えます。
OpenBSDがvmm(4)をデフォルトの機能として提供するようになると、OpenBSD(4)を使ったシステムやプロダクトの組み方もまた大きく変わってきます。マルチコアやメニーコアに対するスケーラビリティに関しては今後も改善の取り組みを続ける必要があると言えますが、仮想マシンごとに独立したpf(4)の活用を行うといったことができますし、これまでにはなかったような活用方法が考えられます。
一般ユーザがvmm(4)の機能を使うのは、早くても次のリリースとなるOpenBSD 5.9以降になると思いますが、今後のリリースが楽しみな機能です。OpenBSDはこのところ興味深い取り組みを続けており、今後も目が離せないプロジェクトです。