題 如何壓縮VirtualBox的VDI文件大小?


我有一個配置了非常大的硬盤大小(大於主機)的VirtualBox VM。由於我的錯誤,VM上的程序生成了大量日誌文件,並且VDI文件大小不斷增長,直到主機上沒有空間。

現在我刪除了日誌文件,但VDI文件大小在使用後沒有變小 VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

有沒有辦法真正壓縮VDI文件大小?謝謝!


279
2018-01-07 03:41


起源




答案:


您必須執行以下步驟:

  1. 在guest虛擬機中運行碎片整理(僅限Windows)
  2. 無效空間:

    有了 Linux Guest 運行這個:

    dd if=/dev/zero of=/var/tmp/bigemptyfile bs=4096k ; rm /var/tmp/bigemptyfile
    

    要么:

    telinit 1
    mount -o remount,ro /dev/sda1
    zerofree -v /dev/sda1
    

    有了 Windows Guest, 下載 SDelete 從Sysinternals開始運行:

    sdelete.exe c: -z
    

    (將C:替換為VDI的驅動器號)

  3. 關閉來賓VM

  4. 現在運行VBoxManage modifymedium 命令與 --compact 選項:

    有了 Linux主機 運行這個:

    vboxmanage modifymedium --compact /path/to/thedisk.vdi
    

    有了 Windows主機 運行這個:

    VBoxManage.exe modifymedium --compact c:\path\to\thedisk.vdi
    

    有了 Mac主機 運行這個:

    VBoxManage modifymedium --compact /path/to/thedisk.vdi
    

這減少了vdi的大小。


469
2018-01-07 05:05



對於下一個人,我的命令最終看起來像這樣:“C:\ Program Files \ Oracle \ VirtualBox \ VBoxManage.exe”modifyhd“C:\ Users \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi” - -緊湊 - Daniel
根據zerofree Linux實用程序手冊(manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html),zerofree應該比 DD 為了這份工作。 DD 不會被推薦,因為“它很慢”,“它使磁盤映像(暫時)增長到最大範圍”,“它(暫時)使用磁盤上的所有可用空間,因此其他並發寫入操作可能會失敗”。 Zerofree可以通過Ubuntu Linux獲得 易於,或者你可以自己編譯。 - Dakatine
它的手冊非常有趣 zerofree 陳述說 DD 其他並發寫入將失敗,但zerofree需要以只讀方式掛載文件系統! *杜* - Madarco
提示:將兩個命令放在一行上,如下所示: dd ...; rm /bigfile,這樣可以最大限度地減少完整磁盤的時間,以防您不等待 dd 去完成。 - jlh
@Dakatine使用VirtualBox 4.3.10,磁盤映像文件 沒有成長 到最大程度。 VirtualBox非常聰明,無需將所有零塊寫入物理磁盤。 - jlh


如果在接受的答案中運行該命令會產生一個無用的錯誤消息,如下所示

VBoxManage.exe: error: Cannot register the hard disk 'thedisk.vdi'
{aaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee} because a hard disk 'thedisk.vdi'
with UUID {aaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee} already exists

只需通過UUID而不是文件名運行命令:

VBoxManage.exe modifyhd {aaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee} --compact

35
2018-06-18 07:20





我在Windows客戶端的Windows 7主機上,這是我寫的一個批處理文件壓縮文件夾樹中的所有VDI

echo off
mode con:cols=140 lines=200
cls
:: see https://forums.virtualbox.org/viewtopic.php?p=29272#p29272
:: How can I reduce the size of a dynamic VDI on disk?
:: but that page says to use sdelete -s which is suboptimal. 
:: use -z as per http://technet.microsoft.com/en-us/sysinternals/bb897443.aspx

:: First run the sdelete -z c: inside the VMs that zero-out all the free space
:: THEN run this batch file 

Title Compacting Free space on Virtual Machine VMs

:: http://ss64.com/nt/for_r.html
:: http://stackoverflow.com/questions/8836368/windows-batch-file-how-to-loop-through-files-in-a-directory/8836401#8836401

Setlocal EnableDelayedExpansion
:: http://ss64.com/nt/delayedexpansion.html ... 
:: Notice that within the for loop we use !variable! instead of %variable%.

For /R %CD% %%G IN (*.vdi) DO (
 set ohai=%%G
 set lastfive=!ohai:~-5!
:: Skip snapshots which are named {guid}.vdi
 if NOT !lastfive!==}.vdi (
 echo .
 echo Compacting %%G
 "C:\Program Files\Oracle\VirtualBox\VboxManage.exe" modifyhd "%%G" --compact )
 )

pause 
exit

我在評論中留下了鏈接,這樣你就可以(有點)告訴它是如何工作的。

編輯

好吧,畢竟,我試過了 CloneVDI工具 它在很短的時間內完成了很好的工作。


11
2018-01-09 10:25



您會認為在這種類型的網站上會有某種語法突出顯示DOS但沒有。它在Notepad ++中看起來更漂亮 - CAD bloke
@CAD_bloke需要一個解析引擎,當你考慮在SE上發布的不同語言的數量時,你正在看一個巨大的項目。只要想想有多少版本和方言的DOS就是這樣的,那就是在你進入Linux等之前。 - Caltor
很好的一點。諷刺的是 是 在堆棧交換iOS應用程序上突出顯示。 - CAD bloke
是的CloneVDI是更好,更快的個人使用方式 - VarunAgw


Windows主機上的Debian guest使用discard / TRIM。

這不是一個直接的答案本身,因為我正在解決問題,而不是問題。此解決方案不使用周期性壓縮映像,而是使用discard自動刪除主機VM磁盤映像中未使用的塊。

此解決方案需要支持連續TRIM的來賓文件系統。 Arch Linux wiki有一個 支持TRIM操作的文件系統列表

FDE和cryptoroot特別沒有涵蓋,因為存在安全問題,並且該問題的其他解決方案都不允許壓縮。 Arch Linux wiki有關於的信息 TRIM和dm-crypt設備

從理論上講,這適用於使用VDI存儲的VBox主機上的所有Linux guest虛擬機。

主機配置

退出VBox並且沒有運行VM,通過設置兩者來為磁盤添加丟棄支持 discard 和 nonrotational 對於VM的配置文件中的每個磁盤。此時 discard 不在GUI中,但是 nonrotational 暴露為“固態驅動器”複選框。 (參考: vbox論壇,放棄支持

<AttachedDevice discard="true" nonrotational="true" type="HardDisk" [..other options..] >

啟動VM,並驗證是否已啟用TRIM支持:

sudo hdparm -I /dev/sda | grep TRIM

訪客配置

如果正在使用LVM,請更改丟棄設置 /etc/lvm/lvm.conf。 (參考: debian wiki,lvm.conf示例

devices {
...
    issue_discards = 1
}

在fstab中,添加 discard 您希望自動丟棄的文件系統的選項(參考: debian wiki,fstab示例

UUID=8db6787f-1e82-42d8-b39f-8b7491a0523c   /   ext4    discard,errors=remount-ro   0   1
UUID=70bfca92-8454-4777-9d87-a7face32b7e7   /build  ext4    discard,errors=remount-ro,noatime   0   1

重新安裝文件系統,讓他們選擇新的選項。

sudo mount -o remount /
sudo mount -o remount /build

現在手動修剪自由塊 fstrimfstrim 使用掛載的文件系統,而不是支持它的塊設備。而不是設置連續丟棄 fstab,這可以在每週一次的cron上完成。 (對於可能對TRIM有可疑支持的物理SSD,建議使用每週cron,但這不相關,因為底層SSD由主機操作系統處理。請參閱: ssd修剪警告)。

fstrim /
fstrim /build

此時,VM內部文件系統的大小和VM映像的大小應該非常接近。

經測試:

  • Guest1:Debian 8.7,內核:linux 4.8 grsec來自backports,filesystem:ext4
  • Guest2:Debian 9 RC2,內核:linux 4.9,文件系統:ext4
  • Host1:VBox 5.1.14,Win7,圖像fmt:VDI
  • Host2:VBox 5.1.14,Win8.1,image fmt:VDI

5
2018-02-24 16:27





對於 MacOS Guest 做這個:

  1. 取消客戶系統中的可用空間:

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

    (將/ Volumes / Macintosh HD替換為您的驅動器名稱)

  2. 關閉來賓VM

  3. 運行此命令可減少VDI磁盤映像大小

    VBoxManage modifyhd /path/to/thedisk.vdi --compact
    

    要么

    VBoxManage modifymedium /path/to/thedisk.vdi --compact
    

2
2017-12-16 17:08





我將此用於在Windows VirtualBox中安裝到虛擬Debian的VDI映像。這不是一般的解決方案,但至少應該給你一個關於我所做的事情的要點。

Debian中的命令:

root@debian:~# lsblk  # show partitions
名稱MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 128G 0磁盤
└─sdb18:17 0 128G 0 part / mnt / web#這是感興趣的分區!
sda 8:0 0 64G 0磁盤
├─sda18:1 0 61,4G 0 part /
├─sda28:2 0 1K 0部分
└─sda58:5 0 2,7G 0部分
[SWAP] sr0 11:0 1 53,5M 0 rom
root@debian:~# service mysql stop  # terminate all operations with partition
root@debian:~# service apache2 stop  # terminate all operations with partition
root@debian:~# umount /mnt/web  # unplug partition
root@debian:~# apt-get install zerofree  # install tool for filling in zeros to empty space
root@debian:~# zerofree -v /dev/sdb1  # fill with zeros
root@debian:~# poweroff  # shut down machine

Windows中的命令:

C:\Program Files\Oracle\VirtualBox>VBoxManage.exe modifyhd --compact "D:\VirtualBox VMs\web.vdi"  # convert zeros to empty space

希望能幫助到你 :)


1
2018-02-05 11:31





我不想在操作系統中啟用TRIM支持,因為每次刪除數據都會強制VDI文件中的數據壓縮,使VDI文件位於經典旋轉盤上時,訪客系統無法使用。對我來說,更好的是用手進行壓實,例如每月一次。

在正常壓縮期間,VDI文件內容將復製到新文件。這需要主機光盤上的一些(有時是大的)可用空間。

我的解決方案類似於Andrew Domaszek所指出的。即使使用NTFS(Windows10),它也能很好地工作。

去做這個:

  • 創建使用GParted Live CD啟動的新虛擬機(您可以使用自己喜歡的Linux發行版)。
  • 編輯機器設置並設置SATA光盤控制器
  • 添加要壓縮的現有VDI文件
  • 將基於VDI的光盤更改為具有TRIM支持的SSD可見:

VBoxManage storageattach "gpared live" --storagectl "SATA" --port 0 --discard on --nonrotational on VBoxManage storageattach "gpared live" --storagectl "SATA" --port 1 --discard on --nonrotational on

  • 啟動機器
  • 在Linux root shell中,掛載NTFS分區 mount /dev/sda2 /mnt
  • 零自由空間 dd if=/dev/zero of=/mnt/bigfile
  • rm /mnt/bigfile
  • 強制壓縮VDI而不創建新文件: fstrim -v /mnt

1
2017-09-15 07:17





一個非常巧妙的技巧來補充已接受的答案是,通過在主機上使用壓縮文件系統(例如,選擇在NTFS屬性上壓縮虛擬驅動器的文件夾),您可以在將客戶空間置零後完全不進行任何壓縮。 Windows主機)。這實際上有利於節省更多空間,因為操作系統往往容納大量重複文本或二進製文件(例如,具有15GB空間歸零的30GB客戶驅動器可以在主機驅動器上變為4GB)。

注意事項包括實際硬件上的驅動器訪問可能會增加,並且CPU使用率略有增加。


0
2018-01-20 07:13