使用qemu运行risc-v ubuntu
参考
Ubuntu installation on a RISC-V virtual machine using a server install image and QEMU
用到的文件
ubuntu-22.04.3-preinstalled-server-riscv64+unmatched.img
1 镜像准备
1.1 镜像选择
如上在下载 Ubuntu Server 时,可能会遇到以下两种安装选项:
- Ubuntu Server preinstalled image:
-
这是一个预安装的系统映像。意味着它已经包含了一个基本的 Ubuntu Server 系统,你可以直接将其写入到目标设备(例如 SD 卡、USB 驱动器或硬盘)并立即启动。
-
这种类型的映像通常用于嵌入式设备或特定的硬件平台,如 Raspberry Pi 或其他 ARM 设备。
-
使用预安装映像,你可以迅速地部署 Ubuntu Server,无需经过传统的安装过程。
- Ubuntu Server live installer:
-
这是一个“实时”安装程序。当你启动这个映像时,你会进入一个实时的 Ubuntu 环境,其中包含一个安装程序。你可以使用这个安装程序来安装 Ubuntu Server 到目标设备。
-
这种类型的安装程序允许你在安装前测试硬件的兼容性、网络连接等,并提供更多的自定义选项。
-
一旦你决定安装,你可以启动安装程序,选择安装选项,然后等待安装完成。
-
安装后移除安装介质,操作系统已经已经被安装到指定的硬盘中。
总结:
-
如果你想要快速部署一个 Ubuntu Server 系统,而不需要进行详细的配置或安装,那么选择 preinstalled image 可能是一个好选择。
-
如果你想要更多的自定义选项,或者你想在安装前测试系统,那么选择 live installer 会更合适。
参考中文章是使用 Ubuntu Server live installer
的安装流程,本文是使用 Ubuntu Server preinstalled image
的安装流程。如果想使用参考文章中的安装流程,在阅读完本文后也会有帮助
1.2 解压镜像
unxz [下载的.img.xz文件路径]
2 创建虚拟磁盘
使用 dd
命令创建磁盘映像时,如:
dd if=/dev/zero of=riscv_disk.img bs=1M count=10240
这里是各个选项的含义:
-
dd: 这是数据复制的命令名,它可以用于低级别的数据复制。
-
if=/dev/zero: 这是输入文件(Input File)的路径。
/dev/zero
是一个特殊的设备文件,它提供了无限的零(null bytes)。当你从这个文件读取时,你会得到连续的零。
- of=riscv_disk.img: 这是输出文件(Output File)的路径。
riscv_disk.img
是你要创建的文件的名称。这将是你的虚拟磁盘映像。
- bs=1M: 这是块大小(Block Size)。
- 这里,
1M
表示每个块的大小是 1 兆字节。dd
会按照这个大小来读取和写入数据。
- count=10240: 这是要复制的块的数量。
10240
块,每块1M
,所以总大小是 10GB。
总的来说,这个命令从 /dev/zero
读取了 10GB 的零,并将它们写入 riscv_disk.img
文件,从而创建了一个 10GB 的空磁盘映像。
3 将预安装镜像写入虚拟磁盘
dd if=[你的预安装映像路径] of=riscv_disk.img
4 启动qemu
之前有在x86的ubuntu上通过QEMU运行运行RISC-V版本的QEMU
在参考的文章中 (先不要着急操作,请看完)
sudo apt-get install qemu-system-misc opensbi u-boot-qemu
-
qemu-system-misc QEMU 用于模拟虚拟 RISC-V 芯片以及CLINT,PLIC等设备
-
OpenSBI提供以机器模式运行的SBI运行环境
-
U-Boot 是实现 UEFI API 并加载 GRUB 的固件
这是参考文章中启动的参数 (别执行)
qemu-system-riscv64 \
-machine virt -m 4G -smp cpus=2 -nographic \
-bios /usr/lib/riscv64-linux-gnu/opensbi/generic/fw_jump.bin \
-kernel /usr/lib/u-boot/qemu-riscv64_smode/u-boot.bin \
-netdev user,id=net0 \
-device virtio-net-device,netdev=net0 \
-drive file=jammy-live-server-riscv64.img,format=raw,if=virtio \
-drive file=disk,format=raw,if=virtio \
-device virtio-rng-pci
分别通过 -bios
和 kernel
参数指定了两个二进制文件,参数指定的目录下发现还有 fw_jump.elf
和 u-boot.elf
文件。按照经验,通常 .bin
文件是由 objcopy
命令从 .elf
文件中拷贝出的 .text
.data
.rodata
段组成。
一个典型的使用 objcopy
从 ELF 文件生成 .bin
文件的命令如下:
objcopy -O binary input.elf output.bin
其中,-O binary
指定了输出的目标文件格式为二进制格式。.bin
文件包含了 ELF 文件中所有应当被加载到内存的段的内容,而不包含其他的调试或链接信息。
所以只要有这两个二进制文件,就可以省略安装 opensbi
和 uboot
。正好我在mac上无法直接安装需要源码编译,我可以将之前x86 ubuntu 环境中的这两个文件复制过来。如果使用linux,可以像参考文章那样使用通过apt 安装 opensbi 和 uboot获得这两个文件。
我在mac上运行以下命令就可顺利在QEMU中启动ubuntu
qemu-system-riscv64 \
-M virt \
-m 2048M \
-smp 4 \
-bios ./fw_jump.bin \
-kernel ./u-boot.bin \
-drive file=./riscv_disk.img,format=raw,id=hd0 \
-device virtio-blk-device,drive=hd0 \
-netdev user,id=net0,hostfwd=tcp::2222-:22 \
-device virtio-net-device,netdev=net0 \
-nographic \
-device virtio-rng-pci
这条命令是用来启动一个 RISC-V 64 位虚拟机的,使用的模拟器是 QEMU。下面是对每一个参数的详细解释:
-
qemu-system-riscv64
: 这是 QEMU 的命令,用于启动一个 RISC-V 64 位的虚拟机。 -
-M virt
: 选择 QEMU 虚拟机的类型。在这里,选择的是virt
,它是 QEMU 支持的 RISC-V 的通用虚拟机型号。 -
-m 2048M
: 设置虚拟机的内存大小。在这里,设置的是 2048M,即 2GB。 -
-smp 4
: 设置虚拟机的 CPU 核心数。在这里,设置的是 4 核心。 -
-bios ./fw_jump.bin
: 指定 BIOS 文件。在这里,用的是fw_jump.bin
这个文件。 -
-kernel ./u-boot.bin
: 指定内核映像文件。这里用的是 U-Boot,一个常用的开源引导加载器。 -
-drive file=./riscv_disk.img,format=raw,id=hd0
: 定义一个驱动器。
-
file=./riscv_disk.img
: 指定磁盘映像文件。 -
format=raw
: 指定磁盘映像的格式,这里是 raw 格式。 -
id=hd0
: 给这个驱动器一个标识符。
-device virtio-blk-device,drive=hd0
: 添加一个设备,并关联前面定义的驱动器。
-
virtio-blk-device
: 这是一个块设备。 -
drive=hd0
: 指定与此设备关联的驱动器。
-netdev user,id=net0,hostfwd=tcp::2222-:22
: 定义一个网络设备。
-
user
: 使用用户模式网络堆栈。 -
id=net0
: 给这个网络设备一个标识符。 -
hostfwd=tcp::2222-:22
: 设置端口转发,将宿主机的 2222 端口转发到虚拟机的 22 端口。
-device virtio-net-device,netdev=net0
: 添加一个网络设备,并关联前面定义的网络设备。
-
virtio-net-device
: 这是一个网络设备。 -
netdev=net0
: 指定与此设备关联的网络设备。
-
-nographic
: 不使用图形界面,仅使用命令行界面。 -
-device virtio-rng-pci
: 添加一个设备,这是一个随机数生成器。
简而言之,这个命令是用来启动一个带有 2GB RAM、4 个 CPU 核心和一块磁盘的 RISC-V 64 位虚拟机的。虚拟机使用 U-Boot 启动,并设置了网络端口转发。
5 登录和使用
-
由于这是一个预安装的映像,Ubuntu Server 应该已经安装并配置好了。在 QEMU 启动后,你应该可以看到登录提示。
-
使用默认的用户名和密码登录(通常为
ubuntu
/ubuntu
,但最好查看下载页面或相关文档以确认)。 -
在首次登录后,你会被要求更改密码。
使用SSH 登录
在启动QEMU事设置hostfwd=tcp::2222-:22
,通过端口转发,将宿主机的 2222 端口转发到虚拟机的 22 端口。
ssh ubuntu@localhost -p 2222
6 关闭
- 方式一:正常关机
sudo shutdown -h now
- 方式一:相当于直接按下主机关机键
当你想要关闭 QEMU 时,可以在 QEMU 的窗口(非SSH链接)中按 Ctrl+A
,然后 X