bhyveってなんや

51
1 BHyVe ってなんや @syuu1228

Upload: takuya-asada

Post on 05-Dec-2014

10.046 views

Category:

Technology


8 download

DESCRIPTION

 

TRANSCRIPT

Page 1: BHyVeってなんや

1

BHyVeってなんや@syuu1228

Page 2: BHyVeってなんや

2

ここでちょっとおさらい

Page 3: BHyVeってなんや

3

Page 4: BHyVeってなんや

4

x86での仮想化実現方法

Page 5: BHyVeってなんや

5

Page 6: BHyVeってなんや

6

x86上で x86を仮想化してるんだから、命令を直接実

CPUで実行したい!※ ♥但し実行しちゃまずい奴はどうにかしてね

Page 7: BHyVeってなんや

7

x86上で x86を仮想化してるんだから、命令を直接実

CPUで実行したい!※ ♥但し実行しちゃまずい奴はどうにかしてね

Page 8: BHyVeってなんや

8

Page 9: BHyVeってなんや

9

Page 10: BHyVeってなんや

10

Page 11: BHyVeってなんや

11

Page 12: BHyVeってなんや

12

Page 13: BHyVeってなんや

13

直接実行しちゃマズい命令だけ trapしてエミュレーションすればいい

Page 14: BHyVeってなんや

14

Page 15: BHyVeってなんや

15

Page 16: BHyVeってなんや

16

あれっこれ無理じゃね

Page 17: BHyVeってなんや

17

根性でどうにかする

● VMWare–実行時にマズい命令を動的に書き換え

● Xen–手で書き換え

Page 18: BHyVeってなんや

18

つらい

Page 19: BHyVeってなんや

19

Intel VT

Page 20: BHyVeってなんや

20

CPUにゲスト用のモードを追加!

Page 21: BHyVeってなんや

21

Page 22: BHyVeってなんや

22

Page 23: BHyVeってなんや

23

VMX root mode(ハイパーバイザ側) VMX non­root mode(ゲスト側)

Page 24: BHyVeってなんや

24

VMX root mode(ハイパーバイザ側) VMX non­root mode(ゲスト側)

VMLAUNCHVMRESUME

Page 25: BHyVeってなんや

25

VMX root mode(ハイパーバイザ側) VMX non­root mode(ゲスト側)

VMExit

Page 26: BHyVeってなんや

26

VMCS構造体

● Virtual Machine Control Structure● 4KBの構造体● 保存するもの

– 例外の引き起こす命令の設定

– プログラムカウンタの値

– 各種レジスタの値

– VM のメモリ開始位置 etc...

Page 27: BHyVeってなんや

27

Intel VTでのゲスト OS動作の流れ

1.VMCSにゲスト環境の設定をロード

2.CPUに VMCSをセット

3.VMLAUNCHでゲストモードに切り替え

4.ゲスト環境実行

5.何らかの trap要因が発生、 VMExitする

6.VMExit要因を調べ、要因に合わせたエミュレーション処理を行う

7.3に戻る

Page 28: BHyVeってなんや

28

KVMの考え方

Page 29: BHyVeってなんや

29

VTを前提にすればハイパーババイザ簡単に作れるん

じゃね?※VMWareとか Xenと比較して。

Page 30: BHyVeってなんや

30

Intel VTでのゲスト OS動作の流れ

1.VMCSにゲスト環境の設定をロード

2.CPUに VMCSをセット

3.VMLAUNCHでゲストモードに切り替え

4.ゲスト環境実行

5.何らかの trap要因が発生、 VMExitする

6.VMExit要因を調べ、要因に合わせたエミュレーション処理を行う

7.3に戻る

エミュレータが欲しいなら、 QEMUを使えばいいじゃない

Page 31: BHyVeってなんや

31

Page 32: BHyVeってなんや

32

Intel VTでのゲスト OS動作の流れ

1.VMCSにゲスト環境の設定をロード

2.CPUに VMCSをセット

3.VMLAUNCHでゲストモードに切り替え

4.ゲスト環境実行

5.何らかの trap要因が発生、 VMExitする

6.VMExit要因を調べ、要因に合わせたエミュレーション処理を行う

7.3に戻る

白いところを KVMがやる。黄色いところを QEMUがやる。

Page 33: BHyVeってなんや

33

簡単にハイパーバイザできちゃった!しかも速い!

Page 34: BHyVeってなんや

34

おさらい終わり

Page 35: BHyVeってなんや

35

ではそろそろBHyVeの話に戻ろうか

Page 36: BHyVeってなんや

36

BHyVeってなんやろ?

知ってる人挙手 ノ

Page 37: BHyVeってなんや

37

BHyVeってなんやろ?

● 最近出てきたばっかりのハイパーバイザ( 2011/05/13に NetAppが BSDCanで発表)

● FreeBSDカーネルの1機能として実装されている→平たく言うと Linux KVMの FreeBSD版!

● シンプルな構造

● BSDライセンス● 絶賛開発中( http://wiki.freebsd.org/BHyVe)

Page 38: BHyVeってなんや

38

「車輪の再発明?」「そうだね。ただし BSDライセンスの車輪だ。」

Page 39: BHyVeってなんや

39

/usr/sbin/bhyve

vmm.koBSD kernel

IOCTL(VM_RUN)

Guest kernel

User program

VMLAUNCH

VMExit

BHyVe動作イメージ

Page 40: BHyVeってなんや

40

BHyVe詳細● Intel VT­x, EPTサポート必須(シャドーページング非サポート)

→ Nehalem以降の Intel CPUのみ対応● AMD SVM未対応● BIOS Emulation/ディスクイメージからのブート未対応ゲストカーネルをロードする事によって起動ゲストカーネルローダはFreeBSDカーネルのみ対応

● ブロックデバイスはvirtio­blk にのみ対応

● イーサネットデバイスはvirtio­netにのみ対応● コンソールデバイスは独自ドライバが必要、UARTコンソールは絶賛実装中● VGAデバイス・PS/2デバイス・USBデバイスなどは未対応● Intel VT­dに対応、PCI passthrough可能● MSI割り込みのみ →対応 Legacy割り込み/MSI­X割り込み未対応

Page 41: BHyVeってなんや

41

もしかして:めっちゃ機能少ない

Page 42: BHyVeってなんや

42

前向きに考えよう

Page 43: BHyVeってなんや

43

今ならハイパーバイザのコードが簡単に全行読破出来る!

Page 44: BHyVeってなんや

44

今なら簡単なパッチでハイパーバイザの開発に

参加し放題!

Page 45: BHyVeってなんや

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,virtio­net,tap0 ­s 2,virtio­blk,${diskdev}

Page 46: BHyVeってなんや

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

Page 47: BHyVeってなんや

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,virtio­net,tap0 ­s 2,virtio­blk,${diskdev} ${vmname}

お前何者だ?

Page 48: BHyVeってなんや

48

各コマンドの役割分担

● /usr/sbin/bhyveloadVMインスタンスを作成し、BSDカーネルをVMインスタンスのメモリ領域にロードして起動可能な状態を作る

● /usr/sbin/bhyvebhyveloadが初期化したVMインスタンスを実行し、ディスク、NIC、コンソールなどのデバイスエミュレーション処理を行う

VMインスタンスの状態は、プロセス内ではなく /dev/vmm/${vmname}というデバイス上、つまりカーネル内に保持される。このファイルへ read(), write(), mmap()する事によりVM 内のメモリ空間にアクセス出来る。

Page 49: BHyVeってなんや

49

なにそれこわい

● YES WE CAN!!dd if=/dev/vmm/testvm of=memdump bs=1024 count=1024

● 僕が狂ったこと言ってるんじゃなく、BSDCanで NetAppが発表したスライドに出てくる

Page 50: BHyVeってなんや

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()

Page 51: BHyVeってなんや

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()で待つ