logo linux router

Proxmox VE es una plataforma de virtualización de código abierto potente y fácil de usar que permite el despliegue y la gestión de máquinas virtuales (VM’s con KVM/QEMU) y contenedores (CT’s basados en LXC). Proxmox nos ofrece Plantillas para minimizar el tiempo de creación de nuevas instancias de estas máquinas virtuales o contendores.

En este apunte me concentro en cómo crear mi propia Plantillas de máquina virtual junto con una imagen basada en la nube y cloud-init.


Aviso a navegantes

Aunque este apunte va de plantillas para VM (Virtual Machines), nunca dejes de intentar montar tus servicios usando LXC, ocupa menos memoria, CPU y recursos. Tienes el proyecto Proxmox VE Helper-Scripts, donde encontrarás cientos de “scripts” para automatizar la instalacion. Un proyecto FOSS espectacular.

Plantillas con imágenes basadas en la nube

¿Qué es una Plantilla de VM en Proxmox?, se trata de una VM normal y corriente que convertimos en “Plantilla” y a partir de ella podemos clonar nuevas VM’s idénticas rápidamente. Si las combinamos con imágenes basadas en la nube y cloud-init conseguimos un activo muy potente para crear VM’s ágiles y ligeras.

Estas imágenes basadas en la nube (VM cloud based images) son discos ya preinstalador, muy útiles porque tienen un tamaño mínimo y permite hacer despliegues ágiles de máquinas virtuales. cloud-init es un estandar para la personalización de instancias en la “nube” (en mi caso instancias en Proxmox). Permite parametrizar el usuario, su contraseña, claves SSH y otras lindezas para ahorrarnos curro durante la instalación.


Creación de una Plantilla

Nota: Los comandos CLI difieren de las imágenes; actualicé el apunte con nuevas versiones y diferentes paths.

La primero es bajarse una imagen basada en la nube. Me conecto al servidor Proxmox y me cambio al directorio del “storage” que tengo para imágenes:

  • Basada en Ubuntu: Hay que bajarse un fichero .img.
curl -O -J -L https://cloud-images.ubuntu.com/minimal/releases/noble/release/ubuntu-24.04-minimal-cloudimg-amd64.img
# La renombro por comodidad
mv ubuntu-24.04-minimal-cloudimg-amd64.img ubuntu-24.04.img
  • Basada en Debian. Hay que bajarse un .raw y renombrarlo.
cd /mnt/rapid/isos/template/iso
curl -O -J -L https://cloud.debian.org/images/cloud/trixie/latest/debian-13-genericcloud-amd64.raw
# Tiene que terminar en .img, la renombro por comodidad
mv debian-13-genericcloud-amd64.raw debian-13.img
  • Basada en Alpine. Elejí Generic (Alpha), Release 3.22.1, Arch x86_64, Firmware UEFI, Bootstrap cloud-init, Machine Virtual. Te ofrece bajarse un .qcow2. Me copié el enlace, lo bajé desde Proxmox y convertí a .img.
cd /mnt/rapid/isos/template/iso
curl -O -J -L https://dl-cdn.alpinelinux.org/alpine/v3.22/releases/cloud/generic_alpine-3.22.1-x86_64-uefi-cloudinit-r0.qcow2
qemu-img convert -f qcow2 -O raw generic_alpine-3.22.1-x86_64-uefi-cloudinit-r0.qcow2 alpine-3.22.1.img

A partir de aquí he usado el ejemplo con Ubuntu, pero con Debian o Alpine es exáctamente igual.

  • Creo una VM nueva sin medio de instalación asociado (no voy a hacer la instalación del Sistema Operativo) y sin disco duro (ya que su disco será la cloud image que me bajé antes). Le concedo lo mínimo: 1 CPU, 1024 RAM (podré cambiarlo en las futuras VM’s que clone).
Creo la máquina virtual
Creo la máquina virtual
  • Se recomienda (desde el proyecto OpenStack) que cloud-init encuentre su parametrización en un dispositivo de tipo CD-ROM asociado a la VM. Tenemos la ventaja de que Proxmox VE nos genera automáticamente una imagen ISO preparada para esto: Hardware -> Add -> CloudInit Drive (ide0).
Asocio un dispositivo CDROM para Cloud-Init
Asocio un dispositivo CDROM para Cloud-Init
  • Parametrizo cloud-init indicando usuario, password, parámetros DNS, mi clave ssh pública y muy importante configuro la red en modo DHCP.
Parametrizo cloud-init y pulso en [Regenerate Image]
Parametrizo cloud-init y pulso en [Regenerate Image]

| Importante: No te olvides de darle a Regenerate Image. La ventaja de cloud-init es que me ahorro configurar varias cosas en las futuras VMs. |

  • Sigo desde el CLI (vía SSH) en el nodo donde creé la VM. Importante a partir de ahora: Usa el mismo número de VM (ID) que usaste durante la creación (en mi caso el 900).
➜  ~ ssh root@pve-tierra.tudominio.com
Last login: Sat Apr  8 10:20:18 2023 from 192.168.100.3
root@pve-tierra:~#
  • Asocio una consola serie de tipo VGA para poder ver la consola desde Proxmox.
qm set 900 --serial0 socket --vga serial0
  • Averiguo el Path de la imagen a importar
 ❯ pvesm list rapid-isos
Volid                            Format  Type            Size VMID
rapid-isos:iso/alpine-3.22.1.img iso     iso        226492416
rapid-isos:iso/debian-13.img     iso     iso       3221225472
rapid-isos:iso/ubuntu-24.04.img  iso     iso        255393792

pvesm path rapid-isos:iso/ubuntu-24.04.img
/mnt/rapid/isos/template/iso/ubuntu-24.04.img

pvesm path rapid-isos:iso/debian-13.img
/mnt/rapid/isos/template/iso/debian-13.img

pvesm path rapid-isos:iso/alpine-3.22.1.img
/mnt/rapid/isos/template/iso/alpine-3.22.1.img
  • Importo la imagen basada en la nube. El siguiente comando copia la imagen al storage de Proxmox y la configura como un disco disponible para la VM.
qm importdisk 900 /mnt/rapid/isos/template/iso/debian-13.img local-lvm
importing disk '/mnt/rapid/isos/template/iso/debian-13.img' to VM 900 ...
:
Tras la importación veo el disco disponible, aunque no asociado
Tras la importación veo el disco disponible, aunque no asociado
  • Asocio este disco a la VM como un dispositivo SCSI.
Asocio el disco con las opciones indicadas, dado que mi disco es SSD
Asocio el disco con las opciones indicadas, dado que mi disco es SSD
  • MUY IMPORTANTE La imagen que nos hemos bajado no permitirá hacer boot y normalmente tamaños pequeños (2-3GB). Usamos qm disk resize que nos corrige ambos.
qm disk resize 900 scsi0 32G
Disco asociado a la VM y redimensionado a 32GB
Disco asociado a la VM y redimensionado a 32GB
  • Cambio el orden de arranque y activo poder arrancar desde este nuevo disco.
Cambio el orden de arranque, lo subo a la segunda posición
Cambio el orden de arranque, lo subo a la segunda posición
  • El paso final es convertir la VM a una Plantilla. Es irreversible, así que es un buen momento para repasar las opciones. Una vez convertida vemos cómo cambia su icono.
Convierto la VM a una Plantilla
Convierto la VM a una Plantilla

Crear una nueva máquina virtual

Ya podemos crear todas las máquinas virtuales que queramos partiendo de la(s) Plantilla(s). Se realiza con la Función Clonar. Veamos un ejemplo con la de Ubuntu (para la de Debian o Apline es igual).

  • Pulso con el botón derecho sobre la Plantilla, selecciono Clone, asigno el VM ID, su nombre y el modo de clonado (a mi me gusta hacer clonados completos). Cuando termina arranco la VM y hago click en Console para ver el proceso de arranque completo. Importante no tocar nada, no hacer Login hasta que termine la ejecución de cloud-init.
Creo una VM (clonando la plantilla) y la arranco.
Creo una VM (clonando la plantilla) y la arranco.
  • Cuando cloud-init termina entro con mi usuario (luis), averiguo qué IP he recibido (para futuras conexiones vía SSH), instalo qemu-guest-agent (para controlar mejor la VM desde Proxmox) y rearranco la VM.
    • ip a
    • sudo apt install qemu-guest-agent
    • sudo reboot -f
Termino de instalar qemu-guest-agent.
Termino de instalar qemu-guest-agent.
  • Ya tenemos un nuevo Ubuntu, Debian o Alpine instanciado. Si vamos a darle un uso de largo recorrido recomiendo asignarle una dirección IP estática. En mi caso siempre lo hago asignando IP’s a MAC’s de forma estática desde mi DHCP Server.

Referencias

  • Un par de enlaces
    • Un buen artículo aquí
    • Un video interesante aquí.