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