KVM虚拟机文件优化导出最小化体积的qcow2镜像文件
KVM虛擬機的模版導出,通常都是直接用qemu-img命令可以將默認的raw格式或者qcow2格式的磁盤文件壓縮后導出,指令如下:
//將默認raw格式的磁盤,簡單壓縮轉換成qcow2格式 #qemu-img convert -c -f raw -O qcow2 vm500G.raw /path/new-vm500G.qcow2//將默認qcow2格式的磁盤,導出為簡單壓縮后的qcow2格式 #qemu-img convert -c -O qcow2 vm500G.qcow2 new.img.qcow2以上兩種方法都能在一定程度上壓縮減小導出后的鏡像文件體積;但僅限于在虛擬機剛安裝部署好,還沒有進行過大量數據讀寫處理的情況下;
假如虛擬機磁盤大小分配40G,剛裝好的操作系統加入占用了5G,那么通過以上的方式壓縮導出的鏡像文件可能也就只占4~5G左右;這是因為該磁盤鏡像的大量的剩余空間都還沒有被虛擬機的操作系統使用到(大量剩余block塊都是空白的,未寫入過數據)所以在導出的過程中,這些空白的block就會被壓縮甚至忽略掉;所以這樣壓縮出來的縮效果還是很不錯的;
但是,假如該虛擬機在裝好后之后,有在磁盤上產生并存儲過一個2G的大文件,盡管當前已經從虛擬機中徹底刪除了這個大文件,虛擬機內的磁盤空間也顯示剩余空間已經釋放出來了,系統占用空間會變成跟系統剛裝完時一樣只有5GB;但此時再使用上面的指令對磁盤鏡像文件進行壓縮導出,你就會發現導出的文件體積比之前至少會多出2GB的體積;
這是因為虛擬機內刪除文件,實際只是在分區表中把文件的索引給刪除了,其2G文件的物理數據還是依然占用著磁盤上對應的block塊的;此時在kvm下用qemu-img info指令就可以清楚看到該虛擬磁盤鏡像的物理占用空間(disk size)比之前也變大了2GB;
精簡導出
那么有沒有辦法只導出當前虛擬機內實際占用的有效數據呢?將所有已經刪除了的文件和其對應的磁盤block塊都忽略掉,不要導出到我們的鏡像文件中,以最大程度縮減導出來的文件體積!
方法就是在導出鏡像之前,先在虛擬機系統的內部,對所有未使用,以及所有剩余可使用的磁盤空間進行全面置零填充操作,可以簡單理解為將當前所有未存儲有效數據的block(含已刪除的文件block)全都進行寫0覆蓋,然后再進行鏡像壓縮導出,就可以忽略所有這些無用的數據空間了;
虛擬機內部寫零操作
#dd if=/dev/zero of=/null.dat //創建一個全0的大文件,占滿所有的剩余磁盤空間,需要很久時間 #rm -f /null.dat //刪除這個文件KVM下的導出操作
執行鏡像文件導出操作前,虛擬機必須要是處于關機狀態
針對raw格式虛擬磁盤文件精簡導出
?
#cp --sparse=always vm500G.raw vm500G-new.raw //--sparse=always稀疏拷貝,忽略全0數據 #qemu-img convert -c -f raw -O qcow2 vm500G.raw vm500G.qcow2針對原本就是qcow2格式的虛擬磁盤文件精簡導出
#qemu-img convert -c -O qcow2 vm500G.qcow2 vm500G-mini.qcow2實測導出數據大小對比
raw文件實際大小disk size: 5.8GB
直接導出qcow2鏡像大小: 4.5GB
全置零后導出qcow2鏡像大小: 2.2GB
總結
以上是生活随笔為你收集整理的KVM虚拟机文件优化导出最小化体积的qcow2镜像文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 的 eval() 与 ex
- 下一篇: 资深项目经理的10条项目管理心得