Skip to content

Instantly share code, notes, and snippets.

@xypron
Created March 24, 2026 14:33
Show Gist options
  • Select an option

  • Save xypron/74c573420ebb068149f22601023f9366 to your computer and use it in GitHub Desktop.

Select an option

Save xypron/74c573420ebb068149f22601023f9366 to your computer and use it in GitHub Desktop.

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment