スライドを一応準備しました(二日目 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ハッカソンに参加してきました(1)
- BHyVeハッカソンに参加してきました(2)
- BHyVeハッカソンに参加してきました(3)