それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

qcow2へ raw(qcowのnon-sparse) イメージを変換して sparse にする virt-sparsify

non-sparse から sparse なファイルにコピーする

qemu で使える raw image なnon sparseな hdd イメージを qcow2 形式の sparse なファイルにする。

生イメージだとどうしてもディスク容量が節約できないので動的にディスク容量を確保するほうが良いよね。

virt-sparsify

直接イメージをマウントしてコピーすると手順が大変なことになってしまいます。そこで virt-sparsify というコマンドが用意されています。

インストール

virt-sparsify は guestfs-tools に含まれて配布されるようです。

takuya@:~$ virt-sparsify

Command 'virt-sparsify' not found, but can be installed with:

sudo apt install libguestfs-tools

変換

変換は、直接ファイルを「書き換える」のではなく、コピーになります。

sudo virt-sparsify   FROM TO

コマンド例

virt-sparsifyはいくつオプションがあり、便利に使える。

virt-sparsify --check-tmpdir=fail  $SRC  $DST
virt-sparsify --in-place  $SRC $DST
virt-sparsify   $SRC--compress $DST

--check-tmpdir=fail/tmp を使う前に残容量を確認し、容量不足になりそうならエラーとする。

--compress は出来上がりのファイルを圧縮形式にする。使ってみた感じだとシングルスレッドで実行は遅いので時間がかかる。非圧縮に比べ容量は確実に減る。

--in-placeは、一時ファイルを作成せずに直接ファイルを書き換えに行く。容量不足になりそうならこれも選択肢である。ただし、sparsify 中に電源断などプロセスが止まったらファイルは壊れる。

状況に応じて使い分けるのがいい。

実際に変換してみた

takuya@host:~$ sudo virt-sparsify   /var/lib/libvirt/images/ubuntu-1910.img  /var/lib/libvirt/images/ubuntu-1910.sp.qcow2
[   0.0] Create overlay file in /tmp to protect source disk
[   0.0] Examine source disk
[  10.4] Fill free space in /dev/ubuntu-vg/root with zero
[ 477.6] Fill free space in volgroup ubuntu-vg with zero
[ 478.0] Copy to destination and make sparse
[ 922.2] Sparsify operation completed with no errors.
virt-sparsify: Before deleting the old disk, carefully check that the
target disk boots and works correctly.

なるほど。これでsparse ファイルになるのか。

無事に sparse なファイルに変換されました。メッセージには「念の為、起動してチェックしろよ」と書いてあります。

出来上がりを見てみます。

こっちが元のファイル。

takuya@:~$ sudo qemu-img info  /var/lib/libvirt/images/ubuntu-1910.img
[sudo] password for takuya:
image: /var/lib/libvirt/images/ubuntu-1910.img
file format: qcow2
virtual size: 200G (214748364800 bytes)
disk size: 191G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
After

次に、スパースファイルになった側

takuya@:~$ sudo qemu-img info  /var/lib/libvirt/images/ubuntu-1910.sp.qcow2
image: /var/lib/libvirt/images/ubuntu-1910.sp.qcow2
file format: qcow2
virtual size: 200G (214748364800 bytes)
disk size: 71G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

実際に消費する実ディスク容量が 191GB→ 71GB と削減されていることがわかります。仮想サイズはどちらも200GBです。

なぜ最初から sparseにしてなかったのか。

virt-manager で作ったqcow2のディスクで、特に設定しないとsparseにならないので注意が必要でした。

virt-manager ってsparseにしないんですね。いまはSSDだし?メモリもいっぱいあるから再配置オーバーヘッドよりもSSDのディスク容量のほうが貴重だしなぁ。

qemu-img を使ってる

libvirt と qcow2 で使ったっ場合、virt-spasify は内部的に qemu-img が使われていて、/tmp に書き出されるので作業用の容量はある程度確保する必要がある。

参考資料

https://milestone-of-se.nesuke.com/sv-basic/linux-basic/resize-kvm-image-sparse-file/

http://libguestfs.org/virt-sparsify.1.html

2022-05-22

追記

2023-02-01

オプションについて追記。