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
オプションについて追記。