BHyVe: The BSD Hypervisor

2,210 views
2,130 views

Published on

Published in: Technology
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,210
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
20
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

BHyVe: The BSD Hypervisor

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

×