第11章 QEMU-img および QEMU ゲストエージェント

本章では、qemu-img パッケージを仮想ゲストマシンと共に使用する場合に役立つヒントを紹介します。QEMU トレースイベントおよび引数についての情報が必要な場合には、以下にある README ファイルを参照してください: /usr/share/doc/qemu-*/README.systemtap

11.1. qemu-img の使い方

qemu-img コマンドラインツールは、KVM で使用される各種ファイルシステムの編集や検証、およびフォーマットを行う際に使用されます。qemu-img のオプションとその使い方を以下に示します。
Check

ディスクイメージ filename の整合性チェックを実行します。

#  qemu-img check -f qcow2 --output=qcow2 -r all filename-img.qcow2

注記

qcow2vdi の形式のみが整合性チェックに対応しています。
-r を使用すると、チェック中に発見された不整合の修復を試みますが、-r leaks と使用するとクラスターリークが修復され、-r all と使用するとすべての種類のエラーが修復されます。これには間違ったフィクスを選択したり、既存の破損問題が隠れてしまうなどのリスクがあることに注意してください。
Commit

qemu-img commit コマンドを使って、指定ファイル (filename) に記録される変更をそのファイルのベースイメージにコミットします。オプションでファイルの形式タイプを指定できます (fmt)。

 # qemu-img commit [-f fmt] [-t cache] filename
Convert

認識しているイメージ形式を別のイメージ形式に変換する場合に convert オプションを使用します。

コマンド形式:
# qemu-img convert [-c] [-p] [-f fmt] [-t cache] [-O output_fmt] [-o options] [-S sparse_size] filename output_filename
-p パラメーターは、コマンドの進捗を表示し (オプションのため、すべてのコマンドに使用できる訳ではありません)、-S フラグは、ディスクイメージ内に含まれる スパースファイル の作成を可能にします。スパースファイルは実際上、ゼロのみを含む (つまり何も含まない) 物理ブロックの場合を除き、標準ファイルのように機能します。オペレーティングシステムがこのファイルを発見すると、いずれのディスク領域も使用していないものの、実際に存在し、実際のディスク領域を占めるものとしてこのファイルを処理します。これは、ディスクが実際に存在する以上のディスク領域を使っている様に表示されるため、ゲスト仮想マシンのディスクを作成する際にはとりわけ役に立ちます。たとえば、10Gb のディスクイメージで -S を 50Gb に設定する場合、実際に使用されているのは 10Gb のみであるのにもかかわらず、10Gb のディスク領域のサイズが 60Gb のように表示されます。
output_format 形式を使って、filename ディスクイメージを output_filename ディスクイメージに変換します。-c オプションを使うとディスクイメージをオプションで圧縮することができます。また、-o オプションを使い -o encryption のように設定すると暗号化することができます。-o パラメーターを付けるオプションは複数あり、選択する形式によって異なります。
暗号化や圧縮に対応しているのは qcow2 形式のみになります。qcow2 の暗号化では安全な 128 ビットキーによる AES 形式が使用されます。qcow2 の圧縮は読み取り専用になります。このため、qcow2 形式から圧縮セクターを変換する場合には、このセクターは圧縮されていないデータとして新しい形式に記述されます。
イメージ変換ではイメージを小さくすることができるため、qcowcow などの拡大する可能性のある形式を使用する場合にも便利です。空のセクターは検出されて、目的のイメージから削除されます。
Create

サイズが size、形式が format となる filename という新しいディスクイメージを作成します。

# qemu-img create [-f format] [-o options] filename [size][preallocation]
-o backing_file=filename でベースイメージを指定すると、作成するイメージとベースファイルとの差異のみが記録されることになります。commit コマンドを使用しない限り、バッキングファイルは変更されません。この場合、サイズの指定は必要ありません。
Preallocation は、qcow2 イメージの作成時にのみ使用可能なオプションです。使用可能な値は、-o preallocation=off|meta|full|falloc になります。事前割り当てのメタデータのあるイメージは、これがないものよりもサイズが大きくなります。ただし、イメージサイズが大きくなると、パフォーマンスは向上します。
割り振りで full を使用すると、大きいイメージでは時間がかかることに注意してください。割り振りで full を使用したいものの、時間に余裕がない場合は、falloc を使うと時間が節約できます。
Info

info パラメーターは、filename ディスクイメージの情報を表示します。 info オプションの形式を以下に示します。

# qemu-img info [-f format] filename
このコマンドはディスク上で予約されているサイズを検出する場合によく使用されます。予約サイズは表示サイズとは異なる場合があります。スナップショットがディスクイメージに格納されている場合は、それらも表示されます。このコマンドは、どの程度の領域がブロックデバイス上の qcow2 イメージによって使用されているかを表示します。これは、qemu-img を実行することによって行なわれます。使用中のイメージが qemu-img info コマンドと qemu-img check コマンドの出力に一致するものであることを確認できます。「qemu-img の使い方」を参照してください。
# qemu-img info /dev/vg-90.100-sluo/lv-90-100-sluo
image: /dev/vg-90.100-sluo/lv-90-100-sluo
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 0
cluster_size: 65536
Map

# qemu-img map [-f fmt] [--output=ofmt] filename のコマンドを実行すると、イメージ filename のメタデータとそのバッキングファイルチェーンがダンプされます。特にこのコマンドは、指定されたファイルの全セクターの割り振り状態と、そのファイルをバッキングファイルチェーンに割り振る最上位のファイルをダンプします。たとえば、c.qcow2 → b.qcow2 → a.qcow2 というチェーンがあったとすると、a.qcow がオリジナルファイル、b.qcow2 が a.qcow2 に加えた変更、c.qcow2 が b.qcow2 からの差分ファイルになります。このチェーンが作成される際には、イメージファイルは適切なイメージデータと何がどのファイルに、かつファイルのどこにあるかという情報とともに保存されます。この情報は、イメージのメタデータと呼ばれます。-f の形式オプションは、指定されたイメージファイルの形式です。raw、qcow2、vhdx および vmdk といった形式が使用されます。出力オプションには humanjson の 2 種類があります。

デフォルト設定は human です。これは人間にとって読みやすいものにするので、この形式は解析すべきではありません。プログラムがこれの解析を試みると、悪意のあるゲストイメージに誤った方向に導かれる場合があります。
明確さと簡素化のために、デフォルトの human 形式は、ファイルの既知の非ゼロエリアのみをダンプします。ファイルの既知のゼロ部分と、チェーンで割り振られていない部分はすべて除外されます。このコマンドを実行すると、qemu-img の出力がデータ読み取り可能なファイルと、ファイルないのオフセットを特定します。出力は 4 コラムの表が表示され、そのうちの最初の 3 つは 16 進数になります。
# qemu-img map -f qcow2 --output=human /tmp/test.qcow2 
Offset          Length          Mapped to       File
0               0x20000         0x50000         /tmp/test.qcow2
0x100000        0x80000         0x70000         /tmp/test.qcow2
0x200000        0x1f0000        0xf0000         /tmp/test.qcow2
0x3c00000       0x20000         0x2e0000        /tmp/test.qcow2
0x3fd0000       0x10000         0x300000        /tmp/test.qcow2
json または JSON (JavaScript Object Notation) は人間が読み取ることが可能ですが、プログラミング言語であることから、解析用に設計されています。たとえば、"qemu-img map" の出力をパーサーで解析するには、--output=json というフラグを使用します。
# qemu-img map -f qcow2 --output=json /tmp/test.qcow2 
[{ "start": 0, "length": 131072, "depth": 0, "zero": false, "data": true, "offset": 327680},
{ "start": 131072, "length": 917504, "depth": 0, "zero": true, "data": false},
JSON 形式の詳細情報については、qemu-img の man ページを参照してください。
Rebase

イメージのバッキングファイルを変更します。

# qemu-img rebase [-f fmt] [-t cache] [-p] [-u] -b backing_file [-F backing_fmt] filename
バッキングファイルが backing_file に変更され (filename の形式がこの機能に対応している場合)、バッキングファイルの形式は backing_format に変更されます。

注記

qcow2 形式のみがバッキングファイルの変更 (rebase) に対応します。
rebase の動作には、セーフ モードと アンセーフ モードの 2 種類があります。
デフォルトでは セーフモード が使用され、実際の rebase 動作が行われます。新しいバッキングファイルは古いバッキングファイルとは異なる可能性があるため、qemu-img rebase コマンドではゲスト仮想マシンに表示される filename のコンテンツは変更されないようにします。backing_file と古いバッキングファイルの filename 間の異なる部分は、バッキングファイルに変更が加えられる前に filename にマージされます。
セーフモードはイメージの変換と同様、時間を要する動作になります。正しく動作させるには古いバッキングファイルが必要になります。
qemu-img rebase-u オプションを渡すと アンセーフモード が使用されます。このモードでは、filename のバッキングファイル名と形式のみが変更され、ファイルのコンテンツに対するチェックは行われません。新しいバッキングファイルが正しく指定されていることを必ず確認してください。指定を誤ると、ゲストに表示されるイメージのコンテンツが破損することになります。
このモードはバッキングファイルの名前変更や移動を行う際に便利です。古いバッキングファイルへのアクセスを必要としません。たとえば、バッキングファイルがすでに移動されているか、またはファイルの名前が変更されているイメージの修正などに使用できます。
Resize

size サイズで作成された filename ディスクイメージであるかのようにディスクイメージのサイズ変更を行います。バージョンにかかわらず、サイズ変更が可能なのは raw 形式のイメージのみになります。Red Hat Enterprise Linux 6.1 以降には qcow2 形式のイメージを拡大できる機能が追加されています (縮小は不可)。

filename ディスクイメージのサイズを size バイトに設定する場合は以下のようにします。
# qemu-img resize filename size
ディスクイメージの現在のサイズに対してサイズを増減させることもできます。ディスクイメージのサイズを大きくする場合はバイト数の前に + を付け、小さくする場合はバイト数の前に - を付けます。単位の接尾辞を付けると、キロバイト (K)、メガバイト (M)、ギガバイト (G)、またはテラバイト (T) などの単位でイメージサイズを設定することができます。
# qemu-img resize filename [+|-]size[K|M|G|T]

警告

このコマンドを使ってディスクのイメージを小さくする場合はその前に、仮想マシン自体のファイルシステムとパーティション設定のツールを使用して、割り当てられているファイルシステムとパーティションのサイズをそれぞれ小さくしておく 必要があります。先にこれを行わないとデータを喪失することになります。
このコマンドを使ってディスクのイメージを拡大した後に、仮想マシン自体のファイルシステムとパーティション設定のツールを使用して、そのデバイス上で新しい領域を実際に使用し始める必要があります。
Snapshot

イメージ (filename) の既存のスナップショット (snapshot) の一覧表示、適用、作成、削除などを行います。

# qemu-img snapshot [ -l | -a snapshot | -c snapshot | -d snapshot ] filename
-l を使うと、指定したディスクイメージに関連付けられているスナップショットの全一覧が表示されます。適用のオプション -a を使うと、ディスクイメージ (filename) が以前に保存したスナップショット snapshot の状態に戻ります。-c を使うと、イメージ (filename) のスナップショット (snapshot) が作成されます。-d を使うと、指定したスナップショットが削除されます。
対応している形式

qemu-img は次のいずれかの形式にファイルを変換するよう設計されています。

raw
raw ディスクイメージ形式 (デフォルト) です。最も高速となるファイルベースの形式です。ファイルシステムで未割り当てのブロックに対応している場合 (linux なら ext2 または ext3、Windows なら NTFS)、書き込みが行われたセクターのみに領域が予約されます。イメージが使用する実際のサイズを取得する場合は qemu-img info を使用します。Unix/Linux の場合は ls -ls を使用します。raw イメージで最適なパフォーマンスを得ることができますが、利用できる機能は非常に基本的なものに限られます (スナップショットなどは不可)。
qcow2
QEMU イメージ形式です。最も用途が多様となる形式で、機能も最も充実しています。オプションの AES 暗号化、zlib ベースの圧縮、仮想マシンの複数のスナップショットに対するサポート、イメージを小さくするなどのオプションを付ける場合に使用します。これらは未割り当てのブロックに対応していないファイルシステムで役に立ちます (Windows 上の NTFS 以外のファイルシステム)。機能が充実している分、パフォーマンスは低下します。
ゲスト仮想マシンやホスト物理マシンでの実行に使用できるのは上記の形式のみになりますが、qemu-img では、以下の形式から raw または qcow2 形式のいずれかに変換できるよう、これらの形式も認識し、これらに対応しています。通常、イメージの形式は自動的に検出されます。raw または qcow2 形式への変換に加え、raw または qcow2 から元の形式への逆変換も可能です。
bochs
Bochs のディスクイメージ形式です。
cloop
Linux 圧縮ループ (Linux Compressed Loop) のイメージです。Knoppix CD-ROM などのように圧縮された CD-ROM イメージを直接再利用する場合にのみ役立ちます。
cow
ユーザーモード Linux コピーオンライト (User Mode Linux Copy On Write) のイメージ形式です。cow 形式が含まれているのは、単に旧バージョンとの互換性を持たせるためです。これは Windows では動作しません。
dmg
Mac のディスクイメージ形式です。
nbd
ネットワークブロックデバイスです。
parallels
Parallels の仮想化ディスクイメージ形式です。
qcow
旧式の QEMU のイメージ形式です。これが含まれているのは、単に旧式のバージョンとの互換性を持たせるためです。
vdi
Oracle 仮想マシンの VirtualBox (Oracle VM VirtualBox) のハードディスクイメージ形式です。
vmdk
VMware 互換のイメージ形式です (バージョン 1 および 2 では読み取り/書き込みサポート、バージョン 3 では読み取り専用サポート)。
vpc
Windows 仮想 PC (Windows Virtual PC) のディスクイメージ形式です。vhd、または Microsoft の仮想ハードディスクのイメージ形式とも呼ばれます。
vvfat
仮想 VFAT のディスクイメージ形式です。