bhyveってなんや
DESCRIPTION
TRANSCRIPT
1
BHyVeってなんや@syuu1228
2
ここでちょっとおさらい
3
4
x86での仮想化実現方法
5
6
x86上で x86を仮想化してるんだから、命令を直接実
CPUで実行したい!※ ♥但し実行しちゃまずい奴はどうにかしてね
7
x86上で x86を仮想化してるんだから、命令を直接実
CPUで実行したい!※ ♥但し実行しちゃまずい奴はどうにかしてね
8
9
10
11
12
13
直接実行しちゃマズい命令だけ trapしてエミュレーションすればいい
14
15
16
あれっこれ無理じゃね
17
根性でどうにかする
● VMWare–実行時にマズい命令を動的に書き換え
● Xen–手で書き換え
18
つらい
19
Intel VT
20
CPUにゲスト用のモードを追加!
21
22
23
VMX root mode(ハイパーバイザ側) VMX nonroot mode(ゲスト側)
24
VMX root mode(ハイパーバイザ側) VMX nonroot mode(ゲスト側)
VMLAUNCHVMRESUME
25
VMX root mode(ハイパーバイザ側) VMX nonroot mode(ゲスト側)
VMExit
26
VMCS構造体
● Virtual Machine Control Structure● 4KBの構造体● 保存するもの
– 例外の引き起こす命令の設定
– プログラムカウンタの値
– 各種レジスタの値
– VM のメモリ開始位置 etc...
27
Intel VTでのゲスト OS動作の流れ
1.VMCSにゲスト環境の設定をロード
2.CPUに VMCSをセット
3.VMLAUNCHでゲストモードに切り替え
4.ゲスト環境実行
5.何らかの trap要因が発生、 VMExitする
6.VMExit要因を調べ、要因に合わせたエミュレーション処理を行う
7.3に戻る
28
KVMの考え方
29
VTを前提にすればハイパーババイザ簡単に作れるん
じゃね?※VMWareとか Xenと比較して。
30
Intel VTでのゲスト OS動作の流れ
1.VMCSにゲスト環境の設定をロード
2.CPUに VMCSをセット
3.VMLAUNCHでゲストモードに切り替え
4.ゲスト環境実行
5.何らかの trap要因が発生、 VMExitする
6.VMExit要因を調べ、要因に合わせたエミュレーション処理を行う
7.3に戻る
エミュレータが欲しいなら、 QEMUを使えばいいじゃない
31
32
Intel VTでのゲスト OS動作の流れ
1.VMCSにゲスト環境の設定をロード
2.CPUに VMCSをセット
3.VMLAUNCHでゲストモードに切り替え
4.ゲスト環境実行
5.何らかの trap要因が発生、 VMExitする
6.VMExit要因を調べ、要因に合わせたエミュレーション処理を行う
7.3に戻る
白いところを KVMがやる。黄色いところを QEMUがやる。
33
簡単にハイパーバイザできちゃった!しかも速い!
34
おさらい終わり
35
ではそろそろBHyVeの話に戻ろうか
36
BHyVeってなんやろ?
知ってる人挙手 ノ
37
BHyVeってなんやろ?
● 最近出てきたばっかりのハイパーバイザ( 2011/05/13に NetAppが BSDCanで発表)
● FreeBSDカーネルの1機能として実装されている→平たく言うと Linux KVMの FreeBSD版!
● シンプルな構造
● BSDライセンス● 絶賛開発中( http://wiki.freebsd.org/BHyVe)
38
「車輪の再発明?」「そうだね。ただし BSDライセンスの車輪だ。」
39
/usr/sbin/bhyve
vmm.koBSD kernel
IOCTL(VM_RUN)
Guest kernel
User program
VMLAUNCH
VMExit
BHyVe動作イメージ
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割り込み未対応
41
もしかして:めっちゃ機能少ない
42
前向きに考えよう
43
今ならハイパーバイザのコードが簡単に全行読破出来る!
44
今なら簡単なパッチでハイパーバイザの開発に
参加し放題!
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}
46
KVM利用例(比較)
modprobe kvm_intel.ko
kvm m 512 vnc :0 \drive file=/foo/bar.img,if=virtio,index=0,boot=on \net nic,model=virtio,macaddr=00:11:22:33:44:55 \net tap,ifname=tap0
47
bhyveload??
● 参考資料: http://callfortesting.org/bhyve/
kldload vmm.ko
/usr/sbin/bhyveload m ${lowmem} M {highmem} h {bootdir} \ /usr/sbin/bhyveload m ${lowmem} M {highmem} h {bootdir} \ ${vmname}${vmname}
/usr/sbin/bhyve c ${cpus} m ${lowmem} M{highmem} \s 1,virtionet,tap0 s 2,virtioblk,${diskdev} ${vmname}
お前何者だ?
48
各コマンドの役割分担
● /usr/sbin/bhyveloadVMインスタンスを作成し、BSDカーネルをVMインスタンスのメモリ領域にロードして起動可能な状態を作る
● /usr/sbin/bhyvebhyveloadが初期化したVMインスタンスを実行し、ディスク、NIC、コンソールなどのデバイスエミュレーション処理を行う
VMインスタンスの状態は、プロセス内ではなく /dev/vmm/${vmname}というデバイス上、つまりカーネル内に保持される。このファイルへ read(), write(), mmap()する事によりVM 内のメモリ空間にアクセス出来る。
49
なにそれこわい
● YES WE CAN!!dd if=/dev/vmm/testvm of=memdump bs=1024 count=1024
● 僕が狂ったこと言ってるんじゃなく、BSDCanで NetAppが発表したスライドに出てくる
50
bhyveloadの動作
● sysctl(“hw.vmm.create”, vm_name)
→ /dev/vmm/${vm_name}を作成● open(/dev/vmm/${vm_name})● seg.gpa = 0
seg.len = mem_sizeioctl(fd, VM_MAP_MEMORY, seg)membase = mmap(NULL, mem_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)
● userboot.soを使ってmembaseの領域へ BSDカーネルをmemcpy()
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()で待つ