qcow2イメージを扱う
目標
qcow2イメージを作り、情報を読み、変換し、バッキングチェーンを立てて、ゴールデンイメージのパターンを手で再現します。
なぜ重要なのか
qcow2の本当の力は、バッキングファイルです。読み取りはバッキングから、書き込みはオーバーレイだけに行うため、ゴールデンイメージ1つでVMを数十台作れます。ここには2つのルールがついてきます。バッキングファイルは絶対に変更してはならず(オーバーレイが静かに壊れます)、バッキングのパスがイメージの中に記録されるので、ファイルを移したら、rebaseで参照を直す必要があります。そして、qemu-img infoのvirtual sizeとdisk sizeを区別できないと、シンプロビジョニングのオーバーコミットを見逃します。
ステップ
/root/vmディレクトリを作成し、/root/vm/base.qcow2を2Gのサイズのqcow2として作成してください。- そのイメージの仮想サイズ(バイト)と実際の占有(バイト)を1行ずつ(仮想サイズが先)
/root/vm/size.txtに書いてください。実際の占有が仮想サイズよりずっと小さい必要があります。 /root/vm/plain.rawをrawフォーマットの2Gで作成し、qcow2とrawの実際の占有を、qcow2=<바이트>/raw=<바이트>の2行(プレースホルダーはバイト数です)で/root/vm/formats.txtに書いてください。plain.rawをqcow2に変換して、/root/vm/converted.qcow2を作成してください。qemu-img infoで、フォーマットがqcow2と出る必要があります。base.qcow2をバッキングにするオーバーレイ/root/vm/vm01.qcow2を作成してください。バッキングのフォーマットを明示する必要があります。cluster_sizeを1Mに指定した/root/vm/big.qcow2を4Gで作成し、qemu-img infoの出力でcluster_sizeが見える行を/root/vm/cluster.txtに保存してください。base.qcow2を/root/vm/golden/base.qcow2に移し、vm01.qcow2のバッキング参照を新しいパスに直してください。直したあと、qemu-img info --backing-chain /root/vm/vm01.qcow2がエラーなしで2つのイメージをどちらも表示する必要があり、その出力を/root/vm/chain.txtに保存してください。/root/vm/inventory.csvを作成してください。1行目はfile,format,virtual_size,backingのヘッダーで、vm01.qcow2、converted.qcow2、big.qcow2の3つのイメージについて、それぞれ1行ずつ書いてください。backingは、バッキングファイルのパスまたはnoneです。
参考
qemu-img create -f qcow2 <파일> 2G、qemu-img info --output=json <파일>、qemu-img convert -f raw -O qcow2 <입력> <출력>の順です(プレースホルダーはファイル名、入力、出力です)。- オーバーレイは
qemu-img create -f qcow2 -b <백킹> -F qcow2 <오버레이>です(プレースホルダーはバッキングとオーバーレイです)。 - バッキングのパスの修正は
qemu-img rebase -u -F qcow2 -b <새경로> <오버레이>です(プレースホルダーは新しいパスとオーバーレイです)。 - よくある間違い1: ステップ5で
-Fを抜かす場合です。最近のqemu-imgは、警告を出すか拒否します。 - よくある間違い2: ステップ7でファイルだけを移してrebaseをしないと、
Could not open backing fileが出ます。
qcow2イメージを作る
/root/vmディレクトリを作成し、/root/vm/base.qcow2を2Gのサイズのqcow2として作成してください。
qemu-img createは、フォーマット、ファイル名、サイズを受け取ります。サイズの単位は、Gのような接尾辞を使います。
仮想サイズと実際のサイズ
そのイメージの仮想サイズ(バイト)と実際の占有(バイト)を1行ずつ(仮想サイズが先)/root/vm/size.txtに書いてください。実際の占有が仮想サイズよりずっと小さい必要があります。
JSON出力を使うと、パースが楽です。virtual-sizeとactual-sizeの2つの値を探してください。
rawとの比較
/root/vm/plain.rawをrawフォーマットの2Gで作成し、qcow2とrawの実際の占有を、qcow2=<바이트> / raw=<바이트>の2行(プレースホルダーはバイト数です)で/root/vm/formats.txtに書いてください。
rawもスパースファイルとして作られますが、メタデータがありません。2つのフォーマットの実際の占有を比べてみてください。
フォーマットの変換
plain.rawをqcow2に変換して、/root/vm/converted.qcow2を作成してください。qemu-img infoで、フォーマットがqcow2と出る必要があります。
convertは、-fで入力フォーマットを、-Oで出力フォーマットを指定します。圧縮オプションもあります。
バッキングファイルでオーバーレイを作る
base.qcow2をバッキングにするオーバーレイ/root/vm/vm01.qcow2を作成してください。バッキングのフォーマットを明示する必要があります。
-bでバッキングファイルを、-Fでそのフォーマットを指定します。-Fを抜かすと、警告やエラーが出ます。
cluster_sizeの指定
cluster_sizeを1Mに指定した/root/vm/big.qcow2を4Gで作成し、qemu-img infoの出力でcluster_sizeが見える行を/root/vm/cluster.txtに保存してください。
-oでフォーマット別のオプションを指定します。infoの出力のFormat specific informationで確認できます。
バッキングのパスを変える
base.qcow2を/root/vm/golden/base.qcow2に移し、vm01.qcow2のバッキング参照を新しいパスに直してください。直したあと、qemu-img info --backing-chain /root/vm/vm01.qcow2がエラーなしで2つのイメージをどちらも表示する必要があり、その出力を/root/vm/chain.txtに保存してください。
rebaseの-uは、データを移さず、参照だけを直します。先にファイルを移してから、参照を合わせてください。
イメージのインベントリ
/root/vm/inventory.csvを作成してください。1行目はfile,format,virtual_size,backingのヘッダーで、vm01.qcow2、converted.qcow2、big.qcow2の3つのイメージについて、それぞれ1行ずつ書いてください。backingは、バッキングファイルのパスまたはnoneです。
各イメージのフォーマットと仮想サイズを集めてください。バッキングファイルがあるものとないものを、区別する必要があります。