Contenu connexe
Similaire à BHyVeってなんや (20)
Plus de Takuya ASADA (20)
BHyVeってなんや
- 6. x86 上で x86 を仮想化して
るんだから、命令を直接実
CPU で実行したい!
※ 但し実行しちゃまずい奴はどうにかしてね♥
6
- 7. x86 上で x86 を仮想化して
るんだから、命令を直接実
CPU で実行したい!
※ 但し実行しちゃまずい奴はどうにかしてね♥
7
- 17. 根性でどうにかする
● VMWare
– 実行時にマズい命令を動的に書き換え
● Xen
– 手で書き換え
17
- 26. VMCS 構造体
● Virtual Machine Control Structure
●
4KB の構造体
● 保存するもの
– 例外の引き起こす命令の設定
– プログラムカウンタの値
– 各種レジスタの値
– VM のメモリ開始位置 etc...
26
- 27. Intel VT でのゲスト OS 動作の流れ
1.VMCS にゲスト環境の設定をロード
2.CPU に VMCS をセット
3.VMLAUNCH でゲストモードに切り替え
4.
ゲスト環境実行
5.
何らかの trap 要因が発生、 VMExit する
6.VMExit 要因を調べ、要因に合わせたエミュレーション処理を行う
7.3 に戻る
27
- 30. Intel VT でのゲスト OS 動作の流れ
1.VMCS にゲスト環境の設定をロード
2.CPU に VMCS をセット
3.VMLAUNCH でゲストモードに切り替え
4.
ゲスト環境実行
5.
何らかの trap 要因が発生、 VMExit する
6.VMExit 要因を調べ、要因に合わせたエミュレーション処理を行う
7.3 に戻る
エミュレータが欲しいなら、 QEMU を使えばいいじゃない
30
- 32. Intel VT でのゲスト OS 動作の流れ
1.VMCS にゲスト環境の設定をロード
2.CPU に VMCS をセット
3.VMLAUNCH でゲストモードに切り替え
4.
ゲスト環境実行
5.
何らかの trap 要因が発生、 VMExit する
6.VMExit 要因を調べ、要因に合わせたエミュレーション処理を行う
7.3 に戻る
白いところを KVM がやる。黄色いところを QEMU がやる。
32
- 37. BHyVe ってなんやろ?
● 最近出てきたばっかりのハイパーバイザ
( 2011/05/13 に NetApp が BSDCan で発表)
●
FreeBSD カーネルの1機能として実装されている
→平たく言うと Linux KVM の FreeBSD 版!
● シンプルな構造
●
BSD ライセンス
● 絶賛開発中( http://wiki.freebsd.org/BHyVe )
37
- 40. BHyVe 詳細
● Intel VTx, EPT サポート必須(シャドーページング非サポート)
→ Nehalem 以降の Intel CPU のみ対応
● AMD SVM 未対応
● BIOS Emulation /ディスクイメージからのブート未対応
ゲストカーネルをロードする事によって起動
ゲストカーネルローダは FreeBSD カーネルのみ対応
● ブロックデバイスは virtioblk にのみ対応
● イーサネットデバイスは virtionet にのみ対応
● コンソールデバイスは独自ドライバが必要、 UART コンソールは絶賛実装中
● VGA デバイス・ PS/2 デバイス・ USB デバイスなどは未対応
●
Intel VTd に対応、 PCI passthrough 可能
● MSI 割り込みのみ対応→ Legacy 割り込み/ MSIX 割り込み未対応
40
- 45. BHyVe 利用例
● 参考資料:
http://callfortesting.org/bhyve/
から http://people.freebsd.org/~neel/bhyve/vm1.tar.gz を
ダウンロード、 vmrun.sh を参照
kldload vmm.ko
/usr/sbin/bhyveload m ${lowmem} M {highmem} h {bootdir} ${vmname}
/usr/sbin/bhyve c ${cpus} m ${lowmem} M{highmem}
s 1,virtionet,tap0 s 2,virtioblk,${diskdev}
45
- 47. bhyveload??
● 参考資料: http://callfortesting.org/bhyve/
kldload vmm.ko
/usr/sbin/bhyveload m ${lowmem} M {highmem} h {bootdir}
${vmname}
/usr/sbin/bhyve c ${cpus} m ${lowmem} M{highmem}
s 1,virtionet,tap0 s 2,virtioblk,${diskdev} ${vmname}
お前何者だ? 47
- 48. 各コマンドの役割分担
● /usr/sbin/bhyveload
VM インスタンスを作成し、 BSD カーネルを VM インスタンスのメモリ領域にロ
ードして起動可能な状態を作る
● /usr/sbin/bhyve
bhyveload が初期化した VM インスタンスを実行し、ディスク、 NIC 、コンソール
などのデバイスエミュレーション処理を行う
VM インスタンスの状態は、プロセス内ではなく /dev/vmm/${vmname} というデバ
イス上、つまりカーネル内に保持される。
このファイルへ read(), write(), mmap() する事により VM 内のメモリ空間にアクセ
ス出来る。
48
- 49. なにそれこわい
● YES WE CAN!!
dd if=/dev/vmm/testvm of=memdump bs=1024 count=1024
● 僕が狂ったこと言ってるんじゃなく、
BSDCan で NetApp が発表したスライドに出てくる
49
- 50. bhyveload の動作
● sysctl(“hw.vmm.create”, vm_name)
→ /dev/vmm/${vm_name} を作成
● open(/dev/vmm/${vm_name})
● seg.gpa = 0
seg.len = mem_size
ioctl(fd, VM_MAP_MEMORY, seg)
membase = mmap(NULL, mem_size, PROT_READ|PROT_WRITE,
MAP_SHARED, fd, 0)
●
userboot.so を使って membase の領域へ BSD カーネルを memcpy()
50
- 51. bhyve の動作
● open(/dev/vmm/${vm_name})
● デバイス初期化
● pthread_create(fbsdrun_start_thread)
fbsdrun_start_thread() {
while(1) {
ioctl(VM_RUN, &vmexit)
handler[vmexit.exitcode](&vmexit, &vcpu);
}
}
● メイン関数はデバイスエミュレーションの処理要求イベントを kevent() で待つ
51