Change Block Tracking(CBT)技術概要

VMwareは1つの技術を色々な用途に応用して使うことが得意です。たとえば、VMotionの技術はDRSにおける仮想マシン配置の自動化のために使われていますし、VMware Converterは単なるP2Vツールではなく、VCBによってエクスポートされた仮想マシン構成ファイルのインポートツールとしても使うことができるように作られています。その他、詳細には様々な技術をけっこう上手く使い回しています。

そんな、VMwareが最近、様々な新機能のベース技術として活用しているものが、CBT (Change Block Tracking)という機能です。

CBTはその名の通りで、仮想マシンが使用している仮想ディスクファイルに対しての更新ブロック情報を仮想化レイヤー側(仮想マシン上のゲストOSは関知しない形で)で抽出する機能です。

この技術はESX4.0以降においてVersion7の仮想マシンハードウェアタイプを選択した場合にのみ使用することができる機能の1つです*1

最近公開されたKB1020128において、CBTを有効にした場合にどのようにフラグが立つのかについて簡単な解説が掲載されています。

  • 構成情報ファイル(.vmx)において ctkEnabled の値が "TRUE" となります
  • 構成情報ファイルにおける仮想ディスク毎のステータスとして scsix:x:.ctkEnabled の値も "TRUE" となります
  • 仮想ディスクファイル群(.vmdkおよびxxxx-flat.vmdkもしくはxxxx-delta.vmdk)にさらにCBTファイル(xxxx-ctk.vmdk)が構成されます

CBTは単純に?更新されたブロックの情報だけを保持していますので、スナップショットファイルなどと違ってどんどんとサイズが肥大化することもありませんし、仮想マシンのパフォーマンスに与える影響も非常に軽微です。

Storage VMotionではこの技術を、Storage VMotion実行中の仮想ディスクの更新追跡のために利用しています。Storage VMotionでは起動中仮想マシンを対象としたクローン実行と同じ要領で仮想ディスクファイルの移動処理を実行していますが、移動処理中にも仮想マシンは起動していますので、仮想ディスクファイルには更新が行われます。Storage VMotionではCBTを使って更新ブロックを追跡し、更新されたブロックの情報をさらに追加的に移動処理を行うことによって仮想マシンを起動したままにしつつも仮想ディスクファイルの移動処理における整合性を確保しているわけです。

VMware Data RecoveryやvStorage APIにおける仮想マシンの差分・増分バックアップについても、このCBTによる更新追跡を利用しています。CBTによって更新ブロックの情報を保持することによって、次回バックアップ時には更新されたブロックだけを対象としてバックアップを行うことができます。システムのイメージバックアップでありながらも差分・増分だけをバックアップするということが実現できるわけです*2。CBTはゲストOSにおけるファイルシステムを意識していないため、Copy on Writeのような仕組みで書き込みを行うファイルシステムとの相性は悪いのでないかと思ったりもしていますが、まだ未確認です。

VMwareの優位性を根幹で支える技術ですので、詳細な仕様については公開されている情報がありませんでしたが、APIレベルとしては、"Designing Backup Solutions for VMware vSphere"というPDF資料が公開されています。

この資料によると、"QueryChangedDiskAreas" APIによってCBTの機能を利用できるようになる様です*3。CBT機能は"changeID"によって変更されたブロックデータを管理しています。CBTはsnapshotが作成された時点から記録が開始されます。

CBTの仕組みは詳細にはわかりませんが、基本的に仮想ディスクファイルに対するI/OはすべてVMMを通じて管理しているわけですから、VMMにおいてゲストOSからの仮想マシンへのディスクI/Oをトラッキングしているものと思われます。良くも悪くもファイルシステムを意識しない作りになっているので、ゲストOS内におけるスワップI/OやOSによる一時ファイル読み書きのI/Oなども含めてすべてのブロックレベルにおける変更をトラッキングしてしまうわけですが、どんなゲストOSが動作していようと使うことができるということでもあります。

ゲストOSのステータスとどう整合性を取るのかという点は大変難しい問題ですが、CBTのような機能は仮想インフラをソフトウェア的に実現しているからこそなわけで、こうしたこれまでの常識を覆すような仕組みが次々と登場してくる点が、仮想化の醍醐味というか、面白さなんじゃないかと思っています。

*1:物理互換RDMの仮想ディスクや、共有ディスクとして構成されているSCSIバスに接続された仮想ディスクでは使用できません

*2:ただし、CBTは変更のあったブロック情報のため、アーカイブビットによる差分・増分ほど正確な差分・増分にはなりません。また、ストレージに一時ファイルを大量に書き込んだり、ファイル更新が多い場合は想定以上の差分・増分バックアップ容量となる可能性があります

*3:CBTを利用したい場合は、まず仮想マシンに対して有効化を行います。CBTの有効化はAPI経由だけではなく、vSphere Clientから詳細パラメータの"ctkEnabled"のフラグを"true"に変えることでも可能です