diff --git a/articles/20220718-build-qemu-and-boot-openeuler-for-risc-v-in-tinylab-linux-lab-disk.md b/articles/20220718-build-qemu-and-boot-openeuler-for-risc-v-in-tinylab-linux-lab-disk.md new file mode 100644 index 0000000000000000000000000000000000000000..d2aa7504fd35ee36660accb61aadb6cfb01b312e --- /dev/null +++ b/articles/20220718-build-qemu-and-boot-openeuler-for-risc-v-in-tinylab-linux-lab-disk.md @@ -0,0 +1,212 @@ +> Author: ZhaoSQ <1044239768@qq.com>
+> Date: 2022/07/18
+> Revisor: lzufalcon
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux) + +# 在泰晓 Linux 实验盘中构建 QEMU 并引导 openEuler for RISC-V + +[泰晓 Linux 实验盘](https://tinylab.org/linux-lab-disk) 已经提供了一些基础包(包含了编译器和编译工具:gcc、git、make 等),但是在构建 QEMU 之前需要安装一些额外的包。 + +## 安装编译所需的软件包 + +### 基础软件包 + +* glib2.0-dev (9 MiB),这会自动包含 zlib1g-dev。 +* libfdt-devel。 + +对于 Ubuntu LTS(可能还有其他基于 Debian 的发行版),所有必需的附加软件包都可以像这样安装: + +``` +$ sudo apt install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev ninja-build +``` + +### 额外的软件包 + +* git-email, used for sending patches +* libsdl2-dev, needed for the SDL based graphical user interface +* gtk3-devel, for a simple UI instead of VNC +* vte-devel, for access to QEMU monitor and serial/console devices via the GTK interface +* libcapstone-dev, for disassembling CPU instructions + +上边的列表并不是 QEMU 完整的软件包。为了尽可能多的使用 QEMU 的功能,在执行 `configure` 前,应该安装更多的软件包。 + +对于 Ubuntu 系统,推荐安装额外的软件包,以实现最大的功能范围,可以安装如下内容: + +``` +$ sudo apt install git-email +$ sudo apt install libaio-dev libbluetooth-dev libcapstone-dev libbrlapi-dev libbz2-dev +$ sudo apt install libcap-ng-dev libcurl4-gnutls-dev libgtk-3-dev +$ sudo apt install libibverbs-dev libjpeg8-dev libncurses5-dev libnuma-dev +$ sudo apt install librbd-dev librdmacm-dev +$ sudo apt install libsasl2-dev libsdl2-dev libseccomp-dev libsnappy-dev libssh-dev +$ sudo apt install libvde-dev libvdeplug-dev libvte-2.91-dev libxen-dev liblzo2-dev +$ sudo apt install valgrind xfslibs-dev +``` + +较新版本的 Debian / Ubuntu 也可能会尝试这些附加软件包: + +``` +$ sudo apt install libnfs-dev libiscsi-dev +``` + +## 获取源代码 + +如果想要使用最新的代码,甚至为代码做出贡献,建议通过 git 获取 QEMU 的代码,仓库地址为:[QEMU](https://github.com/qemu/qemu.git)。 + +这里推荐使用 Github Desktop For Linux,可以加快下载速度。推荐使用如下命令下载软件: + +``` +$ git clone https://gitlab.com/qemu-project/qemu.git +``` + +## 简单的构建和测试 + +QEMU 支持在根目录下的任意文件夹进行构建,因此可以有很多不同的构建文件夹。比如,构建在 `QEMU` 根目录下的 `bin/debug/native` 中。 + +这是我的构建过程: + +``` +# 打开 QEMU 根目录 +$ cd qemu + +# 准备构建文件夹,bin/debug/native +$ mkdir -p bin/debug/native +$ cd bin/debug/native + +# 配置 QEMU 并开始构建 +$ ../../../configure --enable-debug +$ make + +# 返回 QEMU 根目录 +$ cd ../../.. +``` + +构建完成,开始一个简单测试: + +``` +$ bin/debug/native/x86_64-softmmu/qemu-system-x86_64 -L pc-bios +``` + +此测试运行启动 PC BIOS 的 QEMU 系统仿真。 + +## 编译支持 RISC-V 的 QEMU + +如果希望仿真 RISC-V 处理器,则在配置时需要加上 `--target-list="riscv32-softmmu riscv64-softmmu riscv64-linux-user"`。 + +> `riscv32-softmmu` `riscv64-softmmu` 为系统模式,`riscv64-linux-user` 为用户模式。为了测试方便,都安装。 + +下面是完成的配置与编译过程(在 QEMU 根目录中,执行以下命令): + +``` +# 准备构建文件夹,bin/debug/riscv +$ mkdir -p bin/debug/riscv +$ cd bin/debug/riscv + +# 配置 QEMU 并开始构建 +$ ../../../configure --target-list="riscv32-softmmu riscv64-softmmu riscv64-linux-user" +$ make + +# 返回 QEMU 根目录 +$ cd ../../.. +``` + +构建完成,开始一个简单测试,在 QEMU 的根目录下,执行以下命令。 + +``` +$ bin/debug/riscv/qemu-system-riscv64 --version +``` + +如出现类似如下输出表示 QEMU 成功安装并正常工作。 + +> QEMU emulator version 7.0.50 (v7.0.0-2400-g63b38f6c85) +> Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers + +## 下载并运行 openEuler for RISC-V + +### 下载 openEuler RISC-V 系统镜像 + +我们的目标是运行的 openEuler RISC-V OS,本次使用的版本为 20.03。 + +下载地址:[https://repo.openeuler.org/openEuler-preview/RISC-V/Image/](https://gitee.com/link?target=https%3A%2F%2Frepo.openeuler.org%2FopenEuler-preview%2FRISC-V%2FImage%2F) + +其中的两个文件是启动 openEuler RISC-V 移植版所必需的: + +* `fw_payload_oe.elf/fw_payload_oe_docker.elf` 利用 `openSBI` 将 kernel-5.5 的 image 作为 payload 所制作的用于 QEMU 启动的 image。这两个文件选择一个就可以,前者不支持 Docker,后者支持。 +* `openEuler-preview.riscv64.qcow2`  是 `openEuler RISC-V` 移植版的 rootfs 镜像。 + +### 通过 QEMU 启动一个 openEuler RISC-V + +在 QEMU 的同级目录下,新建一个名为 openeuler/ 的文件夹,将 `fw_payload_oe.elf` 和 `openEuler-preview.riscv64.qcow2` 文件移到 openeuler/ 的文件夹中,在 openeuler/ 文件夹下执行: + +``` +$ ~/Desktop/workspaces/qemu/bin/debug/riscv/qemu-system-riscv64 \ + -nographic -machine virt \ + -smp 2 -m 2G \ + -kernel fw_payload_oe_docker.elf \ + -drive file=openEuler-preview.riscv64.qcow2,format=qcow2,id=hd0 \ + -object rng-random,filename=/dev/urandom,id=rng0 \ + -device virtio-rng-device,rng=rng0 \ + -device virtio-blk-device,drive=hd0 \ + -device virtio-net-device,netdev=usernet \ + -netdev user,id=usernet,hostfwd=tcp::12055-:22 \ + -append 'root=/dev/vda1 rw console=ttyS0 systemd.default_timeout_start_sec=600 selinux=0 highres=off earlycon' \ + -bios none +``` + +注意 `-smp` 选项为 CPU 核数,`-m` 为虚拟机内存大小 请根据宿主机配置酌情修改。 + +启动命令可做成 Shell 脚本,其中 `fw_payload_oe_docker.elf` 与 `openEuler-preview.riscv64.qcow2` 需修改为实际下载的文件名,并注意相对和绝对路径,如做成启动脚本则可与脚本放在同一目录下。 + +### 登录 openEuler 系统 + +* 登录用户:`root` +* 默认密码:`openEuler12#$` + +建议在登录成功之后立即修改 root 用户密码,登陆成功之后,可以看到如下的信息: + +``` +openEuler 20.03 (LTS) +Kernel 5.5.19 on an riscv64 + +login: er-RISCV-rare +openEuler 20.03 (LTS) +Kernel 5.5.19 on an riscv64 + +openEuler-RISCV-rare login: root +Password: +Last login: Tue Sep 3 09:30:22 on ttyS0 + + +Welcome to 5.5.19 + +System information as of time: Tue Sep 3 09:30:17 UTC 2019 + +System load: 0.64 +Processes: 65 +Memory used: 2.6% +Swap used: 0.0% +Usage On: 12% +Users online: 1 + + +[root@openEuler-RISCV-rare ~]# +``` + +建议在 Host Linux 上通过 ssh 登录到运行在 QEMU 模拟器之上的 openEuler OS,如直接使用,可能会出现 vim 键盘输入异常。 + +``` +$ ssh -p 12055 root@localhost +``` + +## 小结 + +本文详细介绍了如何在 [泰晓 Linux 实验盘](https://tinylab.org/linux-lab-disk) 中,快速从源码构建一个用于仿真 RISC-V 处理器架构的 QEMU,并演示了如何下载并启动一个最新版的 openEuler for RISC-V 系统,希望对大家有所帮助。 + +根据 [Linux Lab](https://gitee.com/tinylab/linux-lab) 项目的最新开发动态,我们发现在它的 next 分支中已经可以直接编译 QEMU v7.0.0,预计在新版 [泰晓 Linux 实验盘](https://tinylab.org/linux-lab-disk) 中,也将很快支持 QEMU 的自动构建,敬请期待,我们下回再进行相关演示。 + +## 参考资料 + +1. [Linux 主机上构建 QEMU](https://wiki.qemu.org/Hosts/Linux) +2. [在 Ubuntu 上安装 gitub desktop](https://gist.github.com/berkorbay/6feda478a00b0432d13f1fc0a50467f1) +3. [Running 64- and 32-bit RISC-V Linux on QEMU](https://risc-v-getting-started-guide.readthedocs.io/en/latest/linux-qemu.html) +4. [通过 QEMU 仿真 RISC-V 环境并启动 OpenEuler RISC-V 系统](https://gitee.com/openeuler/RISC-V/blob/master/doc/tutorials/vm-qemu-oErv.md)