32
28. Sep. 2012 BHyVe: The BSD Hypervisor Takuya ASADA a.k.a @syuu1228 12104日木曜日

BHyVe: The BSD Hypervisor

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: BHyVe: The BSD Hypervisor

28. Sep. 2012

BHyVe: The BSD HypervisorTakuya ASADA a.k.a @syuu1228

12年10月4日木曜日

Page 2: BHyVe: The BSD Hypervisor

仮想化とFreeBSD

12年10月4日木曜日

Page 3: BHyVe: The BSD Hypervisor

仮想化とは?

✤ 一台のコンピュータ上に複数の仮想的なコンピュータを動作させ、それぞれの上でOS・アプリケーションを実行

✤ 複数のOSを調停するソフトウェア→ハイパーバイザ

ハードウェア

OS

プロセス

ハイパーバイザ

OS

プロセス

OS

プロセス

ハードウェア

従来 仮想化

12年10月4日木曜日

Page 4: BHyVe: The BSD Hypervisor

FreeBSDにおける仮想化の種類

✤ 完全仮想化 VirtualBox, Xen(HVM), BHyVe

✤ 準仮想化 Xen(PVM)

✤ コンテナ型仮想化 Jail

12年10月4日木曜日

Page 5: BHyVe: The BSD Hypervisor

完全仮想化

✤ 実ハードウェアを完全にエミュレートし、既存のOSをそのまま仮想マシン上で動作させる ↔ 準仮想化

✤ 高速化の為、ゲストマシンで実行されるプログラムを直接実CPUで実行

ハイパーバイザ

既存OS

プロセス

既存OS

プロセス

ハードウェア

12年10月4日木曜日

Page 6: BHyVe: The BSD Hypervisor

ゲストマシンのプログラムの直接実行

✤ 仮想化対象のCPUに期待される動作

✤ ユーザモードでゲストマシン上のプログラムを直接実行

✤ システム全体に影響を与える命令(センシティブ命令)はユーザモードから実行出来ない(=特権命令)→トラップが発生してカーネルモードへ遷移

✤ トラップハンドラで実行しようとした特権命令に合わせてエミュレーション処理を行い、ゲストプログラムの実行に戻る

カーネルモード(ring0)

ユーザモード(ring3)

特権命令が実行されたらカーネルモードへ遷移

ゲストプログラムを直接実行

特権命令の実行をハンドル、エミュレーション実行

12年10月4日木曜日

Page 7: BHyVe: The BSD Hypervisor

x86アーキテクチャの問題点

✤ 特権命令ではないセンシティブ命令がある→権限が不足していない為トラップされないこれの実行を回避する必要がある

カーネルモード(ring0)

ユーザモード(ring3)

ゲストプログラムを直接実行

特権命令の実行をハンドル、エミュレーション実行

12年10月4日木曜日

Page 8: BHyVe: The BSD Hypervisor

バイナリトランスレーション

✤ ゲストのプログラムを実行中に書き換え、センシティブ命令をエミュレーション処理に置き換える事により実行を回避

✤ 現在では後述のハードウェア仮想化支援が主流になったが、以前はこれが主流の方式だった

12年10月4日木曜日

Page 9: BHyVe: The BSD Hypervisor

ハードウェア仮想化支援機能による仮想化(Intel VT, AMD-V)✤ CPUにRingとは独立した仮想化用のモードを追加:ハイパーバイザモード、ゲストモード

✤ ゲストモードはセンシティブ命令の実行などエミュレーションが必要な処理が発生した時点で中断され、ハイパーバイザモードへ復帰する

✤ ハードウェアレベルで仮想化に対応する事により、仮想化オーバヘッドを低減しながらハイパーバイザの実装を単純化出来るようになった

カーネルモード

ユーザモード

カーネルモード

ユーザモード

ハイパーバイザモード

ゲストモード

ring 0

ring 3

12年10月4日木曜日

Page 10: BHyVe: The BSD Hypervisor

VirtualBox

✤ BHyVe以外で唯一FreeBSD上で動作するハードウェア仮想化支援対応のハイパーバイザ

✤ ホストカーネル上のドライバとしてハイパーバイザが動作、ゲストマシンは通常のプロセスとしてFreeBSDが管理

✤ デスクトップ用途が中心

✤ ライセンス:GPLv2

✤ オラクルが開発、多くのOS上で動作

ホストOS

プロセスゲストOS

プロセス

ハードウェア

ハイパーバイザ

12年10月4日木曜日

Page 11: BHyVe: The BSD Hypervisor

Xen(HVM)

✤ ハードウェア上で直接Xenハイパーバイザが動作

✤ ユーザからの操作やハードウェアへのアクセスには「dom0」と呼ばれる準仮想化された管理OSを用いる(FreeBSDは対応していない)

✤ サーバ用途が中心

✤ ライセンス:GPLv2

✤ XenハイパーバイザはXenコミュニティで開発各OSの準仮想化対応はそれぞれのOSのコミュニティ・開発元で開発

ハイパーバイザ

dom0

プロセス

HVM

プロセス

ハードウェア

12年10月4日木曜日

Page 12: BHyVe: The BSD Hypervisor

Linux KVM(参考)

✤ ハイパーバイザはLinuxカーネルに統合

✤ ゲストマシンは通常のプロセスとしてLinuxが管理

✤ サーバ用途が中心

✤ ライセンス:GPLv2

✤ Linuxカーネルコミュニティで開発

ホストOS

プロセスゲストOS

プロセス

ハードウェア

ハイパーバイザ

12年10月4日木曜日

Page 13: BHyVe: The BSD Hypervisor

BHyVe

✤ Linux KVMのFreeBSD版!

✤ ハイパーバイザはFreeBSDカーネルに統合

✤ ゲストマシンは通常のプロセスとしてFreeBSDが管理

✤ サーバ用途が中心

✤ ライセンス:BSDL

✤ FreeBSDコミュニティで開発(baseへのマージを目指している)

ホストOS

プロセスゲストOS

プロセス

ハードウェア

ハイパーバイザ

12年10月4日木曜日

Page 14: BHyVe: The BSD Hypervisor

準仮想化 - Xen(PVM)

✤ 実ハードウェアを完全にエミュレートするのではなく、仮想化に都合が良い構造にゲストOSを改変センシティブ命令の実行やハードウェアアクセスなどハイパーバイザによるエミュレーションが必要な処理は、ゲストからハイパーバイザを呼び出す「ハイパーバイザコール」に置き換え

✤ 高速化の為、ゲストマシンで実行されるプログラムを直接実CPUで実行センシティブ命令の実行など実行されてはまずい処理は予め書き換えられているので、バイナリトランスレーションやハードウェア仮想化支援を必要としない

✤ 現在ではハードウェア仮想化支援(HVM)を使う事が多くなったが、登場時はハードウェア仮想化は未だ存在しておらず、バイナリトランスレーションよりもいくつかのベンチマークで性能が高く、オーバヘッドも低かった

ハイパーバイザ

dom0

プロセス

PVM

プロセス

ハードウェア

12年10月4日木曜日

Page 15: BHyVe: The BSD Hypervisor

準仮想化デバイス

✤ 完全仮想化環境で用いられているHDDやNICなどの仮想デバイスは実デバイスをエミュレートしているのでゲストOS上の既存のドライバが使えるが、ゲスト・ハイパーバイザ間のモード切り替え回数が無駄に多い、メモリコピーが発生するなど必ずしも性能が高くない

✤ 準仮想化環境で用いられている仮想デバイスはゲスト・ハイパーバイザ間のデータのやり取りに最適化されている為、既存デバイスのエミュレーションよりも性能が高い

✤ 準仮想化デバイスを完全仮想化環境にも導入しよう→ virtioBHyVeでも使用

12年10月4日木曜日

Page 16: BHyVe: The BSD Hypervisor

コンテナ型仮想化

✤ 1つのOS上に擬似的に複数のOS環境を作り、OSの各種リソース情報をコンテナごとに別々に管理する事により、プロセスに対し別々のOSであるかのように見せかける

✤ オーバヘッドは最も低いが、OSは1つしか動作していないので再起動やpanicには全コンテナが巻き込まれる、1つのバージョンのOSにしか対応しない、異なるOSの混在環境は作れないなどの制約がある

OS

プロセス プロセス

ハードウェア

コンテナ

12年10月4日木曜日

Page 17: BHyVe: The BSD Hypervisor

コンテナ型仮想化

✤ chrootあるプロセスに対して、あるディレクトリをルートディレクトリに見せる(ls /しても指定したディレクトリより上位ディレクトリは見えない)

✤ jailchrootに加えて、プロセス空間も独立(ps axを実行してもjailの外側のプロセスは見えない)

✤ jail + VIMAGE更にネットワークスタックも独立(netstat -nrを実行してもjailの外側のルーティングテーブルは見えない)

12年10月4日木曜日

Page 18: BHyVe: The BSD Hypervisor

BHyVe詳解

12年10月4日木曜日

Page 19: BHyVe: The BSD Hypervisor

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日木曜日

Page 20: BHyVe: The BSD Hypervisor

BHyVe実演自分でも試してみたい人はhttp://callfortesting.org/bhyve/をチェック!

12年10月4日木曜日

Page 21: BHyVe: The BSD Hypervisor

/boot/loader.conf

✤ hw.physmemでホストOSのメモリサイズを制限(0x100000000 = 4GB)

✤ BHyVeのカーネルモジュールであるvmm.koをロード

hw.physmem="0x100000000"vmm_load=”YES”

12年10月4日木曜日

Page 22: BHyVe: The BSD Hypervisor

/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日木曜日

Page 23: BHyVe: The BSD Hypervisor

/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日木曜日

Page 24: BHyVe: The BSD Hypervisor

カーネルとユーザランドの役割分担

✤ 各デバイスのエミュレーション、仮想マシンのコンソールなどのUIはユーザランドで動作する/usr/sbin/bhyveが受け持つ

✤ VT-xの機能を用い、CPUをゲストモードへ切り替えるのはカーネルにロードされたvmm.koが受け持つ

FreeBSDカーネルvmm.ko

/usr/sbin/bhyve

カーネル

ユーザ

ハイパーバイザモード ゲストモード

仮想デバイス

ゲストOS

ioctl

12年10月4日木曜日

Page 25: BHyVe: The BSD Hypervisor

メモリ仮想化

✤ hw.physmemで制限されたメモリ領域の外側から仮想マシン起動時に固定的に割り付け

✤ 仮想マシン間のページ共有無し

✤ オンデマンドメモリ割り付け無し

✤ これにより、PCIパススルー時のメモリマップが簡単になった

12年10月4日木曜日

Page 26: BHyVe: The BSD Hypervisor

PCIパススルー

✤ Intel VT-dにより物理PCIデバイスをパススルー

✤ IOAPICエミュレーションを持たない為、レガシ割り込みは非サポートMSI割り込みのみをサポート(MSI-X割り込みも非サポート)

✤ ホストOSで割り込みを受け取ってゲストへ送り込むため、ホストにstubドライバが必要

12年10月4日木曜日

Page 27: BHyVe: The BSD Hypervisor

virtio

✤ virtioの仕様に沿ったvirtio-net, virtio-blkをサポートhttp://ozlabs.org/~rusty/virtio-spec/virtio-paper.pdf

✤ virtio-netは/dev/tapNを通してイーサネットフレームを送受信

✤ virtio-blkはホストファイルシステム上のディスクイメージを読み書き

12年10月4日木曜日

Page 28: BHyVe: The BSD Hypervisor

パフォーマンス

✤ /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日木曜日

Page 29: BHyVe: The BSD Hypervisor

ゲストカーネルの変更点

✤ カスタムコンソール&デバッグポート→ com0 emulationかVGA emulationが必要

✤ Local APICはMSR経由でアクセス(MMIO非サポートの為)→ Local APIC MMIO supportが必要

✤ セカンダリプロセッサを直接64bitモードで起動→ BIOS emulationが必要(?)

12年10月4日木曜日

Page 30: BHyVe: The BSD Hypervisor

実装中の機能

✤ 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日木曜日

Page 31: BHyVe: The BSD Hypervisor

やってくれる人がいるといいな

✤ libvirt対応

✤ NetBSD, OpenBSD, Linuxなどのローダ

✤ PCIパススルーのテスト

12年10月4日木曜日

Page 32: BHyVe: The BSD Hypervisor

最新情報はこちらまで

✤ http://bhyve.org/

✤ @syuu1228

12年10月4日木曜日