PS: 本文首发于格维开源社区微信公众号 GTOC 。
目前支持 RISCV 虚拟化扩展的硬件不是很多,对于想尝鲜的朋友,可以使用 QEMU 来模拟。下文给出详细的教程。
基本思路是采用 QEMU 软件模拟一个 RISCV SoC(virt Machine),在上面运行 Ubuntu 发行版,然后在 Ubuntu 上使用虚拟化运行 Linux 。
一、基本环境准备。
以宿主机(x86-64)为 Ubuntu 操作系统环境为例,需要安装以下几款软件包:
sudo apt updatesudo apt install opensbi qemu-system-misc u-boot-qemu
如果你想体验最新的 QEMU ,可以在官网下载并手动编译。
另外需要准备一个 RISC-V 版本的 Ubuntu 镜像,用于模拟 RISC-V 硬件虚拟化的使用环境。直接在 Ubuntu 官网下载即可(由于下载链接常更新,避免失效,本文不贴附链接),这里推荐使用 preinstalled 版本,不需要自己手动安装操作系统。
镜像下载好以后,需要解压和扩容:
# 解压下载好的镜像xz -dk ubuntu-24.04.2-preinstalled-server-riscv64.img.xz# 镜像扩容qemu-img resize -f raw ubuntu-24.04-preinstalled-server-riscv64.img +5G
使用如下命令启动 RISC-V Ubuntu 镜像:
qemu-system-riscv64 \ -machine virt -nographic -m 4096 -smp 32 \ -kernel /usr/lib/u-boot/qemu-riscv64_smode/uboot.elf \ -device virtio-net-device,netdev=eth0 -netdev user,id=eth0,hostfwd=tcp::2222-:22 \ -device virtio-rng-pci \ -drive file=ubuntu-25.04-preinstalled-server-riscv64.img,format=raw,if=virtio
这里我们配置了 virt Machine 来运行客户机操作系统(virt 默认开启了对 H 扩展的支持),不需要图形界面,通过命令行终端打印客户机串口输出,并允许人机交互。
QEMU 启动 RISC-V 的第一阶段 boot 是 OpenSBI,在 7.0 版本以前需要通过 -bios 选项指定,后续高版本,QEMU 默认自动加载,无需手动指定。第二阶段,通过 U-Boot 来引导 kernel 。
我们还分配了 4 GiB 内存,32 个 vCPU 核心(u-boot 最大支持数量),另外我们还配置了网络直通,并把客户机的 22 端口映射到宿主机的 2222 端口,以便通过 ssh 等远程连接工具访问虚拟机。
二、配置 RISC-V Ubuntu。
成功启动 Ubuntu 以后,将会看到以下打印信息,我们使用默认的用户名 ubuntu 来登录,并修改初始密码 ubuntu 为你需要的密码,操作如下:
...[ OK ] Started [email protected] - Getty on tty1.[ OK ] Reached target getty.target - Login Prompts.Ubuntu 25.04 ubuntu ttyS0ubuntu login: ubuntu # 输入用户名Password: ubuntu # 输入密码,之后会提示你修改初始密码...Welcome to Ubuntu 25.04 (GNU/Linux 6.14.0-13-generic riscv64)
成功登录以后,我们简单验证一下客户机操作系统是否支持虚拟化:
grep isa /proc/cpuinfo isa : rv64imafdch_zicbom_zicboz_ziccrse_zicntr_zicsr_zifencei_zihintntl_zihintpause_zihpm_zawrs_zfa_zca_zcd_zba_zbb_zbc_zbs_sstc_svadu_svvptc...
可以看到 32 个 CPU 的 isa 部分,都有 h 扩展的字符,这说明我们模拟的硬件是支持虚拟化扩展的。
接着配置一下环境,为了方便使用虚拟化能力来运行 Linux,我们依旧可以通过 QEMU 来实现,先安装一些必要软件包(由于开启了网络直通,可以直接安装):
sudo apt update;sudo apt upgrade -ysudo apt install qemu-system
我们使用 Revyos 提供的 RISC-V 虚拟化测试镜像及脚本进行验证:
sudo apt install -y wget # 如系统未安装 wget 工具,请先安装wget https://mirror.iscas.ac.cn/revyos/extra/kvm_demo/rootfs_kvm_guest.img \https://mirror.iscas.ac.cn/revyos/extra/kvm_demo/start_vm.sh \https://mirror.iscas.ac.cn/revyos/extra/kvm_demo/Imagechmod +x start_vm.sh; ./start_vm.sh # 启动 KVM
成功启动以后,输出如下:
...[ 6.538768] Freeing unused kernel image (initmem) memory: 2200K[ 6.561827] Run /init as init process _ _ | ||_| | | _ ____ _ _ _ _ | || | _ \| | | |\ \/ / | || | | | | |_| |/ \ |_||_|_| |_|\____|\_/\_/ Busybox RootfsPlease press Enter to activate this console./ # uname -aLinux (none) 6.6.30 #1 SMP Sat May 11 15:15:11 UTC 2024 riscv64 GNU/Linux/ #
接下来,就可以愉快地开启 KVM 虚拟化体验体验之旅啦~