BHyVeってなんや

Post on 05-Dec-2014

10046 Views

Category:

Technology

8 Downloads

Preview:

Click to see full reader

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 non­root mode(ゲスト側)

24

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

VMLAUNCHVMRESUME

25

VMX root mode(ハイパーバイザ側) VMX non­root 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 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割り込み未対応

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,virtio­net,tap0 ­s 2,virtio­blk,${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,virtio­net,tap0 ­s 2,virtio­blk,${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()で待つ

top related