BHyVe ってなんや
  @syuu1228

              1
ここでちょっとおさらい


              2
3
x86 での仮想化実現方法


                4
5
x86 上で x86 を仮想化して
るんだから、命令を直接実
  CPU で実行したい!
    ※ 但し実行しちゃまずい奴はどうにかしてね♥




                             6
x86 上で x86 を仮想化して
るんだから、命令を直接実
  CPU で実行したい!
    ※ 但し実行しちゃまずい奴はどうにかしてね♥




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

              13
14
15
あれっ
これ無理じゃね

          16
根性でどうにかする
●   VMWare
    – 実行時にマズい命令を動的に書き換え
●   Xen
    –   手で書き換え




                          17
つらい


      18
Intel VT


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




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




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




                    VMLAUNCH
                    VMRESUME



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




                      VMExit




                                                          25
VMCS 構造体
●   Virtual Machine Control Structure
●
    4KB の構造体
●   保存するもの
    –   例外の引き起こす命令の設定
    –   プログラムカウンタの値
    –   各種レジスタの値
    –   VM のメモリ開始位置 etc...


                                        26
Intel VT でのゲスト OS 動作の流れ
1.VMCS にゲスト環境の設定をロード
2.CPU に VMCS をセット
3.VMLAUNCH でゲストモードに切り替え
4.
 ゲスト環境実行
5.
 何らかの trap 要因が発生、 VMExit する
6.VMExit 要因を調べ、要因に合わせたエミュレーション処理を行う
7.3 に戻る



                                      27
KVM の考え方


           28
VT を前提にすればハイパ
ーババイザ簡単に作れるん
     じゃね?
    ※VMWare とか Xen と比較して。




                            29
Intel VT でのゲスト OS 動作の流れ
1.VMCS にゲスト環境の設定をロード
2.CPU に VMCS をセット
3.VMLAUNCH でゲストモードに切り替え
4.
 ゲスト環境実行
5.
 何らかの trap 要因が発生、 VMExit する
6.VMExit 要因を調べ、要因に合わせたエミュレーション処理を行う
7.3 に戻る


          エミュレータが欲しいなら、 QEMU を使えばいいじゃない
                                          30
31
Intel VT でのゲスト OS 動作の流れ
1.VMCS にゲスト環境の設定をロード
2.CPU に VMCS をセット
3.VMLAUNCH でゲストモードに切り替え
4.
 ゲスト環境実行
5.
 何らかの trap 要因が発生、 VMExit する
6.VMExit 要因を調べ、要因に合わせたエミュレーション処理を行う
7.3 に戻る


    白いところを KVM がやる。黄色いところを QEMU がやる。
                                       32
簡単にハイパーバイザでき
ちゃった!しかも速い!

           33
おさらい終わり


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

                35
BHyVe ってなんやろ?




知ってる人挙手 ノ


                 36
BHyVe ってなんやろ?
●   最近出てきたばっかりのハイパーバイザ
    ( 2011/05/13 に NetApp が BSDCan で発表)
●
    FreeBSD カーネルの1機能として実装されている
    →平たく言うと Linux KVM の FreeBSD 版!
●   シンプルな構造
●
    BSD ライセンス
●   絶賛開発中( http://wiki.freebsd.org/BHyVe )

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

                38
BHyVe 動作イメージ

/usr/sbin/bhyve                      User 
                                    program
         IOCTL(VM_RUN)
                         VMExit

BSD kernel    vmm.ko              Guest kernel

                    VMLAUNCH                     39
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
前向きに考えよう


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

              43
今なら簡単なパッチで
ハイパーバイザの開発に
   参加し放題!

              44
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
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




                                                       46
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
各コマンドの役割分担
●   /usr/sbin/bhyveload
    VM インスタンスを作成し、 BSD カーネルを VM インスタンスのメモリ領域にロ
    ードして起動可能な状態を作る
●   /usr/sbin/bhyve
    bhyveload が初期化した VM インスタンスを実行し、ディスク、 NIC 、コンソール
    などのデバイスエミュレーション処理を行う

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


                                                            48
なにそれこわい
●   YES WE CAN!!
    dd if=/dev/vmm/testvm of=memdump bs=1024 count=1024
●   僕が狂ったこと言ってるんじゃなく、
    BSDCan で NetApp が発表したスライドに出てくる




                                                          49
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
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

BHyVeってなんや