修订日期 2023-05-31
一般来说,常见 GNU/Linux 发行版软件源中都提供了包含 qemu-system-riscv64
的软件包。各发行版间以及其各个大小版本间对应的包名可能略有不同,详情可移步 pkgs.org 进行查询。
通常可以通过
lsb_release -a
来查询自己正在使用哪个发行版和具体的大版本 (或与之对应的 codename)
- Ubuntu 22.04 提供 6.2 版本:
$ sudo apt install qemu-system-misc
- 注: 20.04 及以前的版本过旧
- Debian 11 仓库提供较旧的 5.2 版本:
$ sudo apt install qemu-system-misc
- Debian 11 官方 backports 仓库 (在修订时) 提供 7.2 版本,可参考这里的 指引 启用 backports 仓库获取新版本软件包:
$ sudo apt install -t bullseye-backports qemu-system-misc
- 注: 10 及以前的版本过旧
- Debian 11 官方 backports 仓库 (在修订时) 提供 7.2 版本,可参考这里的 指引 启用 backports 仓库获取新版本软件包:
- openEuler 22.03 提供 6.2 版本:
$ sudo dnf install qemu-system-riscv
- 注: 21.09 及以前的版本过旧
- Fedora 38 提供 7.2.1 版本:
$ sudo dnf install qemu-system-riscv
- Arch Linux (在修订时) 提供 8.0 版本:
$ sudo pacman -Syu qemu-full
- openSUSE Tumbleweed (在修订时) 提供 7.1 版本:
$ sudo dnf install qemu
如果官方仓库 (及各种 您信任的 第三方仓库) 中未收录 QEMU 或版本过旧 (低于 5.0),或者发行版提供的软件包构建时未开启本项目所需的 slirp 网络模块(如运行时出现报错:network backend 'user' is not compiled into this binary
),请移步下一部分从 QEMU 项目主页 获取源代码进行手动构建。
QEMU 从 7.2.0 版本之后移除了 slirp 子模块,会影响用户模式的网络功能,需要提前加上依赖包和配置选项。
修订者注: 建议优先考虑发行版提供的软件包或在有能力的情况下自行打包,不鼓励 非必要情况的编译安装。
下述内容以 Ubuntu 为例
- 安装必要的构建工具
$ sudo apt install build-essential git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev ninja-build libslirp-dev
- 创建 /usr/local 下的目标目录
$ sudo mkdir -p /usr/local/bin/qemu-riscv64
- 下载 QEMU 源码包 (此处以 7.2 版本为例)
$ wget https://download.qemu.org/qemu-7.2.0.tar.xz
- 解压源码包并切换目录
$ tar xvJf qemu-7.2.0.tar.xz && cd qemu-7.2.0
- 配置编译选项
$ sudo ./configure --enable-slirp --target-list=riscv64-softmmu,riscv64-linux-user --prefix=/usr/local/bin/qemu-riscv64
riscv64-softmmu
为系统模式,riscv64-linux-user
为用户模式。为了测试方便建议两个都编译,以免后续需要时重复编译 - 编译安装
$ sudo make && sudo make install
- 执行
$ qemu-system-riscv64 --version
,如出现类似如下输出表示 QEMU 成功安装并正常工作。
QEMU emulator version 7.2.0
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
对于不同的版本我们均有提供 QEMU 文档,请查阅本 Repo 的 release 目录来获取不同的版本。
例如,欲了解如何下载 openEuler RISC-V 23.03 并通过 QEMU 仿真 RISC-V 环境启动,请访问 release 目录下的 openEuler-23.03 文件夹。
vcpu
为 qemu 运行线程数,与 CPU 核数没有严格对应,建议维持为 8 不变memory
为虚拟机内存数目,可随需要调整drive
为虚拟磁盘路径,可随需要调整fw
为启动 payloadssh_port
为转发的 SSH 端口,默认为 12055,可随需要调整。
建议在登录成功之后立即修改 root 用户密码
在 console 直接登录可能出现输入异常
-
用户名:
root
-
默认密码:
openEuler12#$
-
登录方式: 命令行
ssh -p 12055 root@localhost
(或使用您偏好的 ssh 客户端)
登录成功之后,可以看到如下的信息:
Last login: Mon Jun 27 15:08:35 2022
Welcome to 5.10.0
System information as of time: Mon Jun 27 07:11:54 PM CST 2022
System load: 0.08
Processes: 130
Memory used: 1.3%
Swap used: 0.0%
Usage On: 23%
IP address: 10.0.2.15
Users online: 2
[root@openEuler-riscv64 ~]#
此部分内容参考了教程《RISC-V openEuler包移植从零开始》 与博客文章《在 QEMU 内运行 openEuler RISC-V 移植版》,在此感谢几位作者老师的总结
工作过程中虚拟机磁盘空间不足的情况偶有发生,此时应对其进行扩容。扩容操作分为三步:
虚拟硬盘的格式为 .qcow2 时请自行替换文件名后缀
此处以扩容 40G 为例
- 安装所需工具
- 在宿主机上安装
qemu-img
工具- 各个发行版间可能会有所不同,以 Ubuntu 和 Debian 为例:
apt install qemu-utils
- 执行
qemu-img --help
验证安装
- 各个发行版间可能会有所不同,以 Ubuntu 和 Debian 为例:
- 在 openEuler RISC-V 虚拟机上安装
growpart
工具- 若磁盘空间不足以安装此工具,可先进行清理一些无用文件,如
osc
缓存的软件包 - 执行
dnf install cloud-utils-growpart
进行安装 - 执行
growpart --help
验证安装
- 若磁盘空间不足以安装此工具,可先进行清理一些无用文件,如
- 扩容虚拟硬盘
- 关闭 openEuler RISC-V 虚拟机
- 执行
qemu-img resize openeuler-qemu.raw +40G
- 扩容磁盘分区和文件系统
- 启动 openEuler RISC-V 虚拟机
- 执行
lsblk
查看分区情况
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 254:0 0 50G 0 disk
└─vda1 254:1 0 10G 0 part /
- 扩展分区 vda1,执行
growpart /dev/vda 1
- 执行
lsblk
可以看到 / 所在的 vda1 分区已经扩展到了预期大小
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 254:0 0 50G 0 disk
└─vda1 254:1 0 50G 0 part /
- 扩展文件系统,执行
resize2fs /dev/vda1
- 执行
df -h
验证 / 分区的大小
当需要对比 openEuler 主线软件包,或者进行内核对比测试等情况时,可安装对应的 QEMU x86_64 或 arm64 虚拟机环境。这里以主线版本 openEuler-22.03-LTS-SP1 为例说明准备方法。
- QEMU x86_84
- 下载镜像:
$ wget https://mirror.iscas.ac.cn/openeuler/openEuler-22.03-LTS-SP1/virtual_machine_img/x86_64/openEuler-22.03-LTS-SP1-x86_64.qcow2.xz
$ xz -d openEuler-22.03-LTS-SP1-x86_64.qcow2.xz
$ wget https://mirror.iscas.ac.cn/openeuler/openEuler-22.03-LTS-SP1/OS/x86_64/images/pxeboot/initrd.img
$ wget https://mirror.iscas.ac.cn/openeuler/openEuler-22.03-LTS-SP1/OS/x86_64/images/pxeboot/vmlinuz
- 启动虚拟机:
$ qemu-system-x86_64 \
-nographic -smp 8 -m 4G \
-kernel vmlinuz \
-initrd initrd.img \
-hda openEuler-22.03-LTS-SP1-x86_64.qcow2 \
-net user,hostfwd=::2222-:22 -net nic \
-append 'root=/dev/sda2 console=ttyS0'
- root口令与上面相同。虚拟机的网络、时间(除时区)、软件源等已设置好,开机即可用。
- QEMU arm64
- 下载镜像:
$ wget https://mirror.iscas.ac.cn/openeuler/openEuler-22.03-LTS-SP1/virtual_machine_img/aarch64/openEuler-22.03-LTS-SP1-aarch64.qcow2.xz
$ xz -d openEuler-22.03-LTS-SP1-aarch64.qcow2.xz
$ wget https://mirror.iscas.ac.cn/openeuler/openEuler-22.03-LTS-SP1/OS/aarch64/images/pxeboot/initrd.img
$ wget https://mirror.iscas.ac.cn/openeuler/openEuler-22.03-LTS-SP1/OS/aarch64/images/pxeboot/vmlinuz
- 启动虚拟机:
$ qemu-system-aarch64 \
-nographic \
-M virt -cpu cortex-a57 \
-smp 8 -m 4G \
-kernel vmlinuz \
-initrd initrd.img \
-hda openEuler-22.03-LTS-SP1-aarch64.qcow2 \
-nic user,model=e1000,hostfwd=tcp::2222-:22 \
-append 'root=/dev/vda2 console=ttyAMA0'
- root口令与上面相同。虚拟机的网络、时间(除时区)、软件源等已设置好,开机即可用。