En corto#
Cloud image qcow2 → qm create → qm import-from → qm template → qm 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.