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

¿Cómo compactar el tamaño del archivo VDI de VirtualBox?

Tengo una VM VirtualBox que configuró un tamaño de disco duro muy grande (más grande que el anfitrión). Por mi error, un programa en la VM generó muchos archivos de registro y el tamaño del archivo VDI sigue creciendo hasta que no hay espacio en el host.

Ahora he borrado los archivos de registro pero el tamaño del archivo VDI no se está reduciendo después de usar VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

¿Hay alguna manera de compactar realmente el tamaño del archivo VDI? Gracias.

Respuestas (8)

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

Tienes que hacer los siguientes pasos:

  1. Ejecutar defrag en el huésped (sólo en Windows)
  2. Anular el espacio libre:

  3. Apagar el VM del huésped

  4. Ahora ejecuta el comando modifymedium de VBoxManage con la opción --compact:

Esto reduce el tamaño de la vdi.

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

Estoy en un host de Windows 7 con huéspedes Windows, Aquí hay un archivo por lotes que escribí para compactar todos los VDI en un árbol de carpetas

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

Dejé los enlaces en los comentarios para que puedas (más o menos) decir cómo funciona.

editar

Bueno, después de todo eso, probé la herramienta CloneVDI e hizo un buen trabajo en mucho menos tiempo y en un solo clic.

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

Huésped Debian en un host Windows usando discard/TRIM.

Esta no es una respuesta directa en sí, ya que estoy tratando el problema, no la pregunta. En lugar de compactar periódicamente la imagen, esta solución usa el descarte para eliminar automáticamente los bloques no utilizados en la imagen de disco de la VM del host.

Esta solución requiere un sistema de ficheros huésped que soporte TRIM continuo. El wiki de Arch Linux tiene una lista de sistemas de archivos que soportan operaciones TRIM .

FDE y cryptoroot no están específicamente cubiertos, ya que hay preocupaciones de seguridad y ninguna de las otras soluciones a esta pregunta permitiría la compactación tampoco. El wiki de Arch Linux tiene información sobre TRIM y dispositivos dm-crypt .

En teoría, esto funcionará para todos los huéspedes Linux en hosts VBox que usen almacenamiento VDI.

Configuración del host

Con VBox cerrado y sin VMs en ejecución, agregue soporte de descarte a sus discos configurando tanto discard como nonrotational para cada disco en el archivo de configuración de la VM. En este momento discard no está en la interfaz gráfica, pero nonrotational está expuesto como la casilla de verificación “Unidad de estado sólido”. (ref: foros de vbox, soporte de descartes )

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

Arranca la VM, y verifica que el soporte TRIM está activado:

sudo hdparm -I /dev/sda | grep TRIM

Configuración del huésped

Si LVM está en uso, cambia la configuración de descartes en /etc/lvm/lvm.conf. (ref: debian wiki, lvm.conf ejemplo )

devices {
...
    issue_discards = 1
}

En fstab, añade la opción discard a los sistemas de archivos que desees descartar automáticamente (ref: debian wiki, fstab ejemplo )

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

Remonta los sistemas de archivos para que recojan sus nuevas opciones.

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

Recorta manualmente los bloques libres ahora con fstrim. fstrim utiliza el sistema de archivos montado, no el dispositivo de bloques que lo respalda. En lugar de configurar el descarte continuo en fstab, esto podría hacerse en un cron semanal. (El cron semanal se recomienda para las SSD físicas que pueden tener un soporte cuestionable para TRIM, pero esto no es relevante aquí ya que las SSD subyacentes son manejadas por el sistema operativo anfitrión. ver: ssd trim warning ).

fstrim /
fstrim /build

En este punto, el tamaño de los sistemas de archivos dentro de la VM y el tamaño de las imágenes de la VM deberían tener un valor bastante cercano.

Probado con:

  • Guest1: Debian 8.7, núcleo: linux 4.8 grsec de backports, sistema de archivos: ext4
  • Invitado2: Debian 9 RC2, núcleo: linux 4.9, sistema de archivos: ext4
  • Huésped1: VBox 5.1.14, Win7, imagen fmt: VDI
  • Host2: VBox 5.1.14, Win8.1, imagen fmt: VDI
2
2
2
2016-12-16 17:08:31 +0000

Para MacOS Guest haga esto:

  1. Anular el espacio libre en el sistema de invitados:

  2. Apagar el VM del huésped

  3. Ejecute este comando para reducir el tamaño de la imagen del disco VDI

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

Uso esto para mi imagen VDI montada en la Debian virtual en Windows VirtualBox. No es una solución general, pero al menos debería darle una idea de lo que hago.

Comandos en Debian:

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

Comandos en Windows:

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

Espero que ayude :)

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

No quiero habilitar el soporte TRIM en el SO, porque cada borrado de datos forzará la compactación de los datos en el archivo VDI, haciendo que el sistema invitado sea inutilizable cuando el archivo VDI está en el disco rotativo clásico. Para mí lo mejor es realizar la compactación a mano, por ejemplo, una vez al mes.

Durante la compactación normal, el contenido del archivo VDI se copia en un nuevo archivo. Esto requiere algo de espacio libre (a veces grande) en el disco anfitrión.

Tengo una solución similar a la señalada por Andrew Domaszek. Funciona muy bien incluso con NTFS (Windows10).

Para hacer esto:

  • crear una nueva máquina virtual que arranque con el Live CD de GParted (puedes usar tu distro de Linux favorito).
  • Editar la configuración de la máquina y configurar el controlador de disco SATA
  • Añadir los archivos VDI existentes que desea compactar
  • Cambiar los discos basados en VDI para que sean visibles como SSD con soporte para TRIM:

  • Arrancar la máquina

  • En el shell raíz de Linux, montar la partición NTFS mount /dev/sda2 /mnt

  • cero espacio libre dd if=/dev/zero of=/mnt/bigfile

  • rm /mnt/bigfile

  • forzar la compactación de VDI sin crear un nuevo archivo: fstrim -v /mnt

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

NOTA IMPORTANTE PARA EL LEGADO (~1997-2007) SISTEMAS OPERATIVOS

En general, las técnicas de las respuestas dadas anteriormente son válidas; SIN EMBARGO, hay un caso especial muy importante.

Durante un período de algunos años - quizás 1997-2007 o así - los sistemas operativos de 32 bits seguían siendo la norma, pero los discos duros de más de 2 GB ya estaban en uso. Como resultado, cuando se intenta consumir todo el espacio libre escribiendo un archivo de ceros (lo que siempre debe hacerse como root, para incluir el espacio libre privilegiado de root, que nadie más puede tocar), puede ver:

Archivo demasiado grande

en lugar de lo que espera:

No queda espacio en el dispositivo.

Si esto ocurre, lo más probable es que haya alcanzado una limitación de tamaño de archivo de 2 GB. Esto era común en ese momento porque muchas operaciones de archivo devolvían resultados en enteros de 32 bits firmados, de modo que los valores negativos podían reportar códigos de error. Esto significaba efectivamente que los resultados de la compensación se limitaban a 2^31 bytes sin medidas especiales.

La solución es sencilla: siga creando archivos de puesta a cero separados, con nombres diferentes, hasta que el disco se quede realmente sin espacio.

Si usted es un instructor que desea demostrar esta situación para una clase, una imagen de disco de 4 GB con una copia antigua de Red Hat Linux 7.0 es suficiente.

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

Un truco muy ingenioso para complementar la respuesta aceptada es que se puede salir sin hacer ningún tipo de compactación después de poner a cero el espacio del huésped, mediante el uso de un sistema de archivos comprimido en el host (por ejemplo, seleccionando para comprimir la carpeta de unidades virtuales en las propiedades NTFS en un host Windows). Esto, de hecho, tiene el beneficio de ahorrar mucho más espacio porque los sistemas operativos tienden a contener muchos archivos binarios o de texto repetitivos (por ejemplo, una unidad huésped de 30 GB que tenía 15 GB de espacio reducido a cero puede convertirse en 4 GB en la unidad del host).

Las advertencias incluyen que el acceso a la unidad en el hardware real puede aumentar y hay un ligero aumento en el uso de la CPU.