本文擬對qcow2進行壓縮進行簡單介紹
背景
qcow2鏡像在使用一段時間后,總是會不斷膨脹變大,所以在導出分享時一般都需要進行壓縮以縮減占用空間。
清除空洞
qcow2方式也有稀疏的問題,在磁盤級別上看,鏡像會有大量連續的相同空洞,比如剛創建的鏡像的swap分區,通過virt-sparsify 我們可以消除這些空洞,從而縮小磁盤大小,便于我們傳輸磁盤鏡像。該方法耗時較久
qemu-img create -f qcow2 test2.qcow2 5G #創建5G的qcow2鏡像
# sudo apt install guestfs-tools # 安裝工具包
virt-sparsify -x /root/test.qcow2 --convert qcow2 /root/test2.qcow2 #除鏡像空洞
# 使用該方法不會降低系統開機速度
virt-sparsify --compress --convert qcow2 centos.img centos.qcow2 #鏡像格式轉換
fstrim方法
具體流程就是將qcow2鏡像掛載出來,隨后對每個分區進行fstrim操作。
在導出鏡像之前,先在虛擬機系統的內部,對所有未使用,以及所有剩余可使用的磁盤空間進行全面置零填充操作,可以簡單理解為將當前所有未存儲有效數據的block(含已刪除的文件block)全都進行寫0覆蓋,然后再進行鏡像壓縮導出,就可以忽略所有這些無用的數據空間了;該方法耗時較久。
#dd if=/dev/zero of=/null.dat //創建一個全0的大文件,占滿所有的剩余磁盤空間,需要很久時間
#rm -f /null.dat //刪除這個文件#qemu-img convert -c -p -O qcow2 vm500G.qcow2 vm500G-mini.qcow2
進一步壓縮
qemu-img convert -p -O qcow2 zero_disk.qcow2 new_disk.qcow2
# 沒有使用 -c 選項,單獨使用該方法鏡像文件不會變小,需要先去空洞再convert# 如果需要壓縮,可以加上 -c 選項,文件會變得更小:
qemu-img convert -p -c -O qcow2 zero_disk.qcow2 compress_disk.qcow2
# 使用該方法會降低系統開機速度,原因是每次都到壓縮鏡像上的文件都需要解壓縮,這會影響讀性能
不影響性能
參考壓縮qcow2鏡像帶來的性能損失簡單分析這里的分析,對qcow2鏡像進行壓縮會對虛擬機性能產生影響。
第一種:用virt-sparsify -x uos1060-nogt.qcow2 --convert qcow2 uos-spar.qcow2 --tmp ./tmp/
來清除空洞
第二種:
- 先用fstrim鏡像
- 再
qemu-img convert -p -O qcow2 src.qcow2 dst.qcow2
經過測試,這兩種方法最后縮減鏡像大小的效果基本一樣。
已經被壓縮的鏡像如何恢復
重新轉換成raw格式或者qcow2格式(不帶-c壓縮選項)
qemu-img convert -f qcow2 -p -O qcow2 src-c.qcow2 dst-uc.qcow2
參考
Does converting qcow2 without -c remove compression?
Can qemu-img uncompress qcow2 file?
An Overview of QEMU Storage Features