Ports/riscv64/QEMU
This page describes how to start riscv64 virtual machine via QEMU.
QEMU, starting with version 6.0, includes OpenSBI firmware. For older QEMU versions, there are instructions how to obtain and use the firmware in #OpenSBI section below.
Some older ALT images for QEMU include a VNC server that provides access to graphical system setup and graphical desktop (see Regular/riscv64#VNC for more details). To access that server, it's convenient to forward port 5900 from the virtual machine to the host machine. The parameters necessary for that are included into QEMU command lines below.
ALT Images
Currently, we recommend Regular builds (see also: Regular).
Quickstart for QEMU 6.0+
QEMU 6.0 virtual machines with kernel 5.14+ have graphics (virtuo-gpu) and input (virtio-keyboard and virtio-mouse) working.
Here are the steps to start a riscv64 virtual machine:
Step 0: Install QEMU with riscv64 support. If your host system is running ALT, you need qemu-system-riscv-core package:
apt-get install qemu-system-riscv-core
On Ubuntu, riscv64 emulation is part of qemu-system-misc.
Step 1: Download the recent version of u-boot-qemu for riscv64. You can use the riscv64 link from https://packages.altlinux.org/ru/sisyphus/srpms/u-boot-qemu/rpms.
From the downloaded package, extract /usr/share/u-boot/qemu-riscv64_smode/u-boot.bin. For example:
rpm2cpio u-boot-qemu-*riscv64.rpm | cpio -vi --to-stdout './usr/share/u-boot/qemu-riscv64_smode/u-boot.bin' > u-boot.bin
Step 2: Now you can start a virtual machine via the following commands:
$ IMAGE=<path to riscv64 image in img or qcow2 format>
$ UBOOT=<path to u-boot.bin from step 1>
$ qemu-system-riscv64 \
-nographic -m 2G -machine virt -kernel "$UBOOT" \
-smp cpus=4 \
-drive file=$IMAGE,id=hd0 -device virtio-blk-device,drive=hd0 \
-netdev user,id=eth0,hostfwd=tcp::5900-:5900 -device virtio-net-device,netdev=eth0 \
-device virtio-gpu,xres=1280,yres=800 -device virtio-keyboard -device virtio-tablet -sdl
OpenSBI
To run riscv64 virtual machine on older (pre-6.0) QEMU, you need OpenSBI (firmware) binary.
Option #1 There is an OpenSBI firmware binary inside the qcow2/qcow2c image. You can copy it out of the image:
root# modprobe nbd
root# qemu-nbd -c /dev/nbd0 qemu-riscv64.qcow2c
root# mount /dev/nbd0p1 /mnt
root# cp -v /mnt/usr/share/opensbi/generic/firmware/fw_payload.elf .
user$ FIRM=./fw_payload.elf
Option #2 Download and install the latest version of OpenSBI package opensbi-firmware-generic
.
The OpenSBI firmware will be at /usr/share/opensbi/generic/firmware/fw_payload.elf.
For example:
user$ curl -O http://ftp.altlinux.org/pub/distributions/ALTLinux/ports/riscv64/Sisyphus/noarch/RPMS.classic/opensbi-firmware-generic-0.9-alt1.noarch.rpm
root# rpm -i opensbi-firmware-generic-0.9-alt1.noarch.rpm
user$ FIRM=/usr/share/opensbi/generic/firmware/fw_payload.elf
$ QCOW=qemu-riscv64.qcow2c
$ qemu-system-riscv64 \
-nographic -machine virt -kernel "$FIRM" \
-m 2G -smp cpus=4 \
-drive file="$QCOW",id=hd0 -device virtio-blk-device,drive=hd0 \
-netdev user,id=eth0,hostfwd=tcp::5900-:5900 -device virtio-net-device,netdev=eth0