VirtualBox'ın VDI dosya boyutu nasıl sıkıştırılır?


302

Çok büyük bir sabit disk boyutu (ana bilgisayardan daha büyük) yapılandırmış bir VirtualBox VM'im var. Yanlışlıkla, VM'deki bir program çok sayıda günlük dosyası oluşturdu ve VDI dosya boyutu ana bilgisayarda yer kalmayana kadar büyümeye devam ediyor.

Şimdi günlük dosyalarını sildim ancak VDI dosya boyutu kullandıktan sonra küçülmüyor VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

VDI dosya boyutunu gerçekten sıkıştırmanın bir yolu var mı? Teşekkürler!

Yanıtlar:


506

Aşağıdaki adımları yapmanız gerekir:

  1. Konukda dolandırmayı çalıştır (yalnızca Windows)
  2. Geçersiz boş alan:

    Bir Linux Misafiriyle şunu çalıştırın:

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

    Veya:

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

    Bir Windows Misafir ile Sysinternals SDelete indirin ve bunu çalıştırın:

    sdelete.exe c: -z
    

    (C: yerine VDI sürücü harfiyle)

  3. Konuk VM'yi kapatma

  4. Şimdi VBoxManage'ın modifymediumkomutunu aşağıdaki --compactseçenekle çalıştırın :

    Bir Linux Host ile bunu çalıştırın:

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

    Bir Windows Host ile bunu çalıştırın:

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

    Bir Mac Host ile bunu çalıştırın:

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

Bu vdi boyutunu küçültür.


13
Bir sonraki kişi için komutum şöyle görünmüştü: "C: \ Program Files \ Oracle \ VirtualBox \ VBoxManage.exe" "edithd" "C: \ Kullanıcılar \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi" - -compact
Daniel

36
Zerofree Linux yarar manpage (göre manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html ), zerofree daha iyi olmalıdır gg bu iş için. dd , "yavaş", "disk görüntüsünü (geçici olarak) maksimum ölçüde büyütmesini sağlar", "(" geçici olarak) diskteki tüm boş alanları kullanır, böylece diğer eşzamanlı yazma işlemleri başarısız olabilir ". Zerofree, Ubuntu Linux'ta apt aracılığıyla kullanılabilir veya kendiniz derleyebilirsiniz.
Dakatine

25
O bir manpage bu eğlenceli zerofree ile belirtiyor dd başarısız olur diğer eşzamanlı yazma, ancak salt okunur monte edilecek dosya sistemi zerofree ihtiyacı var! * duh *
Madarco

7
İpucu: İki komutu aşağıdaki gibi bir satıra koyun: dd ...; rm /bigfilebu, ddtamamlanmasını beklememeniz durumunda, tam bir diskle zamanı en aza indirir .
JLH

21
VirtualBox 4.3.10 kullanma @Dakatine disk görüntü dosyası yoktu büyümez onun maksimal ölçüde. VirtualBox, tüm sıfır blokları fiziksel diske yazmaya zahmet etmeyecek kadar akıllıdır.
JLH

12

Windows misafirleri olan bir Windows 7 sunucusuyum, İşte tüm VDI'leri bir klasör ağacında sıkıştırmak için yazdığım bir toplu iş dosyası

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

Bağlantılardaki yorumları yorumlarda bıraktım, böylece nasıl çalıştığını anlayabilirsiniz.

Düzenle

Tüm bunlardan sonra, CloneVDI aracını denedim ve çok daha az zamanda ve tek bir tıklamayla iyi bir iş çıkardı.


5
Bu tür bir sitede, DOS için vurgulanan bir tür sözdizimi olacağını, ancak hayır olacağını düşünürdünüz. Notepad ++ 'da çok daha hoş görünüyor
CAD

1
Ayrıştırma altyapısı gerektiren @CAD_bloke ve SE'de yayınlanan farklı dillerin sayısını düşündüğünüzde, BÜYÜK bir projeye bakıyorsunuzdur. Örneğin, DOS'un kaç sürümü ve lehçesi olduğunu ve bunun Linux'a başlamadan önce olduğunu
düşünün

Çok iyi bir nokta. İronik bu bir yığın değişimi IOS uygulamasında vurgulanır.
CAD

2
Evet CloneVDI kişisel kullanım için çok daha iyi ve daha hızlı bir yoldur
VarunAgw

6

Discard / TRIM kullanarak Windows ana bilgisayarında Debian misafir.

Bu doğrudan bir cevap değil, çünkü ben sorunu ele alıyorum, soruyu değil. Görüntüyü düzenli aralıklarla sıkıştırmak yerine, bu çözüm ana makinenin VM disk görüntüsündeki kullanılmayan blokları otomatik olarak kaldırmak için atar kullanır.

Bu çözüm, sürekli TRIM'i destekleyen bir konuk dosya sistemi gerektirir. Arch Linux wiki'de TRIM işlemlerini destekleyen bir dosya sistemi listesi vardır .

FDE ve cryptoroot, güvenlikle ilgili endişeler olduğundan ve bu sorunun diğer çözümlerinden hiçbirinin sıkıştırmaya izin vermeyeceğinden özel olarak ele alınmamıştır. Arch Linux wiki TRIM ve dm-crypt aygıtları hakkında bilgi sahibidir .

Teorik olarak, bu VDI depolama kullanan VBox ana bilgisayarlarındaki tüm Linux misafirleri için işe yarayacaktır.

Ana bilgisayar yapılandırması

VBox çıkıldı ve hiç VM'leri çalışırken, hem ayarlayarak disklere atma desteği eklemek discardve nonrotationalVM için yapılandırma dosyasında her disk için. Şu anda discardGUI'de değil, ancak nonrotational"Katı Hal Sürücüsü" onay kutusu olarak gösteriliyor. (ref: vbox forumları, atma desteği )

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

Sanal Makineyi önyükleyin ve TRIM desteğinin etkin olduğunu doğrulayın:

sudo hdparm -I /dev/sda | grep TRIM

Konuk Konfigürasyonu

LVM kullanımdaysa, atma ayarını içinde değiştirin /etc/lvm/lvm.conf. (ref: debian wiki, lvm.conf örneği )

devices {
...
    issue_discards = 1
}

Fstab'da, discardotomatik olarak silmek istediğiniz dosya sistemlerine seçenek ekleyin (ref: debian wiki, fstab örneği )

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

Yeni sistemlerini almalarını sağlamak için dosya sistemlerini yeniden kurun.

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

Şimdi ücretsiz blokları elle düzeltin fstrim. fstrimtakılı dosya sistemini kullanır, onu destekleyen blok cihazını kullanmaz. Sürekli atma yerine fstabkoymak yerine , bu haftalık bir cron üzerinde yapılabilir. (Haftalık cron, TRIM için sorgulanabilir desteği olan fiziksel SSD'ler için önerilmektedir, ancak bu, altta yatan SSD'lerin ana işletim sistemi işletim sistemi tarafından yönetilmesi nedeniyle burada geçerli değildir. Bkz: ssd trim uyarısı ).

fstrim /
fstrim /build

Bu noktada, VM içindeki dosya sistemlerinin boyutu ve VM görüntülerinin boyutu değer olarak oldukça yakın olmalıdır.

Şununla test edildi:

  • Misafir1: Debian 8.7, çekirdek: linux 4.8 grsec desteklenir, dosya sistemi: ext4
  • Misafir2: Debian 9 RC2, çekirdek: linux 4.9, dosya sistemi: ext4
  • Ana bilgisayar 1: VBox 5.1.14, Win7, görüntü fmt: VDI
  • Ana Bilgisayar2: VBox 5.1.14, Win8.1, görüntü fmt: VDI

2

İçin MacOS Konuk bunu:

  1. Konuk sistemindeki geçersiz alan:

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

    (sürücü adınızla / birimler / Macintosh HD değiştirin)

  2. Konuk VM'yi kapatma

  3. VDI disk görüntüsü boyutunu azaltmak için bu komutu çalıştırın

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

    VEYA

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

1

Bunu, Windows VirtualBox'ta sanal Debian'a bağlanan VDI resmim için kullanıyorum. Bu genel bir çözüm değil, ama en azından sana yaptığımın özünü vermeli.

Debian'daki Komutlar:

root@debian:~# lsblk  # show partitions
ADI MAJ: MIN RM BOYUTU RO TİPİ DAĞ 
sdb 8:16 0 128G 0 disk 
Dsdb1 8:17 0 128G 0 bölüm / mnt / web # İLGİ BÖLÜM
sda 8: 0 0 64G 0 disk 
1sda1 8: 1 0 61,4G 0 kısım / 
2sda2 8: 2 0 1K 0 kısım 
5sda5 8: 5 0 2,7G 0 kısım 
[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

Windows'taki Komutlar:

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

Umarım yardımcı olur :)


1

TRIM desteğini etkinleştirmek istemiyorum, çünkü her veri silme VDI dosyasındaki verileri sıkıştırmaya zorlayacak ve VDI dosyası klasik dönme diskindeyken konuk sistemini kullanılamaz hale getirecektir. Benim için daha iyi, örneğin ayda bir kez elle sıkıştırma yapmaktır.

Normal sıkıştırma sırasında, VDI dosya içeriği yeni dosyaya kopyalanır. Bu, ana bilgisayar diskinde biraz (bazen büyük) boş alan gerektirir.

Andrew Domaszek'in işaret ettiği gibi çözümüm var. NTFS ile bile çok iyi çalışıyor (Windows10).

Bunu yapmak için:

  • GParted Live CD ile önyükleme yapan yeni bir sanal makine oluşturun (en sevdiğiniz Linux dağıtımını kullanabilirsiniz).
  • Makine ayarlarını düzenleyin ve SATA disk denetleyicisini ayarlayın
  • Sıkıştırmak istediğiniz mevcut VDI dosyalarını ekleyin
  • TRIM desteğiyle SSD olarak görünebilecek VDI tabanlı diskleri değiştirin:

    VBoxManage storageattach "gpared live" --storagectl "SATA" --port 0 --discard on --nonrotational on
    VBoxManage storageattach "gpared live" --storagectl "SATA" --port 1 --discard on --nonrotational on
    
  • makineyi başlat

  • Linux kök kabuğunda NTFS bölümünü bağlayın mount /dev/sda2 /mnt
  • sıfır boş alan dd if=/dev/zero of=/mnt/bigfile
  • rm /mnt/bigfile
  • yeni dosya oluşturmadan VDI'yı sıkıştırmaya zorla: fstrim -v /mnt

0

Kabul edilen cevabı tamamlamak için çok iyi bir püf noktası, konuk alanını sıfırladıktan sonra, ana bilgisayarda sıkıştırılmış bir dosya sistemi kullanarak (örneğin, sanal sürücülerin NTFS özelliklerinde sanal sürücülerin klasörünü sıkıştırmayı seçerek) Windows ana bilgisayarı). Aslında bu, çok daha fazla alan kazanma avantajına sahiptir çünkü işletim sistemleri çok sayıda tekrarlayan metin veya ikili dosya tutma eğilimindedir (örneğin, 15GB'lık boş alana sahip 30 GB'lık bir konuk sürücü, ana bilgisayar sürücüsünde 4GB'ye dönebilir).

Uyarılar, gerçek donanıma sürücü erişiminin artabileceğini ve CPU kullanımında küçük bir artış olduğunu içerir.


0

YASAĞI İÇİN ÖNEMLİ NOT (~ 1997-2007) ÇALIŞMA SİSTEMLERİ

Genel olarak, daha önce verilen cevaplardaki teknikler geçerlidir; Ancak, çok önemli bir özel durum var.

Birkaç yıl boyunca - belki 1997-2007 ya da öylesine - 32 bit işletim sistemleri hala normdu, ancak 2GB'tan büyük sabit diskler zaten kullanılıyordu. Sonuç olarak, sıfır boş bir dosya yazarak tüm boş alanı tüketmeye çalışırken (bu, her zaman kök olarak yapılması gerekir, kökün kimsenin dokunamayacağı ayrıcalıklı boş alanı dahil etmek için).

Dosya çok büyük

beklediğiniz yerine:

Cihazda boş alan kalmadı.

Bu durumda, büyük olasılıkla 2GB dosya boyutunda bir sınırlama elde etmiş olursunuz. Bu, o sırada yaygındı çünkü birçok dosya işlemi, 32-bit tam sayı imzalı sonuç verdi, böylece negatif değerler hata kodlarını rapor edebildi. Bu etkili bir şekilde ofset sonuçlarının özel önlemler alınmadan 2 ^ 31 byte ile sınırlandırılması anlamına geliyordu.

Çözüm geçicidir: disk gerçekten bitene kadar ayrı, farklı adlı sıfırlama dosyaları oluşturmaya devam edin.

Bu durumu bir sınıf için göstermek isteyen bir eğitmen iseniz, eski bir Red Hat Linux 7.0 kopyası olan 4 GB'lık bir disk görüntüsü yeterlidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.