Unbuntu16.04 虛擬機 安裝win7以及文件共享

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

發佈了22 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章