Una forma de ahorrar tiempo y espacio al comprimir máquinas virtuales QEmu o KVM con GNU/Linux es utilizar el comando zerofree.
El comando zerofree escribe con ceros los clústeres marcados como espacio libre en particiones con sistema de archivos ext2, ext3 o ext4. Las utilidades de compresión como zip o lzo ignoran esos clústeres vacíos ahorrando espacio y tiempo de compresión.
zerofree requiere que el volumen esté montado en modo sólo lectura o desmontado. Por ejemplo para optimizar la partición home:
# apt-get install zerofree # umount -f /home # zerofree /dev/vdb1 # mount -a
Yo lo he utilizado en particiones formateadas con ext3 y ext4 sobre unidades de disco virtualizadas en formato RAW y QCOW2 de máquinas virtuales KVM con Ubuntu Server Linux gestionadas con Proxmox VE 5.x
He tenido problemas para utilizarlo sobre la partición raíz / porque no consigo liberarla de uso ni montarla en modo readonly. telinit llama al modo singleuser y mount ro a sólo lectura:
# telinit 1 # mount -o remount,ro / # zerofree /dev/vda1 zerofree: filesystem /dev/vda1 is mounted rw
Hay una forma alternativa (más lenta y un poco menos elegante) que consiste en crear un archivo relleno completamente de ceros (con ayuda de /dev/zero) con todo el espacio libre (saturando la partición) con dd e inmediatamente borrarlo:
# dd if=/dev/zero of=/tmpZEROfile # rm -f /tmpZEROfile
De este modo he arañado varios cientos de GB y decenas de minutos en tiempo de compresión y copia durante las tareas de backup.