<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://blog.procopan.md/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.procopan.md/" rel="alternate" type="text/html" /><updated>2026-02-16T11:23:48+00:00</updated><id>https://blog.procopan.md/feed.xml</id><title type="html">Vitalie Procopan’s Devops Blog</title><subtitle></subtitle><entry><title type="html">K8s Clean Evicted Pods</title><link href="https://blog.procopan.md/2026/02/16/k8s-clean-evicted-pods.html" rel="alternate" type="text/html" title="K8s Clean Evicted Pods" /><published>2026-02-16T00:00:00+00:00</published><updated>2026-02-16T00:00:00+00:00</updated><id>https://blog.procopan.md/2026/02/16/k8s-clean-evicted-pods</id><content type="html" xml:base="https://blog.procopan.md/2026/02/16/k8s-clean-evicted-pods.html"><![CDATA[<p>To clean evicted pods run:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl get pods <span class="nt">-A</span> <span class="nt">-o</span> json <span class="se">\</span>
| jq <span class="nt">-r</span> <span class="s1">'.items[]
  | select(.status.reason=="Evicted")
  | "\(.metadata.namespace) \(.metadata.name)"'</span> <span class="se">\</span>
| <span class="k">while </span><span class="nb">read </span>ns pod<span class="p">;</span> <span class="k">do
    </span>kubectl delete pod <span class="nt">-n</span> <span class="s2">"</span><span class="nv">$ns</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">$pod</span><span class="s2">"</span> <span class="nt">--grace-period</span><span class="o">=</span>0 <span class="nt">--force</span>
  <span class="k">done</span>
</code></pre></div></div>]]></content><author><name></name></author><summary type="html"><![CDATA[To clean evicted pods run:]]></summary></entry><entry><title type="html">How To Add Kubespray Node</title><link href="https://blog.procopan.md/2026/01/26/how-to-add-kubespray-node.html" rel="alternate" type="text/html" title="How To Add Kubespray Node" /><published>2026-01-26T00:00:00+00:00</published><updated>2026-01-26T00:00:00+00:00</updated><id>https://blog.procopan.md/2026/01/26/how-to-add-kubespray-node</id><content type="html" xml:base="https://blog.procopan.md/2026/01/26/how-to-add-kubespray-node.html"><![CDATA[<h2 id="to-add-a-node-use">to add a node use:</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ansible-playbook <span class="nt">-i</span> /inventory/inventory.ini <span class="nt">--private-key</span> /root/.ssh/id_ed25519 scale.yml <span class="nt">--limit</span><span class="o">=</span><span class="s2">"node6,kube_control_plane"</span> <span class="nt">--become</span> <span class="nt">-vvv</span>
</code></pre></div></div>]]></content><author><name></name></author><summary type="html"><![CDATA[to add a node use:]]></summary></entry><entry><title type="html">Patch Pod</title><link href="https://blog.procopan.md/2025/12/19/patch-pod.html" rel="alternate" type="text/html" title="Patch Pod" /><published>2025-12-19T00:00:00+00:00</published><updated>2025-12-19T00:00:00+00:00</updated><id>https://blog.procopan.md/2025/12/19/patch-pod</id><content type="html" xml:base="https://blog.procopan.md/2025/12/19/patch-pod.html"><![CDATA[<h2 id="remove-probes-at-runtime">Remove probes at runtime</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl patch deploy pihole <span class="nt">-n</span> pihole <span class="nt">--type</span> json <span class="nt">-p</span><span class="o">=</span><span class="s1">'[
  {"op":"remove","path":"/spec/template/spec/containers/0/livenessProbe"},
  {"op":"remove","path":"/spec/template/spec/containers/0/readinessProbe"}
]'</span>
</code></pre></div></div>]]></content><author><name></name></author><summary type="html"><![CDATA[Remove probes at runtime]]></summary></entry><entry><title type="html">Dns</title><link href="https://blog.procopan.md/2025/12/15/dns.html" rel="alternate" type="text/html" title="Dns" /><published>2025-12-15T00:00:00+00:00</published><updated>2025-12-15T00:00:00+00:00</updated><id>https://blog.procopan.md/2025/12/15/dns</id><content type="html" xml:base="https://blog.procopan.md/2025/12/15/dns.html"><![CDATA[<h2 id="to-view-dns-settings-in-ubuntu-enter-the-command">to view DNS settings in ubuntu, enter the command:</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>resolvectl
</code></pre></div></div>]]></content><author><name></name></author><summary type="html"><![CDATA[to view DNS settings in ubuntu, enter the command: resolvectl]]></summary></entry><entry><title type="html">Winget</title><link href="https://blog.procopan.md/2025/12/12/winget.html" rel="alternate" type="text/html" title="Winget" /><published>2025-12-12T00:00:00+00:00</published><updated>2025-12-12T00:00:00+00:00</updated><id>https://blog.procopan.md/2025/12/12/winget</id><content type="html" xml:base="https://blog.procopan.md/2025/12/12/winget.html"><![CDATA[<h1 id="winget-the-windows-package-manager">WinGet: The Windows Package Manager</h1>

<p>WinGet is Microsoft’s official package management tool for Windows. It provides:</p>

<ul>
  <li><strong>CLI</strong> (Command Line Interface)</li>
  <li><strong>PowerShell modules</strong></li>
  <li><strong>COM API</strong> (Component Object Model Application Programming Interface)</li>
</ul>

<p>Learn more in the <a href="https://learn.microsoft.com/en-us/windows/package-manager/winget/">official WinGet documentation</a>.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[WinGet: The Windows Package Manager]]></summary></entry><entry><title type="html">Kubespray</title><link href="https://blog.procopan.md/2025/12/01/kubespray.html" rel="alternate" type="text/html" title="Kubespray" /><published>2025-12-01T00:00:00+00:00</published><updated>2025-12-01T00:00:00+00:00</updated><id>https://blog.procopan.md/2025/12/01/kubespray</id><content type="html" xml:base="https://blog.procopan.md/2025/12/01/kubespray.html"><![CDATA[<h2 id="-run-kubespray-container">🐳 <strong>Run Kubespray container</strong></h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">--rm</span> <span class="nt">-it</span> <span class="se">\</span>
  <span class="nt">--mount</span> <span class="nb">type</span><span class="o">=</span><span class="nb">bind</span>,source<span class="o">=</span><span class="s2">"</span><span class="si">$(</span><span class="nb">pwd</span><span class="si">)</span><span class="s2">"</span>/inventory/sample,dst<span class="o">=</span>/inventory <span class="se">\</span>
  <span class="nt">--mount</span> <span class="nb">type</span><span class="o">=</span><span class="nb">bind</span>,source<span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">HOME</span><span class="k">}</span><span class="s2">"</span>/.ssh/id_ed25519,dst<span class="o">=</span>/root/.ssh/id_ed25519 <span class="se">\</span>
  quay.io/kubespray/kubespray:v2.29.0 bash
</code></pre></div></div>

<hr />

<h1 id="️-kube-vip-configuration">⚙️ kube-vip Configuration</h1>

<p>You will edit:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">inventory/sample/group_vars/k8s-cluster/addons.yml</code></li>
  <li><code class="language-plaintext highlighter-rouge">inventory/sample/group_vars/k8s-cluster/k8s-cluster.yml</code></li>
</ul>

<hr />

<h2 id="-addonsyml--enable-kube-vip">🟦 <strong>addons.yml — Enable kube-vip</strong></h2>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Enable kube-vip for API server load balancing</span>
<span class="na">kube_vip_enabled</span><span class="pi">:</span> <span class="no">true</span>

<span class="c1"># Virtual IP for your Kubernetes control-plane</span>
<span class="na">kube_vip_address</span><span class="pi">:</span> <span class="s">192.168.100.10</span>

<span class="c1"># API Server Load Balancer</span>
<span class="na">loadbalancer_apiserver</span><span class="pi">:</span>
  <span class="na">address</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span>
  <span class="na">port</span><span class="pi">:</span> <span class="m">6443</span>

<span class="c1"># Interface where the VIP will be bound</span>
<span class="na">kube_vip_interface</span><span class="pi">:</span> <span class="s">eth0</span>

<span class="c1"># Enable ARP mode (Layer2)</span>
<span class="na">kube_vip_arp_enabled</span><span class="pi">:</span> <span class="no">true</span>
<span class="na">kube_vip_controlplane_enabled</span><span class="pi">:</span> <span class="no">true</span>

<span class="c1"># Service LoadBalancer functionality (disabled)</span>
<span class="na">kube_vip_services_enabled</span><span class="pi">:</span> <span class="no">false</span>

<span class="c1"># DNS resolution mode</span>
<span class="na">kube_vip_dns_mode</span><span class="pi">:</span> <span class="s">first</span>

<span class="c1"># Misc kube-vip options</span>
<span class="na">kube_vip_cp_detect</span><span class="pi">:</span> <span class="no">false</span>
<span class="na">kube_vip_lb_fwdmethod</span><span class="pi">:</span> <span class="s">local</span>
<span class="na">kube_vip_enable_node_labeling</span><span class="pi">:</span> <span class="no">false</span>

<span class="c1"># Run kube-vip pod in hostNetwork with NET_ADMIN capability</span>
<span class="na">kube_vip_pod_hostnetwork</span><span class="pi">:</span> <span class="no">true</span>
<span class="na">kube_vip_pod_capabilities</span><span class="pi">:</span>
  <span class="na">add</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="s">NET_ADMIN</span>
</code></pre></div></div>

<hr />

<h1 id="-k8s-clusteryml--required-arp-fix">🔧 <strong>k8s-cluster.yml — Required ARP Fix</strong></h1>

<p>kube-vip <strong>requires</strong> strict ARP mode in kube-proxy.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">kube_proxy_strict_arp</span><span class="pi">:</span> <span class="no">true</span>
</code></pre></div></div>

<hr />

<h1 id="️-summary">✔️ Summary</h1>
<p>This setup:</p>

<ul>
  <li>Enables kube-vip as the <strong>control-plane load balancer</strong></li>
  <li>Uses <strong>Layer2 (ARP) mode</strong></li>
  <li>Assigns a static VIP: <code class="language-plaintext highlighter-rouge">192.168.100.10</code></li>
  <li>Ensures kube-proxy is correctly configured (<code class="language-plaintext highlighter-rouge">strict_arp: true</code>)</li>
  <li>Runs kube-vip with the necessary NET_ADMIN capability</li>
</ul>

<p>Everything is now ready for:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ansible-playbook <span class="nt">-i</span> /inventory/inventory.ini <span class="nt">--private-key</span> /root/.ssh/id_ed25519 cluster.yml
</code></pre></div></div>

<hr />]]></content><author><name></name></author><summary type="html"><![CDATA[🐳 Run Kubespray container]]></summary></entry><entry><title type="html">Upgrade Linux Different Commands</title><link href="https://blog.procopan.md/2025/11/25/upgrade-Linux-different-commands.html" rel="alternate" type="text/html" title="Upgrade Linux Different Commands" /><published>2025-11-25T00:00:00+00:00</published><updated>2025-11-25T00:00:00+00:00</updated><id>https://blog.procopan.md/2025/11/25/upgrade-Linux-different-commands</id><content type="html" xml:base="https://blog.procopan.md/2025/11/25/upgrade-Linux-different-commands.html"><![CDATA[<h2 id="difference-between-upgrade--y-and-dist-upgrade--y">difference between upgrade -y and dist-upgrade -y</h2>

<p><code class="language-plaintext highlighter-rouge">apt-get update</code>
updates the list of available packages and their versions, but it does not install or upgrade any packages.</p>

<p><code class="language-plaintext highlighter-rouge">apt-get upgrade</code>
actually installs newer versions of the packages you have. After updating the lists, the package manager knows about available updates for the software you have installed. This is why you first want to update.</p>

<p><code class="language-plaintext highlighter-rouge">apt-get dist-upgrade</code>
in addition to performing the function of apt-get upgrade, also intelligently handles changing dependencies with new versions of packages and will attempt to upgrade the most important packages at the expense of less important ones if necessary. Thus, the apt-get dist-upgrade command may actually remove some packages in rare but necessary instances.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[difference between upgrade -y and dist-upgrade -y]]></summary></entry><entry><title type="html">Apt Upgrade Only A Package</title><link href="https://blog.procopan.md/2025/11/18/apt-upgrade-only-a-package.html" rel="alternate" type="text/html" title="Apt Upgrade Only A Package" /><published>2025-11-18T00:00:00+00:00</published><updated>2025-11-18T00:00:00+00:00</updated><id>https://blog.procopan.md/2025/11/18/apt-upgrade-only-a-package</id><content type="html" xml:base="https://blog.procopan.md/2025/11/18/apt-upgrade-only-a-package.html"><![CDATA[<p>If you want <strong>apt to update ONLY the Jenkins package</strong> (and not upgrade the whole system), use:</p>

<hr />

<h2 id="-1-update-package-index">✅ <strong>1. Update package index</strong></h2>

<p>You must always update sources first:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt update
</code></pre></div></div>

<hr />

<h2 id="-2-upgrade-only-the-jenkins-package">✅ <strong>2. Upgrade ONLY the Jenkins package</strong></h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt <span class="nb">install</span> <span class="nt">--only-upgrade</span> jenkins
</code></pre></div></div>

<p>This will:</p>

<ul>
  <li>NOT install new packages</li>
  <li>NOT update anything else</li>
  <li>ONLY upgrade the <code class="language-plaintext highlighter-rouge">jenkins</code> package if an update exists</li>
</ul>

<hr />

<h2 id="-check-version-afterwards">🔍 Check version afterwards:</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dpkg <span class="nt">-l</span> | <span class="nb">grep </span>jenkins
</code></pre></div></div>

<hr />

<h2 id="-if-jenkins-is-installed-via-repo-recommended">📝 If Jenkins is installed via repo (recommended)</h2>

<p>Make sure your <code class="language-plaintext highlighter-rouge">/etc/apt/sources.list.d/jenkins.list</code> is correct:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>deb https://pkg.jenkins.io/debian-stable binary/
</code></pre></div></div>

<p>Then run the upgrade command above.</p>

<hr />

<h2 id="-if-you-want-to-prevent-other-packages-from-upgrading">⛔ If you want to prevent other packages from upgrading</h2>

<p>You can hold the rest:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt-mark hold <span class="s1">'*'</span>
<span class="nb">sudo </span>apt-mark unhold jenkins
</code></pre></div></div>

<p>But normally unnecessary — the <code class="language-plaintext highlighter-rouge">--only-upgrade</code> flag is enough.</p>

<hr />]]></content><author><name></name></author><summary type="html"><![CDATA[If you want apt to update ONLY the Jenkins package (and not upgrade the whole system), use:]]></summary></entry><entry><title type="html">Cloud Init</title><link href="https://blog.procopan.md/2025/11/15/cloud-init.html" rel="alternate" type="text/html" title="Cloud Init" /><published>2025-11-15T00:00:00+00:00</published><updated>2025-11-15T00:00:00+00:00</updated><id>https://blog.procopan.md/2025/11/15/cloud-init</id><content type="html" xml:base="https://blog.procopan.md/2025/11/15/cloud-init.html"><![CDATA[<p>Perfect — here is the <strong>clean, guaranteed-working</strong>, official <strong>Ubuntu 24.04 Cloud-Image + cloud-init (NoCloud) + Virt-Manager</strong> setup.</p>

<p>This is the method Ubuntu itself recommends for KVM/QEMU.
Zero installer. Zero GRUB. Zero autoinstall pain.</p>

<p>This will <strong>work 100%</strong>.</p>

<hr />

<h1 id="-overview-what-you-will-get">✅ OVERVIEW (what you will get)</h1>

<p>A VM that:</p>

<ul>
  <li>Boots instantly (no installer)</li>
  <li>Uses cloud-init like AWS / Azure / Proxmox</li>
  <li>Has your user <code class="language-plaintext highlighter-rouge">vprocopan</code></li>
  <li>Has your SSH key installed</li>
  <li>Has qemu-guest-agent enabled</li>
  <li>Is reproducible, template-ready, cloud-ready</li>
</ul>

<p>And created entirely using <strong>cloud image + NoCloud seed</strong>.</p>

<hr />

<h1 id="-step-1--download-ubuntu-2404-cloud-image">🚀 STEP 1 — Download Ubuntu 24.04 cloud image</h1>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mkdir</span> ~/cloudvm
<span class="nb">cd</span> ~/cloudvm

wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
</code></pre></div></div>

<p>This file is the <strong>actual OS image</strong>, no installer.</p>

<hr />

<h1 id="-step-2--resize-the-vm-image">🚀 STEP 2 — Resize the VM image</h1>

<p>Let’s make it 50GB total disk:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>qemu-img resize noble-server-cloudimg-amd64.img 50G
</code></pre></div></div>

<hr />

<h1 id="-step-3--create-cloud-init-config">🚀 STEP 3 — Create cloud-init config</h1>

<h2 id="31-user-data">3.1 <code class="language-plaintext highlighter-rouge">user-data</code></h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano user-data
</code></pre></div></div>

<p>Paste:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#cloud-config</span>
<span class="na">users</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">user</span>
    <span class="na">groups</span><span class="pi">:</span> <span class="pi">[</span> <span class="nv">sudo</span> <span class="pi">]</span>
    <span class="na">shell</span><span class="pi">:</span> <span class="s">/bin/bash</span>
    <span class="na">sudo</span><span class="pi">:</span> <span class="s">ALL=(ALL) NOPASSWD:ALL</span>
    <span class="na">ssh_authorized_keys</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">ssh-ed25519 XXX</span>

<span class="na">package_upgrade</span><span class="pi">:</span> <span class="no">true</span>

<span class="na">packages</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="s">qemu-guest-agent</span>

<span class="na">runcmd</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="s">systemctl enable qemu-guest-agent</span>
  <span class="pi">-</span> <span class="s">systemctl start qemu-guest-agent</span>
</code></pre></div></div>

<h2 id="32-meta-data">3.2 <code class="language-plaintext highlighter-rouge">meta-data</code></h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nano meta-data
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>instance-id: cloudimg-001
local-hostname: ubuntu-cloud
</code></pre></div></div>

<hr />

<h1 id="-step-4--create-the-nocloud-seed-image">🚀 STEP 4 — Create the NoCloud seed image</h1>

<p>This is the <strong>magic piece</strong> from the official cloud-init QEMU tutorial.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>genisoimage <span class="nt">-output</span> seed.iso <span class="nt">-volid</span> cidata <span class="nt">-joliet</span> <span class="nt">-rock</span> user-data meta-data
</code></pre></div></div>

<p><strong>IMPORTANT:</strong>
The volume label must be <strong>cidata</strong> (lowercase).
This is how NoCloud datasource detects it.</p>

<hr />

<h1 id="-step-5--create-the-vm-in-virt-manager">🚀 STEP 5 — Create the VM in Virt-Manager</h1>

<h3 id="-add-vm-manually">🔹 Add VM manually:</h3>

<p><strong>1. Create new VM → “Import existing disk image”</strong>
Select:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>noble-server-cloudimg-amd64.img
</code></pre></div></div>

<p>OS type:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Ubuntu 24.04 (or Generic Ubuntu)
</code></pre></div></div>

<p><strong>2. Choose Q35 + UEFI (recommended)</strong>
Under Overview →</p>

<ul>
  <li>Chipset: <strong>Q35</strong></li>
  <li>Firmware: <strong>UEFI</strong> (OVMF)</li>
</ul>

<p><strong>3. Add the cloud-init seed disk</strong>
Add Hardware →
Storage →
“Select or create custom storage” → choose:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>seed.iso
</code></pre></div></div>

<p>IMPORTANT:
Set:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Device type: Disk
Bus: SCSI or VirtIO
</code></pre></div></div>

<p>(Cloud-init sees disks, not CDROMs.)</p>

<p><strong>4. Ensure the boot order boots only from the main disk</strong>
NOT from seed.iso.</p>

<hr />

<h1 id="-step-6--boot-the-vm">🚀 STEP 6 — Boot the VM</h1>

<p>During first boot:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cloud-init will detect NoCloud (seed.iso)
apply user-data
create user vprocopan
add SSH key
enable qemu-guest-agent
resize disk to full 50GB
</code></pre></div></div>

<p>You can watch progress:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo tail -f /var/log/cloud-init-output.log
</code></pre></div></div>

<p>Check status:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cloud-init status --wait
cloud-init status --long
</code></pre></div></div>

<hr />

<h1 id="-step-7--ssh-into-the-vm">🚀 STEP 7 — SSH into the VM</h1>

<p>Get the VM IP from virt-manager or inside VM:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ip a
</code></pre></div></div>

<p>Then SSH:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh vprocopan@&lt;VM-IP&gt;
</code></pre></div></div>

<p>Your key works instantly.</p>

<hr />

<h1 id="-done">🎉 DONE</h1>

<p>You now have:</p>

<ul>
  <li>A <strong>real cloud-image VM</strong></li>
  <li>No installer needed</li>
  <li>Full cloud-init support</li>
  <li>Perfect for DevOps work</li>
  <li>Runs instantly</li>
  <li>Repeatable</li>
  <li>Zero GUI interaction</li>
</ul>

<hr />]]></content><author><name></name></author><summary type="html"><![CDATA[Perfect — here is the clean, guaranteed-working, official Ubuntu 24.04 Cloud-Image + cloud-init (NoCloud) + Virt-Manager setup.]]></summary></entry><entry><title type="html">Git Ignore Cached Rm</title><link href="https://blog.procopan.md/2025/11/09/git-ignore-cached-rm.html" rel="alternate" type="text/html" title="Git Ignore Cached Rm" /><published>2025-11-09T00:00:00+00:00</published><updated>2025-11-09T00:00:00+00:00</updated><id>https://blog.procopan.md/2025/11/09/git-ignore-cached-rm</id><content type="html" xml:base="https://blog.procopan.md/2025/11/09/git-ignore-cached-rm.html"><![CDATA[<h2 id="git-rm--r-cached-idea">git rm -r –cached .idea</h2>
<p>This removes .idea from Git index only, not your disk.
(–cached = keep local, untrack in repo.)</p>]]></content><author><name></name></author><summary type="html"><![CDATA[git rm -r –cached .idea This removes .idea from Git index only, not your disk. (–cached = keep local, untrack in repo.)]]></summary></entry></feed>