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


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

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

¿Hay alguna forma de compactar realmente el tamaño del archivo VDI? ¡Gracias!


269


origen




Respuestas:


Tienes que hacer los siguientes pasos:

  1. Ejecute la desfragmentación en el invitado (solo Windows)
  2. Anular el espacio libre:

    Con un Invitado de Linux ejecuta esto:

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

    O:

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

    Con un Invitado de Windows, descarga SDelete de Sysinternals y ejecuta esto:

    sdelete.exe c: -z
    

    (reemplace C: con la letra de la unidad de VDI)

  3. Apagar la máquina virtual invitada

  4. Ahora ejecuta VBoxManage's modifymedium comando con el --compact opción:

    Con un Host de Linux ejecuta esto:

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

    Con un Host de Windows ejecuta esto:

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

    Con un Mac Host ejecuta esto:

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

Esto reduce el tamaño vdi.


452



Para la siguiente persona, mi comando terminó luciendo así: "C: \ Archivos de programa \ Oracle \ VirtualBox \ VBoxManage.exe" modifyhd "C: \ Users \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi" - -compacto - Daniel
De acuerdo con la página de manual de la utilidad zerofree Linux (manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html), zerofree debería ser mejor que dd para este trabajo. dd no se recomienda porque "es lento", "hace que la imagen del disco (temporalmente) crezca en su máxima extensión", "utiliza (temporalmente) todo el espacio libre en el disco, por lo que otras acciones de escritura simultáneas pueden fallar". Zerofree está disponible en Ubuntu Linux a través de apto, o puedes compilarlo tú mismo. - Dakatine
Es divertido que la página de manual de zerofree afirma que con dd otras escrituras simultáneas fallarán, ¡pero zerofree necesita que el sistema de archivos se monte solo en lectura! * duh * - Madarco
Sugerencia: Coloque los dos comandos en una línea así: dd ...; rm /bigfile, esto minimizará el tiempo con un disco completo en caso de que no esté esperando el dd completar. - jlh
@Dakatine Usando VirtualBox 4.3.10, el archivo de imagen del disco no no crecer en su máxima extensión. VirtualBox es lo suficientemente inteligente como para no molestarse en escribir todos los bloques cero en el disco físico. - jlh


Si ejecutar el comando en la respuesta aceptada produce un mensaje de error inútil como este

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

Simplemente ejecute el comando por el UUID en lugar del nombre de archivo:

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

34





Estoy en un host de Windows 7 con invitados de Windows. Aquí hay un archivo por lotes que escribí para compactar todas las 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é Herramienta CloneVDI e hizo un buen trabajo en mucho menos tiempo y con un solo clic.


11



Uno pensaría que en este tipo de sitio habría algún tipo de resaltado de sintaxis para DOS pero no. Se ve mucho más bonito en Notepad ++ - CAD bloke
@CAD_bloke que requeriría un motor de análisis sintáctico y cuando consideras la cantidad de idiomas diferentes publicados en SE, estás viendo un proyecto ENORME. Solo piense en cuántas versiones y dialectos de DOS hay, por ejemplo, y eso incluso antes de que llegue a Linux, etc. - Caltor
Muy buen punto. Irónicamente es resaltado en la aplicación iOS de intercambio de pila. - CAD bloke
Sí, CloneVDI es mucho mejor y más rápido para uso personal - VarunAgw


Invitado de Debian en el host de Windows utilizando descarte / TRIM.

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

Esta solución requiere un sistema de archivos invitado que admita TRIM continuo. La wiki de Arch Linux tiene una lista de sistemas de archivos que admiten operaciones TRIM.

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

En teoría, esto funcionará para todos los invitados de Linux en los hosts de VBox que usan almacenamiento VDI.

Configuración de host

Con VBox salido y sin máquinas virtuales en ejecución, agregue soporte de descarte a sus discos estableciendo ambos discard y nonrotational para cada disco en el archivo de configuración para la VM. En este momento discard no está en la GUI, pero nonrotational está expuesto como la casilla de verificación "Unidad de estado sólido". (árbitro: vbox forums, descartar soporte)

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

Arranque la VM y verifique que la compatibilidad con TRIM esté habilitada:

sudo hdparm -I /dev/sda | grep TRIM

Configuración de invitado

Si LVM está en uso, cambie la configuración de descarte en /etc/lvm/lvm.conf. (árbitro: debian wiki, lvm.conf example)

devices {
...
    issue_discards = 1
}

En fstab, agregue el discard opción para los sistemas de archivos que desea descartar automáticamente (ref: debian wiki, ejemplo de 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

Vuelva a montar los sistemas de archivos para que ellos recojan sus nuevas opciones.

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

Recorte manualmente los bloques libres ahora con fstrim. fstrim usa el sistema de archivos montado, no el dispositivo de bloques que lo respalda. En lugar de establecer un descarte continuo en fstab, esto podría hacerse en un cron semanal. (El cron semanal se recomienda para discos SSD físicos que pueden tener soporte cuestionable para TRIM, pero esto no es relevante aquí ya que los SSD subyacentes son manejados por el sistema operativo host. advertencia de ajuste ssd)

fstrim /
fstrim /build

En este punto, el tamaño de los sistemas de archivos dentro de la máquina virtual y el tamaño de las imágenes de máquina virtual debería ser muy cercano al valor.

Probado con:

  • Guest1: Debian 8.7, kernel: linux 4.8 grsec de backports, sistema de archivos: ext4
  • Guest2: Debian 9 RC2, kernel: linux 4.9, sistema de archivos: ext4
  • Host1: VBox 5.1.14, Win7, imagen fmt: VDI
  • Host2: VBox 5.1.14, Win8.1, imagen fmt: VDI

5





por MacOS Guest hacer esto:

  1. Anule el espacio libre en el sistema invitado:

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

    (reemplazar / Volúmenes / Macintosh HD con el nombre de su unidad)

  2. Apagar la máquina virtual invitada

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

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

    O

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

2





Lo uso para mi imagen VDI montada en 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
NOMBRE MAJ: MIN RM TAMAÑO RO TYPE MOUNTPOINT
sdb 8:16 0 128G 0 disco
└─sdb1 8:17 0 128G 0 parte / mnt / web # ¡ESTA ES LA PARTICIÓN DE INTERÉS!
disco sda 8: 0 0 64G 0
├─sda1 8: 1 0 61,4G 0 pieza /
├─sda2 8: 2 0 1K 0 parte
└─sda5 8: 5 0 2,7G 0 pieza
[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 eso ayude :)


1





No quiero habilitar la compatibilidad con TRIM en el sistema operativo, ya que cada eliminación de datos forzará la compactación de datos en el archivo VDI, haciendo que el sistema invitado no se pueda utilizar cuando el archivo VDI se encuentre en un disco giratorio clásico. Para mí es mejor realizar la compactación a mano, p. Una vez al mes.

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

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

Para hacer esto:

  • cree una nueva máquina virtual que arranque con GParted Live CD (puede usar su distribución de Linux favorita).
  • Edite la configuración del equipo y configure el controlador de disco SATA
  • Agregue archivos VDI existentes que desee compactar
  • Cambie los discos basados ​​en VDI para que sean visibles como SSD con soporte TRIM:

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

  • iniciar la máquina
  • En el shell raíz de Linux, monte 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

1





Un truco muy ingenioso para complementar la respuesta aceptada es que puede escaparse sin compactar nada después de poner a cero el espacio para invitados, usando un sistema de archivos comprimido en el host (por ejemplo, seleccionar comprimir la carpeta de unidades virtuales en propiedades NTFS en un Host de Windows). De hecho, esto tiene el beneficio de ahorrar mucho más espacio porque los sistemas operativos tienden a contener una gran cantidad de archivos de texto o binarios repetitivos (por ejemplo, una unidad de 30 GB que tiene 15 GB de espacio puesto a cero puede convertirse en 4 GB en la unidad host).

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


0