FreeBSD勉強会 第11回 FreeBSDハイパーバイザ「BHyVe」の仕組み・使い方紹介

話は全体的に仮想化技術についてでした。最後の方でBHyVeについて話していました。

完全仮想化 VirtualBOX

実ハードウエアを完全にエミュレートし、既存のOSをそのまま仮想マシン上で動作させる。OSに一切手を加えない。高速化のためにCPUの部分はエミュレートしない。CPUにはユーザモードとカーネルモードがある。アプリケーションが破壊しそうな行動がきたらハンドルしてエラーを返す。権限の分離を行なっている。ユーザモードで仮想化のマシンを動かす。システム全体に影響を与えるのはユーザモードではできない。なので、できないのをトラップで検知して特権処理に合わせてエミュレートを行う。特権命令ではないセンシティブ命令がある。

昔の手法

バイナリトランスレーション

ゲストのプログラムを実行中に書き換え。実行されるとまずい命令を置き換える。システム影響を与えないで実行できるようにする。VMwareが主にやっている。ハードウエア仮想化支援ができる前にはこれが行われていた。

ハードウエア仮想化による仮想化(IntelVT,AMD-V)

Intelだとリングだと呼ばれている。ハードウエアに仮想化用のモードが用意されている。ハードウエア的にトラップできるようになっている。仮想化のオーバヘッドがなくなると共に、ハイパーバイザーの実装が簡単になった。

仮想化のソフトウエアの種類

Virtual Box

FreeBSDでBHyVe以外で動く唯一のハードウエア仮想化対応のハイパーバイザー。あまりサーバ用途ではなく、デスク通っップ用途。特徴として多くのホストOSで動く。

Xen(HVM)ゼン
  • ハードウエア上で直接Xenハイパーバイザが動作する。
  • 準仮想化された管理OSを用いる必要がある。FreeBSDは対応してない。(dom0が動けない)LinuxtとかNetBSDが動く。サーバ用途が中心。
  • HVMはそのままWindowsが動く。
LinuxKVM

BHyVe

準仮想化

Xen(PVM)

P実ハードウエアを完全にエミュレートするのではなく、仮想化に都合が良い構造にゲストOSを改変。センティブ命令はソースコードレベルであらかじめ書き換えられている。バイナリトランスレーションなどのように実行中に書き換えてない。そのため、バイナリトランスレーションよりもいくつかのベンチマークでは性能が高く評価される。オーバヘッドが低い。OSを書き換えてしまえという発想から生まれた。

完全仮想化に用いられている実ハードウエアと仮想化ディバイスをエミュレートするのは必ずしも良いわけでは無い。なぜならば、ゲストとハイパーバイザ間のモード切り替えの回数が無駄に多いためメモリコピーが発生して必ずしも性能が高くない。

準仮想化ではゲストとハイパーバイザのやりとりに最適化されているため既存のディバイスよりもオーバヘッドが少ない。NICとHDDのがKVMでは導入されている。BHyVeでも実装されている。ソースまるごとではなく公開されている資料を作られている。

Jail

コンテナ型仮想化

  • 一つのOS上に擬似的に複数のOS環境を作り、OSの各種リソース情報をコンテナごとに別々に管理することにより、プロセスごとにして別のOSで有るかのように見せる。
  • 複数のバージョンのOSを仮想化には向いてない
  • ホストがカーネルパニックになるとダメ

あるプロセスに対して、あるディレクトリをルートディレクトリに見せる。上位ディレクトリが見えないような挙動を行う。

  • Jail

chrootに加えて、プロセス空間も独立

  • Jail+VIMAGE

ネットワーックスタックも独立
netstat -nrを実行してもJailの外側のルーティングテーブルは見えない。

準仮想化原理的にはオーバヘッドが少ないが、できることが少ない。

BHyVeの詳細

  • Linux KVMのようなもの
  • FreeBSD10へのマージを目指して開発中。
  • Intel-VT-x EPT対応のCPUで動作Nehalem以降のCPU
  • http://ark.intel.com/にCPUのリストがあり。対応しているからしてないかがわかる。dmesgはEPTではわからない。
  • NetAPの二人が頑張って開発している。
  • 今はKVMのような機能が揃っているわけではない。
  • FrreeBSD8.1-10 amd64は無改造で動く
  • FreeBSD7.22-10/amd64は要改造
  • amd64のみ32bitは対象外
  • 最初はFreeBSD8ベースで開発していた。8と9と10ではうごくのではないか。
  • 現在はFreeBSDのみ動く。
  • Linuxも動くらしいがコードは出してない。(ぼそっとRedhatが動いたみたいな事を行っていた時があった。)
  • 仮想コンソールはビデオというより文字が表示できるのみ。でもなぜか、CPIパススルーはできている。
  • SMP対応(最大8コア)
  • HDDとNICとはバートIO
設定方法

CFT: Hands-on BHyVe http://callfortesting.org/bhyve/

  • VMware上でBHyVeを動かせる
  • デモではVMwareFusionで動かしていた。
  • ホスト側での設定
  • Pysicalmen で使うメモリ量を指定する。これをしてしないとメモリが無いと言われる。
  • vmm.koをロードする必要がある
  • #/root/bhyve-guest
  • Bhyveload-m 128 -h . mygest
  • BIOSが無いのメモリをかくほしてやる
  • Destoryしないとメモリを確保されたままになる。
  • Hw.physmem
  • VMごとにディバイスファイルができる、中には状態が入る。/dev/vmm/$VMNAME ができる。
  • BIOSが無いのでディスクイメージのブートセクタから起動できないで変わりんbhyveloadによりメモリの構造体を作る。
  • コンソールが遅いだけ。ネットからSSHでつなげれれば速い
  • PCIはビデオ周りはだめ。NIC周りはいける。IOAPICエミュレートを持たないためレガシ割り込みは非サポート。MSIのみMSIーXはダメ、MSI割り込みをするとわかっているもの飲み使える。
  • Virtioの仕様にそったネットとbloc(HDD)をサポート

仕様の書いてあるPDFは以下の通り
http://ozlabs.org/~rusty/virtio-spec/virtio-paper.pdf

ゲストカーネルの変更点
  • 変更している点は実装してない部分
  • カスタムコンソールとデバッグポート
  • com0 emulation or VGA emulationが必要
  • コンソール出力がOSに無いものを利用しているため
  • 設定しないと何も出ない。
  • Local API はMSR経由でアクセス(MMIO非サポートのため)
  • Local APIC MMIO supportが必要、
  • memory mapd IOが無い状態。
  • SMPの場合2個めからどうするか?
  • 2つめ以降のquick hackが必要。
実装中の機能
  • BIOS 7割、8割はできている。が10割できないと使えない。起動してFreeBSDのロゴは見えるようにはなっている。
  • Guest suspend /resume これがライブグレーションができるようになる。動いているマシンを移動できるようになる。

MMIO local APIC できたと言っているがソースは見てない

  • IOAPIC emulation できた。レガシー割り込みができるようになったらしい。現在はMSI割り込みのみ
  • AMD-V support 命令とかゲストマシンの情報の持ち方が違う、AMD用のコードは書かないといけない。

やろうと思っているが手はつけてない。

  • Older Intel CUP supprt(witout EPT)Core2tDuoとかうわっどで動かすようにしたいが、優先度は高くない。
  • libvirt対応
  • これがあると、情報が取れるようになる。
  • ブートローダ
  • ゲスト側を改造しなくてすむ。
  • NetBSDからだと楽なのでは
  • Q10ではどれくらいでうごくのをマージされるの?
  • AゲストとしてFreeBSDで、手を加えないでうごけばいいなレベルにする予定。
  • FreeBSDはベースとportsにわかれており、ベースに全部入れようとしているが、LInuxのboot loader はporsでいいのではないかと思っている。
  • Q複数立ち上げる場合には
  • A/dev/vmm/$vmname ごとにつくってそれを立ち上げる。他のプロセスと同じ。
  • QEMUにたよるとBIOSとか支援されて楽になる。が、ソースを読んでいて残念になるのと、GPL汚染があるので全部自前でやる。
次回

次回は佐藤先生がやる予定
FDTが導入されたよ!的な組み込み系の話になるみたい。
日時は11月2日