2013-01-07 03:41:45 +0000 2013-01-07 03:41:45 +0000
307
307

Jak zmniejszyć rozmiar pliku VDI VirtualBoxa?

Mam maszynę wirtualną VirtualBoxa, która skonfigurowała bardzo duży rozmiar dysku twardego (większy niż host). Przez moją pomyłkę program na maszynie VM wygenerował wiele plików logów, a rozmiar plików VDI ciągle rośnie, aż do momentu, gdy nie ma miejsca na hoście.

Teraz usunąłem pliki logów, ale rozmiar plików VDI nie zmniejsza się po użyciu VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

Czy istnieje sposób na rzeczywiste zmniejszenie rozmiaru plików VDI? Dzięki!

Odpowiedzi (8)

520
520
520
2013-01-07 05:05:34 +0000

Musisz wykonać następujące kroki:

  1. Uruchom defrag w gościu (tylko Windows)
  2. Zlikwidować wolne miejsce:

  3. Wyłączenie maszyny wirtualnej gościa

  4. Teraz wykonaj polecenie VBoxManage modifymedium z opcją --compact:

Zmniejsza to rozmiar vdi.

12
12
12
2015-01-09 10:25:08 +0000

I’m on a Windows 7 host with Windows guests, Here is a batch file I wrote to Compact all of the VDIs in a folder tree

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

I left the links in the comments so you can (sort of) tell how it works.

edit

Well, after all that, I tried the CloneVDI tool and it did a good work in much less time and in one click.

7
7
7
2017-02-24 16:27:40 +0000

Debian guest on Windows host using discard/TRIM.

Nie jest to bezpośrednia odpowiedź sama w sobie, ponieważ zajmuję się problemem, a nie pytaniem. Zamiast okresowo kompresować obraz, rozwiązanie to wykorzystuje odrzutnik do automatycznego usuwania nieużywanych bloków w obrazie dysku maszyny wirtualnej hosta.

Rozwiązanie to wymaga systemu plików gościa, który obsługuje ciągły TRIM. Wiki Arch Linux posiada listę systemów plików obsługujących operacje TRIM .

FDE i cryptoroot nie są specjalnie uwzględnione, ponieważ istnieją obawy związane z bezpieczeństwem i żadne inne rozwiązanie tego problemu nie pozwoliłoby również na kompaktowanie. Wiki Arch Linuxa zawiera informacje o TRIM i urządzeniach dm-crypt .

Teoretycznie będzie to działać dla wszystkich gości Linuksa na hostach VBoxa korzystających z pamięci masowej VDI.

Konfiguracja hosta

Przy wyjściu VBoxa i braku uruchomionych maszyn wirtualnych, dodaj obsługę dysków poprzez ustawienie zarówno discard jak i nonrotational dla każdego dysku w pliku konfiguracyjnym dla maszyny wirtualnej. W tym momencie discard nie znajduje się w graficznym interfejsie użytkownika, ale nonrotational jest wyświetlany jako pole wyboru “Solid-state Drive”. (ref: vbox forums, discard support )

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

Boot the VM up, and verify that TRIM support is enabled:

sudo hdparm -I /dev/sda | grep TRIM

Guest Configuration

If LVM is in use, change the discard setting in /etc/lvm/lvm.conf. (ref: debian wiki, lvm.conf example )

devices {
...
    issue_discards = 1
}

In fstab, add the discard option to the filesystems you wish to auto-discard (ref: debian wiki, fstab example )

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

Remount the filesystems to have them pick up their new options.

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

Ręczne przycinanie wolnych bloków za pomocą fstrim. fstrim używa zamontowanego systemu plików, nie urządzenia blokującego. Zamiast ustawiać ciągły odrzut w fstab, można to zrobić na cotygodniowym cronie. (Cotygodniowy cron jest zalecany dla fizycznych dysków SSD, które mogą mieć wątpliwe wsparcie dla TRIM, ale nie jest to istotne w tym przypadku, ponieważ podstawowe dyski SSD są obsługiwane przez system operacyjny hosta. patrz: ostrzeżenie o trymie ssd ).

fstrim /
fstrim /build

W tym momencie rozmiar systemów plików wewnątrz maszyny wirtualnej i rozmiar obrazów maszyny wirtualnej powinien być dość zbliżony do wartości.

Testowane z:

  • Guest1: Debian 8.7, jądro: linux 4.8 grsec z backportów, system plików: ext4
  • Guest2: Debian 9 RC2, jądro: linux 4.9, system plików: ext4
  • Host1: VBox 5.1.14, Win7, image fmt: VDI
  • Host2: VBox 5.1.14, Win8.1, obrazek fmt: VDI
2
2
2
2016-12-16 17:08:31 +0000

Dla Gościa MacOS zrób to:

  1. Unieważnij wolne miejsce w systemie dla gości:

  2. Wyłączyć maszynę wirtualną dla gości:

  3. Wykonaj to polecenie, aby zmniejszyć rozmiar obrazu dysku VDI:

1
1
1
2016-02-05 11:31:32 +0000

Używam tego dla mojego obrazu VDI zamontowanego na wirtualnym Debianie w Windows VirtualBox. Nie jest to rozwiązanie ogólne, ale powinno przynajmniej dać Ci zarys tego, co robię.

Komendy w Debianie: root@debian:~# lsblk # show partitions

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 128G 0 disk └─sdb1 8:17 0 128G 0 part /mnt/web # THIS IS THE PARTITION OF INTEREST! sda 8:0 0 64G 0 disk ├─sda1 8:1 0 61,4G 0 part / ├─sda2 8:2 0 1K 0 part └─sda5 8:5 0 2,7G 0 part [SWAP] sr0 11:0 1 56,3M 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

Komendy w Windows:

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

Mam nadzieję, że to pomoże :)

1
1
1
2017-09-15 07:17:05 +0000

Nie chcę włączać obsługi TRIM w systemie operacyjnym, ponieważ każde usunięcie danych wymusi kompresję danych w pliku VDI, czyniąc system gościa bezużytecznym, gdy plik VDI znajduje się na klasycznym dysku obrotowym. Dla mnie lepszym rozwiązaniem jest ręczne kompaktowanie np. raz na miesiąc.

Podczas normalnego kompaktowania zawartość pliku VDI jest kopiowana do nowego pliku. Wymaga to trochę (czasami dużego) wolnego miejsca na dysku hosta.

Mam rozwiązanie podobne do tego, które wskazał Andrew Domaszek. Działa ono bardzo dobrze nawet z NTFS (Windows10).

Aby to zrobić:

  • stwórz nową wirtualną maszynę, która uruchamia się z płyty GParted Live CD (możesz użyć swojej ulubionej dystrybucji Linuksa).
  • edytuj ustawienia maszyny i ustaw kontroler dysków SATA
  • dodaj istniejące pliki VDI, które chcesz skompresować
  • zmień dyski bazujące na VDI, aby były widoczne jako SSD z obsługą TRIM:

  • uruchom maszynę

  • w Linuxowej powłoce root, zamontuj partycję NTFS mount /dev/sda2 /mnt

  • zero wolnego miejsca dd if=/dev/zero of=/mnt/bigfile

  • wymuszaj kompresję VDI bez tworzenia nowego pliku: rm /mnt/bigfile

0
0
0
2019-08-17 06:07:39 +0000

IMPORTANT NOTE FOR LEGACY (~1997-2007) OPERATORING SYSTEMS

Ogólnie rzecz biorąc, techniki zawarte w podanych wcześniej odpowiedziach są ważne; HOWEVER, istnieje bardzo ważny przypadek szczególny.

Przez okres kilku lat - być może 1997-2007 lub dotychczas 32-bitowe systemy operacyjne były nadal normą, ale dyski twarde większe niż 2GB były już w użyciu. W rezultacie, próbując wykorzystać całą wolną przestrzeń poprzez zapisanie pliku zerami (co zawsze powinno być wykonywane jako root, aby uwzględnić uprzywilejowane wolne miejsce roota, którego nikt inny nie może dotknąć), możesz zobaczyć:

Plik zbyt duży

zamiast tego, czego oczekujesz:

Brak miejsca na urządzeniu.

Jeśli tak się stanie, najprawdopodobniej trafisz na ograniczenie rozmiaru pliku 2GB. Było to wówczas powszechne, ponieważ wiele operacji na plikach zwracało wyniki w postaci podpisanych 32-bitowych liczb całkowitych, dzięki czemu ujemne wartości mogły zgłaszać kody błędów. W praktyce oznaczało to, że wyniki offsetu były ograniczone do 2^31 bajtów bez specjalnych środków.

Obejście jest proste: należy tworzyć oddzielne, inaczej nazwane pliki z zerowaniem, aż do momentu, gdy na dysku faktycznie zabraknie miejsca.

Jeśli jesteś instruktorem, który chce zademonstrować taką sytuację dla danej klasy, wystarczy obraz dysku 4GB ze starą kopią Red Hat Linux 7.0.

0
0
0
2018-01-20 07:13:01 +0000

Bardzo zgrabną sztuczką uzupełniającą zaakceptowaną odpowiedź jest to, że po wyzerowaniu miejsca dla gości, można uciec bez kompresji, używając skompresowanego systemu plików na hoście (np. wybierając do kompresji folder dysków wirtualnych na właściwościach NTFS na hoście Windows). W rzeczywistości ma to tę zaletę, że pozwala zaoszczędzić o wiele więcej miejsca, ponieważ systemy operacyjne zazwyczaj przechowują wiele powtarzających się plików tekstowych lub binarnych (np. dysk gościa o pojemności 30 GB, który miał wyzerowane 15 GB miejsca, może zmienić się w 4 GB na dysku hosta).

Caveats przewidują, że dostęp do dysku na prawdziwym sprzęcie może wzrosnąć i występuje niewielki wzrost wykorzystania procesora.