如何“真正”減小 KVM 虛擬機映像的大小?
我花了很多時間在網上搜尋如何縮小 KVM 虛擬磁碟映像,尤其是對於 Windows 來賓,但沒有運氣。
我所發現的只是將 VM 可用空間歸零,對虛擬磁碟進行碎片整理(來自 Windows),然後執行
qemu-img convert -c ...
(-c
標誌壓縮)。我有一個 Windows 7 VM,虛擬驅動器大小為 100 GB。最初,這個 VDD 在主機儲存上花費了 40 GB。歸零後,VDD 會在主機上佔用 100 GB 的空間。並
qemu-img -c ...
創建了 91 GB,這完全不是我的預期。在modernie 網站上,我們可以下載小於10 GB 的W7 VM,這怎麼可能?有沒有辦法“真正”壓縮 VM 映像?
感謝@dyasny,我用
virt-sparsity
. 我清理了 W7 VM 磁碟,禁用休眠,所以 VDD 只消耗 20 GB。再次降級磁碟,然後再次執行sdelete -z
。virt-sparsity
使用該標誌執行--compress
會提供 80 GB 的虛擬驅動器。遠非我所希望的。EDIT-2016-02-16:“刷新”這個問題,因為這裡討論的縮小 VM 的方法非常有效,但有一個主要缺點:它會刪除所有 VM 快照。如果有人知道如何在保留快照的同時縮小 VM,請隨時分享!
我終於設法真正縮小了 VM 空間。一開始,W7 VM 佔用了 107 GB 的主機儲存空間。虛擬 HDD 大小為 100 GB,目前,VM 僅佔用 18 GB 的虛擬儲存空間。
這是我所做的:
- 清理虛擬驅動器(刪除臨時文件等)
- 使用具有“全面優化”功能的開源 UltraDefrag 軟體進行碎片整理
- 跑
sdelete -c c:
- 跑
sdelete -z c:
- 跑
qemu-img convert -c -f qcow2 w7-64.qcow2 -O qcow2 w7-64-compressed.qcow2
這樣,qcow2 文件就從 107 GB 縮小到了…7 GB!
要縮小 Windows 來賓作業系統,您必須縮小來賓內部的分區,關閉虛擬機,創建所需大小的新磁碟,將數據從舊磁碟複製到新的較小磁碟,交換磁碟名稱並重新啟動虛擬機。
這很簡單,但如果操作不當可能會導致數據失去和頭髮失去。
以下是帶有 100 GB 的 Windows Server 2012 來賓的 KVM 的步驟,我們希望使用 QCOW2 格式縮小到 35 GB。
重要提示:此方法不涉及修改虛擬機定義。相反,它只需要磁碟映像操作。
客人的假設:
來賓是 Windows Server 2012
QCOW2 格式的 100 GB 磁碟映像
兩個分區:
- 350 MB 啟動
- 99.6 GB 的 C:具有 20 GB 已用空間的驅動器
我們想縮小 C: 從 99.6 GB 到 34 GB
主機假設:
- Ubuntu 16 LTS 伺服器
- KVM (libvirt)
- 250 GB 驅動器
- 位於 /var/lib/libvirt/images 中的虛擬映像
第 1 步:準備 Windows 來賓,收縮主 C: 分區
在這一步中,我們將直接從 Windows 中減少我們的 Windows 分區。此步驟結束時生成的磁碟映像將是引導分區、C: 驅動器(減少)和我們將刪除的剩餘未使用空間(通過不將其複製到新磁碟)的總和。
- 登錄到 Windows 來賓
- 打開“電腦管理”實用程序,使用開始菜單搜尋功能找到它。
- 在左側,點擊“儲存->磁碟管理”儲存磁碟管理截圖
- 在新螢幕上,右鍵點擊 C: 分區,點擊“Shrink Volume…”,這需要一點時間才會出現一個對話框。耐心點。
- 一旦出現“收縮 C:”對話框視窗,在“要收縮的空間量”中輸入空間量,使“收縮後的總大小(以 MB 為單位)”值接近所需的 35 GB。然後點擊“收縮”。
注意:如果新空間太小,您可能會收到錯誤消息,在這種情況下,您應該將“要收縮的空間量”逐漸減少 1GB,直到錯誤消失並發生收縮。在實踐中,我們希望保留 10 GB 的可用空間。
假設您能夠將 C: 分區縮小到 34 GB。 6. 完成後,通過打開命令提示符並鍵入以下內容來關閉 VM:
shutdown /s /t 0
7. 您的 Windows 來賓已準備就緒。第 2 步:縮小 VM 主機上的磁碟
該過程並不是真正的收縮,而是我們將創建一個新磁碟(最終大小),我們將從原始磁碟複製兩個分區,並跳過未使用的空間。
目標是創建一個總大小 = 引導分區 + C: 分區的磁碟。我們還會得到一些微小的剩餘空間(除非你的數學是完美的),不用擔心,因為我們將在最後一步處理。
- 登錄linux主機
- 切換到超級使用者:
sudo su
- 轉到儲存虛擬圖像的位置:
cd /var/lib/libvirt/images
- 列出文件:
ls -l
- 找到您的客人圖片(其他地方的大量教程)。假設我們的 Windows 訪客映像名為“windows.qcow2”
- 我們做一個備份:
mkdir backup cp windows.qcow2 backup/windows.qcow2.bak
(去喝杯咖啡,因為這需要一段時間才能獲得大磁碟) 7. 安裝您可能缺少的 guestfs 軟體包:
apt-get install libguestfs-tools
- 好的,讓我們通過瀏覽 windows 映像來仔細檢查我們的 windows 磁碟
virt-filesystems
:virt-filesystems --long --parts --blkdevs -h -a windows.qcow2
輸出這個:
Name Type MBR Size Parent /dev/sda1 partition 07 350M /dev/sda /dev/sda2 partition 07 34G /dev/sda /dev/sda device - 100G -
請注意,我們有
/dev/sda1
350 MB 的 Windows 引導分區/dev/sda2
,現在是 34 GB 的 C: 分區,總磁碟映像/dev/sda/
為 100 G,留給我們一堆空間需要修剪。所以這是重要的一步:算一算:34 G + 350M 適合 35 G,因此我們將創建一個 35 GB 的圖像。我們最終會不可避免地得到一些剩餘空間——除非你的數學是完美的——但別擔心,我們將在下面處理它。 9.
newdisk.qcow2
讓我們創建一個總大小為 35 GB的新虛擬 QCOW2 磁碟:qemu-img create -f qcow2 -o preallocation=metadata newdisk.qcow2 35G
輸出:
Formatting 'newdisk.qcow2', fmt=qcow2 size=37580963840 encryption=off cluster_size=65536 preallocation=metadata lazy_refcounts=off refcount_bits=16`
- 讓我們通過將舊磁碟複製到新分配的磁碟來調整磁碟大小。這是絕對令人敬畏的一點。大多數其他指南顯示了一些非常複雜的東西。這可以通過這個命令簡單地完成,之後你應該去喝更多的咖啡——這可能需要一段時間:
virt-resize windows.qcow2 newdisk.qcow2`
輸出這個:
[ 0.0] Examining windows.qcow2 100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? --:-- ********** Summary of changes: /dev/sda1: This partition will be left alone. /dev/sda2: This partition will be left alone. There is a surplus of 439.8M. An extra partition will be created for the surplus. ********** [ 8.8] Setting up initial partition table on newdisk.qcow2 [ 9.9] Copying /dev/sda1 100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? 00:00 [ 15.1] Copying /dev/sda2 100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? 00:00 Resize operation completed with no errors. Before deleting the old disk, carefully check that the resized disk boots and works correctly.
請注意該工具發現了剩餘空間…回憶一下關於數學的評論…所以您可以取消它並重新創建磁碟,或者像我們在此處所做的那樣繼續前進並像
sda2
在步驟 3 中所做的那樣擴展分區。 11. 一旦完成。檢查生成的圖像:virt-filesystems --long --parts --blkdevs -h -a newdisk.qcow2
輸出這個:
Name Type MBR Size Parent /dev/sda1 partition 07 350M /dev/sda /dev/sda2 partition 07 34G /dev/sda /dev/sda3 partition 83 439.8M /dev/sda /dev/sda device - 35G -
注意
/dev/sda3
剩餘空間的類型是 linux 類型。剩餘的空間是可以的,除非你的數學完全正確。我們將在下面進一步處理來自 Windows 來賓的這個額外分區。現在,忽略它。 12. 交換磁碟映像:mv windows.qcow2 backup/ mv newdisk.qcow2 windows.qcow2
- 啟動你的虛擬機。
第 3 步:在 Window Guest 上完成磁碟操作
在這一步中,我們確認 Windows 啟動正常,我們將把 C 分區擴展到額外的空間。
- 登錄到 Windows 來賓
- 打開“電腦管理”實用程序,使用開始菜單搜尋功能找到它。
- 在左側,點擊“儲存->磁碟管理”
- 您應該看到 3 個分區:引導、C: 和一個 439 MB 的小分區(最右邊)。顯示 3 個分區的電腦管理螢幕截圖
- 通過右鍵點擊->刪除卷刪除linux分區。(對任何提示點擊是)
- 右鍵點擊 C: 分區並點擊“擴展”,然後在對話框中點擊“下一步”和“確定”。它應該只提供最後一個分區的擴展量。完成後,您已經調整了 C: 的大小,並且只剩下兩個分區。
- 就是這樣。您的 Windows 來賓現在僅使用 35 GB 左右。請記住,由於所有成本等原因,實際磁碟映像可能更大(可能接近 38 GB)。
檢查一切是否正常並刪除您的映像備份或將它們離線移動到儲存中。