如何縮小原始虛擬機器磁碟映像(kvm)的大小?

如何縮小原始虛擬機器磁碟映像(kvm)的大小?

假設我的linux-vm-image.raw大小為 10GB。裡面有一個主分割區(使用「經典」MS-DOS 式分割區表,而不是 GPT)etx4分割區(不使用 LVM),擴展到整個磁碟區。例如,該分割區上分配的實際資料為 3GB。

該映像已準備好用於某些虛擬化環境(在我的例子中是 kvm+OpenStack),從此映像建立的任何 VM 都會根據使用者的選擇調整自身大小以適應目標虛擬磁碟大小。因此沒有理由在該磁碟映像中保留任何可用磁碟空間。

如何將此原始磁碟映像的大小縮小到最小(從 10GB 到 ~3GB)?

一些 指示對於qcow2磁碟映像,但我必須raw僅使用映像 - 不使用qcow,不使用OVF,也不使用其他映像。

我的猜測是這樣的

  • 將此映像檔作為區塊裝置安裝在某處
  • 進行一些維護,將 ext4 分割區內的所有檔案移至其“開頭”,換句話說 - 進行可用空間碎片整理
  • 解除安裝映像
  • 將檔案系統的大小縮小為圖像(以匹配其中資料的大小)
  • 縮小圖像的大小(以匹配其中檔案系統的大小)
  • 將分區表更新到映像中以符合新的分割區大小

但我不是在嘗試發明自行車嗎?是否有一些單行命令或特殊軟體可以完成我想要的事情?

答案1

原始影像並不是真正適合調整大小。但是,您可以嘗試zerofree(已卸載的)檔案系統,然後壓縮生成的映像檔。

另外,檢查您的目標環境是否支援 OVF 容器格式,該格式允許壓縮磁碟映像。 (zerofree 仍然適用)。

答案2

你走在正確的軌道上。如果您可以將其安裝為區塊裝置(循環安裝),則可能可以讓 gparted 對其進行處理。

gparted 將完成您想要的大部分操作:
1. 將 FS 資料移到其分割區的前面(收縮 FS)
2. 收縮分割區並調整分割區表
3. 它甚至可以為您提供剩餘的「磁碟」當您讓它列印更新的分割表時的大小(例如最後一個分割區的最後一個磁區等)。

這是最困難的部分。之後,將其卸載。您可能必須手動計算“磁碟”的確切大小,但之後,對檔案進行簡單的截斷就可以了。

更新:如果您的分割表是 MBR 類型,那就沒問題。使用 GPT,它在磁碟末尾有一個鏡像副本。因此,請小心,因為 gparted 可能不夠聰明(除非您可以直接給它原始圖像)。如果遇到問題,請考慮將 gdisk 作為截斷後的步驟。截斷一些額外的區塊並使用 gdisk/equiv 重建鏡像副本(可能需要第二次循環掛載)。

相關內容