bhyve
bhyve (BHyVe)とは、"BSD hypervisor"(BSDハイパーバイザー)です。bhyveは、FreeBSD向けに開発されたレガシーフリーなハイパーバイザー(Hypervisor)/仮想マシンマネージャです。bhyveは、拡張ページテーブル(Extednded Page Tables, EPT)やvirtio(VirtIO)ネットワーク/ストレージドライバのようなモダンなCPUの機能を利用します。また、bhyveコマンドです。
読み方
- bhyve
- びーはいぶ
目次
概要
bhyve は、FreeBSD 10.0-RELEASEの一部として2014/01/02に正式にリリースされました。 簡単にいうとLinux KVMのFreeBSD版です。ハイパーバイザは、FreeBSD カーネルに統合されています。
bhyveは、仮想マシンを作成すると /dev/vmm/仮想マシン名 のファイルが作成されます。
ライセンス
BSDライセンス
仕様
- Intel VT-x, EPTサポートが必須です。
- CPU仮想化機能のためVT-Xが必須です。
- メモリ仮想化機能のためEPTが必須です。
- Nehalem 以降のCPU
- シャドーページングは、サポート外です。
- AMD SVM 未対応
- BIOSがないため、ディスイメージから起動できない。
- BIOS Emulation / ディスイメージからのブートに未対応
- bhyveloadでメモリの構造体を作成する。
- I/Oは、bhyve専用コンソール、virtio, VT-d によるパススルー
- コンソールは遅い。
- PCI
- IO APICエミュレート機能を持たないため、レガシーな割り込みは非サポート。
- MSIのみサポート
- MSI割り込みするものだけが仕様できる
- MSI-Xは非サポート
- vmm.koが必要です。
x86の仮想化の実現方法
仮想マシンは、OSの上でCPUエミュレータ、仮想デバイスをエミュレートすることでゲストOSの実行環境を実現できます。しかし、すべてをエミュレーションすると実効速度が遅くなります。
x86上でx86を仮想化している場合、命令を直接CPUで実行したらよい、と考えられますが、すべての命令を実行できるわけではありません。そのため、直接実行できない命令をトラップし、エミュレーションする必要があります。
命令には、いくつか種類があります。
- 非特権命令
- 特権命令
- センシティブ命令
特権命令をユーザーモードで実行したときに、その特権命令をトラップできればいいのですが、x86 では、それが難しくなっています。 x86では、センシティブ命令が非特権命令であるため、ユーザーモードで実行できてしまいます。
x86アーキテクチャにおける仮想化は、センシティブ命令でかつ非特権命令を「静的」もしくは、「動的」に置き換える必要がありました。
- VMWare
- 動的な置き換え
- Xen
- 静的な置き換え
近年のハードウェア側で対応する機能をCPUで提供されています。
- インテル
- Intel Virtualization Technology (VT-x)
- AMD
- AMD Virtualization
ユーザーモードで実行されるゲストOSでセンシティブ命令を実行したとき、それがトラップされ、ルートモードのハイパーバイザによって、エミュレーションを実行し、仮想OSに処理を返します。
KVMは、VT-xを前提にハイパーバイザを作成しています。 KVMでは、エミュレーションの部分にQEMUを使用します。
QEMU | Linux kernel - kvm <-> Guest Kernel
FreeBSDのbhyveだと以下の通りです。
bhyve | BSD kernel - vmm.ko <-> Guest Kernel
インストール
FreeBSD 10.0-RELEASEでは、デフォルトでベースシステムに入っています。
コマンド
- bhyve
- bhyveloadが初期化した仮想マシンのインスタンスを実行し、ディスク、NIC、コンソール等のデバイスのエミュレーションを担当します。
- bhyvectl
- 仮想マシンの設定値の参照、変更を行います。
- bhyveload
- bhyve仮想マシンへFreeBSDゲストをロードします
- vmrun.sh(/usr/share/examples/bhyve/vmrun.sh)
- 仮想マシンを実行するスクリプトです。
設定
使い方
bhyveコマンド
bhyveコマンドとは
bhyveコマンドは、仮想マシン内でゲストオペレーティングシステムを実行するコマンドです。
コマンドラインオプション
Usage: bhyve [-aehAHIPW] [-g <gdb port>] [-s <pci>] [-S <pci>] [-c vcpus] [-p pincpu] [-m mem] [-l <lpc>] <vm> -a: local apic is in XAPIC mode (default is X2APIC) -A: create an ACPI table -g: gdb port -c: # cpus (default 1) -p: pin vcpu 'n' to host cpu 'pincpu + n' -H: vmexit from the guest on hlt -P: vmexit from the guest on pause -W: force virtio to use single-vector MSI -e: exit on unhandled I/O access -h: help -s: <slot,driver,configinfo> PCI slot config -S: <slot,driver,configinfo> legacy PCI slot config -l: LPC device configuration -m: memory size in MB
usage: bhyveload [-m mem-size] [-d <disk-path>] [-h <host-path>] [-e <name=value>] [-c <console-device>] <vmname>
関連項目
- bhyve
- bhyvectl
- bhyveload
- vmrun.sh (/usr/share/examples/bhyve/vmrun.sh)
ツイート