Qcow2 (Qemu Copy-On-Write)は Qemu のデフォルトの仮想ディスクイメージ形式として採用されています。この形式は「シンプロビジョニング(Thin-Provisioning)」つまり必要に応じて容量が割り当てられる方式なので実際に使用されるまで割り当てられません。
しかし、使われてた領域が開放されてもホストへ返還されないので手動でこれを行わなければ肥大化してしまいます。OS上でファイルを削除しても半導体上ではデータは残っている SSD のような性質を持ちます。
また、スナップショット機能を利用している場合はこれを削除することでさらに容量を小さくできます。
実際使われている容量を確認する
最初に qcow2 イメージの予約領域のうちどれくらいが実際に使用されているのか確認しましよう。
40 GB を最大容量に制限した Windows 10 の仮想マシンイメージを qemu-img コマンドで測定してみます。
# qemu-img info /var/lib/libvirt/images/vm.qcow2
file format: qcow2
virtual size: 40 GiB (42949672960 bytes)
disk size: 23.3 GiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: true
refcount bits: 16
corrupt: false
extended l2: false
Child node '/file':
filename: /var/lib/libvirt/images/win10.qcow2
protocol type: file
file length: 40 GiB (42956488704 bytes)
disk size: 23.3 GiB
仮想サイズ(virtual size)は 40 GB、 実際のサイズ(disk size)は 23.3 GB とあります。仮想ディスクサイズとは仮想ディスクに設定されている制限です。
qcow2 を最適化する
virt-sparsitfy でもスパースすることができるようですが、 Arch Linux の libguestfs に同封されなくなったりと徐々に消えつつある予感がするので qemu-img を使うことにします。
1. 準備
まず、作業する前に必ずゲストの仮想システムをシャットダウンしなければいけません。最悪イメージが破損して使い物にならなくなります。
さらに念のためにディスクイメージのコピーを作成しておきましよう。
2. 圧縮
次に以下のコマンドを実行します。このコマンドは 0 で敷き詰められた領域を解放し、ついでに圧縮してくれます。
# qemu-img convert -O qcow2 vm.qcow2.orig vm.qcow2
3. 確認
最後に本当にディスクイメージが圧縮されたかどうか確認を行います。
# qemu-img info /var/lib/libvirt/image/disk.qcow2
file format: qcow2
virtual size: 40 GiB (42949672960 bytes)
disk size: 23.1 GiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
extended l2: false
Child node '/file':
filename: /var/lib/libvirt/images/win10-c.qcow2
protocol type: file
file length: 23.1 GiB (24826871808 bytes)
disk size: 23.1 GiB
すでに数日前に圧縮していたため、あまり効果がありませんでしたが、ディスクサイズが 0.3GiB に縮小していることが確認できます。
おわり
スナップショットを除去する
1. 準備
圧縮・最適化する手順と同じように、作業に使う qcow2 が使われているドメインを停止します。
2. 利用可能なスナップショットを表示
qcow2 ディスクイメージに保存されているスナップショットのリストを表示します。
# qemu-img snapshot -l vm.qcow2
3. スナップショットを削除する
ディスクイメージから不要なスナップショットを削除します。
# qemu-img snapshot -d "snapshot name a" vm.qcow2
.....
# qemu-img snapshot -d "snapshot name n" vm.qcow2
4. ディスクイメージを最適化する
qcow2 ディスクイメージから使用されていない領域を解放したのち、データを圧縮します。
# qemu-img convert -O qcow2 vm.qcow2 vm-min.qcow2
おわり
Image by mikezwei from Pixabay
コメント