これから「Xen 4.0 blktap2」の話をしよう

ご無沙汰しています。Advent Calendarと呼ばれる1日1エントリずつブログ書くイベントに参加することになったので、急遽技術ネタを用意してみた次第です。
http://atnd.org/events/10701

それでは、Xen 4.0から搭載された「blktap2」について紹介してみましょう。

blktap2とは

 blktap2はXenのゲストOS(DomU)からアクセスするブロックデバイスに対して、Dom0のユーザレベルで実装したライブラリを通してディスクを読み書き可能にするツールキットである。
 blktap2はMicrosftが開発したVHDファイル、QEMUが扱うQCOWイメージのフォーマットに対応している。また、blktapを使ってパーティション・ファイル・ネットワークなどをブロックデバイスのバックエンドに使用できるようになるとblktapのREADME*1では説明している。ドキュメントで説明されている部分を紹介したり、実際にblktap2を導入する方法、その仕組みについて簡単に説明したいと思う。

READMEで説明されている利点を以下に抜粋した。

  • Copy on Write、暗号化、スパースファイル、圧縮などの機能を持つディスクフォーマットの対応をユーザレベルで実装できる
  • ファイルベースでのイメージファイルのアクセスを使うことで、Linxuループバックドライバのdirty pageのフラッシュ問題を避けることができる(OSには私が明るくないため、何なのかうまく説明できません)
  • ユーザレベルのライブラリを活用できる(例:ネットワーク、圧縮、P2Pファイル共有)

 

VHD・QCOWを使う利点

 続いて、blktap2で対応しているVHD・QCOWを使う利点について説明する。VHDとQCOWを利用する利点に、スパースファイルの作成、スナップショットの対応がある。それぞれのフォーマットについて紹介してみよう。

VHD(Virtual Hard Disk)

Microsoft製の製品に使われているディスクイメージファイルのフォーマット。Microsoftが買収したConnectixがオリジナルを開発したらしい。Virtual PCや、Windowsのバックアップの保存イメージとしても使われている。Windows 7にはVHDファイルから直接ブートできる機能がある。

ソースはWikipediaなど:
VHD (file format) - Wikipedia

VHDフォーマットもMicrosoftから公開されてるので、詳しくこちらの資料を参照されたし。
http://technet.microsoft.com/en-us/virtualserver/bb676673.aspx
About VHD (Windows)

QCOW

 QEMUのディスクイメージファイルフォーマット。COWとはCopy on Writeのこと。QCOWの次バージョンであるQCOW2ではバージョン1でから対応していたCopy on Writeに加えて、スナップショットにも対応した。zlibを使用した圧縮、AESを使ったディスクの暗号化も可能である。

同じく情報のソースはWikipedia
qcow - Wikipedia
qcow - Wikipedia

The QCOW Image Format
http://people.gnome.org/~markmc/qcow-image-format-version-1.html
The QCOW2 Image Format
http://people.gnome.org/~markmc/qcow-image-format.html

VHD・QCOWのスナップショットの使用例

 VMware Workstationにもスナップショット機能が搭載されており、使ったことある人には想像しやすいと思う。ただ、VMware Workstationなどと比べてXenは特にサーバ用途での利用が主流だろう。そういった観点からは、以下のような用途に適していると思う。

  • 一時的な用途のために、環境構築/破棄を繰り返すとき。また、その頻度が非常に高いケースでは、スナップショット(もしくはCopy on Write)による素早い環境構築が役立つようなとき。
  • Virtual PCQEMUで使用していたマシンをXenへ移行して利用するとき(ディスクイメージを変換せずにそのまま利用できる)

 具体的にはテスト・評価のために環境構築したり、マルウェア解析環境の構築・破棄するような環境構築の頻度が高く。Amazon EC2のように、共通のイメージファイルからインスタンス仮想マシン)の作成ごとにイメージファイルをコピーをするようなケースにも活用できるだろう。スナップショット機能は正しかった環境まで"元に戻せる"ため、システムを元に戻しにくい操作を実行したり、過去の環境を再現したりするのに役立つのではないだるか。

 偉そうに書いた割に意外と中身が浅い。こういった例は、私のようなプログラムを書く人間よりも、インフラの構築・運用しているエンジニアの方がノウハウ・活用例を見いだしやすいと思うのですよ。さて次へ。

利用方法

 Xen 4.0以降からblktap2をサポートしているため、おそらく最新版のXen 4.0.1をインストールすることになる。blktap2を使うには、多少順序が逆転しても以下のような手順になる。
 注意:私の環境では残念ながら以下の4番目でつまづいてしまった。2,3より先に4をチェックするのがオススメかも。

  1. Xen 4.0.1を導入
  2. VHD・QCOWイメージを作成する(RawイメージからVHD・QCOWフォーマットへ変換する)
  3. XenのコンフィグファイルでVHD・QCOWイメージを指定する
  4. blktap2が利用できるか確認する
  5. 仮想マシンを起動する
  6. 運用する(まだXen 4.0リリースされて日も浅いため、ノウハウを貯めていきましょう!)

 ハマりどころとして、まずXen 4.0.1のインストールが面倒くさい。これに尽きる。次に4番目で私はかなりハマった。これについては後述。

1. 導入

Xen 4.0.1をインストールしよう。私はyuyarinさんのブログを参考にFedora 14にインストールした。
Xen4.0をFedora14にインストールする - yuyarinの日記

2. イメージの作成

vhd-utilもしくはqemu-imgコマンドを使用する。使い方は各ドキュメントを参照のこと。以下はコマンド例。

VHD:

# vhd-util create -s 1024 -n test.vhd

QEMU:

# qemu-img convert -O vpc rawimage.raw output.vpc
3. Xenのコンフィグファイルにディスクイメージの指定

 Xen 4.0.1の設定ファイルだと、以下の???の部分にvhdやqcow2を埋めればよい。

disk = ["tap2:tapdisk:???:/path/images/disk,xvda,w"]

詳細はblktap2のドキュメントを参照。
http://wiki.xensource.com/xenwiki/blktap2
http://lxr.xensource.com/lxr/source/tools/blktap2/README

4. blktap2の確認

 1〜3をクリアすれば、正しくOSが起動できるはずであると過去に私は思ったが、そう甘くはなかった。blktapのカーネルモジュールがロードされていない、Pythonのライブラリにバグがある、といったハマるポイントが存在する。

4.1 カーネルモジュールblktapの確認
# cat /proc/misc

もしくはlsmodコマンドを実行し、カーネルモジュールのblktapがロードされているか確認する。
正しくロードされていれば、/dev/xen/blktap-2が作成されている。

4.2 blktapctrl(デーモン)の起動

 blktapctrlのパスが取っている、もしくはinit.dの起動スクリプトが以下のパスにインストールされていると思う。以下のようにデーモンを起動する。

# /etc/init.d/blktapctrl start

私はここでつまづき、ここから先に進めていない。startの実行は成功したように見えるが、blktapctrl status(やpsコマンド)でblktapctrlのプロセスを確認してもデーモンが起動していなかった。

5, 6.

おめでとう、と祝福したいところだがそうは問屋が卸さない。Xen 4.0.1にコンフィグファイルにVHDを指定したときパースに失敗するバグが残っている模様。以下のブログに載っているパッチをあてること。patchはXen 4.0.1のファイルと完全に一致しないので、patchを修正して当てるのが無難。

Set up Xen 4.1-unstable & 2.6.32.16 pvops Dom0 on top of Ubuntu 10.04 Server | Xen Virtualization on Linux and Solaris
exeCooler’s patch for Xen 4.1-unstable | Xen Virtualization on Linux and Solaris

パッチをあてていない場合、xm createで以下のようなエラーが発生した。

[root@localhost xen]# xm create vhd1
Using config file "./vhd1".
Error: [Errno 2] No such file or directory: 'vhd:/var/lib/libvirt/images/vm1.vhd'

パッチをてあても、blktapctrlが起動していないと以下の通り。

[root@localhost xen]# xm create ./vhd1
Using config file "././vhd1".
Error: Failed to create device.
    stdout: vbd open failed: -22
    stderr:
Check that target "/var/lib/libvirt/images/vm1.vhd" exists and that blktap2 driver installed in dom0.

うまく起動させることができれば、これからバグに満ちたわくわく運用生活が待っているはずだ!

blktapの仕組み

 さてさて、blktap(blktap2)の仕組みについて手短に説明しよう。blktapはカーネルモードドライバ(モジュール)とユーザモードのライブラリの2つの構成になっている。詳細はblktap、blktap2のREADME、Xen Wikiのドキュメントにゆずるが、おおまかに次の図のような構成となっている(DomU側のブロックデバイスのドライバ、デバイスチャネルあたりも省略)。

 DomU(ゲスト)のディスクIOは、Dom0(VMM)のblktap(カーネルモジュール)を経由して、Dom0上のblktapctrl(ユーザモードのデーモン)を介して、ファイルのイメージにアクセスすることになる。非常に文章だとわかりづらい。以下のような流れ。

 DomU Disk IO(user -> kernel) -> (Xen: event channel) ->
  Dom0(blktap kernel) -> Dom0 blktapctrl(user mode) ->
   Dom0 Disk IO(user mode) -> Dom0 Disk IO(kernel mode)

ここで私はちからつきた。ばたり。XenにはEvent ChannelとかRing Bufferとかありましたね、blktapのwikiとかソース読んでください。

統括

 以上でXen 4.0から搭載されたblktap2の紹介でした。私は環境構築に苦労しただけで、Xen 4.0のうまみを活かせてないのでどなたかblktap2の布教と良い環境構築のチュートリアル、ノウハウをお願いします。
 本気で文書書いたのも久しぶりで、楽しかったです。「カーネルVM Advent Calendar」に誘ってくれた@syuu1228先生には感謝してます。また、原稿の下書きを見てくれた@syu_cream先生にも感謝しています。コメント、トラックバックあたりで何か指摘を頂けたら適宜内容に追記・修正します。

環境

 参考までに、私が構築した環境について紹介。VMware Fusion 3.1.2にFedora 14(x86)をインストールした(でもDom0カーネルはFC12用だったりする)。

# xm info
host                   : localhost.localdomain
release                : 2.6.32.26-174.2.xendom0.fc12.i686.PAE
version                : #1 SMP Wed Dec 1 20:34:34 UTC 2010
machine                : i686
nr_cpus                : 2
nr_nodes               : 1
cores_per_socket       : 1
threads_per_core       : 1
cpu_mhz                : 2658
hw_caps                : 0febfbff:28100000:00000000:00001f40:82982203:00000000:00000001:00000000
virt_caps              : 
total_memory           : 687
free_memory            : 157
node_to_cpu            : node0:0-1
node_to_memory         : node0:157
node_to_dma32_mem      : node0:157
max_node_id            : 0
xen_major              : 4
xen_minor              : 0
xen_extra              : .1
xen_caps               : xen-3.0-x86_32p 
xen_scheduler          : credit
xen_pagesize           : 4096
platform_params        : virt_start=0xf5800000
xen_changeset          : unavailable
xen_commandline        : dom0_mem=512M lglvl=all guest_loglvl=all
cc_compiler            : gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC) 
cc_compile_by          : root
cc_compile_domain      : localdomain
cc_compile_date        : Thu Nov 25 12:42:13 JST 2010
xend_config_format     : 4
# uname -a
Linux localhost.localdomain 2.6.32.26-174.2.xendom0.fc12.i686.PAE #1 SMP Wed Dec 1 20:34:34 UTC 2010 i686 i686 i386 GNU/Linux