<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Pxe on Backend Engineering Strategy Tools</title><link>https://backend-engineering-strategy-tools.github.io/site/tags/pxe/</link><description>Recent content in Pxe on Backend Engineering Strategy Tools</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Thu, 14 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://backend-engineering-strategy-tools.github.io/site/tags/pxe/index.xml" rel="self" type="application/rss+xml"/><item><title>PXE Booting with OPNSense + iPXE</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/hardware/hardware-provisioning/ipxe-opnsense/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/hardware/hardware-provisioning/ipxe-opnsense/</guid><description>&lt;p&gt;How to configure OPNSense as a PXE boot server using its built-in DHCP and TFTP services, and how to write an iPXE boot menu that can chainload Talos Linux (or anything else).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="opnsense-dhcp--network-boot-fields"&gt;OPNSense DHCP — Network Boot Fields
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Services → ISC DHCPv4 → [LAN] → Network Booting&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Value&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Enable network booting&lt;/td&gt;
 &lt;td&gt;✓&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Next-server IP&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;192.168.1.1&lt;/code&gt; (OPNSense LAN address)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Default BIOS filename&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;undionly.kpxe&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;x86 UEFI (32-bit) filename&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ipxe.efi&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;x64 UEFI/EBC (64-bit) filename&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ipxe.efi&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;iPXE boot filename&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;default.ipxe&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The DHCP server serves the correct boot file based on client architecture. BIOS clients get &lt;code&gt;undionly.kpxe&lt;/code&gt;; UEFI clients get &lt;code&gt;ipxe.efi&lt;/code&gt;. Both then chainload &lt;code&gt;default.ipxe&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="tftp--downloading-the-boot-files"&gt;TFTP — Downloading the Boot Files
&lt;/h2&gt;&lt;p&gt;OPNSense runs a TFTP server rooted at &lt;code&gt;/usr/local/tftp&lt;/code&gt;. SSH in and fetch the iPXE binaries:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fetch -o /usr/local/tftp/undionly.kpxe https://boot.ipxe.org/undionly.kpxe
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fetch -o /usr/local/tftp/ipxe.efi https://boot.ipxe.org/ipxe.efi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="ipxe-boot-script"&gt;iPXE Boot Script
&lt;/h2&gt;&lt;p&gt;Save as &lt;code&gt;/usr/local/tftp/default.ipxe&lt;/code&gt;. This example has a boot menu with options for netboot.xyz, a Talos Omni boot, and a debug shell.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-ipxe" data-lang="ipxe"&gt;#!ipxe

dhcp
set menu-timeout 5000

:start
menu PXE Boot Menu
item --gap -- ----------------------------
item netboot Boot netboot.xyz
item talos Boot Talos (Omni)
item shell iPXE Shell
item --gap -- ----------------------------
choose target &amp;amp;&amp;amp; goto ${target}

:netboot
chain http://boot.netboot.xyz || goto failed
goto start

:talos
echo Booting Talos via Omni...

set api https://&amp;lt;your-omni-instance&amp;gt;.omni.siderolabs.io
set token &amp;lt;join-token&amp;gt;
set event [&amp;lt;siderolink-ipv6&amp;gt;]:8090
set log tcp://[&amp;lt;siderolink-ipv6&amp;gt;]:8092

kernel tftp://${next-server}/talos/vmlinuz-omni \
 ima_template=ima-ng \
 ima_appraise=fix \
 ima_hash=sha512 \
 selinux=1 \
 consoleblank=0 \
 nvme_core.io_timeout=4294967295 \
 initrd=initramfs.xz \
 init_on_alloc=1 \
 slab_nomerge \
 pti=on \
 console=tty0 \
 console=ttyS0 \
 printk.devkmsg=on \
 talos.platform=metal \
 siderolink.api=${api}?jointoken=${token} \
 talos.events.sink=${event} \
 talos.logging.kernel=${log}

initrd tftp://${next-server}/talos/initramfs-omni.xz
boot || goto failed

:shell
shell

:failed
echo Boot failed, press Enter to continue...
read fake
goto start
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;api&lt;/code&gt;, &lt;code&gt;token&lt;/code&gt;, &lt;code&gt;event&lt;/code&gt;, and &lt;code&gt;log&lt;/code&gt; values come from the Omni console when you generate a join link.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="talos-kernel-and-initramfs--image-factory"&gt;Talos Kernel and Initramfs — Image Factory
&lt;/h2&gt;&lt;p&gt;The standard Talos release binaries do not include firmware for all hardware. Since Talos 1.6, several older NIC drivers (including Broadcom BNX2 / BCM5709) were removed from the mainline image and made available as extensions via the image factory.&lt;/p&gt;
&lt;p&gt;Generate a custom image at &lt;a class="link" href="https://factory.talos.dev" target="_blank" rel="noopener"
 &gt;factory.talos.dev&lt;/a&gt; with the extensions you need (e.g. &lt;code&gt;siderolabs/bnx2&lt;/code&gt;), then download the PXE artifacts:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir -p /usr/local/tftp/talos
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fetch -o /usr/local/tftp/talos/vmlinuz-omni &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;https://pxe.factory.talos.dev/image/&amp;lt;IMAGE_ID&amp;gt;/v1.10.1/kernel-amd64&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fetch -o /usr/local/tftp/talos/initramfs-omni.xz &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;https://pxe.factory.talos.dev/image/&amp;lt;IMAGE_ID&amp;gt;/v1.10.1/initramfs-amd64.xz&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace &lt;code&gt;&amp;lt;IMAGE_ID&amp;gt;&lt;/code&gt; with the schematic ID from the image factory, and adjust the version tag as needed.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="gotchas"&gt;Gotchas
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;UEFI boot and NIC memory limits&lt;/strong&gt; — &lt;code&gt;ipxe.efi&lt;/code&gt; can be too large to fit in the NIC&amp;rsquo;s PXE memory buffer on some older hardware. If the UEFI chain fails silently, switch to BIOS/legacy mode and use &lt;code&gt;undionly.kpxe&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DHCP options 66/67 conflict&lt;/strong&gt; — If you have previously set DHCP options 66 (next-server) and 67 (boot file) as raw additional options, remove them. OPNSense&amp;rsquo;s built-in network boot fields handle this; having both causes conflicts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BIOS boot order after first boot&lt;/strong&gt; — Talos writes its own bootloader on first boot. If the BIOS is set to PXE as the primary device, the machine will fall back to the PXE menu on every subsequent reboot. Set disk as the primary boot device once the cluster is up.&lt;/p&gt;</description></item><item><title>Talos Linux in the homelab via Omni</title><link>https://backend-engineering-strategy-tools.github.io/site/homelab/talos-omni/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/homelab/talos-omni/</guid><description>&lt;p&gt;Getting &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/kubernetes/talos/" &gt;Talos Linux&lt;/a&gt; running in the homelab via PXE boot and &lt;a class="link" href="https://omni.siderolabs.com" target="_blank" rel="noopener"
 &gt;Omni&lt;/a&gt; — starting with &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/homelab/inventory/systems/" &gt;ODEN (SYS-005)&lt;/a&gt;, an IBM System x3550 M3. The full OPNSense + iPXE configuration lives in the &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/hardware/hardware-provisioning/ipxe-opnsense/" &gt;reference note&lt;/a&gt;; this covers what actually happened, in order.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="setup"&gt;Setup
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Hardware&lt;/strong&gt;: ODEN (SYS-005) — IBM x3550 M3, Broadcom BNX2 NICs (BCM5709)&lt;br&gt;
&lt;strong&gt;Network&lt;/strong&gt;: OPNSense router on LAN; ODEN connected via one NIC (start with one — removes variables)&lt;br&gt;
&lt;strong&gt;Target&lt;/strong&gt;: Single-node Talos cluster registered in Omni&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="step-1--opnsense-dhcp-and-tftp"&gt;Step 1 — OPNSense DHCP and TFTP
&lt;/h2&gt;&lt;p&gt;Enable network booting on the LAN DHCP server and download the iPXE binaries to the TFTP root. Full field values in the &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/hardware/hardware-provisioning/ipxe-opnsense/" &gt;iPXE reference note&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One thing to check first: if you previously set DHCP options 66 and 67 as raw additional options, remove them. OPNSense&amp;rsquo;s built-in network boot fields do the same job and having both causes conflicts.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="step-2--ipxe-boot-script"&gt;Step 2 — iPXE boot script
&lt;/h2&gt;&lt;p&gt;Write &lt;code&gt;default.ipxe&lt;/code&gt; to &lt;code&gt;/usr/local/tftp/&lt;/code&gt;. Include a boot menu with at minimum a Talos option and a shell fallback — the shell is genuinely useful when something fails and you need to debug from the boot prompt. Full script in the &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/hardware/hardware-provisioning/ipxe-opnsense/" &gt;reference note&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Talos entry in the menu needs the Omni join token from your Omni console. Generate a join link in Omni; it provides the API endpoint, token, and SideroLink addresses.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="step-3--talos-kernel-and-initramfs"&gt;Step 3 — Talos kernel and initramfs
&lt;/h2&gt;&lt;p&gt;The standard Talos release binaries do not include BNX2 firmware. Since around Talos 1.6 those drivers are available as extensions but not in the mainline image. Without them, the node boots, fails to initialise the NIC, and produces &lt;code&gt;can't load firmware bnx2&lt;/code&gt; errors — everything else looks fine until you notice the node never gets an IP and never appears in Omni.&lt;/p&gt;
&lt;p&gt;Fix: generate a custom image at &lt;a class="link" href="https://factory.talos.dev" target="_blank" rel="noopener"
 &gt;factory.talos.dev&lt;/a&gt; with the &lt;code&gt;siderolabs/bnx2&lt;/code&gt; extension included, then download the PXE kernel and initramfs from the factory URL. Commands in the &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/hardware/hardware-provisioning/ipxe-opnsense/" &gt;reference note&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="step-4--first-boot"&gt;Step 4 — First boot
&lt;/h2&gt;&lt;p&gt;Go into BIOS and set the boot device to PXE. On the M3, UEFI boot with &lt;code&gt;ipxe.efi&lt;/code&gt; fails silently — the image is too large for the NIC&amp;rsquo;s PXE memory buffer. Switch to legacy/BIOS mode and use &lt;code&gt;undionly.kpxe&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;The machine takes a while to POST and boot. This is normal for old enterprise hardware. It is also why demos typically use virtual machines.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="step-5--static-ip"&gt;Step 5 — Static IP
&lt;/h2&gt;&lt;p&gt;After the BNX2 fix the node boots Talos successfully but still does not appear in Omni. The DHCP assignment for the node is not being picked up during early boot. Workaround: add a static IP via kernel params in the iPXE script:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-ipxe" data-lang="ipxe"&gt;ip=192.168.1.171::192.168.1.1:255.255.255.0::eth0:off
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Add this to the &lt;code&gt;kernel&lt;/code&gt; line in the Talos iPXE entry. The format is &lt;code&gt;ip=&amp;lt;client-ip&amp;gt;::&amp;lt;gateway&amp;gt;:&amp;lt;netmask&amp;gt;::&amp;lt;iface&amp;gt;:off&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="step-6--omni-registration"&gt;Step 6 — Omni registration
&lt;/h2&gt;&lt;p&gt;With a working NIC and an IP, the node contacts the Omni API using the join token. It appears in the Omni console as an unallocated machine. Create a cluster, assign the machine, and let Omni configure it. The initial cluster bootstrap takes a few minutes.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="step-7--fix-the-bios-boot-order"&gt;Step 7 — Fix the BIOS boot order
&lt;/h2&gt;&lt;p&gt;After the cluster is up, change the BIOS boot order so the disk is first. If PXE remains the primary boot device, every reboot drops the machine back to the iPXE menu instead of booting the installed Talos. Discovered on first reboot. Worth noting it here so you don&amp;rsquo;t make the same trip to the garage.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="upgrade"&gt;Upgrade
&lt;/h2&gt;&lt;p&gt;Omni makes single-node upgrades straightforward: open the cluster in the Omni console, select a new Talos version, apply. The node reboots once. Single-node means the cluster has downtime during the reboot; that is expected. Nothing else to do.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="result"&gt;Result
&lt;/h2&gt;&lt;p&gt;Single-node Kubernetes cluster running on ODEN, managed via Omni. &lt;code&gt;kubectl&lt;/code&gt; and &lt;code&gt;talosctl&lt;/code&gt; access via the Omni CLI. Next experiment: &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/homelab/rook-ceph/" &gt;Rook + Ceph&lt;/a&gt; for persistent storage.&lt;/p&gt;</description></item><item><title>Hardware Provisioning: PXE Booting and Tooling</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/hardware/hardware-provisioning/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/hardware/hardware-provisioning/</guid><description>&lt;p&gt;When moving beyond manual installs, managing hardware lifecycle through PXE (Preboot Execution Environment) becomes essential. A breakdown of common tools for automating the &amp;ldquo;power-on to OS ready&amp;rdquo; process.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="common-starting-points"&gt;Common starting points
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Tool&lt;/th&gt;
 &lt;th&gt;Focus&lt;/th&gt;
 &lt;th&gt;Complexity&lt;/th&gt;
 &lt;th&gt;Best for&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a class="link" href="https://cobbler.github.io/" target="_blank" rel="noopener"
 &gt;Cobbler&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;PXE/repo server&lt;/td&gt;
 &lt;td&gt;Low–Medium&lt;/td&gt;
 &lt;td&gt;Stable, static environments needing reliable kickstart or seed installs&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a class="link" href="https://theforeman.org/" target="_blank" rel="noopener"
 &gt;Foreman&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Full lifecycle mgmt&lt;/td&gt;
 &lt;td&gt;High&lt;/td&gt;
 &lt;td&gt;Single pane of glass for provisioning + ongoing config management (Puppet/Ansible)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a class="link" href="https://rebar.digital/" target="_blank" rel="noopener"
 &gt;Digital Rebar&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Infrastructure-as-Code&lt;/td&gt;
 &lt;td&gt;Medium&lt;/td&gt;
 &lt;td&gt;Modern DevOps teams wanting cloud-like speed on physical gear; evolved from Crowbar&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a class="link" href="https://wiki.openstack.org/wiki/Ironic" target="_blank" rel="noopener"
 &gt;Ironic&lt;/a&gt; / &lt;a class="link" href="https://docs.openstack.org/bifrost/latest/" target="_blank" rel="noopener"
 &gt;Bifrost&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;BMaaS / scale&lt;/td&gt;
 &lt;td&gt;High&lt;/td&gt;
 &lt;td&gt;Bare Metal as a Service at scale; Bifrost runs Ironic standalone without full OpenStack&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="broader-landscape"&gt;Broader landscape
&lt;/h2&gt;&lt;h3 id="classic-pxe--provisioning"&gt;Classic PXE / Provisioning
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Tool&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Strengths&lt;/th&gt;
 &lt;th&gt;Weaknesses&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Cobbler&lt;/td&gt;
 &lt;td&gt;PXE provisioning server&lt;/td&gt;
 &lt;td&gt;Simple, mature, easy to understand&lt;/td&gt;
 &lt;td&gt;Old architecture, static workflows&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Foreman&lt;/td&gt;
 &lt;td&gt;Lifecycle/provisioning platform&lt;/td&gt;
 &lt;td&gt;Powerful, enterprise-capable, large ecosystem&lt;/td&gt;
 &lt;td&gt;Heavy footprint, Rails monolith&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Uyuni&lt;/td&gt;
 &lt;td&gt;Systems management&lt;/td&gt;
 &lt;td&gt;Enterprise lifecycle management (SUSE/Spacewalk lineage)&lt;/td&gt;
 &lt;td&gt;Less modern provisioning architecture&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="dynamic--policy-driven"&gt;Dynamic / Policy-Driven
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Tool&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Strengths&lt;/th&gt;
 &lt;th&gt;Weaknesses&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Razor&lt;/td&gt;
 &lt;td&gt;Policy-driven provisioning&lt;/td&gt;
 &lt;td&gt;Dynamic node discovery, elegant lifecycle model&lt;/td&gt;
 &lt;td&gt;Effectively dormant&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Digital Rebar&lt;/td&gt;
 &lt;td&gt;Workflow provisioning platform&lt;/td&gt;
 &lt;td&gt;Architecturally modern and flexible&lt;/td&gt;
 &lt;td&gt;Partially commercialized&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="cloud--hyperscale-bare-metal"&gt;Cloud / Hyperscale Bare Metal
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Tool&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Strengths&lt;/th&gt;
 &lt;th&gt;Weaknesses&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Ironic&lt;/td&gt;
 &lt;td&gt;OpenStack bare-metal service&lt;/td&gt;
 &lt;td&gt;Extremely scalable, API-driven&lt;/td&gt;
 &lt;td&gt;High operational complexity&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Bifrost&lt;/td&gt;
 &lt;td&gt;Standalone Ironic deployment&lt;/td&gt;
 &lt;td&gt;Easier entry into Ironic ecosystem&lt;/td&gt;
 &lt;td&gt;Inherits Ironic complexity&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MAAS&lt;/td&gt;
 &lt;td&gt;Bare metal cloud platform&lt;/td&gt;
 &lt;td&gt;Excellent UX, API-first, machine discovery&lt;/td&gt;
 &lt;td&gt;Larger footprint, Ubuntu-centric&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="kubernetes-native--cloud-native"&gt;Kubernetes-Native / Cloud-Native
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Tool&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Strengths&lt;/th&gt;
 &lt;th&gt;Weaknesses&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Tinkerbell&lt;/td&gt;
 &lt;td&gt;Cloud-native provisioning&lt;/td&gt;
 &lt;td&gt;Modern architecture, composable workflows&lt;/td&gt;
 &lt;td&gt;Microservice complexity&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Metal3&lt;/td&gt;
 &lt;td&gt;Kubernetes operator&lt;/td&gt;
 &lt;td&gt;Native Kubernetes integration&lt;/td&gt;
 &lt;td&gt;Requires Kubernetes infrastructure&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Omni&lt;/td&gt;
 &lt;td&gt;Talos cluster orchestration&lt;/td&gt;
 &lt;td&gt;Very modern UX and lifecycle management&lt;/td&gt;
 &lt;td&gt;Talos/Kubernetes specific&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Matchbox&lt;/td&gt;
 &lt;td&gt;Minimal PXE/ignition service&lt;/td&gt;
 &lt;td&gt;Elegant, simple, iPXE-first&lt;/td&gt;
 &lt;td&gt;Narrow immutable-infra focus&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="boot-infrastructure--pxe-utilities"&gt;Boot Infrastructure / PXE Utilities
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Tool&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Strengths&lt;/th&gt;
 &lt;th&gt;Weaknesses&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;iPXE&lt;/td&gt;
 &lt;td&gt;Network boot firmware&lt;/td&gt;
 &lt;td&gt;Flexible, fast, programmable (HTTP + scripting)&lt;/td&gt;
 &lt;td&gt;Requires infrastructure around it&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;netboot.xyz&lt;/td&gt;
 &lt;td&gt;Dynamic network boot menu&lt;/td&gt;
 &lt;td&gt;Extremely useful and lightweight&lt;/td&gt;
 &lt;td&gt;Not a provisioning orchestrator&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="architectural-styles"&gt;Architectural Styles
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Style&lt;/th&gt;
 &lt;th&gt;Example Tools&lt;/th&gt;
 &lt;th&gt;Characteristics&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Static config-driven&lt;/td&gt;
 &lt;td&gt;Cobbler&lt;/td&gt;
 &lt;td&gt;Profiles + templates + PXE configs&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Policy/state-driven&lt;/td&gt;
 &lt;td&gt;Razor, Digital Rebar&lt;/td&gt;
 &lt;td&gt;Nodes discovered dynamically, assigned via policies&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Cloud resource model&lt;/td&gt;
 &lt;td&gt;Ironic, MAAS&lt;/td&gt;
 &lt;td&gt;Bare metal treated as cloud infrastructure&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Kubernetes-native&lt;/td&gt;
 &lt;td&gt;Tinkerbell, Metal3&lt;/td&gt;
 &lt;td&gt;Bare metal managed via Kubernetes APIs&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Immutable OS orchestration&lt;/td&gt;
 &lt;td&gt;Omni, Matchbox&lt;/td&gt;
 &lt;td&gt;Minimal provisioning around immutable operating systems&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="the-gap"&gt;The Gap
&lt;/h2&gt;&lt;p&gt;There is still no widely adopted FOSS solution that is simultaneously:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lightweight&lt;/li&gt;
&lt;li&gt;modern&lt;/li&gt;
&lt;li&gt;self-hostable&lt;/li&gt;
&lt;li&gt;API-first&lt;/li&gt;
&lt;li&gt;iPXE-native&lt;/li&gt;
&lt;li&gt;distro-agnostic&lt;/li&gt;
&lt;li&gt;easy to operate&lt;/li&gt;
&lt;li&gt;single-binary deployable&lt;/li&gt;
&lt;li&gt;workflow-capable&lt;/li&gt;
&lt;li&gt;not tied to Kubernetes/OpenStack&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most existing systems drift toward enterprise complexity, cloud platform assumptions, Kubernetes dependency, immutable OS specialization, or monolithic lifecycle management.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&amp;ldquo;A modern lightweight provisioning orchestrator for reproducible bare-metal infrastructure.&amp;rdquo;&lt;/p&gt;

 &lt;/blockquote&gt;</description></item></channel></rss>