<?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/en/tags/proxmox/</link><description>Recent content in Proxmox on inetshell</description><generator>Hugo</generator><language>en</language><lastBuildDate>Wed, 19 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://inet.sh/en/tags/proxmox/index.xml" rel="self" type="application/rss+xml"/><item><title>Export a ZFS ZVOL to a RAW image</title><link>https://inet.sh/en/posts/zfs/zvol-raw-image/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/en/posts/zfs/zvol-raw-image/</guid><description>dd if=/dev/zvol/pool/volume of=file.raw to dump a ZVOL (Proxmox VM disks) to RAW, and when to use qemu-img instead.</description><content:encoded><![CDATA[<h2 id="tldr">TL;DR</h2>
<p>ZVOL = block device: <code>dd if=/dev/zvol/pool/vol of=vm.raw</code>. Snapshot first if the VM is running.</p>
<p>On Proxmox a VM disk on ZFS is a <strong>ZVOL</strong> (<code>rpool/data/vm-101-disk-0</code>), not a file. To copy it to another hypervisor or a USB stick, dump a RAW.</p>
<p>Thread: <a href="https://forum.proxmox.com/threads/import-convert-export-raw-images-to-zfs-volume.21241/">Import/convert/export RAW images to ZFS volume</a>.</p>
<h2 id="snapshot-and-dd">Snapshot and dd</h2>
<p>If the VM is running, freeze the disk with a snapshot and read the snap (the <code>@snap</code> ZVOL shows up under <code>/dev/zvol/…</code>):</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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs snapshot rpool/data/vm-101-disk-0@export
</span></span><span class="line"><span class="cl">dd <span class="k">if</span><span class="o">=</span>/dev/zvol/rpool/data/vm-101-disk-0@export <span class="nv">of</span><span class="o">=</span>/mnt/backup/vm-101.raw <span class="nv">bs</span><span class="o">=</span>1M <span class="nv">status</span><span class="o">=</span>progress
</span></span><span class="line"><span class="cl">zfs destroy rpool/data/vm-101-disk-0@export
</span></span></code></pre></td></tr></table>
</div>
</div><p>VM off, you can read the live zvol:</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">dd <span class="k">if</span><span class="o">=</span>/dev/zvol/rpool/data/vm-101-disk-0 <span class="nv">of</span><span class="o">=</span>/mnt/backup/vm-101.raw <span class="nv">bs</span><span class="o">=</span>1M <span class="nv">status</span><span class="o">=</span>progress
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>bs=1M</code> matters: the 512 B default takes forever.</p>
<h2 id="qemu-img-qcow2--vmdk">qemu-img (qcow2 / vmdk)</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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">qemu-img convert -p -f raw -O qcow2 /mnt/backup/vm-101.raw /mnt/backup/vm-101.qcow2
</span></span></code></pre></td></tr></table>
</div>
</div><p>Or straight from the zvol:</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">qemu-img convert -p -f raw -O qcow2 /dev/zvol/rpool/data/vm-101-disk-0 vm-101.qcow2
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="the-other-way-raw--zvol">The other way (RAW → ZVOL)</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">zfs create -s -V 32G rpool/data/vm-101-disk-0
</span></span><span class="line"><span class="cl">dd <span class="k">if</span><span class="o">=</span>file.raw <span class="nv">of</span><span class="o">=</span>/dev/zvol/rpool/data/vm-101-disk-0 <span class="nv">bs</span><span class="o">=</span>1M <span class="nv">status</span><span class="o">=</span>progress
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>-s</code> = sparse. The RAW must not be larger than the zvol.</p>
<p>See also: <a href="/en/posts/zfs/basic-commands/">basic commands</a>.</p>
]]></content:encoded></item><item><title>Proxmox templates from Linux cloud images (qm + cloud-init)</title><link>https://inet.sh/en/posts/proxmox/cloud-image-templates/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/en/posts/proxmox/cloud-image-templates/</guid><description>Build a Proxmox template from a GenericCloud qcow2: wget, qm create, import-from, cloud-init, qm clone. Alma, Rocky, Ubuntu, and more.</description><content:encoded><![CDATA[<h2 id="tldr">TL;DR</h2>
<p>Cloud qcow2 → <code>qm create</code> → <code>qm import-from</code> → <code>qm template</code> → <code>qm clone</code>. Alma, Rocky, Ubuntu, etc.</p>
<p>You do not need an installer ISO if you just want Linux that boots with a user, an SSH key, and DHCP. Distros ship a <strong>GenericCloud / cloudimg</strong> (qcow2): import it, attach a cloud-init drive, turn it into a template.</p>
<p>Tested on <strong>Proxmox 8.0.4</strong>. The flow is this <a href="https://gist.github.com/inetshell/f1d0206d5319c11062845901e4f3d06b">gist</a> (fork of zidenis). Fedora 38 / Ubuntu 23.04 URLs go stale: point <code>wget</code> at the distro’s <strong>current</strong> cloud image.</p>
<h2 id="1-download-the-image">1. Download the image</h2>
<p>On the node, as root, on a storage with space (NFS, local, whatever you use):</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>Other distros (uncomment one):</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 (bump the version)</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 — the .qcow is not qcow2; convert it</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 — needs a logged-in download from 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-vm-and-cloud-init-variables">2. VM and cloud-init variables</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> passes through the node CPU flags (faster; the template is not portable across CPU vendors). <code>VM_MEMORY=4098</code> is the gist value; 4096 is fine.</p>
<p>The cloud-init user is <strong>not</strong> <code>root</code>. The key must be the <code>.pub</code> you will use from your laptop.</p>
<h2 id="3-create-the-base-vm-and-import-the-disk">3. Create the base VM and import the disk</h2>
<p>Swap <code>local-lvm</code> and <code>vmbr0</code> for your real storage and bridge.</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> asks for qemu-guest-agent. Alma/Rocky/Fedora ship it or cloud-init installs it (<code>ciupgrade</code>). Amazon Linux 2 and some Ubuntu cloudimgs <strong>will not</strong> show the guest IP in the Proxmox GUI until you install the agent yourself.</p>
<h2 id="4-convert-to-a-template">4. Convert to 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>Do not start that VM again: clone it.</p>
<h2 id="5-clone-and-boot">5. Clone and boot</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 with the <strong>private</strong> key that matches the <code>.pub</code> you fed 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>If Proxmox does not show an IP: serial console, <code>ip neigh</code> on the bridge, or the router’s DHCP leases.</p>
<p>Source: <a href="https://gist.github.com/inetshell/f1d0206d5319c11062845901e4f3d06b">gist inetshell/f1d0206d5319c11062845901e4f3d06b</a>.</p>
]]></content:encoded></item></channel></rss>