type
status
date
slug
summary
tags
category
icon
password
安装过程
在 repo.openeuler.org/openEuler-preview/RISC-V/openEuler-22.03-V1-riscv64/QEMU/ 中,找到最新版的镜像并下载,下载所有文件。
启动虚拟机
详解一下各个参数
- -machine virt:设置机器类型为 virt ,使用下面的 virtio 设备必须要设置这个,如果要模拟其他类型的设备,-machine和-device都要对应修改
- -cpu rv64:模拟cpu类型为RISC-V 64位
- -m 4G:设置内存为4G
- -smp “4”:设置核心数为 4
- -drive file=openEuler.qcow2, if=none, id=hd0:使用文件 openEuler.qcow2, 不设置协议(这里的协议可以设置类似于SD卡之类的协议),id和下面的device对应
- -device xxx, xxx=xx0:模拟类型,并指定对应的设备
- -device virtio-rng-device: 随机数生成器
- -bios none: 不使用BIOS,这样会自动跳转到kernel所在内存位置
- -kernel xxx.elf: 设置kernel在内存某位置上的内容
- -append ‘root=/dev/vda1’:将/dev/vda1设备挂载为root,有点类似于 mount /dev/vda1 /
自问自答
- 问:什么是OpenSbi
答:根据官方介绍来说,它是一个接口,然后可以根据不同的应用场景制定不同的模式。实际上,它就类似x86_64的BIOS,就是bootloader。而所谓的M-mode(Machine Mode), S-mode(Supervisor Mode), HS-Mode(Hypervisor-Extension Mode), VS-Mode(Virtual Supervisor-Mode)有点类似于x86_64处理器上的ring0~3,就是处理器不同的特权级别。
- 问:为什么在一些 RISC-V 虚拟机的启动教程里面,有时候需要使用 BIOS 参数,有时候将它设为none,而将fw放到kernel?
答:在使用 qemu-system-riscv64 时,如果不设定 -bios 的值,那么它默认会使用 OpenSbi,对于Linux它是好用的,但是对于其它系统的话,那就必须自己指定 BIOS 参数。对于其他文章,可以看出有一些是设置了 -bios fw_jump, -kernel uboot ,(这里的fw_jump就是为了跳到kernel的,但是也是必要的,如果没有fw_jump,那么部分使用opensbi的系统调用接口就不存在了,而且会运行在最高级别的M-Mode),这样的话,它是从opensbi来启动uboot,以便实现opensbi不支持或没那么方便实现的一些奇奇怪怪的东西,比如使RISC-V机器能够从U盘启动。不指定bios是默认将bios设为opensbi,而在这里使用的是 -bios none, -kernel fw,就是将kernel存入到内存某个地址中,那么qemu开机在没有bios的情况下,就会默认跳转到这个地址,直接执行kernel的内容。这里的kernel是一个RISC-V的二进制汇编文件。
- 问:QEMU 启动命令中,-device是怎么使用的
答:一般会和 -netdev 或 -drive 这种东西配套使用。在 -drive 里面比如指定了 id=hd0,然后再在 -device 指定类型,比如设定为 virtio-blk-device ,那么它就是一个普通的硬盘,qemu虚拟机里面识别这个就是一个普通的硬盘。当然,你也可以设成类似nvme,或者是pci硬盘
- 问:为什么 -machine 一定要设置为 virt?设置其他的行不行?
答:可以设置为其他的,设置为什么就默认模拟什么机型。可以尝试执行以下 qemu-system-riscv64 -machine ?,会输出以下内容
可以看到,这里有几种类型可选,而这里的 -machine 里的内容就可以和 -device 里的内容对应,相对的,也可以查看 qemu-system-riscv64 -device ? 来查看其内容。
比如说,设置 -machine 为 virt,那么模拟设备一般都是 virtio 开头的,比如说 virtio-net-device,或者是 virtio-rng-device
参考资料
特别嘉宾
@U2FsdGVkX1