Windows

如何“真正”減小 KVM 虛擬機映像的大小?

  • July 6, 2018

我花了很多時間在網上搜尋如何縮小 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 -zvirt-sparsity使用該標誌執行--compress會提供 80 GB 的虛擬驅動器。遠非我所希望的。


EDIT-2016-02-16:“刷新”這個問題,因為這裡討論的縮小 VM 的方法非常有效,但有一個主要缺點:它會刪除所有 VM 快照。如果有人知道如何在保留快照的同時縮小 VM,請隨時分享!

我終於設法真正縮小了 VM 空間。一開始,W7 VM 佔用了 107 GB 的主機儲存空間。虛擬 HDD 大小為 100 GB,目前,VM 僅佔用 18 GB 的虛擬儲存空間。

這是我所做的:

  1. 清理虛擬驅動器(刪除臨時文件等)
  2. 使用具有“全面優化”功能的開源 UltraDefrag 軟體進行碎片整理
  3. sdelete -c c:
  4. sdelete -z c:
  5. 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: 驅動器(減少)和我們將刪除的剩餘未使用空間(通過不將其複製到新磁碟)的總和。

  1. 登錄到 Windows 來賓
  2. 打開“電腦管理”實用程序,使用開始菜單搜尋功能找到它。
  3. 在左側,點擊“儲存->磁碟管理”儲存磁碟管理截圖
  4. 在新螢幕上,右鍵點擊 C: 分區,點擊“Shrink Volume…”,這需要一點時間才會出現一個對話框。耐心點。
  5. 一旦出現“收縮 C:”對話框視窗,在“要收縮的空間量”中輸入空間量,使“收縮後的總大小(以 MB 為單位)”值接近所需的 35 GB。然後點擊“收縮”。

注意:如果新空間太小,您可能會收到錯誤消息,在這種情況下,您應該將“要收縮的空間量”逐漸減少 1GB,直到錯誤消失並發生收縮。在實踐中,我們希望保留 10 GB 的可用空間。

假設您能夠將 C: 分區縮小到 34 GB。 6. 完成後,通過打開命令提示符並鍵入以下內容來關閉 VM:shutdown /s /t 0 7. 您的 Windows 來賓已準備就緒。

第 2 步:縮小 VM 主機上的磁碟

該過程並不是真正的收縮,而是我們將創建一個新磁碟(最終大小),我們將從原始磁碟複製兩個分區,並跳過未使用的空間。

目標是創建一個總大小 = 引導分區 + C: 分區的磁碟。我們還會得到一些微小的剩餘空間(除非你的數學是完美的),不用擔心,因為我們將在最後一步處理。

  1. 登錄linux主機
  2. 切換到超級使用者:sudo su
  3. 轉到儲存虛擬圖像的位置:cd /var/lib/libvirt/images
  4. 列出文件:ls -l
  5. 找到您的客人圖片(其他地方的大量教程)。假設我們的 Windows 訪客映像名為“windows.qcow2”
  6. 我們做一個備份:
mkdir backup
cp windows.qcow2 backup/windows.qcow2.bak

(去喝杯咖啡,因為這需要一段時間才能獲得大磁碟) 7. 安裝您可能缺少的 guestfs 軟體包:

apt-get install libguestfs-tools
  1. 好的,讓我們通過瀏覽 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/sda1350 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`
  1. 讓我們通過將舊磁碟複製到新分配的磁碟來調整磁碟大小。這是絕對令人敬畏的一點。大多數其他指南顯示了一些非常複雜的東西。這可以通過這個命令簡單地完成,之後你應該去喝更多的咖啡——這可能需要一段時間:
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
  1. 啟動你的虛擬機。

第 3 步:在 Window Guest 上完成磁碟操作

在這一步中,我們確認 Windows 啟動正常,我們將把 C 分區擴展到額外的空間。

  1. 登錄到 Windows 來賓
  2. 打開“電腦管理”實用程序,使用開始菜單搜尋功能找到它。
  3. 在左側,點擊“儲存->磁碟管理”
  4. 您應該看到 3 個分區:引導、C: 和一個 439 MB 的小分區(最右邊)。顯示 3 個分區的電腦管理螢幕截圖
  5. 通過右鍵點擊->刪除卷刪除linux分區。(對任何提示點擊是)
  6. 右鍵點擊 C: 分區並點擊“擴展”,然後在對話框中點擊“下一步”和“確定”。它應該只提供最後一個分區的擴展量。完成後,您已經調整了 C: 的大小,並且只剩下兩個分區。
  7. 就是這樣。您的 Windows 來賓現在僅使用 35 GB 左右。請記住,由於所有成本等原因,實際磁碟映像可能更大(可能接近 38 GB)。

檢查一切是否正常並刪除您的映像備份或將它們離線移動到儲存中。

引用自:https://serverfault.com/questions/729110