当前位置: 首页 > article >正文

RISCV虚拟化环境搭建

概要

本文记搭建 RISCV 虚拟化环境的流程。

整体架构

我们使用 QEMU 来模拟 RISCV 的各种硬件扩展环境,通过 QEMU 启动 Ubuntu 作为我们的 Host 来在 Host 之中通过 KVMTOOL 来运行 Guest,学习 RISCV 的虚拟化。

目前我的 X86_64 主机使用的是 Ubuntu 的 22.04 桌面版。具体如下:

Linux ovo-ovo 6.8.0-52-generic #53~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jan 15 19:18:46 UTC 2 x86_64 x86_64 x86_64 GNU/Linux

准备 Ubuntu 镜像

打开终端,执行以下命令,下载镜像。

wget https://old-releases.ubuntu.com/releases/22.04.4/ubuntu-22.04-preinstalled-server-riscv64+unmatched.img.xz

解压缩系统镜像文件然后扩个容。

xz -d ubuntu-22.04-preinstalled-server-riscv64+unmatched.img.xz
qemu-img resize ubuntu-22.04-preinstalled-server-riscv64+unmatched.img +20G

编译 QEMU-v9.2.2

考虑到直接使用 apt 命令安装的 QEMU 可能不支持 RISC-V 虚拟化扩展。所以直接下载源码编译。

安装编译前所需工具

sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \
                 gawk build-essential bison flex texinfo gperf libtool patchutils bc \
                 zlib1g-dev libexpat-dev git ninja-build \
                 libglib2.0-dev libfdt-dev libpixman-1-dev
# 根据 python 版本调整版本号
sudo apt-get install python3.12-venv

QEMU 的 user 用户模式网络配置需要 libslirp 的支持

下载 libslirp 源码和编译所需工具

git clone https://gitlab.freedesktop.org/slirp/libslirp.git
sudo apt install meson

libslirp 编译,安装

meson build
ninja -C build install

下载 QEMU 源码

git clone https://gitee.com/popukey/qemu.git

切换到目标版本。

git checkout v9.2.2

编译 RV64 架构下的 QEMU:qemu-system-riscv64

cd qemu && ./configure --target-list=riscv64-softmmu --enable-slirp  && make -j 8

编译结束之后生成的可执行文件位于 QEMU 目录下的 build 目录中。

把该路径在 ~/.bashrc 文件最后写入环境变量 PATH

export PATH="\$HOME/riscv64-qemu/qemu/build/:\$PATH"
source ~/.bashrc

确保修改生效。qemu-system-riscv64 --version 通过该命令验证 QEMU 版本正确。

安装最新 U-Boot 和 OpenSBI-v1.6

交叉编译工具

编译需要交叉编译工具 riscv64-unknown-linux-gnu-gcc,RISCV 仓库中有编译好的,这里我使用当前最新的会出错,需要我更新 libc 到 2.38。遂放弃。使用低一点的版本。

wget https://github.com/riscv-collab/riscv-gnu-toolchain/releases/download/2024.09.03/riscv64-glibc-ubuntu-22.04-gcc-nightly-2024.09.03-nightly.tar.gz
mkdir riscv
tar -xf riscv64-glibc-ubuntu-22.04-gcc-nightly-2024.09.03-nightly.tar.gz -C riscv --strip-components=1

把目录加入 PATH 中,方便后续使用。把下面内容放入 ~/.bashrc 文件最末尾。

export PATH="$HOME/crossTools/riscv/bin/:$PATH" 

确保修改生效。

source ~/.bashrc

U-boot

克隆 U-boot 项目并编译。

git clone https://source.denx.de/u-boot/u-boot.git
cd u-boot
export ARCH=riscv
make CROSS_COMPILE=riscv64-unknown-linux-gnu- qemu-riscv64_smode_defconfig
make CROSS_COMPILE=riscv64-unknown-linux-gnu- -j 8

编译之后的 u-boot 位于项目目录下。

openSBI-v1.6

克隆 openSBI 项目并编译。

git clone https://github.com/riscv-software-src/opensbi.git
cd opensbi && git checkout v1.6
make PLATFORM=generic CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv -j 8

编译之后的内容位于 build/platform/generic/firmware/ 目录中。

qemu引导Linux

启动 Linux

qemu-system-riscv64 -machine virt -nographic -m 8192 -smp 6 -bios opensbi/build/platform/generic/firmware/fw_jump.bin -kernel u-boot/u-boot -device virtio-net-device,netdev=eth0 -netdev user,id=eth0,hostfwd=tcp::6666-:22 -device virtio-rng-pci -drive file=./ubuntu-22.04-preinstalled-server-riscv64+unmatched.img,format=raw,if=virtio

此时,我们可以通过 ssh 命令 ssh -p 6666 ubuntu@localhost 登录到 Linux,系统会立即要求更改密码

# 默认用户名和密码
username: ubuntu
password: ubuntu

加载 kvm 模块,并验证

sudo modprobe kvm

此时应该会看到,系统目前没有 KVM 模块。

编译升级 Linux 内核

依照上文方式用 QEMU 引导 RISCV 的内核之后,在 Host 中编译。这种方式可能较慢。接下来的操作都在 Host 中进行。

安装必要的工具:

sudo apt update
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev fakeroot dwarves

下载内核源码压缩包。

在这里插入图片描述
这里下载版本 v6.13.7 并解压缩。

wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.13.7.tar.xz
tar -xf linux-6.13.7.tar.xz
cd linux-6.13.7/

拷贝配置文件并对配置文件做选择性修改。

 cp -v /boot/config-$(uname -r) .config
 make localmodconfig

最后对配置文件做些修改,确保编译过程顺利。

scripts/config --disable SYSTEM_TRUSTED_KEYS
scripts/config --disable SYSTEM_REVOCATION_KEYS
scripts/config --set-str CONFIG_SYSTEM_TRUSTED_KEYS ""
scripts/config --set-str CONFIG_SYSTEM_REVOCATION_KEYS ""

开始编译

fakeroot make -j8

查看结果,命令执行之后为 0 则一切正常。

echo $?

安装内核模块、更新用户头文件、安装内核内核并重启。

sudo make modules_install
sudo make headers_install INSTALL_HDR_PATH=/usr
sudo make install
sudo reboot

输入命令验证内核版本。

uname -rs

此时,我们再加载 kvm 模块。并验证在 dev 下有 kvm 这个设备文件存在。

sudo modprobe kvm
ls /dev/

下载最新 KVMTool

下载另外一个经常更新的 KVMTOOL 并编译源码。

sudo apt-get install libfdt-dev
git clone git://git.kernel.org/pub/scm/linux/kernel/git/will/kvmtool.git
cd kvmtool && make

小结

完结撒花!


http://www.kler.cn/a/590913.html

相关文章:

  • [快乐学坊management_1] With Cursor | Mysql设计 | 服务接口设计与开发
  • 2、idea里Maven项目如何打成jar或war包
  • 二叉树深度优先搜索:从递归到剪枝六大高频题解析
  • 使用Ajax技术进行动态网页的爬虫(pycharm)
  • 【如何在OpenWebUI中使用FLUX绘画:基于硅基流动免费API的完整指南】
  • 字符串模板(单文件组件、JSX)
  • 3月18号
  • DeepSeek本地部署:从零开始打造安全高效的AI私域环境
  • 基于FPGA的3U机箱温度采集板PT100,应用于轨道交通/电力储能等
  • 【Axios 开发中的代理配置陷阱与解决方案】
  • 从信息熵上看图像
  • Linux 网络基础设置
  • 利用Python爬虫获取Shopee(虾皮)商品详情:实战指南
  • 导出的使用
  • zabbix统计闲置资产
  • centos6.10 编译gcc11.5.0 支持mutilib(32bit,64bit)glibc2.11.3
  • 蓝桥杯备考:特殊01背包问题——》集合subset
  • c++图论(二)之图的存储图解
  • wx142基于django+vue+uniapp的摄影竞赛小程序
  • leetcode-47.全排列II