「bhyve」の版間の差分

提供: FreeBSD入門
移動: 案内検索
行8: 行8:
 
== 概要 ==
 
== 概要 ==
 
[[bhyve]] は、[[FreeBSD 10.0-RELEASE]]の一部として2014/01/02に正式にリリースされました。
 
[[bhyve]] は、[[FreeBSD 10.0-RELEASE]]の一部として2014/01/02に正式にリリースされました。
簡単にいうとLinux KVMのFreeBSD版です。ハイパーバイザは、[[FreeBSD]] [[カーネル]]
+
簡単にいうとLinux KVMのFreeBSD版です。ハイパーバイザは、[[FreeBSD]] [[カーネル]]に統合されています。
統合されています。
+
 
 +
[[bhyve]]は、仮想マシンを作成すると /dev/vmm/仮想マシン名 のファイルが作成されます。
 
== ライセンス ==
 
== ライセンス ==
 
BSDライセンス
 
BSDライセンス
 
== 仕様 ==
 
== 仕様 ==
 
* Intel VT-x, EPTサポートが必須です。
 
* Intel VT-x, EPTサポートが必須です。
 +
** CPU仮想化機能のためVT-Xが必須です。
 +
** メモリ仮想化機能のためEPTが必須です。
 
** Nehalem 以降のCPU
 
** Nehalem 以降のCPU
 
** シャドーページングは、サポート外です。
 
** シャドーページングは、サポート外です。
行20: 行23:
 
** BIOS Emulation / ディスイメージからのブートに未対応
 
** BIOS Emulation / ディスイメージからのブートに未対応
 
** bhyveloadでメモリの構造体を作成する。
 
** bhyveloadでメモリの構造体を作成する。
 +
* I/Oは、[[bhyve]]専用コンソール、[[virtio]], VT-d によるパススルー
 
* コンソールは遅い。
 
* コンソールは遅い。
 
* PCI
 
* PCI
行27: 行31:
 
*** MSI-Xは非サポート
 
*** MSI-Xは非サポート
 
* vmm.koが必要です。
 
* 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を使用します。
 +
<pre>
 +
QEMU
 +
|
 +
Linux kernel - kvm <-> Guest Kernel
 +
</pre>
 +
 +
[[FreeBSD]]の[[bhyve]]だと以下の通りです。
 +
<pre>
 +
bhyve
 +
|
 +
BSD kernel - vmm.ko <-> Guest Kernel
 +
</pre>
 +
 +
== インストール ==
 +
[[FreeBSD 10.0-RELEASE]]では、デフォルトでベースシステムに入っています。
 
== コマンド ==
 
== コマンド ==
* [[bhyve]]
+
;[[bhyve]]:bhyveloadが初期化した仮想マシンのインスタンスを実行し、ディスク、NIC、コンソール等のデバイスのエミュレーションを担当します。
* [[bhyvectl]]
+
;[[bhyvectl]]:仮想マシンの設定値の参照、変更を行います。
* [[bhyveload]]
+
;[[bhyveload]]:bhyve仮想マシンへFreeBSDゲストをロードします
* [[vmrun.sh]] (/usr/share/examples/bhyve/vmrun.sh)
+
;[[vmrun.sh]](/usr/share/examples/bhyve/vmrun.sh):仮想マシンを実行するスクリプトです。
 
== 設定 ==
 
== 設定 ==
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
行60: 行103:
 
       -l: LPC device configuration
 
       -l: LPC device configuration
 
       -m: memory size in MB
 
       -m: memory size in MB
 +
</syntaxhighlight>
 +
 +
<syntaxhighlight lang="bash">
 +
usage: bhyveload [-m mem-size] [-d <disk-path>] [-h <host-path>]
 +
                [-e <name=value>] [-c <console-device>] <vmname>
 
</syntaxhighlight>
 
</syntaxhighlight>
  

2014年3月27日 (木) 02:13時点における版

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

FreeBSDbhyveだと以下の通りです。

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)