Create a x86 VM with multipass
multipass launch \
-n jammy 22.04 \
--cpus 4 \
--disk 16G \
--memory 16G
multipass shell jammy
Install backported packages
sudo apt-add-repository ppa:canonical-openstack/nova-riscv64
sudo apt-get install \
qemu-system-misc=1:10.1.0+ds-5ubuntu1~22.04.3 \
libvirt-daemon=11.4.0-1ubuntu1~22.04.1.exp2 \
libvirt-daemon-config-network=11.4.0-1ubuntu1~22.04.1.exp2 \
libvirt-daemon-driver-qemu=11.4.0-1ubuntu1~22.04.1.exp2 \
qemu-efi-riscv64=2025.02-8~22.04.0~ppa3
sudo reboot
multipass shell jammy
Test QEMU and EDK II
cp /usr/share/qemu-efi-riscv64/RISCV_VIRT_VARS.fd .
qemu-system-riscv64 \
-cpu rva23s64 \
-machine virt,acpi=off -m 4G -smp cpus=2 \
-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,readonly=off \
-netdev user,id=net0 \
-device virtio-net-device,netdev=net0 \
-device virtio-rng-pci
# Use <ESC>, <ESC> to enter menu
# End QEMU with <CTRL><a>, <x>
Create a virtual machine definition file
cat > riscv64.xml << EOF
<?xml version="1.0"?>
<domain type="qemu">
<name>ubuntu26.04-riscv64</name>
<uuid>1a35d812-d84c-42c3-a21d-6c67a6c5db06</uuid>
<memory unit="GiB">4</memory>
<vcpu placement="static">2</vcpu>
<cpu match='exact'>
<model>max</model>
<topology sockets='1' cores='2' threads='1' />
</cpu>
<os firmware='efi'>
<type arch='riscv64' machine='virt'>hvm</type>
<firmware>
<feature enabled='no' name='enrolled-keys'/>
<feature enabled='no' name='secure-boot'/>
</firmware>
<loader readonly='yes' type='pflash' format='raw'>/usr/share/qemu-efi-riscv64/RISCV_VIRT_CODE.fd</loader>
<nvram template='/usr/share/qemu-efi-riscv64/RISCV_VIRT_VARS.fd' templateFormat='raw' format='raw'>/home/ubuntu/RISCV_VIRT_VARS.fd</nvram>
</os>
<devices>
<emulator>/usr/bin/qemu-system-riscv64</emulator>
<rng model='virtio'>
<backend model='builtin'/>
</rng>
<disk type="file" device="disk" cache="none">
<driver name="qemu" type="raw"/>
<source file="/home/ubuntu/resolute-preinstalled-server-riscv64.img"/>
<target dev="vda" />
<boot order='1' />
</disk>
<interface type='bridge'>
<mac address='52:54:00:a0:a3:1a'/>
<source bridge='virbr0'/>
<model type='virtio'/>
</interface>
<console type="pty">
<target type="serial" port="0"/>
</console>
</devices>
</domain>
EOF
Create a virtual machine and launch it with libvirt
wget https://cdimage.ubuntu.com/ubuntu-server/daily-preinstalled/current/resolute-preinstalled-server-riscv64.img.xz
xz -d resolute-preinstalled-server-riscv64.img.xz
sudo mkdir -p /etc/qemu
echo allow virbr0 | sudo tee /etc/qemu/bridge.conf
sudo chmod u+s /usr/lib/qemu/qemu-bridge-helper
virsh --connect=qemu:///session create riscv64.xml
virsh --connect=qemu:///session console ubuntu26.04-riscv64