2012年7月31日火曜日

BHyVeハッカソンに参加してきました(3)

BHyVeハッカソンでの個人的な取り組みについて紹介してきます。
スライドを一応準備しました(二日目 4:00pm時点。その後いろいろと改良済み)





BHyVeはまだ誕生したばかりの仮想マシンモニタであり管理ツールなどもぜんぜん充実していません。正直なところ実用レベルに達するのは当分先の話でしょう(だからこそいじりがいがある、というものですが)。


実は BHyVe にはまだ仮想マシンをリスト表示するコマンドすら存在していないので、 vmmls というコマンドを実装してみました。


BHyVe では、仮想マシンを作成すると /dev/vmm/仮想マシン名 という名前で特殊な制御ファイルとして仮想マシンが見えるようになります。たとえば myguest という仮想マシンであれば /dev/vmm/myguest という名前です。

ls -l /dev/vmm/ とすれば仮想マシンの一覧はとれるのですが、ただそれだけなのはビミョーなので簡単なツールと作ってみました。 vmmls コマンドを実行すると仮想マシンの一覧と、現時点では highmem で指定されたメモリ量が表示されます。

また、仮想マシンに割り当て可能なメモリ量を表示するようにしてみました。

実は、「この仮想マシンに割り当て可能なメモリ量」を知ることは、現時点のBHyVeでは普通にはできません。なぜならば、BHyVeのメモリ管理機能は、以下の機能を提供しますが、本当にこれだけのことをできるだけの最低限の実装しかありませんでした。

  • FreeBSDが使っていないメモリを自分のものとしてプールの管理下におく
  • 必要に応じて仮想マシンにメモリをプールから配る
  • 仮想マシンからメモリが返却されたらプールに戻す

管理者などが仮想マシンモニタのメモリ利用状況を知る方法はなく、あえていえば仮想マシンモニタのメモリ管理機能がもっているデータを計算すれば求められる、という状態でした。カーネルモードに手を出すかなやんだのですが、結局以下のとおり実装しました。

int
vmm_mem_get_mem_free(void)
{
    int length = 0;
    int i;

    mtx_lock(&vmm_mem_mtx);
    for (i = 0; i < vmm_mem_nsegs; i++) {
        length += vmm_mem_avail[i].length;
    }
    mtx_unlock(&vmm_mem_mtx);

    return(length);
}

この関数の値は(最初はioctlで取得できたのですが)最新のコードではsysctlにて取得できます。

[root@vm160 ~/bhyve/sys/amd64/vmm]# sysctl hw.vmm
hw.vmm.mem_free: 0 ← BHyVeがメモリをもっていたらここにバイト単位で表示される
hw.vmm.mem_total: 0
hw.vmm.create: beavis
hw.vmm.destroy: beavis

また、最新版ではメモリのフリーエリアだけでなくBHyVeがコントロール下においているメモリ総量もわかるようにしました(mem_totalがそれです)。

これらの値は sysctl にて hw.vmm.* を参照すればわかりますが、一応 libvmmapi 経由でこれらの値がとれるようにライブラリも拡張しました。

というわけで、

  • 仮想マシンの一覧表示ができるようになった

  • 仮想マシンモニタのメモリ(合計および空き)がバイト単位でわかるようになった

  • vmmapi に仮想マシンモニタのメモリ情報を取得する関数を追加した

というところで二日間終了しました。成果物についてははやめに BHyVe 開発者に送付できるように整理するつもりです。

関連記事



BHyVeハッカソンに参加してきました(2)

BHyVeハッカソンは二日間にわたって開催されましたが、最初の半日は仮想化技術にまつわるプレゼンテーションがなされました。
  • Linux KVMとBHyVeの実装を考慮しつつの「仮想マシンの仕組み」 (私がやりました)
  • ハードウエアやら仮想化やらの深いお話
  • BHyVeってなんぞや
プレゼンテーションの後、必要な人には作業用マシンが割り当てられたりして、各々のトピックで作業を開始。気づけば皆、時がたつのを忘れてカーネルモードのコードをいじったりBHyVeをビルドしまくったりとかしていたようです。



私は会場近くのホテルにとまったのですが、最初の一時間はローカルアレンジメントの担当者と私の二人だけでした。。。。二日目はスロースタートでし
たが、ハッカソンはもりあがり、結局撤収は日曜日の20時頃にはじまりました(翌日は仕事とかが普通なのによくがんばるわ・・・)。

なお各自で取り組んだトピックは様々でしたが、私が把握している限りでは、ほかの方々は

  • BIOSコールの実装。未改造のブートローダなどを動かすことを目的としている
  • BHyVeのベンチマーク
  • コンソールの性能改善
  • クラッシュの原因となるパスの解消
  • 仮想マシンの状態保存/復帰
  • NetBSDへのポート

と様々な取り組みをしていました。驚くべきことに参加者のほとんどがカーネルモードで戦いをしていたのが衝撃的でした(私はユーザモードをいじっていたw)。

イベントがおわってからは近くのホルモンやさんで軽く焼き肉をしてから解散。久々にコードをいじったのでいい気分転換になりました。

関連記事




BHyVeハッカソンに参加してきました(1)

7月28日〜29日に埼玉県内某所にてBHyVeハッカソンが開催されました。BHyVeとはFreeBSD向けの全く新しい仮想マシンモニタです。


BHyVeについて簡単に紹介しておきましょう。2006年にXen 3.0がVT-xを使って完全仮想化を実現し、その後にLinux KVMが続きました。これらの仮想マシンモニタの設計上の大きな相違点は、ハイパーバイザーとして必要となるスケジューラなどの機能を新たに実装したか、
それともホストOSにある機能をうまく再利用したか、という点が第一に挙げられるでしょう。

もうすこし細かく解説しておくと、Xenの場合は何もなくてもXen自体が複数のOSを実行できます(管理のためにdomain-0が必要なのはここでは考慮しません)。それに対してLinux
KVMはユーザプロセスのひとつという位置づけで仮想マシンを実行するためのカーネルモジュールで、それ自体はスケジューラの機能をもちません。共通していえるのは、XenもLinux KVMもVT-xを使ったオープンソースの仮想マシンモニタであり、未改造のLinuxやWindowsなどのOSを実行できる、ということです。

Linux
KVMは、Xenでは実装しているようなスケジューラなどの機能を実装していないためコードが短くすんでいますが、BHyVeはさらに短いコードで実装されています。BHyVeは、以下の制約を受け入れることにより本体自体に非常にシンプルに実装しているのです。

  • VT-xなどのCPU仮想化機能を必須とする
  • EPTなどのメモリ仮想化機能を必須とする
  • I/OはBHyVe専用コンソールとvirtio、もしくはVT-dによるパススルーに限定
  • I/Oの実装は最小限
これらの制約はおそらく開発者の人的リソースによる事情もあるかと思いますが、Xenからに影響をうけつつ、不要な部分を取り除いてコンパクトに実装したものがLinux KVMであるとしたら、さらに KVM のうち一部の機能を割り切って実装したものが BHyVe であるといえます。なのでKVM が理解できれば BHyVe は理解できますし、逆に BHyVe を理解できれば KVM も理解できるでしょう。