天天看點

KVM虛拟機磁盤精簡導出

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格式虛拟磁盤檔案精簡導出

//将預設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
           

針對原本就是qcow2格式的虛拟磁盤檔案精簡導出

實測導出資料大小對比

raw檔案實際大小disk size: 5.8GB
直接導出qcow2鏡像大小: 4.5GB
全置零後導出qcow2鏡像大小: 2.2GB
           

參考連結:https://www.moonfly.net/archives/50.html

繼續閱讀