(DIR) <- Back # Setup an OpenBSD RISCV64 VM in QEMU Last modification on 2021-10-26 This describes how to setup an OpenBSD RISCV64 VM in QEMU. The shellscript below does the following: * Set up the disk image (raw format). * Patch the disk image with the OpenBSD miniroot file for the installation. * Downloads the opensbi and u-boot firmware files for qemu. * Run the VM with the supported settings. The script is tested on the host GNU/Void Linux and OpenBSD-current. **IMPORTANT!: The signature and checksum for the miniroot, u-boot and opensbi files are not verified. If the host is OpenBSD make sure to instead install the packages (pkg_add u-boot-riscv64 opensbi) and adjust the firmware path for the qemu -bios and -kernel options. ** ## Shellscript #!/bin/sh # mirror list: https://www.openbsd.org/ftp.html mirror="https://ftp.bit.nl/pub/OpenBSD/" release="7.0" minirootname="miniroot70.img" miniroot() { test -f "${minirootname}" && return # download once url="${mirror}/${release}/riscv64/${minirootname}" curl -o "${minirootname}" "${url}" } createrootdisk() { test -f disk.raw && return # create once qemu-img create disk.raw 10G # create 10 GB disk dd conv=notrunc if=${minirootname} of=disk.raw # write miniroot to disk } opensbi() { f="opensbi.tgz" test -f "${f}" && return # download and extract once. url="${mirror}/${release}/packages/amd64/opensbi-0.9p0.tgz" curl -o "${f}" "${url}" tar -xzf "${f}" share/opensbi/generic/fw_jump.bin } uboot() { f="uboot.tgz" test -f "${f}" && return # download and extract once. url="${mirror}/${release}/packages/amd64/u-boot-riscv64-2021.07p0.tgz" curl -o "${f}" "${url}" tar -xzf "${f}" share/u-boot/qemu-riscv64_smode/u-boot.bin } setup() { miniroot createrootdisk opensbi uboot } run() { qemu-system-riscv64 \ -machine virt \ -nographic \ -m 2048M \ -smp 2 \ -bios share/opensbi/generic/fw_jump.bin \ -kernel share/u-boot/qemu-riscv64_smode/u-boot.bin \ -drive file=disk.raw,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 \ -netdev user,id=net0,ipv6=off -device virtio-net-device,netdev=net0 } setup run