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 のメンテナンス系コマンドの実行負荷や実行時間を減らせるかも知れない。