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, while the 32 bit image does not use rumpdisk, because rumpdisk is a little memory hungry at the moment. If you wish, you can switch to rumpdisk. Please read this faq entry to learn more about maximum partition sizes.
Getting a qemu image
pre-installed available at https://cdimage.debian.org/cdimage/ports/latest/hurd-i386/debian-hurd.img.tar.gz or you may use the 64 bit image: https://cdimage.debian.org/cdimage/ports/latest/hurd-amd64/debian-hurd.img.tar.gz.
Usage:
- Install qemu-kvm via your distribution's package manager (it might just be named qemu)
- Download the image, unpack it, and run it:
$ wget https://cdimage.debian.org/cdimage/ports/latest/hurd-i386/debian-hurd.img.tar.gz
$ tar -xz < debian-hurd.img.tar.gz
$ kvm -m 1G -drive cache=writeback,file=$(echo debian-hurd-*.img) -no-reboot -net user,hostfwd=tcp:127.0.0.1:2222-:22 -net nic,model=e1000
- Log in as root (the root password is empty)
Set up a root password with
passwdupdate the system with
apt update && apt upgradeLog in as demo (the demo password is empty)
Set up a demo password with
passwdYou can also create another non-root user with
adduser <username>- and set the non-root user password with
passwd <username> and add the non-root user to the sudo group via
gpasswd -a <user> sudologout via
logout
Optionally you may use -display curses to keep your keyboard layout. If need be modprobe kvm_amd, kvm_intel and kvm to get kvm support (which is much, much faster). You may need to add your user to your machine's kvm group. The group name may differ by your distribution. Check the group name via $ ls -lha /dev/kvm.
Note that if you do not have a command named kvm, you can try something across the lines of:
$ qemu-system-i386 --enable-kvm -m 2G -drive cache=writeback,file=$(echo debian-hurd-*.img) -net user,hostfwd=tcp:127.0.0.1:2222-:22 -net nic,model=e1000
Or, if your machine does not allow for KVM acceleration, omit --enable-kvm from the command.
Please also read the README file: https://cdimage.debian.org/cdimage/ports/latest/hurd-i386/README
If you have troubles extracting the image, you can use the gz version, the zip version, or even the plain version (5GiB!)
See the discussion about writeback caching.
For more detailed instructions, please see the QEMU page.
Flashing a qemu hurd image to an SSD or HDD
Next 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 to determine your spare SSD's device name.
$ 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 connected and disconnected. 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 (please be aware of the partition size limits). 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 a supported Hurd machine and boot! Our x page gives some good window manager recommendations!
