もうみなさんご存知かも知れませんが、BitVisorのtools/logの使い方の紹介です。
tools/logとは
このディレクトリには、BitVisorのログをLinuxのログに出すためのカーネルモジュールのソースコードが入っています。
BitVisorのログを見る手っ取り早い方法としてはtools/dbgshがありますが、インタラクティブなインターフェイスでprintfデバッグのログを観察するには不便なところがあります。tools/logでは、Linuxカーネルのタイマー機能を用いて自動的にログをポーリングして出してくれて、しかもたいていのGNU/Linuxディストリビューションでは最初からカーネルログがファイルに書き込まれる設定になっているので、ファイルにも残って便利というわけです。
BitVisor側の設定
make configでLOG_TO_GUESTを有効にしましょう。
$ make config
本機能はdbgshとは異なり、特権レベル0からしか制御できないようになっていますので、一般ユーザーからどうこうできるようなものではありませんが、デフォルトではオフになっています。
カーネルモジュールのビルド
tools/logディレクトリでmakeコマンドを実行すると、現在動作中のカーネルソースあるいはヘッダーを用いてカーネルモジュールがビルドされます。
$ make -C tools/log
Debian GNU/Linuxをお使いであればlinux-headers-amd64などの必要なパッケージをインストールしておきましょう。別のカーネルソースを利用する場合は、そのディレクトリに移動して、make SUBDIRS=/path/to/tools/log modulesという風にしてビルドします。
カーネルモジュールのロード
BitVisor上でGNU/Linuxを起動したら、tools/logディレクトリでmake loadコマンドを実行すると、カーネルモジュールがロードされます。
# make -C tools/log load
余談ですが、GNU Make 4.0からはload directiveというものが追加されたため、以下のMakefileの記述はload directiveに:という引数を与えたと解釈されてしまい、エラーになります:
load :
これの対策のため現在は以下のようにスペースを除いた記述となっています:
load:
なお、GNU Makeのinfoを見ても:の前後にスペースを入れるのは普通のことであるようですし、他のmakeコマンドの実装ではload directiveなどというものは存在しないので、こんな回避策を入れなければならないのは奇妙な話ではあります。loadというファイルをターゲットにすることはありそうですが、:なんてファイル名を使うことはまず考えられないので、GNU Make側でうまく解釈してくれよ、という感じがします。
ログの確認
カーネルモジュールをロードしたらログが出るようになっています。試しにdbgshで以下のように"free"宛にmsgsendintします:
$ ~/dbgsh
> sendint
sendint> free
send 0 to free
sendint>
> exit
これはBitVisor内の空きメモリーの容量を出力するものです。以下のように出力されていることが確認できます:
$ dmesg|tail -1
[ 438.934984] VMM: 2663 pages (10652 KiB) free