Solución:
Tienes que seguir los siguientes pasos:
-
Ejecute desfragmentar en el invitado (solo Windows)
-
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)
-
Apague la máquina virtual invitada
-
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