<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Sudhakar Daggubati</title>
    <description>The latest articles on Forem by Sudhakar Daggubati (@mrdaggubati).</description>
    <link>https://forem.com/mrdaggubati</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F162572%2F271b03fa-08e7-489c-a608-e97df992151d.jpg</url>
      <title>Forem: Sudhakar Daggubati</title>
      <link>https://forem.com/mrdaggubati</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mrdaggubati"/>
    <language>en</language>
    <item>
      <title>PCI GPU passthrough</title>
      <dc:creator>Sudhakar Daggubati</dc:creator>
      <pubDate>Wed, 13 May 2026 09:33:37 +0000</pubDate>
      <link>https://forem.com/mrdaggubati/pci-gpu-passthrough-1m6h</link>
      <guid>https://forem.com/mrdaggubati/pci-gpu-passthrough-1m6h</guid>
      <description>&lt;p&gt;Little snippet to prepare the host for GPU passthrough&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail

&lt;span class="nb"&gt;echo&lt;/span&gt;  &lt;span class="s2"&gt;" This enables vfio passthroug on ubuntu 24+ "&lt;/span&gt;

&lt;span class="c"&gt;# =========================&lt;/span&gt;
&lt;span class="c"&gt;# CONFIG&lt;/span&gt;
&lt;span class="c"&gt;# =========================&lt;/span&gt;
&lt;span class="nv"&gt;GPU_PCI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"0000:01:00.0"&lt;/span&gt;
&lt;span class="nv"&gt;GPU_AUDIO_PCI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"0000:01:00.1"&lt;/span&gt;
&lt;span class="nv"&gt;GPU_IDS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"10de:2820,10de:22bd"&lt;/span&gt;


&lt;span class="nv"&gt;GRUB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/etc/default/grub"&lt;/span&gt;
&lt;span class="nv"&gt;VFIO_CONF&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/etc/modprobe.d/vfio.conf"&lt;/span&gt;
&lt;span class="nv"&gt;BLACKLIST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/etc/modprobe.d/blacklist-nvidia.conf"&lt;/span&gt;
&lt;span class="nv"&gt;RECOVERY_FLAG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/boot/vfio_last_state"&lt;/span&gt;
&lt;span class="nv"&gt;SAFE_ENTRY_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/etc/grub.d/40_vfio_safe_mode"&lt;/span&gt;

&lt;span class="c"&gt;# ⚠️ IMPORTANT: replace once with `blkid`&lt;/span&gt;
&lt;span class="nv"&gt;ROOT_UUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;findmnt &lt;span class="nt"&gt;-no&lt;/span&gt; UUID /&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;ROOT_FSTYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;findmnt &lt;span class="nt"&gt;-no&lt;/span&gt; FSTYPE /&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# SAFETY CHECK: Ensure UUID was actually captured&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ROOT_UUID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[!] ERROR: Could not determine ROOT_UUID."&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"    Check if findmnt is installed or if you have sufficient permissions."&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;


&lt;span class="c"&gt;# 2. Check for Filesystem Compatibility&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ROOT_FSTYPE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; ext&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"===================================================="&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" [!] WARNING: NON-EXT FILESYSTEM DETECTED (&lt;/span&gt;&lt;span class="nv"&gt;$ROOT_FSTYPE&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"===================================================="&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" Your Safe Mode GRUB entry is currently hardcoded for 'insmod ext2'."&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" To ensure recovery works, you should update the 'insmod' line"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" in the ensure_safe_mode_entry function to 'insmod &lt;/span&gt;&lt;span class="nv"&gt;$ROOT_FSTYPE&lt;/span&gt;&lt;span class="s2"&gt;'."&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
    &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Continue anyway? (y/n): "&lt;/span&gt; confirm
    &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$confirm&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"y"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;


&lt;span class="c"&gt;# =========================&lt;/span&gt;
&lt;span class="c"&gt;# BANNER&lt;/span&gt;
&lt;span class="c"&gt;# =========================&lt;/span&gt;
show_recovery_banner&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"===================================================="&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" VFIO SAFE CONTROLLER"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"===================================================="&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"RECOVERY OPTIONS:"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  → GRUB: 'Ubuntu (SAFE MODE - iGPU only)'"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  → OR 'Advanced options'"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SAFE MODE = NO VFIO, NO NVIDIA, iGPU ONLY"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"===================================================="&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# =========================&lt;/span&gt;
&lt;span class="c"&gt;# VM SAFETY CHECK&lt;/span&gt;
&lt;span class="c"&gt;# =========================&lt;/span&gt;
check_vms&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[*] Checking running VMs..."&lt;/span&gt;

    &lt;span class="nv"&gt;RUNNING&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;virsh list &lt;span class="nt"&gt;--state-running&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'NR&amp;gt;2 {print $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RUNNING&lt;/span&gt;&lt;span class="p"&gt;// &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nv"&gt;RUNNING&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;virsh list 2&amp;gt;/dev/null | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'NR&amp;gt;2 &amp;amp;&amp;amp; $3=="running" {print $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;fi

    if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RUNNING&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[!] Running VMs detected:"&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RUNNING&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;1
    &lt;span class="k"&gt;fi

    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[✓] No running VMs"&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;0
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# =========================&lt;/span&gt;
&lt;span class="c"&gt;# PREFLIGHT&lt;/span&gt;
&lt;span class="c"&gt;# =========================&lt;/span&gt;
preflight&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[*] Preflight check..."&lt;/span&gt;

    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;blocked&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0
    &lt;span class="nb"&gt;local &lt;/span&gt;running_vms

    &lt;span class="nv"&gt;running_vms&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;virsh list &lt;span class="nt"&gt;--name&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'/^$/d'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$running_vms&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[✓] No running VMs"&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[✓] Preflight OK"&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;0
    &lt;span class="k"&gt;fi

    for &lt;/span&gt;vm &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$running_vms&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
        if &lt;/span&gt;virsh dumpxml &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$vm&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-qE&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GPU_PCI&lt;/span&gt;&lt;span class="s2"&gt;|&lt;/span&gt;&lt;span class="nv"&gt;$GPU_AUDIO_PCI&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[!] Running VM '&lt;/span&gt;&lt;span class="nv"&gt;$vm&lt;/span&gt;&lt;span class="s2"&gt;' is using configured GPU passthrough devices"&lt;/span&gt;
            &lt;span class="nv"&gt;blocked&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
        &lt;span class="k"&gt;else
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[i] Running VM '&lt;/span&gt;&lt;span class="nv"&gt;$vm&lt;/span&gt;&lt;span class="s2"&gt;' does not use passthrough GPU"&lt;/span&gt;
        &lt;span class="k"&gt;fi
    done

    if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$blocked&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 1 &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[!] Stop affected VM(s) before changing VFIO state"&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;1
    &lt;span class="k"&gt;fi

    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[✓] No running VM currently uses the dGPU"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[✓] Preflight OK"&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;0
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# =========================&lt;/span&gt;
&lt;span class="c"&gt;# STATUS&lt;/span&gt;
&lt;span class="c"&gt;# =========================&lt;/span&gt;
status&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"===================="&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" SYSTEM STATUS"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"===================="&lt;/span&gt;

    virsh list 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true
    echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;

    lspci &lt;span class="nt"&gt;-nnk&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GPU_PCI&lt;/span&gt;:5:7&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# =========================&lt;/span&gt;
&lt;span class="c"&gt;# SAFE MODE GRUB ENTRY&lt;/span&gt;
&lt;span class="c"&gt;# =========================&lt;/span&gt;
ensure_safe_mode_entry&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[*] Ensuring SAFE MODE GRUB entry for &lt;/span&gt;&lt;span class="nv"&gt;$ROOT_FSTYPE&lt;/span&gt;&lt;span class="s2"&gt;..."&lt;/span&gt;

    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;grub_mod&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ROOT_FSTYPE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ROOT_FSTYPE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; ext&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;grub_mod&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ext2"&lt;/span&gt;

    &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SAFE_ENTRY_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
#!/bin/sh
exec tail -n +3 &lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="sh"&gt;0

menuentry "Ubuntu (SAFE MODE - iGPU only, NO VFIO)" {
    insmod part_gpt
    insmod &lt;/span&gt;&lt;span class="nv"&gt;$grub_mod&lt;/span&gt;&lt;span class="sh"&gt;
    search --no-floppy --fs-uuid --set=root &lt;/span&gt;&lt;span class="nv"&gt;$ROOT_UUID&lt;/span&gt;&lt;span class="sh"&gt;
    linux /boot/vmlinuz root=UUID=&lt;/span&gt;&lt;span class="nv"&gt;$ROOT_UUID&lt;/span&gt;&lt;span class="sh"&gt; ro quiet splash intel_iommu=off modprobe.blacklist=vfio_pci,vfio,vfio_iommu_type1,nvidia,nvidia_drm,nvidia_modeset
    initrd /boot/initrd.img
}
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;    &lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SAFE_ENTRY_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;


&lt;span class="c"&gt;# =========================&lt;/span&gt;
&lt;span class="c"&gt;# GRUB APPLY VFIO&lt;/span&gt;
&lt;span class="c"&gt;# =========================&lt;/span&gt;
apply_vfio_grub&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GRUB&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GRUB&lt;/span&gt;&lt;span class="s2"&gt;.bak.&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%s&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="nb"&gt;sudo sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/vfio-pci.ids=[^ ]*//g'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GRUB&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;sudo sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/intel_iommu=on//g'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GRUB&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;sudo sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/iommu=pt//g'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GRUB&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="c"&gt;#sudo sed -i "s/^GRUB_CMDLINE_LINUX_DEFAULT=\"/GRUB_CMDLINE_LINUX_DEFAULT=\"quiet splash intel_iommu=on iommu=pt vfio-pci.ids=$GPU_IDS /" "$GRUB"&lt;/span&gt;
    &lt;span class="nb"&gt;sudo sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/^GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on iommu=pt vfio-pci.ids='&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GPU_IDS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s1"&gt;' rd.driver.pre=vfio-pci"/'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GRUB&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

verify_vfio_binding&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[*] Checking GPU driver binding..."&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;lspci &lt;span class="nt"&gt;-nnk&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GPU_PCI&lt;/span&gt;:5:7&lt;span class="k"&gt;}&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"vfio-pci"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[✓] GPU correctly bound to VFIO"&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;0
    &lt;span class="k"&gt;else
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[!] VFIO FAILED — GPU still not isolated"&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"    Do NOT launch VM"&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;1
    &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;


&lt;span class="c"&gt;# =========================&lt;/span&gt;
&lt;span class="c"&gt;# GRUB RESTORE (iGPU)&lt;/span&gt;
&lt;span class="c"&gt;# =========================&lt;/span&gt;
restore_igpu_grub&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GRUB&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GRUB&lt;/span&gt;&lt;span class="s2"&gt;.bak.&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%s&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="nb"&gt;sudo sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/vfio-pci.ids=[^ ]*//g'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GRUB&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;sudo sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/intel_iommu=on//g'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GRUB&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;sudo sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/iommu=pt//g'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GRUB&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="nb"&gt;sudo sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/^GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"/'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GRUB&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# =========================&lt;/span&gt;
&lt;span class="c"&gt;# ENABLE VFIO&lt;/span&gt;
&lt;span class="c"&gt;# =========================&lt;/span&gt;
enable_flow&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    show_recovery_banner
    preflight &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[*] Enabling VFIO..."&lt;/span&gt;


    &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; | sudo tee "&lt;/span&gt;&lt;span class="nv"&gt;$BLACKLIST&lt;/span&gt;&lt;span class="sh"&gt;" &amp;gt;/dev/null
blacklist nvidia
blacklist nvidia_drm
blacklist nvidia_modeset
blacklist nvidia_uvm
blacklist nvidia_nouveau
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;    &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="s2"&gt;"options vfio-pci ids=&lt;/span&gt;&lt;span class="nv"&gt;$GPU_IDS&lt;/span&gt;&lt;span class="s2"&gt; disable_vga=1"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="s2"&gt;"softdep nvidia pre: vfio-pci"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="s2"&gt;"softdep nvidia_drm pre: vfio-pci"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="s2"&gt;"softdep nvidia_modeset pre: vfio-pci"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="s2"&gt;"softdep nvidia_uvm pre: vfio-pci"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$VFIO_CONF&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null

    &lt;span class="c"&gt;# Block udev from loading nvidia modules&lt;/span&gt;
    &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/udev/rules.d/71-nvidia.rules &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
# VFIO override — block nvidia module loading via udev
ACTION=="add", DEVPATH=="/bus/pci/drivers/nvidia", RUN+="/bin/false"
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;    &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl disable &lt;span class="nt"&gt;--now&lt;/span&gt; nvidia-persistenced.service 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true
    sudo &lt;/span&gt;systemctl disable &lt;span class="nt"&gt;--now&lt;/span&gt; nvidia-powerd.service 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true
    sudo &lt;/span&gt;systemctl disable &lt;span class="nt"&gt;--now&lt;/span&gt; nvidia-cdi-refresh.path 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true



    &lt;/span&gt;apply_vfio_grub
    ensure_safe_mode_entry

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GPU_IDS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RECOVERY_FLAG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null

    &lt;span class="nb"&gt;sudo &lt;/span&gt;update-initramfs &lt;span class="nt"&gt;-u&lt;/span&gt;
    &lt;span class="nb"&gt;sudo &lt;/span&gt;update-grub
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[*] Verifying GRUB configuration..."&lt;/span&gt;
    &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"vfio-pci.ids=&lt;/span&gt;&lt;span class="nv"&gt;$GPU_IDS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GRUB&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[!] GRUB injection failed"&lt;/span&gt;
        &lt;span class="nb"&gt;exit &lt;/span&gt;1
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[✓] VFIO enabled safely"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# =========================&lt;/span&gt;
&lt;span class="c"&gt;# DISABLE VFIO&lt;/span&gt;
&lt;span class="c"&gt;# =========================&lt;/span&gt;
disable_flow&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    show_recovery_banner

    &lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$VFIO_CONF&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BLACKLIST&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /etc/udev/rules.d/71-nvidia.rules
    &lt;span class="nb"&gt;sudo &lt;/span&gt;udevadm control &lt;span class="nt"&gt;--reload-rules&lt;/span&gt;

    restore_igpu_grub
    ensure_safe_mode_entry

    &lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RECOVERY_FLAG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="c"&gt;# Re-enable nvidia services&lt;/span&gt;
    &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; nvidia-persistenced.service 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true
    sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; nvidia-powerd.service 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true
    sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; nvidia-cdi-refresh.path 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true

    sudo &lt;/span&gt;update-initramfs &lt;span class="nt"&gt;-u&lt;/span&gt;
    &lt;span class="nb"&gt;sudo &lt;/span&gt;update-grub

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[✓] VFIO disabled"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# =========================&lt;/span&gt;
&lt;span class="c"&gt;# RECOVERY MODE&lt;/span&gt;
&lt;span class="c"&gt;# =========================&lt;/span&gt;
recover_flow&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[!] RECOVERY MODE ACTIVATED"&lt;/span&gt;

    restore_igpu_grub

    &lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$VFIO_CONF&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BLACKLIST&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RECOVERY_FLAG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /etc/udev/rules.d/71-nvidia.rules
    &lt;span class="nb"&gt;sudo &lt;/span&gt;udevadm control &lt;span class="nt"&gt;--reload-rules&lt;/span&gt;

    ensure_safe_mode_entry

    &lt;span class="c"&gt;# Re-enable nvidia services&lt;/span&gt;
    &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; nvidia-persistenced.service 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true
    sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; nvidia-powerd.service 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true
    sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; nvidia-cdi-refresh.path 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true

    sudo &lt;/span&gt;update-initramfs &lt;span class="nt"&gt;-u&lt;/span&gt;
    &lt;span class="nb"&gt;sudo &lt;/span&gt;update-grub

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[✓] System restored to iGPU SAFE MODE"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# =========================&lt;/span&gt;
&lt;span class="c"&gt;# MAIN CONTROLLER&lt;/span&gt;
&lt;span class="c"&gt;# =========================&lt;/span&gt;
main&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    show_recovery_banner

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;:-}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in
        &lt;/span&gt;status&lt;span class="p"&gt;)&lt;/span&gt;
            status
            &lt;span class="p"&gt;;;&lt;/span&gt;
        preflight&lt;span class="p"&gt;)&lt;/span&gt;
            preflight
            &lt;span class="p"&gt;;;&lt;/span&gt;
        &lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            enable_flow
            &lt;span class="p"&gt;;;&lt;/span&gt;
        disable&lt;span class="p"&gt;)&lt;/span&gt;
            disable_flow
            &lt;span class="p"&gt;;;&lt;/span&gt;
        recover&lt;span class="p"&gt;)&lt;/span&gt;
            recover_flow
            &lt;span class="p"&gt;;;&lt;/span&gt;
        verify&lt;span class="p"&gt;)&lt;/span&gt;
            verify_vfio_binding &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1
            &lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; {status|preflight|enable|disable|recover|verify}"&lt;/span&gt;
            &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="k"&gt;esac&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

main &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>automation</category>
      <category>linux</category>
      <category>tutorial</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>open-source API gateway solutions and their managed offerings.</title>
      <dc:creator>Sudhakar Daggubati</dc:creator>
      <pubDate>Fri, 27 Sep 2024 14:48:14 +0000</pubDate>
      <link>https://forem.com/mrdaggubati/api-management-gateways-4h0f</link>
      <guid>https://forem.com/mrdaggubati/api-management-gateways-4h0f</guid>
      <description>&lt;p&gt;&lt;a href="https://konghq.com/" rel="noopener noreferrer"&gt;Kong&lt;/a&gt; and &lt;a href="https://apisix.apache.org/" rel="noopener noreferrer"&gt;APISIX&lt;/a&gt;, two popular open-source #APIGateway solutions. #kong looks versatile Unified Gateway but how it fares against #APISIX backed by a similar enterprise &lt;a href="https://api7.ai" rel="noopener noreferrer"&gt;API7&lt;/a&gt; offering. &lt;/p&gt;

&lt;p&gt;Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API Gateway and API Management&lt;/li&gt;
&lt;li&gt;Plugin architecture&lt;/li&gt;
&lt;li&gt;NGINX-based&lt;/li&gt;
&lt;li&gt;Config management&lt;/li&gt;
&lt;li&gt;Seamless Kubernetes integration&lt;/li&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Differentiation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Gateway:&lt;/strong&gt; Only Kong offers an AI gateway, leveraging AI for tasks like traffic management and anomaly detection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance:&lt;/strong&gt; API7 claims superior performance, but real-world benchmarks may vary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; Self-hosting Kong can be cost-effective, SaaS offering pricing are complex, its better to check the fine print and usage patterns &lt;a href="![Image%20description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i4tm0nrch9vmd9tkjfpp.png)"&gt; Pricing Models &lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Mesh:&lt;/strong&gt; Kong uses Envoy, while API7 uses Istio (which also uses Envoy).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Costs:&lt;/strong&gt; Running AI and API gateways at scale in the cloud can be expensive, Network design, workload pattern and application architecture going to play a critical role in how costly its going to be.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choosing the Right API Gateway:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35qrxqt1rocvduv7rpx5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35qrxqt1rocvduv7rpx5.png" alt="Image description" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;APISIX(API7):&lt;/strong&gt; If performance and native service mesh capabilities are your primary concerns, then API7 might be a good choice. While #APISIX is a top #CNCF project and cloud-native with its out-of-the-box plugins, API7's focus on performance and service mesh integration is a compelling factor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F347jlck0bso6wjomq4zm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F347jlck0bso6wjomq4zm.png" alt="Image description" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kong:&lt;/strong&gt; if that #AIGateway is exiting, in-house team is capable and priority is for long standing community support and self management then considering kong is advisable; you could self mange or opt for enterprise option.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4tm0nrch9vmd9tkjfpp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4tm0nrch9vmd9tkjfpp.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The best choice between Kong and APISIX depends on organizational inclinations and specific requirements, including the need for AI integration, performance demands, and budget constraints. Carefully evaluate your needs and consider the strengths and weaknesses of each platform to make an informed decision.&lt;/p&gt;

&lt;p&gt;Considering both are open source in nature/base and a big community driving the adoption, over a period of time, feature coverage would eventually catch-up, so better to be cost &amp;amp; performance conscious when choosing the gateway. Watch out those pricing models; getting on is easy but not getting off :-)&lt;/p&gt;

&lt;h1&gt;
  
  
  PlatformEngineering
&lt;/h1&gt;

</description>
      <category>apigateway</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Automating DNS with Confidence: Terraform + DNScontrol</title>
      <dc:creator>Sudhakar Daggubati</dc:creator>
      <pubDate>Mon, 23 Sep 2024 15:09:55 +0000</pubDate>
      <link>https://forem.com/mrdaggubati/automating-dns-with-confidence-terraform-dnscontrol-566m</link>
      <guid>https://forem.com/mrdaggubati/automating-dns-with-confidence-terraform-dnscontrol-566m</guid>
      <description>&lt;p&gt;A split origin DNS setup with multi origin and multi subscription creating route via a gateway subnet is complex&lt;/p&gt;

&lt;p&gt;Its even more challenging to keep it running smoothly and not to break things inadvertently; it's not a joke when people say &lt;code&gt;its all DNS&lt;/code&gt; :-)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmvtnp3vh4hsl8skeq58u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmvtnp3vh4hsl8skeq58u.png" alt="Image description" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Terraform can automate most of this infra at scale but one aspect that  it lacks is management of DNS in a complex setup in which one often need additional capabilities to test and validate before plan is applied.&lt;/p&gt;

&lt;p&gt;There are multiple scenarios in which lack of this capability makes it hard to customize DNS and do not get into troubles. &lt;/p&gt;

&lt;h1&gt;
  
  
  Temporary zone and validate before apply
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjh2dktf3z5qzm3msi740.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjh2dktf3z5qzm3msi740.png" alt="Image description" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use terraform to create temporary DNS zone&lt;/li&gt;
&lt;li&gt;Use curl or &lt;a href="https://httpie.io/" rel="noopener noreferrer"&gt;https://httpie.io/&lt;/a&gt; to validate the DNS entries&lt;/li&gt;
&lt;li&gt;this setup ensures DNS changes are tested and impact is known

&lt;ul&gt;
&lt;li&gt;Each provider has their own SDK, format that they support and API; for example terraform has no zone file import while azure does besides integration tests are non exist and complex to craft, mostly simple nslookup validation.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  Combination of native DNS mgmt + Terraform
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12btgxy6je7mn0khbp2a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12btgxy6je7mn0khbp2a.png" alt="Image description" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DNScontrol and Terraform are both powerful tools for managing DNS records, but they have different capabilities and use cases. Let's use them together to make a DNS management predictable and fault proof.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designed specifically for DNS: DNScontrol is tailored for DNS management, offering features and integrations that are optimized for DNS-related tasks.&lt;/li&gt;
&lt;li&gt;Flexibility: It provides a high level of flexibility, allowing you to define DNS records using various formats (e.g., YAML, JSON) and supports a wide range of DNS providers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You could leave whole DNS management to DNSControl or use it for complex validations and DNS records mgmt and use AZ CLI to  export and import in a CI/CD task with necessary approval flows +/- terraform.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>terraform</category>
      <category>dns</category>
    </item>
    <item>
      <title>kyverno-json; to extend kyverno policy rules framework beyond K8S resources</title>
      <dc:creator>Sudhakar Daggubati</dc:creator>
      <pubDate>Wed, 14 Aug 2024 11:06:57 +0000</pubDate>
      <link>https://forem.com/mrdaggubati/kyverno-json-to-extend-kyverno-policy-rules-framework-beyons-k8s-resources-5b2d</link>
      <guid>https://forem.com/mrdaggubati/kyverno-json-to-extend-kyverno-policy-rules-framework-beyons-k8s-resources-5b2d</guid>
      <description>&lt;p&gt;&lt;a href="https://kyverno.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;kyverno&lt;/strong&gt;&lt;/a&gt; is a powerful policy engine for #Kubernetes artifacts governance, What if you need to extend same capabilities beyond Kubernetes resources?&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqi45aol0bc51c3tujped.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqi45aol0bc51c3tujped.png" alt="Image description" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check &lt;a href="https://kyverno.github.io/kyverno-json/latest/" rel="noopener noreferrer"&gt;kyverno-json&lt;/a&gt;, it is natural extension when one already having #kyverno as policy engine for #k8s governance.&lt;/p&gt;

&lt;p&gt;Exploring as we got a config driven PaaS infra setup,by extending existing policy coverage to other configuration items and at plan stage itself and as a pipeline, we hope to minimize config induced errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kyverno-json&lt;/strong&gt; bridges the gap by allowing you to apply Kyverno policies to validate any JSON or YAML data. This opens doors to validating:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Terraform files&lt;/strong&gt;: Ensure your infrastructure configurations adhere to best practices and security guidelines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dockerfiles&lt;/strong&gt;: Validate image builds for compliance and prevent potential vulnerabilities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cloud configurations: Maintain consistency and avoid errors across your cloud infrastructure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Authorization&lt;/strong&gt; requests: Enforce granular access control at the request level.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Beyond Deployment-Time Validation:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With kyverno-json, validation extends beyond deployment time:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DevOps Pipelines&lt;/strong&gt;: Integrate seamlessly into your DevOps pipelines for continuous validation.&lt;br&gt;
&lt;strong&gt;Pre-commit hooks&lt;/strong&gt;: Enforce validation before code commits, catching errors early in the development cycle.&lt;br&gt;
&lt;strong&gt;Atlantis&lt;/strong&gt; (Terraform PR Automation): Enhance your Terraform pull request automation with robust validation capabilities., atlantis also doubles up as self service tool for developers.&lt;br&gt;
&lt;strong&gt;Makefiles&lt;/strong&gt;: Utilize kyverno-json in your makefiles for streamlined validation as part of your build process.&lt;/p&gt;

&lt;p&gt;Terraform plan can be validated taking its JSON output and passing to CLI when complex validation is required.&lt;/p&gt;

&lt;p&gt;Terraform input validation is limited, kyverno-json covers a lot more with &lt;a href="https://jmespath.org/" rel="noopener noreferrer"&gt;JMESPath &lt;/a&gt;; a query language for JSON.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
