<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Proxmox on inetshell</title><link>https://inet.sh/es/posts/proxmox/</link><description>Recent content in Proxmox on inetshell</description><generator>Hugo</generator><language>es</language><lastBuildDate>Wed, 19 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://inet.sh/es/posts/proxmox/index.xml" rel="self" type="application/rss+xml"/><item><title>Plantillas Proxmox con cloud images (qm + cloud-init)</title><link>https://inet.sh/es/posts/proxmox/plantillas-cloud-init/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/proxmox/plantillas-cloud-init/</guid><description>Crear un template de Proxmox a partir de un qcow2 GenericCloud: wget, qm create, import-from, cloud-init y qm clone. Alma, Rocky, Ubuntu y más.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p>Cloud image qcow2 → <code>qm create</code> → <code>qm import-from</code> → <code>qm template</code> → <code>qm clone</code>. Alma, Rocky, Ubuntu, etc.</p>
<p>El ISO de instalador sobra si solo quieres un Linux que arranque con usuario, llave SSH y DHCP. Las distros publican un <strong>GenericCloud / cloudimg</strong> (qcow2): lo importas, le pegas un drive de cloud-init y lo conviertes en template.</p>
<p>Probado en <strong>Proxmox 8.0.4</strong>. El flujo es el de este <a href="https://gist.github.com/inetshell/f1d0206d5319c11062845901e4f3d06b">gist</a> (fork del de zidenis). Las URLs de Fedora 38 / Ubuntu 23.04 envejecen: cambia el <code>wget</code> por el cloud image <strong>actual</strong> de la distro.</p>
<h2 id="1-bajar-el-image">1. Bajar el image</h2>
<p>En el nodo, como root, en un storage con espacio (NFS, local, lo que uses):</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">IMAGES_PATH</span><span class="o">=</span><span class="s2">&#34;/mnt/pve/nfs-data/images/&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> <span class="s2">&#34;</span><span class="si">${</span><span class="nv">IMAGES_PATH</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">wget https://repo.almalinux.org/almalinux/9/cloud/x86_64/images/AlmaLinux-9-GenericCloud-latest.x86_64.qcow2
</span></span><span class="line"><span class="cl">wget https://repo.almalinux.org/almalinux/9/cloud/x86_64/images/CHECKSUM -O SHA256SUMS
</span></span><span class="line"><span class="cl">sha256sum -c SHA256SUMS --ignore-missing
</span></span></code></pre></td></tr></table>
</div>
</div><p>Otras distros (descomenta la que toque):</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Amazon Linux 2 — https://cdn.amazonlinux.com/os-images/latest/</span>
</span></span><span class="line"><span class="cl"><span class="c1"># wget https://cdn.amazonlinux.com/os-images/2.0.20230727.0/kvm/amzn2-kvm-2.0.20230727.0-x86_64.xfs.gpt.qcow2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># CentOS Stream 9</span>
</span></span><span class="line"><span class="cl"><span class="c1"># wget https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Fedora (ajusta la versión)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># wget https://download.fedoraproject.org/pub/fedora/linux/releases/38/Cloud/x86_64/images/Fedora-Cloud-Base-38-1.6.x86_64.qcow2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Oracle Linux 9 — el .qcow no es qcow2; conviértelo</span>
</span></span><span class="line"><span class="cl"><span class="c1"># wget https://yum.oracle.com/templates/OracleLinux/OL9/u2/x86_64/OL9U2_x86_64-kvm-b197.qcow</span>
</span></span><span class="line"><span class="cl"><span class="c1"># qemu-img convert -O qcow2 -o compat=0.10 OL9U2_x86_64-kvm-b197.qcow OL9U2_x86_64-kvm-b197.qcow2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># RHEL 9 — hace falta login en access.redhat.com</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Rocky 9</span>
</span></span><span class="line"><span class="cl"><span class="c1"># wget https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud-Base.latest.x86_64.qcow2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Ubuntu cloudimg</span>
</span></span><span class="line"><span class="cl"><span class="c1"># wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="2-variables-de-la-vm-y-de-cloud-init">2. Variables de la VM y de cloud-init</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">QEMU_CPU_MODEL</span><span class="o">=</span><span class="s2">&#34;host&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">VM_CPU_SOCKETS</span><span class="o">=</span><span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">VM_CPU_CORES</span><span class="o">=</span><span class="m">2</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">VM_MEMORY</span><span class="o">=</span><span class="m">4098</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">VM_RESOURCE_POOL</span><span class="o">=</span><span class="s2">&#34;CustomResourcePool&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CLOUD_INIT_USER</span><span class="o">=</span><span class="s2">&#34;user&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CLOUD_INIT_SSHKEY</span><span class="o">=</span><span class="s2">&#34;/home/user/.ssh/id_rsa.pub&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CLOUD_INIT_IP</span><span class="o">=</span><span class="s2">&#34;dhcp&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CLOUD_INIT_NAMESERVER</span><span class="o">=</span><span class="s2">&#34;1.1.1.1&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CLOUD_INIT_SEARCHDOMAIN</span><span class="o">=</span><span class="s2">&#34;example.com&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">TEMPLATE_ID</span><span class="o">=</span><span class="m">1001</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">VM_NAME</span><span class="o">=</span><span class="s2">&#34;alma9&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">VM_DISK_IMAGE</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">${</span><span class="nv">IMAGES_PATH</span><span class="si">}</span><span class="s2">/AlmaLinux-9-GenericCloud-latest.x86_64.qcow2&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>--cpu host</code> pasa las flags de la CPU del nodo (mejor rendimiento; el template no es portable a otro CPU vendor sin rehacer). <code>VM_MEMORY=4098</code> es el valor del gist; 4096 también vale.</p>
<p>El usuario de cloud-init <strong>no</strong> es <code>root</code>. La llave tiene que ser el <code>.pub</code> que vas a usar desde tu laptop.</p>
<h2 id="3-crear-la-vm-base-e-importar-el-disco">3. Crear la VM base e importar el disco</h2>
<p>Cambia <code>local-lvm</code> y <code>vmbr0</code> por tu storage y bridge reales.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">qm create <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span> --name <span class="si">${</span><span class="nv">VM_NAME</span><span class="si">}</span> --cpu <span class="si">${</span><span class="nv">QEMU_CPU_MODEL</span><span class="si">}</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --sockets <span class="si">${</span><span class="nv">VM_CPU_SOCKETS</span><span class="si">}</span> --cores <span class="si">${</span><span class="nv">VM_CPU_CORES</span><span class="si">}</span> --memory <span class="si">${</span><span class="nv">VM_MEMORY</span><span class="si">}</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --numa <span class="m">1</span> --net0 virtio,bridge<span class="o">=</span>vmbr0 --ostype l26 --agent <span class="m">1</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --pool <span class="si">${</span><span class="nv">VM_RESOURCE_POOL</span><span class="si">}</span> --scsihw virtio-scsi-single
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">qm <span class="nb">set</span> <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span> --scsi0 local-lvm:0,import-from<span class="o">=</span><span class="si">${</span><span class="nv">VM_DISK_IMAGE</span><span class="si">}</span>
</span></span><span class="line"><span class="cl">qm <span class="nb">set</span> <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span> --ide2 local-lvm:cloudinit --boot <span class="nv">order</span><span class="o">=</span>scsi0
</span></span><span class="line"><span class="cl">qm <span class="nb">set</span> <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span> --ipconfig0 <span class="nv">ip</span><span class="o">=</span><span class="si">${</span><span class="nv">CLOUD_INIT_IP</span><span class="si">}</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --nameserver <span class="si">${</span><span class="nv">CLOUD_INIT_NAMESERVER</span><span class="si">}</span> --searchdomain <span class="si">${</span><span class="nv">CLOUD_INIT_SEARCHDOMAIN</span><span class="si">}</span>
</span></span><span class="line"><span class="cl">qm <span class="nb">set</span> <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span> --ciupgrade <span class="m">1</span> --ciuser <span class="si">${</span><span class="nv">CLOUD_INIT_USER</span><span class="si">}</span> --sshkeys <span class="si">${</span><span class="nv">CLOUD_INIT_SSHKEY</span><span class="si">}</span>
</span></span><span class="line"><span class="cl">qm cloudinit update <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>--agent 1</code> pide qemu-guest-agent. Alma/Rocky/Fedora lo traen o cloud-init lo instala (<code>ciupgrade</code>). Amazon Linux 2 y algunos Ubuntu cloudimg <strong>no</strong> muestran la IP en la GUI de Proxmox hasta que instalas el agent a mano.</p>
<h2 id="4-convertir-a-template">4. Convertir a template</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">qm <span class="nb">set</span> <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span> --name <span class="s2">&#34;</span><span class="si">${</span><span class="nv">VM_NAME</span><span class="si">}</span><span class="s2">-Template&#34;</span>
</span></span><span class="line"><span class="cl">qm template <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>A partir de aquí esa VM no se arranca: se clona.</p>
<h2 id="5-clonar-y-arrancar">5. Clonar y arrancar</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">VM_ID</span><span class="o">=</span><span class="k">$(</span>pvesh get /cluster/nextid<span class="k">)</span>
</span></span><span class="line"><span class="cl">qm clone <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span> <span class="si">${</span><span class="nv">VM_ID</span><span class="si">}</span> --name <span class="si">${</span><span class="nv">VM_NAME</span><span class="si">}</span>
</span></span><span class="line"><span class="cl">qm start <span class="si">${</span><span class="nv">VM_ID</span><span class="si">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>SSH con la llave <strong>privada</strong> pareja del <code>.pub</code> que metiste en cloud-init:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ssh user@192.168.0.123 -i ~/.ssh/id_rsa
</span></span></code></pre></td></tr></table>
</div>
</div><p>Si no ves la IP en Proxmox: consola serial, o <code>ip neigh</code> en el bridge, o DHCP leases del router.</p>
<p>Fuente: <a href="https://gist.github.com/inetshell/f1d0206d5319c11062845901e4f3d06b">gist inetshell/f1d0206d5319c11062845901e4f3d06b</a>.</p>
]]></content:encoded></item></channel></rss>