Optimizar el backup de máquinas virtuales QEmu y KVM Linux con zerofree

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.