Installing the Hurd from a Qemu Image

Perhaps the easiest method of installing the Hurd on real hardware is to use a GNU/Linux machine to download a qemu image (or 64 bit image), run it via qemu, update the distribution, install the packages you want, and configure your hurd to your liking, and finally flash the image directly to your SSD. Please note that as of Feb 2026, the 64 bit image uses rumpdisk by default and supports only SSDs, while the 32 bit image does not support SSDs.

Flashing a qemu hurd image to an SSD or HDD

The first step is to find your spare SSD's device name. You'll need to attach your spare SSD to your GNU/Linux machine via USB to SATA dongle. StarTech dongles are a good choice. Once you are plugged in run this command.

$ lsblk
NAME          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sda             8:0    0  74.5G  0 disk
├─sda1          8:1    0     2M  0 part
└─sda2          8:2    0  74.5G  0 part
  └─cryptroot 253:0    0  74.5G  0 crypt /gnu/store
                                         /
sdb             8:16   0 953.9G  0 disk
└─sdb4          8:20   0 953.9G  0 part

Normally /dev/sda and /dev/sdaN is GNU/Linux's SSD and /dev/sdb is your blank SSD. In the above example, Guix System is my sda and sdb is my spare SSD. To double check your spare SSD's device name, run the above command with your SATA dongle not plugged in and with it plugged in. Once you have your spare SSD's device name, flash your hurd image to it. Here's the command that worked for me:

# dd if=debian-hurd*.img of=/dev/sdb bs=1m status=progress

Note do not write /dev/sdb1. Write it as /dev/sdb. The vm image already contains the partitions.

Expand your hurd filesystem partitions.

$ lsblk | grep sdb
NAME          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sdb             8:16   0 238.5G  0 disk
├─sdb1          8:17   0   953M  0 part
├─sdb2          8:18   0     1K  0 part
└─sdb5          8:21   0     4G  0 part

Sweet! Flashing was successful! You cannot really tell here, but my Hurd partitions are sdb1 swap, sdb2 extended, sdb5 ext2. We need to expand the sdb2 and sdb5 and resize the filesystem to take up all available space. That's easily achieved via:

# parted /dev/sdb
(parted) resizepart 2 100%
(parted) resizepart 5 100%
(parted) quit
# resize2fs /dev/sdb5
$ echo new let's check out work!
$ lsblk | grep sdb
NAME          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sdb             8:16   0 238.5G  0 disk
├─sdb1          8:17   0   953M  0 part
├─sdb2          8:18   0     1K  0 part
└─sdb5          8:21   0 237.5G  0 part

It looks like our ext2 filesystem has expanded to about 240G. Now we can unplug our SATA dongle, install the SSD to the Hurd machine and boot!