Crear imagen plantilla de máquina virtual de KVM de Linux

  Cuando se trabaja con sistemas virtualizados, lo más cómun es que se posean varias máquinas virtuales con el mismo sistema operativo, aunque cada una de ellas tenga instalados diferentes programas. Otra circunstancia que se puede dar es que se posea todo el sistema y una aplicación desplegados en numerosas máquinas, pudiendo hacer cambios sólo sobre la aplicación. Para este tipo de situaciones existen las imágenes plantillas de máquinas virtuales.
  Una imagen plantilla se puede definir como una imagen de un disco virtual de máquina virtual que sirve de modelo para la creación de más discos virtuales, o máquinas virtuales, con las mismas características que esta.
  En el caso de programas de virtualización como VMware o Virtualbox, los propios programas tienen la opción en sus menús de crear imágenes de disco virtual que posteriormente se pueden emplear como plantillas; en el primero son llamadas archivo ovf, y en el segundo archivos ova.
  No obstante, KVM no tiene esa opción para crear tales archivos de imagen de disco virtual, por lo que hay que ser más imaginativos a la hora de crear plantillas de este programa de virtualización; aunque hay que tener en cuenta que los discos virtuales del KVM (archivos con extensión ".qcow2") son más estables que los de los otros dos programas arriba mencionados, lo que hace que se puedan transformar fácilmente en otros formatos de discos virtuales (".vmdk", ".vdi", ".raw" o ".qed", por ejemplo) sin que haya demasiados problemas de compatibilidad entre distintos programas de virtualización.

  Pese a este problema, y gracias a su ya mencionada estabilidad, existe un modo, un poco laborioso, de convertir una imagen de disco virtual de KVM en una imagen de plantilla para otras máquinas virtuales de este programa que contengan el mismo sistema operativo.
  El primer paso, evidentemente, es crear desde cero una máquina virtual con KVM (o utilizar una ya creada previamente) (una buena práctica, cuando se crea desde cero, consiste en darle a la máquina que va a ser plantilla un nombre representativo, al usuario, un nombre genérico, y poner unas contraseñas de administrador y de usuario genéricas y sencillas) instalarle aquellos programas que necesite el usuario en todas las máquinas virtuales creadas a partir de la plantilla (para ejemplificar esta explicación se utilizará una máquina virtual con el sistema operativo Debian 9 sin entorno gráfico de escritorio y con un servidor SSH instalado); un ejemplo de programas útiles para la plantilla es: joe, most, lynx, curl, nmap, deborphan, ntp, ntpdate, htop, syslog-ng, bzip2, net-tools, apt-transport-https, iptables-persistent, y vim [todos ellos se pueden instalar con el comando apt install <nombre del paquete> (anteponiendo sudo si no se es administrador)]. Cuando todo esté listo, se apaga la máquina virtual.
  A continuación, se accede, como administrador, a la ruta "/var/lib/libvirt/images" (es la ruta predeterminada de KVM para alojar los discos virtuales de sus máquinas virtuales) desde un terminal, y se busca el disco virtual de la máquina virtual que se desea convertir en una plantilla (en nuestro ejemplo "pruebaOVA.qcow2")
  Seguidamente, se realiza una copia de ese disco virtual en otro lugar del disco duro [lo mejor es utilizar el comando rsync -varuz --progress <ruta archivo origen> <ruta archivo destino> (anteponiendo sudo si no se es administrador), ya que el comando más básico cp puede dar problemas al copiar este tipo de archivo] (en este ejemplo, la copia ya recibe el nombre de "Plantilla.qcow2").
  El siguiente paso consiste en crear una nueva máquina virtual desde la copia del disco duro virtual recién realizada, para lo cual se abre el Gestor de máquinas virtuales y en la ruta "Archivo > Nueva máquina virtual" se pulsa sobre esta última parte (o bien se pulsa sobre el botón "Crear máquina virtual nueva" bajo el menú).
  En la ventana que aparecerá, se debe marcar la opción "Importar imagen de disco existente", y luego pulsar en el botón "Adelante".

  Acto seguido, en la siguiente ventana, se pulsará en el botón "Explorar..." (a no ser que se conozca la ruta de antemano, con lo que sólo habrá que escribirla en el recuadro correspondiente), con lo que aparecerá una nueva ventana en la que, si no aparece la ruta correcta en el panel izquierdo, se debe pulsar el botón "Explore localmente".


  En el explorador que se abrirá a continuación, se busca el disco virtual copiado previamente, se selecciona y se pulsa en el botón "Abrir". Al regresar a la ventana anterior, se selecciona la nueva ruta en el panel izquierdo de la misma, y se hace lo mismo con el disco virtual copiado, luego, se pulsa en el botón "Elegir volumen".
  De regreso a la pantalla anterior, se seleccionan el tipo de sistema operativo y la versión del mismo en los desplegables que aparecen con ese propósito (¡OJO!, deben elegirse las mismas opciones que tiene el disco elegido para ser plantilla o abrá problemas; en este ejemplo, las opciones son "Linux" y "Debian Stretch"), luego se pulsa en el botón "Adelante".
   La siguiente pantalla es la que determina la capacidad de memoria RAM del disco virtual y su cantidad de núcleos; como en la pantalla anterior, lo mejor es dejar los mismos valores que tenga el disco duro a emplear. Al terminar, se pulsa el botón "Adelante".
  En la siguiente pantalla se escribe un nombre para la máquina virtual (mejor si es representativo; en nuestro ejemplo es "Plantilla"), se elige un interfaz de red en el desplegable correspondiente (en el ejemplo, "Red virtual 'default': NAT") y, si se considera necesario, se marca la casilla "Personalizar configuración antes de instalar". Tras realizar todo esto, se pulsa en el botón "Finalizar".
  En la siguiente pantalla hay que dejar una configuración lo más parecida posible a la de la máquina virtual original, quedando el panel derecho de a ventana como se ve en la siguiente imagen. Para finalizar, se pulsa en el botón "Iniciar la instalación".
  Una vez arrancada la máquina virtual (la primera vez arranca sola), se debe terminar de configurar la imagen plantilla (los cambios quedan guardados en el disco virtual automáticamente) para que no provoque conflictos al utilizarse en otras máquinas virtuales.
  En primer lugar, se debe buscar el archivo "70-persistent-net.rules" en la ruta "/etc/udev/rules.d/" y, si existe, borrarlo mediante el comando rm -f <nombre del archivo> (anteponiendo sudo si no se es administrador). Actualmente, en algunos sistemas operativos de Linuxlas reglas para inhibir la creación del fichero de persistencia para redes de KVM están en el fichero "75-persistent-net-generator.rules", situado en la ruta "/lib/udev/rules.d/", pero ese es mejor no tocarlo porque se estaría modificando un fichero del paquete udev, práctica nada recomendable para futuras actualizaciones.
  Lo siguiente que se debe hacer es limpiar los archivos de registro que se encuentran en la ruta "var/log/" y sus correspondientes subdirectorios [comando true > <nombre archivo> (anteponiendo sudo si no se es administrador)] ; excepto los siguientes:
  • btmp.
  • faillog.
  • lastlog.
  • wtmp.
  • /apt/eipp.log.xz.
  • Archivos del directorio "installer" (excepto archivos "status" y "syslog").

  Acto seguido, se deben limpiar los archivos ".bash_history" que se encuentran en las rutas "/home/<nombre de usuario>/" y "/root" con el mismo comando que se empleó para el paso anterior.
  Tras esta fase de limpieza, se deben crear dos archivos que se ejecutarán en el primer arranque de la imagen plantilla en cualquier nueva máquina virtual que se cree a partir de esta.
  El primero de ellos, llamado (por ejemplo) "firstboot.sh", se programarán las tareas iniciales necesarias para la configuración de la nueva máquina virtual (regeneración de las claves del servicio ssh, cambio de hostname de la nueva máquina virtual, cambio del nombre de usuario y de las contraseñas de usuario y de administrador, cambio de la configuración de red, etc.). Para lograr, por ejemplo, que se regeneren las claves del servicio ssh, el archivo de guión deberá tener las siguientes líneas:
#!/bin/bash
rm /etc/ssh/ssh_host_*
/usr/sbin/dpkg-reconfigure openssh-server

  El segundo archivo se creará para obligar al primero a arrancar durante el primer inicio de la máquina virtual creada desde la imagen plantilla, y debe crearse en la ruta "/etc/cron.d/" y tener un nombre representativo (en este caso, "firstboot"). El texto de este archivo debe ser: @reboot root bash /root/firstboot.sh && rm -f /etc/cron.d/firstboot /root/firstboot.sh.
  Si se intenta entrar una máquina virtual creada con la imagen plantilla que tenga el guión antes mostrado por ssh, el resultado será el siguiente:
  La solución para este problema (que ya aparece en la imagen) consiste en utilizar el comando ssh-keygen -f "/root/.ssh/known_hosts" -R 192.168.0.16" (anteponiendo sudo si no se es administrador).

  Tras la ejecución del primer archivo, se deben borrar la entrada del cron y el guión del primer arranque para que no se vuelvan a ejecutar (otra opción, si se sabe cómo hacerlo, es que el propio guión se autoelimine tras hacer el resto de las tareas que tenga programadas).
  Por otra parte, es posible que la red de la máquina virtual de la plantilla no funcione tras su primer arranque, por lo que hay  que asociarla manualmente al puente de red creado tras la instalación del KVM. Para ello hay que acceder al gestor de máquinas virtuales, seleccionar la máquina virtual creada a partir de la plantilla (en el ejemplo, "Plantilla"), y seguir la ruta del menú "Editar > Detalles de la máquina virtual".


  Como la siguiente ventana se abrirá en la vista de consola, hay que cambiarla desde el menú en la ruta "Vista > Detalles" (se marca esta última opción).
  A continuación, en la siguiente pantalla, se selecciona la opción "NIC" en el panel izquierdo de la ventana y se cambia en el desplegable de la opción "Fuente de red" de "Red virtual 'default': NAT" a "Especificar el nombre del dispositivo compartido"; también hay que cambiar la opción del desplegable "Modelo de dispositivo" a la más adecuada según la máquina física (lo mejor es utilizar la opción "virtio"), y escribir el nombre del puente de red apropiado (en este ejemplo, "virbr01") en el recuadro "Nombre del puente". Para finalizar, se pulsa en el botón "Aplicar".

  Esta solución al problema de red puede hacerse tanto con la máquina virtual de la plantilla en ejecución como si esta se encuentra apagada (es mejor en que se haga en este segundo caso); si se hace en el primer caso, hay que reiniciar la máquina virtual para que se hagan efectivos los cambios en la red.

  Espero que esta entrada haya sido del gusto del lector. En caso afirmativo, aguardo que el lector la comente y/o la comparta, por favor.

No hay comentarios:

Publicar un comentario

Deje aquí su comentario, si no puede comentar, pruebe a hacerlo desde otro navegador de red u otro equipo.