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
小结
完结撒花!