Site logo
Stories around the Genode Operating System RSS feed
Christian Helmuth avatar

Getting Fujitsu U7411 up and running: Network Boot


Earlier this year, the Genode team met the challenge to bring our OS to recent Intel Gen11 hardware, more precisely we faced the task to fully enable the Fujitsu LIFEBOOK U7411. But first things first: How to prepare the notebook for remote booting without sufficient legacy BIOS support?

As described in the article, the standard x86 development setup is a lubricated combination of integrated PXE network boot via Pulsar and Intel ME/AMT. While the latter appeared to work reasonably well on the U7411, PXE boot was not an option as the BIOS manifested as UEFI-only, which left me at a loss what to do. Also, my initial desperate (and quite inexperienced) experiments to replace Pulsar by iPXE failed gloriously for several reasons (as I learned later).

Next, I had the idea to replace Pulsar by Grub2 with an integrated efinet driver as we already use Grub to boot our ISO and disk images and it could be quite cool to reduce the Zoo of tools required. The work let to a series of acceptable developments in Github issue #4429 but I believe that Grub efinet is a blind end for the following reasons. First, it takes ages for the U7411 UEFI to initialize networking, which is a time lost during each build-test cycle. Further, it seems almost impossible to identify the right time frame to connect to AMT Serial-over-LAN - either the connection just gets stuck when trying too early or the boot already entered the next stage when connecting too late. In both cases, valuable boot messages are lost especially while debugging the early stages like Bender or NOVA. Finally, all attempts to alleviate the negative effects did not lead to robust behavior.

Eventually, I directed my attention back to iPXE, gathered available experiences with this boot option from the community, and developed a reliable solution that works delightfully not only on U7411 but also on older and more recent devices too. As a bonus the network transport protocol can be switched from TFTP to HTTP, which decreases boot times with large images significantly. In the following I describe the required steps to switch to iPXE network boot.

Prepare iPXE boot image

The sources for iPXE can be cloned from the upstream Git repository.

 git clone https://github.com/ipxe/ipxe.git

Next, edit an embedded boot script to configure the boot loader and, thus, bypass any network/PXE configuration of the local network. The script genode.ipxe should contain the following commands for a development machine with IP address 10.0.2.55.

 #!ipxe

 dhcp || goto failed
 chain http://10.0.2.55:2209/boot.cfg || goto failed

 :failed
 echo Booting failed, dropping to shell
 shell

You may replace ipxe/boot.cfg in the URL by ipxe-${mac:hexhyp}/boot.cfg to distinguish multiple test machines booting from the same host. ${mac:hexhyp} is then replaced on boot by the MAC address of the NIC, e.g., 02-00-00-00-00-01. The boot-loader image can now be built in <ipxe.git>/src and written to a USB thumb drive /dev/sdb like follows.

 make bin-x86_64-efi/ipxe.usb EMBED=genode.ipxe
 sudo dd if=bin-x86_64-efi/ipxe.usb of=/dev/sdb bs=8M conv=fsync

I decided to boot the test target from a USB thumb drive to skip UEFI network initialization but it's also possible to chainload an iPXE image generated by the following command.

 make bin-x86_64-efi/ipxe.efi EMBED=genode.ipxe

Preparing first boot

You may have noticed that the boot script shamelessly expects an HTTP server listening on your development machine's port 2209. This requirement can easily be fulfilled by installing the lighttpd package of your Linux distribution. Don't bother with global configuration or automatic startup of lighttpd, this task is solved by the following Genode RUN_OPT declarations in etc/build.conf of your Genode build directory on each test cycle.

 RUN_OPT += --include load/ipxe
 RUN_OPT +=   --load-ipxe-base-dir /tftpboot
 RUN_OPT +=   --load-ipxe-boot-dir /ipxe
 RUN_OPT +=   --load-ipxe-lighttpd
 RUN_OPT +=   --load-ipxe-lighttpd-port 2209

Additionally, instruct the run tool to generate UEFI images.

 RUN_OPT += --include image/uefi

Run it

In case you're running Sculpt OS on your development machine, you need to configure the NIC router to forward port 2209 to your development VM.

 <domain name="uplink">
  <tcp-forward port="2209" domain="default" to="10.0.2.2"/>
 </domain>

Any Genode run script can now be tested on the test machine as usual. I did that for the U7411, which gave me quite some insights and surprises, but that's for another story.