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
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).

- 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)
.

- 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]](/img/posts/2023-04-07-proxmox-plantilla-vm-04.jpg)
| 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 ...
:

- Asocio este disco a la VM como un dispositivo SCSI.

- 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

- Cambio el orden de arranque y activo poder arrancar desde este nuevo disco.

- 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.

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.

- Cuando
cloud-init
termina entro con mi usuario (luis
), averiguo qué IP he recibido (para futuras conexiones vía SSH), instaloqemu-guest-agent
(para controlar mejor la VM desde Proxmox) y rearranco la VM.ip a
sudo apt install qemu-guest-agent
sudo reboot -f

- 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.