This page describes the steps necessary to get Fedora for RISC-V running, either on emulated or real hardware.
Quickstart
This section assumes that you have already set up libvirt/QEMU on your machine and you're familiar with them, so it only highlights the details that are specific to RISC-V. It also assumes that you're running Fedora 40 as the host.
First of all, you need to download a disk image from http://fedora.riscv.rocks/koji/tasks?state=closed&view=flat&method=createAppliance&order=-id
As of this writing, the most recent image is Fedora-Minimal-40-20240502.n.0-sda.raw.xz
so I will be using that throughout the section. If you're using a different image, you will need to adjust things accordingly.
Once you've downloaded the image, start by uncompressing it:
$ unxz Fedora-Minimal-40-20240502.n.0-sda.raw.xz
You need to figure out the root filesystem's UUID so that you can later pass this information to the kernel. The virt-filesystems
utility, part of the guestfs-tools
package, takes care of that:
$ virt-filesystems \ -a Fedora-Minimal-40-20240502.n.0-sda.raw \ --long \ --uuid \ | grep ^btrfsvol: \ | awk '{print $7}' \ | sort -u ae525e47-51d5-4c98-8442-351d530612c3
Additionally, you need to extract the kernel and initrd from the disk image. The virt-get-kernel
tool automates this step:
$ virt-get-kernel \ -a Fedora-Minimal-40-20240502.n.0-sda.raw download: /boot/vmlinuz-6.8.7-300.4.riscv64.fc40.riscv64 -> ./vmlinuz-6.8.7-300.4.riscv64.fc40.riscv64 download: /boot/initramfs-6.8.7-300.4.riscv64.fc40.riscv64.img -> ./initramfs-6.8.7-300.4.riscv64.fc40.riscv64.img
Now move all the files to a directory that libvirt has access to:
$ sudo mv Fedora-Minimal-40-20240502.n.0-sda.raw \ vmlinuz-6.8.7-300.4.riscv64.fc40.riscv64 \ initramfs-6.8.7-300.4.riscv64.fc40.riscv64.img \ /var/lib/libvirt/images/
At this point, everything is ready and you can create the libvirt VM:
$ virt-install \ --import \ --name fedora-riscv \ --osinfo fedora40 \ --arch riscv64 \ --vcpus 4 \ --ram 4096 \ --boot uefi,kernel=/var/lib/libvirt/images/vmlinuz-6.8.7-300.4.riscv64.fc40.riscv64,initrd=/var/lib/libvirt/images/initramfs-6.8.7-300.4.riscv64.fc40.riscv64.img,cmdline='root=UUID=ae525e47-51d5-4c98-8442-351d530612c3 ro rootflags=subvol=root rhgb LANG=en_US.UTF-8 console=ttyS0 earlycon=sbi' \ --disk path=/var/lib/libvirt/images/Fedora-Minimal-40-20240502.n.0-sda.raw \ --network default \ --graphics none
Note how the UUID discovered earlier is included in the kernel command line. Quoting is also very important to get right.
You should see a bunch of output coming from edk2 (the UEFI implementation we're using), followed by the usual kernel boot messages and, eventually, a login prompt. Please be patient, as the use of emulation makes everything significantly slower. Additionally, a SELinux relabel followed by a reboot will be performed as part of the import process, which slows things down further. Subsequent boots will be a lot faster.
To shut down the VM, run poweroff
inside the guest OS. To boot it up again, use
$ virsh start fedora-riscv --console