Acabo de terminar el appliance para mis alumnos de Organización de Computadoras de este año. Como todo appliance que se comparte a través de Internet, y para que todos los alumnos puedan descargar la máquina virtual lo más rápido posible, es necesario que el sistema operativo junto con las aplicaciones incluidas consuman poco espacio en disco. De esta forma la imagen de disco resulta de tamaño reducido. A su vez necesito un escritorio funcional con un cierto conjunto de herramientas de desarrollo. Para ello opté por Devuan Jessie con LXDE sobre una máquina virtual VirtualBox.

Pero más allá de que la imagen de disco tenga un tamaño reducido, es necesario compactarla (por ejemplo ZIP) para reducir aún más el tamaño a transmitir por Internet. Y se gana mucha eficiencia durante la compactación si los bloques de disco libres están rellenos con ceros. Para ello existe zerofree. De esta forma, el espacio en disco correspondiente a bloques libres (espacio no utiliza) es directamente ignorado.



La herramienta zerofree encuentra los bloques de disco no asignados (libres) cuyo contenido no son ceros, en sistemas de archivos ext2, ext3 y ext4, y los rellena con ceros. Llenar con ceros las áreas de disco no utilizadas, en dispositivos que residen en imágenes de disco, permite reducir el tamaño de la imagen.

El problema es que zerofree requiere que el sistema de archivos en cuestión no esté montado. Pero ¿qué pasa si tenemos una única partición o queremos optimizar el sistema de archivos raíz? No es posible desmontar el sistema de archivos raíz. Aunque, en Linux, es posible remontar el filesystem raíz en modo de sólo lectura pasando a modo single user.

Manos a la obra

El primer paso consiste en autenticarse como superusuario (root). Luego es posible pasar a modo single user (runlevel 1) ejecutando telinit 1:

El modo single user detiene todos los procesos y servicios que habían sido iniciados en el modo multiusuario (runlevel 2 ó 3 dependiendo de cada distribución). Luego solicita la contraseña de root para abrir una shell:

Como mencionaba en el párrafo anterior, el modo single user detiene todos los procesos del espacio usuario. En el runlevel 1, luego de ingresar la contraseña de root existen sólo 2 procesos del espacio usuario en todo el sistema: init y bash (o cualquiera sea la shell por defecto de la distribución en cuestión). Esto permite montar el sistema de archivos raíz en modo de sólo lectura ejecutando:

# mount -o remount,ro /

Luego es posible correr zerofree sobre el dispositivo que contiene el sistema de archivos raíz (en este caso /dev/sda1):

# zerofree /dev/sda1

Luego de unos minutos (dependiendo del tamaño del dispositivo) finaliza.

Finalmente, al compactar la imagen de disco con ZIP, se ignora todo el espacio libre en el sistema de archivos pues contiene ceros. Cabe destacar que el espacio en disco utilizado en la máquina virtual es 2,5 GB (es de esperarse entonces que la imagen compactada caiga por debajo de ese valor):

Gracias a zerofree y zip se logra reducir el tamaño de la imagen de disco VDI de 4,8 GB a sólo 931 MB:

emi@hal9000:/data/VM % ll -h ocuns.vdi*
-rw-------  1 emi  wheel   4.8G Aug 12 12:33 ocuns.vdi
-rw-r--r--  1 emi  wheel   931M Aug 12 10:06 ocuns.vdi.zip

Referencias

man zerofree
man runlevel
man init


Tal vez pueda interesarte


Compartí este artículo