4.

QCOW2 (.qcow2) とは | QEMU/KVM 標準仮想ディスク / CoW

編集
この記事の要点
  • .qcow2QEMU / KVM の標準仮想ディスク形式。「QEMU Copy-On-Write version 2」の略
  • コピーオンライト(CoW) によるスナップショット、差分(バッキングファイル)、内部スナップショット、内部圧縮、AES/LUKS 暗号化など、仮想ディスクに求められる機能を網羅
  • スパースファイル(薄い割り当て)。100 GB 指定しても実際の消費は使った分だけ。raw より大幅に省ディスク
  • OpenStack、Proxmox VE、oVirt、libvirt、CloudStack など、Linux ベースのクラウド・仮想化基盤の事実上の標準
  • 操作は qemu-img: create(作成)/ info(情報)/ convert(変換)/ snapshot(スナップショット)/ resize(サイズ変更)
  • バッキングファイル機能で ベース → 差分 → 差分 のチェーンを作れる。VM テンプレートからの高速プロビジョニングに使える
  • パフォーマンスは raw に劣るが、機能性とのトレードオフ。本番でも preallocation=metadatacache=none 等のチューニングで実用的

概要

QCOW2(QEMU Copy-On-Write version 2、拡張子 .qcow2)は、オープンソース仮想化エンジン QEMU および KVM で標準的に使われる仮想ディスクフォーマットです。初代 QCOW から進化したバージョン 2 で、2009 年頃から普及し、現在は QCOW2 の改良版や QCOW3(QCOW2 内部バージョン 3)として継続的にメンテナンスされています。

QCOW2 が他のフォーマットと比べて優れているのは、仮想ディスクに求められる機能を一通り内包している ことです。具体的には次のような機能をフォーマットレベルでサポートします。

  • スパース割り当て(薄い割り当て) — 100 GB の仮想ディスクを作っても、初期サイズは数 MB。使った分だけ拡張
  • コピーオンライト(CoW) — 親ディスクからの差分のみを記録する「バッキングファイル」
  • 内部スナップショット — 仮想ディスク 1 ファイルの中に複数の時点スナップショットを保存
  • 暗号化 — AES-128(旧)/ LUKS(現在推奨)による中身の暗号化
  • 内部圧縮 — クラスタ単位の zlib 圧縮(読み取り専用ベースに適する)
  • ゼロクラスタ — 0 で埋まった領域はディスク上に書かない

これらの機能のおかげで、QCOW2 は OpenStack、Proxmox VE、oVirt、libvirt、CloudStack、Red Hat Virtualization、SUSE KVM など、Linux ベースの仮想化・クラウド基盤で事実上の標準として採用されています。Windows 側の VHDX、VMware の VMDK と並ぶ仮想ディスク 3 大フォーマットの一角と言えます。

内部構造

QCOW2 ファイルは以下のような構造を持ちます。

要素役割
ヘッダマジックナンバー (QFI\xfb)、バージョン、クラスタサイズ、暗号化方式、バッキングファイル名等
L1 テーブル / L2 テーブル仮想アドレス → ファイル内オフセットの 2 段階マッピング
クラスタ実データのブロック。デフォルト 64 KB
リファレンスカウント表各クラスタの参照数(スナップショット用)
スナップショットテーブル内部スナップショットのメタデータ

仮想ディスクへの書き込みは L1 → L2 → クラスタ という 2 段間接参照を経由するため、raw に比べてオーバーヘッドがあります。代わりに 未割り当て領域はファイルとして存在しない ため、実消費量が小さくなります。

主な用途

  • QEMU / KVM 仮想マシンの OS ディスク — Linux サーバ仮想化の標準
  • Proxmox VE / oVirt のディスク — Linux 系仮想化アプライアンスの内部形式
  • OpenStack Glance イメージ — クラウド OS テンプレートとして配布
  • VM スナップショット — 内部スナップショット機能で「実験前に保存→失敗したら戻る」を高速に
  • 差分ディスクによるテンプレート展開 — 1 つの「ゴールデンイメージ」から多数の VM を差分で起動
  • 暗号化が必要な仮想ディスク — LUKS 統合により VM 単位で暗号化
  • クラウドイメージ配布 — Ubuntu Cloud Images、CentOS Cloud Images などは .qcow2 で配布

関連形式との比較

形式圧縮スナップショット暗号化性能主な使い手
QCOW2あり内部LUKSQEMU / KVM
raw / IMGなし外部のみ外部のみ最速共通
VHDXなし差分ファイルBitLocker 連携中〜高Hyper-V
VMDK分割可内部・外部VMware 連携VMware
VDIなし外部なしVirtualBox

性能が最優先(DB 用途等)なら raw / preallocation=full の QCOW2、機能性と省ディスクを両立したいなら 標準 QCOW2 が選ばれます。Windows ハイパーバイザとの相互運用が必要なら VHDX / VMDK へ変換します。

コマンド・ツール

QCOW2 操作はすべて qemu-img で完結します。

# 100 GB の QCOW2 を作成
qemu-img create -f qcow2 disk.qcow2 100G

# 情報を見る
qemu-img info disk.qcow2

# 出力例:
# file format: qcow2
# virtual size: 100 GiB (107374182400 bytes)
# disk size: 196 KiB
# cluster_size: 65536

# バッキングファイル付きの差分ディスクを作成
qemu-img create -f qcow2 -F qcow2 -b base.qcow2 child.qcow2

# 内部スナップショット
qemu-img snapshot -c snap1 disk.qcow2   # 作成
qemu-img snapshot -l disk.qcow2         # 一覧
qemu-img snapshot -a snap1 disk.qcow2   # 適用(戻す)
qemu-img snapshot -d snap1 disk.qcow2   # 削除

# サイズ拡張
qemu-img resize disk.qcow2 +50G

# 他形式への変換
qemu-img convert -p -O vmdk disk.qcow2 disk.vmdk
qemu-img convert -p -O raw  disk.qcow2 disk.raw

# 暗号化(LUKS)
qemu-img create --object secret,id=sec0,data=mypassword \
  -f qcow2 -o encrypt.format=luks,encrypt.key-secret=sec0 \
  enc.qcow2 50G

注意点

  • 本番性能を引き出すには preallocation=metadatapreallocation=falloc 推奨。スパース割り当てによる動的拡張のオーバーヘッドを抑えられる
  • バッキングファイル(親ディスク)は 絶対に変更しない。変更すると全ての子 QCOW2 が壊れる。読み取り専用属性で保護する運用が望ましい
  • 内部スナップショットを多用すると サイズが膨張し性能が落ちる。長期運用では外部スナップショット(バッキングファイル方式)に寄せる
  • QCOW2 の cache モードは要検討。cache=none はホスト OS のページキャッシュをバイパスし、データ整合性に有利だが性能は条件次第
  • 古い AES 暗号化(QCOW2 v2 旧仕様)は脆弱で廃止予定。新規は必ず LUKS を使う
  • Windows VM のディスクを QCOW2 にすると、起動・I/O 性能は VirtIO ドライバの有無で大きく変わる。virtio-blk / virtio-scsi ドライバを入れることで性能が大幅に改善する
  • QCOW2 → raw の変換は容量が一気に膨らむ(スパースが解凍されるため)ので、変換先のディスク残量を要確認

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ISO(.iso)
  2. IMG(.img)
  3. VHD / VHDX(.vhd / .vhdx)
  4. QCOW2(.qcow2)
  5. OVA / OVF(.ova / .ovf)
  6. PEM(.pem)
  7. CRT / CER / DER(.crt / .cer / .der)
  8. PFX / P12(.pfx / .p12)
  9. PCAP / PCAPNG(.pcap / .pcapng)
  10. DMP / コアダンプ(.dmp / .core)

最近更新/作成されたページ