それマグで!

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

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

qcow2 の容量が減らない。Sparseにしてるのに減らない。/ btrfs on qcow2

qcow2 の容量が減らない。 使ってないのに減らない。

使用してないディスク容量は開放されるはず・・・だけど変わらない。

qemu-img convert -c -O qcow2 image.qcow2 shrinked_image.qcow2

何度も qemu-img を試してもファイルサイズが同じになる。。。

$ ls ubuntu-* -alht
-rw-r--r-- 1 libvirt-qemu kvm  140G Sep  6 03:31 ubuntu-root.qcow2
-rw-r--r-- 1 root         root 140G Sep  6 03:03 ubuntu-root.06.qcow2
-rw-r--r-- 1 root         root 101G Sep  4 14:51 ubuntu-root.04.qcow2

なんで、こんな事が起きるのかが分からずにパニックになる。

冷静になったたら、この仮想ディスクは実際にはbtrfs である。BTRFSだとと気づく

そうだ、btrfs が古いファイルへの参照を持っているに違いない。

btfs を、メンテ後にsparsify を再チャレンジしてみた。

最初にbtrfs をメンテしておく。

btrfs で古いファイルへの参照を消して、開放する。

デフラグして、参照を整理

sudo btrfs filesystem defragment -r /

古い参照をスクラブ

btrfs scrub start /
btrfs scrub status /

スクラブが終わるまでじっと待つ。

UUID:             xxxxxx-x-x-xx-x-x-x
Scrub started:    Tue Sep  6 04:10:03 2022
Status:           running
Duration:         0:01:05
Time left:        0:00:05
ETA:              Tue Sep  6 04:11:13 2022
Total to scrub:   75.48GiB
Bytes scrubbed:   69.80GiB
Rate:             1.07GiB/s
Error summary:    no errors found

デフラグして、参照を整理

sudo swapoff /swap.img
sudo btrfs filesystem defragment -r /

スクラブしたら、sparse へ変換をもう一度試す。

 sudo virt-sparsify out.qcow2 out.sparse.qcow2

減った。うわやっぱりだ。btrfsはそれ自体がCOWで完成されたファイルシステムなので、btrfs をqcow上につくると、btrfs(COW) on qcow2(COW)というネストになり、ややこしいことになっていますね。

ext4 の場合

ext4 の場合はいい感じに容量が減る。btrfsはブロックをCoWで使ってるがext4は使わないので関係ない。ext4で気になるのは、予約ブロック15%くらいだろう。qcow2ファイルが100GB超でもない限り予約ブロックは気にならないはずだ。

qcow2にメンテナンス時間がかかるようなら、ディスクを先頭から順に使えばいいので、デフラグで空き容量を詰めて先頭に揃えてあげれば、qcow2 のメンテナンス系コマンドの実行負荷や実行時間を減らせるかも知れない。

関連資料。

https://takuya-1st.hatenablog.jp/entry/2022/04/18/135921