bhyve: the bsd hypervisor
DESCRIPTION
TRANSCRIPT
28. Sep. 2012
BHyVe: The BSD HypervisorTakuya ASADA a.k.a @syuu1228
12年10月4日木曜日
仮想化とFreeBSD
12年10月4日木曜日
仮想化とは?
✤ 一台のコンピュータ上に複数の仮想的なコンピュータを動作させ、それぞれの上でOS・アプリケーションを実行
✤ 複数のOSを調停するソフトウェア→ハイパーバイザ
ハードウェア
OS
プロセス
ハイパーバイザ
OS
プロセス
OS
プロセス
ハードウェア
従来 仮想化
12年10月4日木曜日
FreeBSDにおける仮想化の種類
✤ 完全仮想化 VirtualBox, Xen(HVM), BHyVe
✤ 準仮想化 Xen(PVM)
✤ コンテナ型仮想化 Jail
12年10月4日木曜日
完全仮想化
✤ 実ハードウェアを完全にエミュレートし、既存のOSをそのまま仮想マシン上で動作させる ↔ 準仮想化
✤ 高速化の為、ゲストマシンで実行されるプログラムを直接実CPUで実行
ハイパーバイザ
既存OS
プロセス
既存OS
プロセス
ハードウェア
12年10月4日木曜日
ゲストマシンのプログラムの直接実行
✤ 仮想化対象のCPUに期待される動作
✤ ユーザモードでゲストマシン上のプログラムを直接実行
✤ システム全体に影響を与える命令(センシティブ命令)はユーザモードから実行出来ない(=特権命令)→トラップが発生してカーネルモードへ遷移
✤ トラップハンドラで実行しようとした特権命令に合わせてエミュレーション処理を行い、ゲストプログラムの実行に戻る
カーネルモード(ring0)
ユーザモード(ring3)
特権命令が実行されたらカーネルモードへ遷移
ゲストプログラムを直接実行
特権命令の実行をハンドル、エミュレーション実行
12年10月4日木曜日
x86アーキテクチャの問題点
✤ 特権命令ではないセンシティブ命令がある→権限が不足していない為トラップされないこれの実行を回避する必要がある
カーネルモード(ring0)
ユーザモード(ring3)
ゲストプログラムを直接実行
特権命令の実行をハンドル、エミュレーション実行
✕
12年10月4日木曜日
バイナリトランスレーション
✤ ゲストのプログラムを実行中に書き換え、センシティブ命令をエミュレーション処理に置き換える事により実行を回避
✤ 現在では後述のハードウェア仮想化支援が主流になったが、以前はこれが主流の方式だった
12年10月4日木曜日
ハードウェア仮想化支援機能による仮想化(Intel VT, AMD-V)✤ CPUにRingとは独立した仮想化用のモードを追加:ハイパーバイザモード、ゲストモード
✤ ゲストモードはセンシティブ命令の実行などエミュレーションが必要な処理が発生した時点で中断され、ハイパーバイザモードへ復帰する
✤ ハードウェアレベルで仮想化に対応する事により、仮想化オーバヘッドを低減しながらハイパーバイザの実装を単純化出来るようになった
カーネルモード
ユーザモード
カーネルモード
ユーザモード
ハイパーバイザモード
ゲストモード
ring 0
ring 3
12年10月4日木曜日
VirtualBox
✤ BHyVe以外で唯一FreeBSD上で動作するハードウェア仮想化支援対応のハイパーバイザ
✤ ホストカーネル上のドライバとしてハイパーバイザが動作、ゲストマシンは通常のプロセスとしてFreeBSDが管理
✤ デスクトップ用途が中心
✤ ライセンス:GPLv2
✤ オラクルが開発、多くのOS上で動作
ホストOS
プロセスゲストOS
プロセス
ハードウェア
ハイパーバイザ
12年10月4日木曜日
Xen(HVM)
✤ ハードウェア上で直接Xenハイパーバイザが動作
✤ ユーザからの操作やハードウェアへのアクセスには「dom0」と呼ばれる準仮想化された管理OSを用いる(FreeBSDは対応していない)
✤ サーバ用途が中心
✤ ライセンス:GPLv2
✤ XenハイパーバイザはXenコミュニティで開発各OSの準仮想化対応はそれぞれのOSのコミュニティ・開発元で開発
ハイパーバイザ
dom0
プロセス
HVM
プロセス
ハードウェア
12年10月4日木曜日
Linux KVM(参考)
✤ ハイパーバイザはLinuxカーネルに統合
✤ ゲストマシンは通常のプロセスとしてLinuxが管理
✤ サーバ用途が中心
✤ ライセンス:GPLv2
✤ Linuxカーネルコミュニティで開発
ホストOS
プロセスゲストOS
プロセス
ハードウェア
ハイパーバイザ
12年10月4日木曜日
BHyVe
✤ Linux KVMのFreeBSD版!
✤ ハイパーバイザはFreeBSDカーネルに統合
✤ ゲストマシンは通常のプロセスとしてFreeBSDが管理
✤ サーバ用途が中心
✤ ライセンス:BSDL
✤ FreeBSDコミュニティで開発(baseへのマージを目指している)
ホストOS
プロセスゲストOS
プロセス
ハードウェア
ハイパーバイザ
12年10月4日木曜日
準仮想化 - Xen(PVM)
✤ 実ハードウェアを完全にエミュレートするのではなく、仮想化に都合が良い構造にゲストOSを改変センシティブ命令の実行やハードウェアアクセスなどハイパーバイザによるエミュレーションが必要な処理は、ゲストからハイパーバイザを呼び出す「ハイパーバイザコール」に置き換え
✤ 高速化の為、ゲストマシンで実行されるプログラムを直接実CPUで実行センシティブ命令の実行など実行されてはまずい処理は予め書き換えられているので、バイナリトランスレーションやハードウェア仮想化支援を必要としない
✤ 現在ではハードウェア仮想化支援(HVM)を使う事が多くなったが、登場時はハードウェア仮想化は未だ存在しておらず、バイナリトランスレーションよりもいくつかのベンチマークで性能が高く、オーバヘッドも低かった
ハイパーバイザ
dom0
プロセス
PVM
プロセス
ハードウェア
12年10月4日木曜日
準仮想化デバイス
✤ 完全仮想化環境で用いられているHDDやNICなどの仮想デバイスは実デバイスをエミュレートしているのでゲストOS上の既存のドライバが使えるが、ゲスト・ハイパーバイザ間のモード切り替え回数が無駄に多い、メモリコピーが発生するなど必ずしも性能が高くない
✤ 準仮想化環境で用いられている仮想デバイスはゲスト・ハイパーバイザ間のデータのやり取りに最適化されている為、既存デバイスのエミュレーションよりも性能が高い
✤ 準仮想化デバイスを完全仮想化環境にも導入しよう→ virtioBHyVeでも使用
12年10月4日木曜日
コンテナ型仮想化
✤ 1つのOS上に擬似的に複数のOS環境を作り、OSの各種リソース情報をコンテナごとに別々に管理する事により、プロセスに対し別々のOSであるかのように見せかける
✤ オーバヘッドは最も低いが、OSは1つしか動作していないので再起動やpanicには全コンテナが巻き込まれる、1つのバージョンのOSにしか対応しない、異なるOSの混在環境は作れないなどの制約がある
OS
プロセス プロセス
ハードウェア
コンテナ
12年10月4日木曜日
コンテナ型仮想化
✤ chrootあるプロセスに対して、あるディレクトリをルートディレクトリに見せる(ls /しても指定したディレクトリより上位ディレクトリは見えない)
✤ jailchrootに加えて、プロセス空間も独立(ps axを実行してもjailの外側のプロセスは見えない)
✤ jail + VIMAGE更にネットワークスタックも独立(netstat -nrを実行してもjailの外側のルーティングテーブルは見えない)
12年10月4日木曜日
BHyVe詳解
12年10月4日木曜日
BHyVeとは
✤ Linux KVMのようなFreeBSDカーネルに統合されたハイパーバイザ
✤ FreeBSD 10へのマージを目指して開発中
✤ Intel VT-x、EPT対応CPUで動作(Nehalem以降のIntel CPU)
✤ 対応しているホストOS:FreeBSD 8.1 - 10/amd64(無変更)
✤ 対応しているゲストOS:FreeBSD 7.2 - 10/amd64(要改造)
✤ 対応デバイス:仮想ディスク、仮想NIC、仮想コンソール、PCIパススルー
✤ SMP対応(最大8コア)
12年10月4日木曜日
BHyVe実演自分でも試してみたい人はhttp://callfortesting.org/bhyve/をチェック!
12年10月4日木曜日
/boot/loader.conf
✤ hw.physmemでホストOSのメモリサイズを制限(0x100000000 = 4GB)
✤ BHyVeのカーネルモジュールであるvmm.koをロード
hw.physmem="0x100000000"vmm_load=”YES”
12年10月4日木曜日
/usr/sbin/bhyveload
✤ VMインスタンス(/dev/vmm/$VMNAME)を作成し、BSDカーネルをVMインスタンスのメモリ領域にロードして起動可能な状態を作る
✤ BIOSが無いのでディスクイメージのブートセクタから起動できない。代わりに、bhyveloadにより64bitモードでFreeBSDカーネルを実行する為の様々な初期化処理を行なっている
✤ ロードするだけで実行はしない。ブートローダが走っているように見えるのは、ホストOSへ移植されたゲスト専用のブートローダが動いているだけ
# /usr/sbin/bhyveload -m 256 -h /usr/guest myguest# ls /dev/vmmmyguest
12年10月4日木曜日
/usr/sbin/bhyve
✤ bhyveloadが初期化したVMインスタンスを実行し、ディスク、NIC、コンソールなどのデバイスエミュレーション処理を行う
✤ VMインスタンスの状態は、プロセス内ではなく/dev/vmm/$VMNAMEというデバイス上、つまりカーネル内に保持される。このファイルへread(), write(), mmap()する事によりVM内のメモリ空間にアクセス出来る
# /usr/sbin/bhyve -c 2 -m 256 -s 1,virtio-net,tap0 -s 2,virtio-blk,/usr/guest/diskdev.img myguest
12年10月4日木曜日
カーネルとユーザランドの役割分担
✤ 各デバイスのエミュレーション、仮想マシンのコンソールなどのUIはユーザランドで動作する/usr/sbin/bhyveが受け持つ
✤ VT-xの機能を用い、CPUをゲストモードへ切り替えるのはカーネルにロードされたvmm.koが受け持つ
FreeBSDカーネルvmm.ko
/usr/sbin/bhyve
カーネル
ユーザ
ハイパーバイザモード ゲストモード
仮想デバイス
ゲストOS
ioctl
12年10月4日木曜日
メモリ仮想化
✤ hw.physmemで制限されたメモリ領域の外側から仮想マシン起動時に固定的に割り付け
✤ 仮想マシン間のページ共有無し
✤ オンデマンドメモリ割り付け無し
✤ これにより、PCIパススルー時のメモリマップが簡単になった
12年10月4日木曜日
PCIパススルー
✤ Intel VT-dにより物理PCIデバイスをパススルー
✤ IOAPICエミュレーションを持たない為、レガシ割り込みは非サポートMSI割り込みのみをサポート(MSI-X割り込みも非サポート)
✤ ホストOSで割り込みを受け取ってゲストへ送り込むため、ホストにstubドライバが必要
12年10月4日木曜日
virtio
✤ virtioの仕様に沿ったvirtio-net, virtio-blkをサポートhttp://ozlabs.org/~rusty/virtio-spec/virtio-paper.pdf
✤ virtio-netは/dev/tapNを通してイーサネットフレームを送受信
✤ virtio-blkはホストファイルシステム上のディスクイメージを読み書き
12年10月4日木曜日
パフォーマンス
✤ /usr/srcをNFS上に/usr/objをローカルディスクにおいた時のmake build world時の速度を比較
build time(sec)Bare MetalPartitionedVirtualized
130813361446
0
375
750
1125
1500
Bare Metal Partitioned Virtualized
make buildworld
build time(sec)
12年10月4日木曜日
ゲストカーネルの変更点
✤ カスタムコンソール&デバッグポート→ com0 emulationかVGA emulationが必要
✤ Local APICはMSR経由でアクセス(MMIO非サポートの為)→ Local APIC MMIO supportが必要
✤ セカンダリプロセッサを直接64bitモードで起動→ BIOS emulationが必要(?)
12年10月4日木曜日
実装中の機能
✤ BIOS emulation (@syuu1228‘s Google Summer of Code 2012 project)
✤ Guest suspend/resume (@iorivur)
✤ AHCI emulation?
✤ MMIO local APIC?
✤ IOAPIC emulation?
✤ AMD-V support?
✤ Older Intel CPU support(without EPT)?
12年10月4日木曜日
やってくれる人がいるといいな
✤ libvirt対応
✤ NetBSD, OpenBSD, Linuxなどのローダ
✤ PCIパススルーのテスト
12年10月4日木曜日