Usando imágenes base para clonar rápidamente en KVM

Esto lo encontré hace tiempo en el sitio de KVM y le probé hace varios meses y funciona de maravilla!

Mira, supón eres docente (podrías ser cualquier otra cosa), y tienes que preparar 20 máquinas virtuales para que tus estudiantes hagan una tarea determinada.  Lógicamente como ya tienes un poco de experiencia sabes que las máquinas deben quedar igualitas, para que todos tengan que realizar las mismas tareas y en el peor escenario tengan los mismos errores/omisiones/tareas por resolver.

Cómo lo haces? con virtualización claro está! Virtualización es maravillosa.. crear la máquina es facilito. Con KVM lógicamente! porque usas Software Libre.

Cómo creas las 20 máquinas virtuales? Ahí está el kid del asunto hoy. Porque además seguramente serán 20 máquinas virtuales que luego de un par de días u horas eliminarás porque habrán hecho su tarea.

Opción 1: Crear las 20 máquinas una a una, estilo: seguir el wizard, el procedimiento de instalación de CentOS, 20 veces.. es difícil eh? Te pasarás al menos unas 4 ó 5 horas instalando las 20 máquinas.

Opción 2: Crear e instalar una máquina virtual, dejarla bien instaladita.. y luego clonarla 19 veces. Es una opción válida, buenaza! Pero igual la clonación toma tiempo, aproximadamente toma 1 minuto clonar 1 GB de disco. Por tanto si creaste una máquina de 20GB, cada máquina clonada te tomará no sé, digamos 20 minutos. Pero claro es más fácil pues ya no hay que pensar mucho, simplemente preparaste la primera máquina y luego clonaste el resto…

Opción 3: Usar disco base.

Esto es lo que quiero ver ahora. Y lo que me facilita durísimo el trabajo:

Imagínate crees una máquina, tal y como la opción 2, y la dejes listita, tuneadita, tal y como quieres que sean todas. Y luego le apagas y no le usas más.

Este será el disco de respaldo. Este disco lo usaremos como base para leer de él todo lo que requiramos.

En base a este disco, creamos ahora 20 discos, uno por cada una de las máquinas virtuales que necesitemos, estos serán utilizados solamente para almacenar los cambios que dentro de esta máquina ocurran! Estos discos estarán enlazados al disco base que no se cambiará para nada. Se usará solamente para leer lo que no haya cambiado.

Por ejemplo digamos que en la máquina 1 requiero leer la lista de usuarios, esta está en /etc/passwd, esta lista será transparentemente leída del disco base, pues no está modificado el archivo.

Si en la máquina 2 requiero leer la lista de usuarios, igual veré /etc/passwd y este lo leeré del disco base pues no ha sido modificado.

Ahora, si en la máquina 1 agrego un usuario , se modificará /etc/passwd y esta modificación será almacenada en el disco de los cambios. Este disco pertenece solamente a máquina 1.

Y si en máquina 2 requiero eliminar un usuario, /etc/passwd aparecerá almacenado en su disco de cambios y solamente maquina 2 le verá.

A ver aqui una imagen feíta de cómo es la cosa, el disco base y dos discos llamados cambiosvm1 y cambiosvm2, ambos discos son los que leen las máquinas VM1 y VM2

VM2<—>CAMBIOSVM2<——-(DISCOBASE)—–>CAMBIOSVM1<—>VM1

En la máquina VM1: Si leo algo, le busco en CAMBIOSVM1, si no está, le busco en DISCOBASE. Si quiero escribir algo, modificarlo, eliminarlo, agregarlo, lo agrego al disco CAMBIOSVM1

Lo mismo para VM2: Si quiero modificar algo, lo hago en CAMBIOSVM2, si quiero leer algo busco en CAMBIOSVM2, si no aparece es que estará en DISCOBASE.

DISCOBASE no se toca. Si le tocas, arruinas todo pues CAMBIOSVM1 y CAMBIOSVM2 dependen de que discobase se mantenga igualito.

El tamaño de CAMBIOSVM1 y CAMBIOSVM2 es simplemente lo que vayan almacenando. Y serán los discos de las máquinas virtuales correspondientes, tendrás 20 disquitos cada uno almacenando cada cambio de cada máquina virtual.

Crear estos discos, es facilito y rápido, toma menos de 5 segundos.. así que crear 20 máquinas virtuales tomará un minuto o dos.. y ya.

Creando los discos:

Supongamos que tengo ya el disco base, que se llama base.qcow2

Ahora quiero crear un disco de cambios llamado estudiante1.qcow2, pongo:

qemu-img create -b base.qcow2 -f  qcow2   estudiante1.qcow2

el disco “estudiante1.qcow2” es el que almacenará los cambios para la máquina virtual de estudiante1.

Ahora hago lo mismo para estudiante2, estudiante3.. y así hasta estudiante20

Luego creo las 20 máquinas virtuales, cada una haciendo uso de su propio disco “estudianteX.qcow2” (1<=X<=20).

Todas quedarán igualitas. Lógicamente al finalizar el rtabajo puedo eliminar estos disquitos y ya… y puedo dejar la base para otros experimentos posteriores.. crear y eliminar máquinas será facilito y consumirá poquísimo disco.

Comandos interesantes:

qemu-img info estudiante1.qcow2

te dará información del disco, verás que usa un backend llamado base.qcow2, mira qué cosa más curiosa y es que el tamaño del disco no es 10G como la base, sino de 56K o así.. porque solamente almacenará los cambios:

image: estudiante1.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 56K
cluster_size: 4096
backing file: base.qcow2 (actual path: base.qcow2)

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.