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 ALT images for riscv64 include a VNC server that provides access to initial 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.
QEMU 6.0+
QEMU 6.0 virtual machines with kernel 5.14+ have graphics (virtuo-gpu) and input (virtio-keyboard and virtio-tablet) working using U-boot boot loader.
Here are the steps run images in QEMU:
Step 0: Install QEMU with riscv64 support to run the ALT port on RISC-V. If your host system is running ALT x86_64, you need qemu-system-riscv-core package:
apt-get install qemu-system-riscv-core qemu-device-display-virtio-gpu-gl qemu-ui-sdl seavgabios
Step 1: Download the recent version of u-boot-qemu
for riscv64. You can use the link to the package on the official website of the Sisyphus repository. Or find the package directly in the repository.
Extract /usr/share/u-boot/qemu-riscv64_smode/u-boot.bin file from the downloaded package. For example:
rpm2cpio u-boot-qemu-*.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 on QEMU via the following commands. Give directions in IMAGE to image and in UBOOT to u-boot that you got in step 1:
$ IMAGE=/path/to/<image>
$ UBOOT=/path/to/u-boot.bin
$ 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-keyboard -device virtio-tablet \
-device virtio-vga-gl,xres=1280,yres=800 -display sdl,gl=on
If you need to access the virtual machine via vnc, replace -device virtio-vga-gl and -display sdl options with "-device virtio-vga -vnc :1" and connect to 5901 port (5900 port is taken for the network forwarding):
$ vncviewer localhost:5901
OpenSBI
To run riscv64 virtual machine on older (pre-6.0) QEMU, you need OpenSBI (firmware) binary.
Download the recent version of opensbi
.
You can use the link to the package on the official website of the Sisyphus repository. Or find the package directly in the repository.
Extract /usr/share/opensbi/generic/firmware/fw_jump.elf file from the downloaded package. For example:
rpm2cpio opensbi-*.rpm | cpio -vi --to-stdout './usr/share/opensbi/generic/firmware/fw_jump.elf' > fw_jump.elf
Now you can start a virtual machine on QEMU via the following commands. Give directions in IMAGE to image, in UBOOT to u-boot, that you got in step 1, and in FIRM to fw_jump.elf.
$ IMAGE=/path/to/<image>
$ UBOOT=/path/to/u-boot.bin
$ FIRM=/path/to/fw_jump.elf
$ qemu-system-riscv64 \
-nographic -machine virt \
-bios "$FIRM" \
-kernel "$UBOOT" \
-m 2G -smp cpus=4 \
-drive file=$IMAGE,id=hd0,format=raw -device virtio-blk-device,drive=hd0 \
-netdev user,id=eth0,hostfwd=tcp::5900-:5900 -device virtio-net-device,netdev=eth0
If you need a graphical interface, run the VNC server in the image, for example, as described in Regular/riscv64#VNC.
Connect to VNC, for example:
vncviewer localhost