En corto

Cloud image qcow2 → qm createqm import-fromqm templateqm clone. Alma, Rocky, Ubuntu, etc.

El ISO de instalador sobra si solo quieres un Linux que arranque con usuario, llave SSH y DHCP. Las distros publican un GenericCloud / cloudimg (qcow2): lo importas, le pegas un drive de cloud-init y lo conviertes en template.

Probado en Proxmox 8.0.4. El flujo es el de este gist (fork del de zidenis). Las URLs de Fedora 38 / Ubuntu 23.04 envejecen: cambia el wget por el cloud image actual de la distro.

1. Bajar el image

En el nodo, como root, en un storage con espacio (NFS, local, lo que uses):

1
2
3
4
5
6
export IMAGES_PATH="/mnt/pve/nfs-data/images/"
cd "${IMAGES_PATH}"

wget https://repo.almalinux.org/almalinux/9/cloud/x86_64/images/AlmaLinux-9-GenericCloud-latest.x86_64.qcow2
wget https://repo.almalinux.org/almalinux/9/cloud/x86_64/images/CHECKSUM -O SHA256SUMS
sha256sum -c SHA256SUMS --ignore-missing

Otras distros (descomenta la que toque):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# Amazon Linux 2 — https://cdn.amazonlinux.com/os-images/latest/
# wget https://cdn.amazonlinux.com/os-images/2.0.20230727.0/kvm/amzn2-kvm-2.0.20230727.0-x86_64.xfs.gpt.qcow2

# CentOS Stream 9
# wget https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2

# Fedora (ajusta la versión)
# wget https://download.fedoraproject.org/pub/fedora/linux/releases/38/Cloud/x86_64/images/Fedora-Cloud-Base-38-1.6.x86_64.qcow2

# Oracle Linux 9 — el .qcow no es qcow2; conviértelo
# wget https://yum.oracle.com/templates/OracleLinux/OL9/u2/x86_64/OL9U2_x86_64-kvm-b197.qcow
# qemu-img convert -O qcow2 -o compat=0.10 OL9U2_x86_64-kvm-b197.qcow OL9U2_x86_64-kvm-b197.qcow2

# RHEL 9 — hace falta login en access.redhat.com

# Rocky 9
# wget https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud-Base.latest.x86_64.qcow2

# Ubuntu cloudimg
# wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img

2. Variables de la VM y de cloud-init

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
export QEMU_CPU_MODEL="host"
export VM_CPU_SOCKETS=1
export VM_CPU_CORES=2
export VM_MEMORY=4098
export VM_RESOURCE_POOL="CustomResourcePool"

export CLOUD_INIT_USER="user"
export CLOUD_INIT_SSHKEY="/home/user/.ssh/id_rsa.pub"
export CLOUD_INIT_IP="dhcp"
export CLOUD_INIT_NAMESERVER="1.1.1.1"
export CLOUD_INIT_SEARCHDOMAIN="example.com"

export TEMPLATE_ID=1001
export VM_NAME="alma9"
export VM_DISK_IMAGE="${IMAGES_PATH}/AlmaLinux-9-GenericCloud-latest.x86_64.qcow2"

--cpu host pasa las flags de la CPU del nodo (mejor rendimiento; el template no es portable a otro CPU vendor sin rehacer). VM_MEMORY=4098 es el valor del gist; 4096 también vale.

El usuario de cloud-init no es root. La llave tiene que ser el .pub que vas a usar desde tu laptop.

3. Crear la VM base e importar el disco

Cambia local-lvm y vmbr0 por tu storage y bridge reales.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
qm create ${TEMPLATE_ID} --name ${VM_NAME} --cpu ${QEMU_CPU_MODEL} \
  --sockets ${VM_CPU_SOCKETS} --cores ${VM_CPU_CORES} --memory ${VM_MEMORY} \
  --numa 1 --net0 virtio,bridge=vmbr0 --ostype l26 --agent 1 \
  --pool ${VM_RESOURCE_POOL} --scsihw virtio-scsi-single

qm set ${TEMPLATE_ID} --scsi0 local-lvm:0,import-from=${VM_DISK_IMAGE}
qm set ${TEMPLATE_ID} --ide2 local-lvm:cloudinit --boot order=scsi0
qm set ${TEMPLATE_ID} --ipconfig0 ip=${CLOUD_INIT_IP} \
  --nameserver ${CLOUD_INIT_NAMESERVER} --searchdomain ${CLOUD_INIT_SEARCHDOMAIN}
qm set ${TEMPLATE_ID} --ciupgrade 1 --ciuser ${CLOUD_INIT_USER} --sshkeys ${CLOUD_INIT_SSHKEY}
qm cloudinit update ${TEMPLATE_ID}

--agent 1 pide qemu-guest-agent. Alma/Rocky/Fedora lo traen o cloud-init lo instala (ciupgrade). Amazon Linux 2 y algunos Ubuntu cloudimg no muestran la IP en la GUI de Proxmox hasta que instalas el agent a mano.

4. Convertir a template

1
2
qm set ${TEMPLATE_ID} --name "${VM_NAME}-Template"
qm template ${TEMPLATE_ID}

A partir de aquí esa VM no se arranca: se clona.

5. Clonar y arrancar

1
2
3
export VM_ID=$(pvesh get /cluster/nextid)
qm clone ${TEMPLATE_ID} ${VM_ID} --name ${VM_NAME}
qm start ${VM_ID}

SSH con la llave privada pareja del .pub que metiste en cloud-init:

1
ssh user@192.168.0.123 -i ~/.ssh/id_rsa

Si no ves la IP en Proxmox: consola serial, o ip neigh en el bridge, o DHCP leases del router.

Fuente: gist inetshell/f1d0206d5319c11062845901e4f3d06b.