Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

BHyVeってなんや

12,513 views

Published on

Published in: Technology
  • Be the first to comment

BHyVeってなんや

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

×