Usar una imagen “cloud” con KVM


Muchas distribuciones linux facilitan desde hace tiempo ficheros de imágenes de máquinas virtuales preparadas para ejecutar como instancias en diferentes nubes públicas o privadas y en esta entrada vamos a ver como aprovechar esas imágenes para ejecutarlas directamente con KVM. Así, en lugar de descargarnos la imagen ISO y hacer el proceso de instalación de la máquina virtual, directamente usaremos una de estas imágenes de disco ya preparadas y que son adecuadas en muchas ocasiones.

La configuración de estas instancias se realiza normalmente en una nube de infraestructura a través del servicio de metadatos de la nube, ejecutando durante el arranque de la instancia la aplicación cloud-init. Al utilizar una máquina virtual local no disponemos normalmente de servicio de metadatos para la configuración, pero lo supliremos con la funcionalidad NoCloud de cloud-init.

Formato de imagen

El formato nativo de imagen de disco de KVM es el formato qcow2 y es uno de los formatos disponibles para descargar imágenes “cloud”, como podemos ver en los repositorios de debian o ubuntu (en este caso aparecen con extensión img en lugar de qcow2, pero tienen formato qcow2):

https://cdimage.debian.org/images/cloud/

https://cloud-images.ubuntu.com/

Podemos navegar por dichos repositorios y descargar alguna imagen, por ejemplo bionic-server-cloudimg-amd64.img, de la que comprobamos su formato y características:

alberto@mut:~$ qemu-img info bionic-server-cloudimg-amd64.img
image: bionic-server-cloudimg-amd64.img
file format: qcow2
virtual size: 2.2 GiB (2361393152 bytes)
disk size: 669 MiB
cluster_size: 65536
Format specific information:
compat: 0.10
compression type: zlib
refcount bits: 16

cloud-init

Otra de las características de estas imágenes es que al estar preparadas para ejecutarse como instancias en nube de infraestructura, se configuran a través del mecanismo de cloud-init, del que puedes ver más detalles en los siguientes vídeos:

Lo que vamos a hacer para utilizar estas imágenes con KVM es crear un fichero de cloud-init que convertiremos a formato de disco ISO9660 y lo pasaremos en el arranque de la máquina virtual, para que así se configure al arrancar utilizando el mecanismo NoCloud mencionado anteriormente.

Fichero user-data

Creamos un fichero user-data en el que especificamos los parámetros que consideremos adecuados con cloud-init, en este caso pondremos el hostname de la máquina virtual, la contraseña de usuario y la clave pública ssh para acceder:

#cloud-config
hostname: mv1
manage_etc_hosts: true
users:
   - name: ubuntu
     sudo: ALL=(ALL) NOPASSWD:ALL
     shell: /bin/bash
     ssh_authorized_keys:
       - ssh-rsa AAAAB3NzaC1yc2E...
package_update: true
package_upgrade: true
timezone: Europe/Madrid
disable_root: false

Creamos también un fichero meta-data vacío, que es necesario:

touch meta-data

Configuración de red

Debemos crear una nueva dirección MAC para nuestra máquina virtual, para lo que creamos la variable de entorno MAC0 y utilizamos los 3 octetos iniciales de libvirt, seguidos por 3 octetos que creamos de manera aleatoria:

MAC0=$(echo "52:52:00:"`openssl rand -hex 3 | sed 's/\(..\)/\1:/g; s/.$//'`)

Creamos un fichero network-config en el que definimos la primera interfaz de red para que coja la configuración por DHCP y se le asigne la anterior dirección MAC:

version: 2
ethernets:
  enp1s0:
    dhcp4: true
    match:
      macaddress: 52:52:00:ff:99:2d
    set-name: enp1s0

Con estos tres ficheros (user-data, meta-data y network-config) creamos una imagen en formato ISO9660 (el formato habitual de los CD-ROM), que añadiremos en el arranque de la máquina virtual (la etiqueta de volumen del sistema de ficheros debe ser cidata o CIDATA):

mkisofs -o cidata.iso -V CIDATA -J -r user-data meta-data network-config

Aprovisionamiento ligero

Podemos crear el dispositivo de almacenamiento para la partición raíz, utilizando como sistema base la imagen qcow2 que hemos descargado, en lo que se denomina aprovisionamiento ligero:

qemu-img create -b bionic-server-cloudimg-amd64.img -f qcow2 mv1.qcow2 80G

De esta manera creamos un nuevo dispositivo de almacenamiento en formato qcow2, que originalmente tiene el contenido de la imagen base, pero que almacenará hasta 80 G. Esa misma imagen base la podemos utilizar para crear tantos dispositivos de almacenamiento como queramos utilizando este mecanismo de aprovisionamiento ligero.

Definición y lanzamiento de la máquina virtual

Ya tenemos el dispositivo de almacenamiento para la partición raíz y los datos de configuración en el fichero ISO, por lo que podemos proceder a definir y arrancar la máquina virtual utilizando virt-install (paquete virtinst):

virt-install --import \
 --name mv1 \
 --memory 2048 \
 --vcpus 2 \
 --cpu host \
 --disk mv1.qcow2,format=qcow2,bus=virtio \
 --disk cidata.iso,device=cdrom \
 --network bridge=virbr0,model=virtio,mac=52:52:00:ff:99:2d \
 --os-type=linux --os-variant=ubuntu18.04 \
 --noautoconsole

Podemos acceder a la instancia localmente con virt-viewer mv1 o virsh console mv1 pero no la hemos preparado para acceder localmente (no conocemos la contraseña), sino a través de ssh con la clave pública que hemos suministrado en user-data, por lo que debemos averiguar la dirección IP asignada por DHCP:

virsh net-dhcp-leases default

Ahora simplemente accedemos por ssh utilizando la clave privada correspondiente a la clave pública suministrada y podremos comprobar que la máquina virtual tiene todas las características necesarias y la hemos creado de una forma más rápida que si tuviésemos que hacer una instalación tradicional desde un instalador.

Usar una imagen “cloud” con KVM

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s