Recently, I investigated the status of the RISC-V netboot tarballs. Those were initially composed of only an initrd and a kernel image. They now ship with a bootloader and menu as well (grub), which makes them bootable, at least under QEMU. This post explores how to use them.
The first available tarball is the daily build from December 15, 2025 of Ubuntu Resolute Raccoon development preview.
netboot
Network booting, or netboot, is the process of booting a computer from the network rather than a local drive.
– Wikipedia (https://en.wikipedia.org/wiki/Network_booting)
Netboot is the process of booting over the network, and it has very little to do with a network install image, which would be a classic ISO image loaded on a local drive that would pull files to install from the network.
Netboot can be interesting for multiple reasons, mostly for server administrators or large computer farms, as it allows all of them to boot automatically on the same environment.
The main standard used for netboot is PXE, Preboot eXecution Environment.
PXE boot […] is a specification describing a standardized client–server environment that
boots a software assembly, retrieved from a network, on PXE-enabled clients. On the
client side it requires only a PXE-capable network interface controller (NIC), and uses a
small set of industry-standard network protocols such as Dynamic Host Configuration
Protocol (DHCP) and Trivial File Transfer Protocol (TFTP).– Wikipedia (https://en.wikipedia.org/wiki/Preboot_Execution_Environment)
Given the protocols used, to setup PXE, you need control over the network DHCP server, which is not always the case with regular home routers. A network administrator can use specific DHCP options to point the client to the TFTP server containing the files to boot. Then, the client PXE implementation connects to the network, sends a DHCP request, and gets an IP address, as well as the address of that TFTP server and the files to download.
PXE is typically implemented in a system’s boot firmware by the hardware’s manufacturer. It is mainly interesting for that reason, as it allows booting without any other software/disk. However, it is not secure, and it can only be used on a controlled and isolated network. There are more modern methods to boot over secure network protocols, but those are typically not yet implemented by hardware manufacturers.
Test setup, netbooting locally
It would be painful to have to set up a DHCP server manually every time you want to test network booting. Fortunately, QEMU has integrated options for network boot. We will use them to test the newly added support in the resolute RISC-V netboot tarballs.
I will use the Install Ubuntu on QEMU (RISC-V) documentation as a reference here.
First, I installed the prerequisites (packages qemu-system-riscv64, opensbi and qemu-efi-riscv64).
Afterwards, instead of downloading a preinstalled image, I download the latest netboot tarball cdimage.ubuntu.com/ubuntu-server/daily-live/20251215/resolute-netboot-riscv64.tar.gz, and extract it into a tftp/ directory:
curl -L -O https://cdimage.ubuntu.com/ubuntu-server/daily-live/20251215/resolute-netboot-riscv64.tar.gz
tar xf resolute-netboot-riscv64.tar.gz
Finally, I can copy the command to run via EDK II, with the following changes:
-
I remove the
-drive file=ubuntu-*-preinstalled-server-riscv64.imgpart, as we don’t want a local drive. -
I add the required options next to
-netdev user,id=net0: tftp=./tftp/riscv64,bootfile=/grubriscv64.efi. This makes QEMU serve thetftp/riscv64/directory over TFTP, as well as advertising that server and the bootfile over DHCP, according to the PXE standard.
The final command should look like:
cp /usr/share/qemu-efi-riscv64/RISCV_VIRT_VARS.fd .
qemu-system-riscv64 \
-cpu rva23s64 \
-machine virt -m 8G -smp cpus=4 \
-nographic \
-drive if=pflash,format=raw,unit=0,file=/usr/share/qemu-efi-riscv64/RISCV_VIRT_CODE.fd,readonly=on \
-drive if=pflash,format=raw,unit=1,file=RISCV_VIRT_VARS.fd \
-netdev user,id=net0,tftp=./tftp/riscv64,bootfile=/grubriscv64.efi \
-device virtio-net-device,netdev=net0 \
-device virtio-rng-pci
Now we can network-boot! The same adaptation can be used for the “Booting with U-Boot” command.
After running that command and waiting a bit, we see:
RISC-V EDK2 firmware version 2025.02-8ubuntu3
Press ESCAPE within 5 seconds for boot options
>>Start PXE over IPv4.
Waiting a bit more leads to:
Selecting that option leads to booting the kernel, which downloads the Ubuntu Server installer ISO and launches the server installer.
