Saltar al contenido

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

Solución:

Tienes que seguir los siguientes pasos:

  1. Ejecute desfragmentar en el invitado (solo Windows)

  2. Anular el espacio libre:

    Con un Invitado 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, descargar SDelete desde Sysinternals y ejecute esto:

     sdelete.exe c: -z
    

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

  1. Apague la máquina virtual invitada

  2. Ahora ejecute 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:pathtothedisk.vdi
    

    Con un Host de Mac ejecuta esto:

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

    VBoxManage se encuentra aquí: /Applications/VirtualBox.app/Contents/MacOS/VBoxManage

Esto reduce el tamaño de vdi.

Estoy en un host de Windows 7 con invitados de 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 FilesOracleVirtualBoxVboxManage.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 con un solo clic.

Invitado de Debian en el host de Windows usando discard / 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 utiliza descartar para eliminar automáticamente los bloques no utilizados en la imagen del disco de la máquina virtual 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. La wiki de Arch Linux tiene información sobre los dispositivos TRIM y dm-crypt.

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

Configuración de host

Con VBox salido y sin máquinas virtuales en ejecución, agregue soporte de descarte a sus discos configurando ambos discard y nonrotational para cada disco en el archivo de configuración de la máquina virtual. En este momento discard no está en la GUI, pero nonrotational aparece como la casilla de verificación “Unidad de estado sólido”. (ref: foros de vbox, descartar soporte)

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

Arranque la máquina virtual 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. (ref: debian wiki, ejemplo de lvm.conf)

devices {
...
    issue_discards = 1
}

En fstab, agregue el discard opción a 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 tomen 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 bloque que lo respalda. En lugar de establecer el descarte continuo en fstab, esto podría hacerse en un cron semanal. (El cron semanal se recomienda para SSD físicos que pueden tener un soporte cuestionable para TRIM, pero esto no es relevante aquí ya que los SSD subyacentes son manejados por el sistema operativo host. Ver: advertencia de recorte de ssd).

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 similar.

Probado con:

  • Guest1: Debian 8.7, kernel: linux 4.8 grsec desde 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
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *