1. UEFI PXE HTTP Boot With iPXE or How to Circumvent TFTP

    Sat 05 September 2026

    Purpose of this blogpost

    I'm documenting how I setup my PXE server for myself and maybe somebody else may also find it useful. It's mostly focussed on diminishing the role of the TFTP server as much as possible as TFTP is very slow.

    My goal is to PXE HTTP boot Debian installations on both virtual machines or physical machines.

    It should also be possible to fully automatically provision a machine through PXE targeted to a specific machine.

    I'm also moving away from BIOS boot and try to configure all hardware using UEFI.

    Why TFTP is a problem

    TFTP is extremely slow. I've never been able to get an individual client to load a file over TFTP faster than maybe 3 MB/s.

    So the trick is to use TFTP only to load the iPXE boot loader and use the HTTP boot support of iPXE to load all subsequent data / files, wich will achieve much higher download speeds.

    Please note that modern UEFI-based server hardware does support HTTP boot natively and since I don't have such hardware, I can't cover that in this blogpost, but not all computers supporting UEFI, support UEFI HTTP boot and this blogpost is relevant for those systems.

    PXE TFTP + HTTP Boot Sequence

    To understand the entire boot process, let's take a look at the entire end-to-end process.

    1. PXE DHCP: the client boots and requests an IP address and reads the TFTP server from the DHCP server response
    2. PXE TFTP: the client gets the iPXE PXE boot loader over TFTP (ipxe.efi)
    3. iPXE DHCP: the client boots the iPXE boot loader and gets a DHCP address
    4. iPXE HTTP: the iPXE client loads its configuration from a HTTP server
    5. IPXE HTTP: the iPXE client loads the Linux kernal for unattended install
    6. Debian Linux reads the preseed file over HTTP for unattended install.

    So to summarise: we use the native UEFI (non-HTTP) PXE client to only bootstrap the iPXE (HTTP) PXE client that can load the rest of the files over HTTP.

    KEA DHCP server

    Since the ISC dhcp server that came standard with Debian Linux is end-of-life, we have to switch over to the KEA DHCP server.

    DHCP pool with next-server configuration

    This is the KEA DHCP pool configuration, which allows static IP address reservations outside the defined scope of the configured DHCP IP pool.

    In this example the TFTP server is the next-server 10.10.10.1 configured here.

    "next-server": "10.10.10.1",
            "pools": [
              {
                "option-data": [
                  {
                    "name": "broadcast-address",
                    "data": "10.10.10.255"
                  }
                ],
                "pool": "10.10.10.150 - 10.10.10.199"
              }
            ],
            "reservations-in-subnet": true,
            "reservations-out-of-pool": true,
            "reservations": [
              {
                "hostname": "example-server",
                "hw-address": "de:ad:be:ef:de:ad",
                "ip-address": "10.10.10.40",
                "boot-file-name": "pxelinux.0",
                "next-server": "10.10.10.1"
              },
              {
                "hostname": "kvm01",
                "hw-address": "aa:bb:cc3:dd:ee:ff",
                "ip-address": "10.10.10.51"
              },
    

    KEA TFTP server configuration

    These sections are there to push BIOS, UEFI and iPXE clients to different boot files.

    "client-classes": [
          {
            "name": "XClient_iPXE",
            "test": "substring(option[77].hex,0,4) == 'iPXE'",
            "boot-file-name": "http://10.10.10.1/init.ipxe"
          },
          {
            "name": "UEFI-64-1",
            "test": "substring(option[60].hex,0,20) == 'PXEClient:Arch:00007'",
            "boot-file-name": "ipxe.efi"
          },
          {
            "name": "BIOS-64-1",
            "test": "substring(option[60].hex,0,20) == 'PXEClient:Arch:00000'",
            "boot-file-name": "ipxe.pxe"
          }
    

    Notice how we can specify a boot-file-name pointing to a HTTP-based resource for the iPXE boot client.

    TFTP setup

    TFTP configuration

    The file /etc/default/tftpd-hpa contains:

    TFTP_USERNAME="tftp"
    TFTP_DIRECTORY="/srv/tftp"
    TFTP_ADDRESS=":69"
    TFTP_OPTIONS="--secure -R 30000:30100 --blocksize 1468"
    

    iPXE setup

    iPXE download software

    Download the Network boot server files from this location

    Example URL: https://github.com/ipxe/ipxe/releases/download/v2.0.0/ipxeboot.tar.gz

    Extract the ipxe.efi file from the archive and put it in /srv/tftp

    Understanding the iPXE boot script process

    • I want to provide a basic boot menu where I can select the operating system and configuration I want to install.

    • For some hosts, don't want to select the OS manually, but automatically install an OS when PXE boot is initiated.

    So the process looks like this:

    1. Load the init.ipxe boot script
    2. The init.ipxe script loads the host-specific ipxe boot script if it exists for unattended OS install
    3. Otherwise the manual OS menu is booted

    iPXE initial boot script

    This first ipxe script is loaded and checks if a boot script for this particular host exists in the boot directory. The name of the host is defined by DHCP in the static DHCP entry where the hostname is set.

    #!ipxe
    
    set boot-dir boot/
    isset ${hostname} && chain --replace --autofree ${boot-dir}hostname-${hostname}.ipxe ||
    chain --autofree uefi-boot-menu.ipxe
    

    iPXE boot script for individual host

    A host-specific boot script can look like this:

    #!ipxe
    
    set pxe-server http://10.10.10.1
    set base-url ${pxe-server}
    
    set debian-installer ${base-url}/debian-installer/amd64
    kernel ${debian-installer}/linux
    initrd ${debian-installer}/initrd.gz
    imgargs linux auto=true priority=critical interface=eno1 url=http://10.10.10.1/preseed/preseed-debian-uefi-kvm.cfg elevator=noop -- quiet
    boot
    

    Notice how the kernel arguments specify a Debian preseed file.

    Main iPXE manual boot menu

    This iPXE script uefi-boot-menu.ipxe creates a simple syslinux-style boot menu where you can manually select which OS configuration to install.

    This file is loaded if no host-specific boot script is found.

    #!ipxe
    
    # Basic setup
    set menu-timeout 0
    set submenu-timeout ${menu-timeout}
    isset ${menu-default} || set menu-default Debian Installer
    
    set pxe-server http://10.10.10.1
    set base-url ${pxe-server}
    
    ###################### MAIN MENU ####################################
    :start
    menu iPXE Boot Menu 
    item --gap --             ------------------------- Operating Systems ----------------------------
    item --key d menu-debian Debian Installer
    item --gap --             ------------------------- PXE options -------------------------------
    item --key c config       Configure settings
    item shell                Drop to iPXE shell
    item reboot               Reboot computer
    item --key x exit         Exit iPXE and continue BIOS boot
    choose --timeout ${menu-timeout} --default ${menu-default} selected || goto cancel
    set menu-timeout 0
    goto ${selected}
    
    :cancel
    echo You cancelled the menu, dropping you to a shell
    
    :shell
    echo Type 'exit' to get the back to the menu
    shell
    set menu-timeout 0
    set submenu-timeout 0
    goto start
    
    :failed
    echo Booting failed, dropping to shell
    goto shell
    
    :reboot
    reboot
    
    :exit
    exit
    
    :config
    config
    goto start
    
    :back
    set submenu-timeout 0
    clear submenu-default
    goto start
    
    
    ###################### Debian MENU ################################
    
    :menu-debian
    menu Debian Installer
    item debian-manual Debian 13 (Trixie) Manual install 
    item debian-unattended-tmm Debian 13 (Trixie) Unattended install UEFI (ELITE DESK)
    item debian-unattended-tmm-kvm Debian 13 (Trixie) Unattended install UEFI KVM SERVER (ELITE DESK)
    item debian-unattended-bios Debian 13 (Trixie) Unattended install BIOS
    item --key 0x08 back Back to top menu...
    choose selected && goto ${selected} || goto start
    
    :debian-manual
    set debian-installer ${base-url}/debian-installer/amd64
    kernel ${debian-installer}/linux
    initrd ${debian-installer}/initrd.gz
    boot || goto failed
    goto start
    
    :debian-unattended
    set debian-installer ${base-url}/debian-installer/amd64
    kernel ${debian-installer}/linux
    initrd ${debian-installer}/initrd.gz
    imgargs linux auto=true priority=critical interface=eno1 url=http://10.10.10.1/preseed/preseed-debian-uefi.cfg elevator=noop -- quiet
    boot || goto failed
    goto start
    
    :debian-unattended-bios
    set debian-installer ${base-url}/debian-installer/amd64
    kernel ${debian-installer}/linux
    initrd ${debian-installer}/initrd.gz
    imgargs linux auto=true priority=critical interface=eno1 url=http://10.10.10.1/preseed/preseed-debian.cfg elevator=noop -- quiet
    boot || goto failed
    goto start
    
    If you have any comments email me, see the About page for contact details.
  2. I Think You Might Be Fooling Yourself With AI

    Thu 23 July 2026

    If you are enthusiastic about AI (LLMs), you may be fooling yourself. Do not consider this an insult, but a kind-hearted warning.

    Remember what Richard Feynman said:

    The first principle is that you must not fool yourself
    and you are the easiest person to fool.
    

    source (backup)

    He made this statement as part of the Caltech's 1974 commencement address. In this speech he strongly advocated for proper scientific integrity.

    I feel it can be difficult to maintain proper 'scientific integrity' on a personal level as AI is a fast-moving target. The tools feel unreasonably capable, using an LLM makes you feel more productive when writing code for instance.

    Yet as of today, there is no independent scientific evidence1 (that I'm aware of) that people or organizations are indeed more productive2 when using AI.

    Are you really more 'productive'?

    Meanwhile, a study (late 2025) seems to report that although participating developers felt they completed tasks faster using AI, they where around 19% slower.

    Using AI may feel faster and more productive, but you might be fooling yourself. You can never go back in time and measure yourself doing the task without using AI tools and compare the results.

    There is a reason why (scientific) experiments are often blind or double-blind. We want prevent personal bias from influencing the outcomes skewing the results and making us believe things that aren't true. Not so easy to do on your own.

    This is why I'm not really swayed by personal testimonies and anecdotes about how AI makes people more productive. How they vibe coded some app they would otherwise not have built3.

    Do not be fooled by the mass layoffs 'due to AI' proving that AI is making people more productive. Sam Altman himself called many of these layoffs 'AI washing'. These are regular layoffs after a period of over-hiring and now the market corrects itself. Because aside from AI-related businesses, it seems that the economy isn't doing great.

    Furthermore, some of these layoffs seem to be specifically to free up money to buy AI resources. Management by fear of being left behind. Firing people to get money to pay for unproven technology that may never be capable to replace the people being fired.

    AI is unsustainable

    Even if you still think AI is really making you more 'productive', enjoy it while it lasts.

    According to this article ChatGPT starts losing money when you use your $200 subscription abouve 11%. If you'd use the full 100%, that same $200 subscription would allow you to use $14,000 worth in API pricing. That seems crazy to me.

    Whatever you think your productivity might be due to AI, I don't think it's worth the 'real' cost once the vendors stop heavily subsidizing AI usage. I really wonder how much usage AI would see if it would be just priced at cost. Would you feel as productive if the price would not be $200 but $2000 a month4? A $200 subscription is not that big of a gamble, but any higher and it may feel less and less worth it.

    Disclosure: my own bias against AI

    Now it's time to be really open about my own bias. I'm an AI sceptic. I'm quite influenced by Ed Zitron's reporting. And I'm also standing by my own idea that AI will run out of money and just be turned off due to the huge operational cost.

    It might feel unfathomable, unreasonable that this can happen. Maybe Google, AWS or Microsoft scoops up OpenAI or Antropic when they reach the end of the runway. But the economics won't change. Are they going to subsidize AI indefinitely?, to what end?

    I'm open to suggestions how this is going to play out. Close to a trillion dollars invested in AI. Where will the money come from to recuperate all these investments? If we disregard the AI (adjacent) companies, the USA economy seems to look bleak (August 2025).

    I myself can't just close my eyes for all the externalities of AI. The energy usage in the context of climate change. The data centers disrupting poor communities. The large-scale theft of intellectual or copyrighted property. The enshitification and the enslopification of the internet. The mass hoarding of memory causing inflation.

    I'm not convinced the bad of AI is - or can be - compensated by the perceived good AI does. It's not possible to separate the tool itself from it's externalities. This is why I'm not using AI. I'm not using AI on moral, ethical grounds.


    Hacker News discussion: here

    Post Script

    I found the comments on hacker news quite revealing. Most are very dismissive without engaging at all with the actual point of this article.

    It is true that the cited Metr study was followed up with a more recent study from 2026 that showed more productivity when using AI. The authors are also pointing out they paid way less and they had a problem where developers didn't want to code without AI.

    What was actually interesting about the initial study is the discrepancy between what developers thought and what they measured in terms of productivity. They were measurably fooling themselves.

    Furthermore, it seems that people are quick to respond and not actually read and comprehend what I wrote. There are two key points I'm making:

    1. Your perception of productivity may be off / you may be fooling yourself
    2. In addition, I question and you may fool yourself thinking that the AI tool is worth the unsubsidized cost in relation to the perceived productivity gain.

    At least I will try to be more explicit in my writing to get this point across.

    I must say I'm amazed at how fast people dismiss this blog post and make claims about AI productivity, without anyone providing anything else but personal anekdotes.


    1. This may be due to my confirmation bias that I was unable to find any. 

    2. Whatever productive really means in this context. 

    3. how much value it delivers or how much revenue it creates is often not discussed. And don't fall for suvivorship bias

    4. Or would you get stressed out and feel pressure to use the AI more to justify the expense and burn out? 

    If you have any comments email me, see the About page for contact details.

Page 1 / 116