UEFI HTTP boot issues

Has anyone of you guys had success with net booting using “new” uefi http boot standard?

tl;dr Uefi has had option to boot from http servers. It is supposed to replace slow tftp pxe booting mechanism.

Here are some examples if you’re interested in the subject.
https://github.com/tianocore/tianocore.github.io/wiki/HTTP-Boot
https://lenovopress.lenovo.com/lp0736.pdf

I’ve seen it on many recent motherboard I’ve used but never managed to get it working. I’ve picked up this subject and gave up multiple times :confused:

I have working pxe uefi boot for 2 machines. Intel nuc and asrock pc. Both of these machines claim to support uefi http boot but I cannot get them to boot via http.

I’m running isc kea dhcp4 server and offers it provides to my machines look ok but UEFI doesn’t even try to download file from provided url.
example from wireshark
20250107_11h18m51s_grim

http server with syslinux.efi works but nothing is trying to download it according to nginx log.
Removing next-server from kea config or keeping it doesn’t change the outcome.
Using IP or domain in boot file url doesn’t change the outcome.

I have it, at least part of it.

DHCP option 60 was broken. Once I’ve fixed it netbooting machine started downloading files from http server.

If anyone is interested. Here is working config for kea 2.4.0
works for both pxe x64 UEFI and x64 uefi boot from http
(architecture options come from here)

		"client-classes": [
			{
			"name": "UEFI-64-http-0",
			"test": "substring(option[60].hex,0,21) == 'HTTPClient:Arch:00016'",
			"boot-file-name": "http://10.0.0.1/syslinux.efi",
			"option-data": [
					{
						"space": "dhcp4",
						"name": "vendor-class-identifier",
						"code": 60,
						"data": "HTTPClient"
					}
				],
			},
			{
			"name": "UEFI-64-http-1",
			"test": "substring(option[60].hex,0,10) == 'HTTPClient'",
			"boot-file-name": "http://10.0.0.1/syslinux.efi-test"
			},
			{
			"name": "UEFI-64-1",
			"test": "substring(option[60].hex,0,20) == 'PXEClient:Arch:00007'",
			"boot-file-name": "syslinux.efi"
			},
			{
			"name": "Legacy",
			"test": "substring(option[60].hex,0,20) == 'PXEClient:Arch:00000'",
			"boot-file-name": "pxelinux.0"
			}
		]

But I still get my PC booted this way.
syslinux.efi doesn’t even load it’s config files.
It downloads /syslinux.efi from http server, screen flashes and my pc exits to boot selection menu.

Grub also doesn’t disappoint. It doesn’t work.
It doesn’t load it’s modules or config from http and drops to grub rescue.
I’ve found people on mailing list discussing similar issues but noone mentioned the solution.
Manually creating grub image allows you to set grub prefix location and help
example:

grub-mkimage --directory '/usr/lib/grub/x86_64-efi' --prefix '(http,x.x.x.x)/boot/grub' --output '/var/www/files/boot/grub/x86_64-efi/core.efi' --format 'x86_64-efi' --compression 'auto' 'http' 'tftp' 'efinet'

But in my case grub has no IP network interfaces can cannot configure them with net_bootp command.

iPXE load as you would expect but since I don’t have config for it nothing happens. Maybe I’ll to switch to it if won’t be able to get syslinux to work.

Other potential solution to this bootloader mess would be to build bootable UKI and load them directly from http. :thinking: