Ports/riscv64/QEMU: Difference between revisions

From ALT Linux Wiki
< Ports‎ | riscv64
No edit summary
 
(11 intermediate revisions by 3 users not shown)
Line 2: Line 2:
{{Stub}}
{{Stub}}


QEMU, starting with version 6.0, include OpenSBI firmware. If you have an older QEMU version, follow the instructions to obtain and use the firmware below.
This page describes how to start riscv64 virtual machine via [https://www.qemu.org QEMU].


Some older ALT images for QEMU include a VNC server that is used for system setup and graphics (see [[Regular/riscv64#VNC]] for more details). To access that server, it's convenient to forward port 5900. The necessary parameters for that are included into QEMU command lines below.
QEMU, starting with version 6.0, includes OpenSBI firmware. For older QEMU versions you need to obtain the firmware -- check out the instructions in the [[#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+ ==


QEMU 6.0 virtual machines with kernel 5.14+ have graphics (virtuo-gpu) and input (virtio-keyboard and virtio-mouse) working.
QEMU 6.0 virtual machines with kernel 5.14 or newer have graphics (virtuo-gpu) and input (virtio-keyboard and virtio-tablet) working. Here are the steps run ALT images in QEMU:
 
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 [http://sisyphus.ru/en/srpm/Sisyphus/qemu qemu-system-riscv-core package]:
 
  apt-get install qemu-system-riscv-core


On Ubuntu, riscv64 emulation is part of <tt>qemu-system-misc</tt>.
'''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 [https://packages.altlinux.org/en/sisyphus/srpms/qemu/ qemu-system-riscv-core package]:


'''Step 1''':  Download the recent version of [https://packages.altlinux.org/ru/sisyphus/srpms/u-boot-qemu u-boot-qemu for riscv64]. You can use the riscv64 link from https://packages.altlinux.org/ru/sisyphus/srpms/u-boot-qemu/rpms.
  apt-get install qemu-system-riscv-core qemu-device-display-virtio-gpu-gl qemu-ui-sdl seavgabios


From the downloaded package, extract <tt>/usr/share/u-boot/qemu-riscv64_smode/u-boot.bin</tt>. For example:
'''Step 1''':  Download the recent version of <code>u-boot-qemu</code> for riscv64. You can use [https://packages.altlinux.org/en/sisyphus_riscv64/srpms/u-boot-sifive/rpms/ the link to the package on the official website of the Sisyphus repository]. Or find the package directly in the [http://ftp.altlinux.org/pub/distributions/ALTLinux/ports/riscv64/Sisyphus/noarch/RPMS.classic/ repository].


  rpm2cpio u-boot-qemu-*riscv64.rpm | cpio -vi --to-stdout './usr/share/u-boot/qemu-riscv64_smode/u-boot.bin' > u-boot.bin
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 via the following commands:
'''Step 2''':  Now you can start a virtual machine on QEMU via the following commands. Put the path to the image you want to run into the IMAGE environment variable, and path to the U-Boot binary you obtained on the step 1 to UBOOT environment variable:
 


<source lang="shell">
<source lang="shell">
$ IMAGE=<path to riscv64 image in img or qcow2 format>
$ IMAGE=/path/to/<image>
$ UBOOT=<path to u-boot.bin from step 1>
$ UBOOT=/path/to/u-boot.bin
$ qemu-system-riscv64 \
$ qemu-system-riscv64 \
           -nographic -m 2G  -machine virt -kernel "$UBOOT" \
           -nographic -m 2G  -machine virt -kernel "$UBOOT" \
Line 36: Line 32:
           -drive file=$IMAGE,id=hd0 -device virtio-blk-device,drive=hd0  \
           -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 \
           -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  
           -device virtio-keyboard -device virtio-tablet \
          -device virtio-vga-gl,xres=1280,yres=800 -display sdl,gl=on
</source>
</source>


== Older QEMU (pre-6.0) ==
If you need to access the virtual machine via VNC, replace <tt>-device virtio-vga-gl</tt> and <tt>-display sdl</tt> options with "-device virtio-vga -vnc :1" and connect to 5901 port (5900 port is taken for the network forwarding):


For older QEMU, you need OpenSB (firmware) binary.
<source lang="shell">
$ vncviewer localhost:5901
</source>


'''Option #1''' There is an OpenSBI firmware binary inside the qcow2/qcow2c image. You can copy it out of the image:
== OpenSBI ==


<source lang=shell>
To run riscv64 virtual machine on older (pre-6.0) QEMU, you need OpenSBI (firmware) binary.
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
</source>


'''Option #2''' [http://ftp.altlinux.org/pub/distributions/ALTLinux/ports/riscv64/Sisyphus/noarch/RPMS.classic/ Download] and install the latest version of OpenSBI package <code>opensbi-firmware-generic</code>.
Download the recent version of <code>opensbi</code>.
You can use [https://packages.altlinux.org/en/sisyphus_riscv64/srpms/opensbi/rpms/ the link to the package on the official website of the Sisyphus repository]. Or find the package directly in the [http://ftp.altlinux.org/pub/distributions/ALTLinux/ports/riscv64/Sisyphus/riscv64/RPMS.classic/ repository].


The OpenSBI firmware will be at <tt>/usr/share/opensbi/generic/firmware/fw_payload.elf</tt>.
Extract '''/usr/share/opensbi/generic/firmware/fw_jump.elf''' file from the downloaded package. For example:


For example:
rpm2cpio opensbi-*.rpm | cpio -vi --to-stdout './usr/share/opensbi/generic/firmware/fw_jump.elf' > fw_jump.elf


<source lang=shell>
Now you can start a virtual machine on QEMU via the following commands. Put path to your image into IMAGE, path to the u-boot binary into UBOOT environment variable, and path to  to u-boot, and path to  <tt>fw_jump.elf</tt> that you extracted from FIRM package into FIRM variable:
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
</source>


<source lang="shell">
<source lang="shell">
$ QCOW=qemu-riscv64.qcow2c
$ IMAGE=/path/to/<image>
$ UBOOT=/path/to/u-boot.bin
$ FIRM=/path/to/fw_jump.elf
$ qemu-system-riscv64 \
$ qemu-system-riscv64 \
          -nographic -machine virt -kernel "$FIRM" \
                      -nographic -machine virt \
          -m 2G -smp cpus=4 \
                      -bios "$FIRM" \
          -drive file="$QCOW",id=hd0 -device virtio-blk-device,drive=hd0 \
                      -kernel "$UBOOT" \
          -netdev user,id=eth0,hostfwd=tcp::5900-:5900 -device virtio-net-device,netdev=eth0
                      -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
</source>
</source>
If you need a graphical interface, run the VNC server in the VM, for example, as described in [[Regular/riscv64#VNC]].
Connect to VNC, for example, like this:
vncviewer localhost
[[Category:RISC-V]]
[[ru:Ports/riscv64/QEMU]]

Latest revision as of 13:15, 16 November 2022

Stub.png
Under construction.
This page is not finished yet and may lack substantial information.


This page describes how to start riscv64 virtual machine via QEMU.

QEMU, starting with version 6.0, includes OpenSBI firmware. For older QEMU versions you need to obtain the firmware -- check out the instructions in the #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 or newer have graphics (virtuo-gpu) and input (virtio-keyboard and virtio-tablet) working. Here are the steps run ALT 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. Put the path to the image you want to run into the IMAGE environment variable, and path to the U-Boot binary you obtained on the step 1 to UBOOT environment variable:

$ 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. Put path to your image into IMAGE, path to the u-boot binary into UBOOT environment variable, and path to to u-boot, and path to fw_jump.elf that you extracted from FIRM package into FIRM variable:

$ 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 VM, for example, as described in Regular/riscv64#VNC.

Connect to VNC, for example, like this:

vncviewer localhost