近日,OpenCloudOS RISC-V SIG 成功适配 EDK II,适配成果得到了 OpenCloudOS 社区的认可。仅需一条命令,即可体验从固件到操作系统的奇妙旅程,目前,包含 EDK II 的发行版已经发布到了 OpenCloudOS 镜像官方网站[1],欢迎尝鲜。

此次工作由中国科学院软件研究所 PLCT 实验室实习生 Luna 完成,mentor 是来自苦芽科技的工程师孙敏,委托培养社区为 OpenCloudOS 社区,这是「甲辰计划开源实习生联合招聘培养」的一部分。

OpenCloudOS 简介

OpenCloudOS(简称 OC)是由国内领先科技企业联合发起并维护的开源云原生操作系统项目。作为面向云基础设施和边缘计算场景设计的下一代 OS,其核心特性包括:

  • 云原生架构
  • 高性能内核
  • 全栈国产化适配
  • 安全合规体系

OC 社区 RV SIG 简介

OC RISC-V Special Interest Group(OC RV SIG)是 OpenCloudOS 社区中专注于 RISC-V 架构适配的核心工作组,主要使命包括:

  • 硬件适配及内核支持
    支持 SG2042、 EIC7700x、UR-DP1000 等主流 RISC-V 核心的深度适配 内核同源支持,在 oc-kernel 下对 RISC-V 架构进行 lts 维护
  • 软件栈构建 支持 SG2042、 EIC7700x、UR-DP1000 等主流 RISC-V 核心的深度适配
    开发轻量化 Runtime 容器,支持 RISC-V 容器镜像跨架构构建。 支持 RVA23 基线,构建高性能 RISC-V 操作系统。

EDK II 简介

EDK II 是 Intel 公司开发的开源 BIOS 项目,用于构建 BIOS 固件。该项目提供了一套完整的 BIOS 开发环境,包括编译工具链、编译脚本、BIOS 源代码等。该项目本身为开源 UEFI 项目,基于 Intel 的 UEFI 标准,也适用于 RISC-V 架构。

适配思路

启动链:

> QEMU内置的OpenSBI -> EDK II引导 -> GNU GRUB -> OpenCloudOS Kernel -> OpenCloudOS Initramfs -> OpenCloudOS Rootfs

  • EDK II 引导启动链时会读取第一个`vfat`格式的磁盘,并读取文件`bootriscv64.efi`(由于系统是 64 位),作为启动引导。
  • 该文件是 EDK II 项目提供的,用于引导 EDK II 项目。
  • 在启动链中将 GNU GRUB 作为引导程序,加载 OpenCloudOS Kernel。
  • GNU GRUB 会加载 OpenCloudOS Kernel,并加载 OpenCloudOS Initramfs,随后进入 rootfs。

适配难点

  • 在 OpenCloudOS 内核,需要开启 CONFIG_NUMA
  • OpenCloudOS 的 rootfs 中,对需要读取的目标硬盘的 UUID 硬编码在/etc/fstab 中。因此当迁移该 rootfs 时需手动写入当前硬盘 UUID。
  • 自行编译的内核和硬件架构之间必须匹配——如果在操作系统层面启用了扩展功能,在虚拟机(或实际硬件)中必须有对应的扩展功能。
  • EDK II 生成的两个 UEFI 文件推荐设定为 32MB,以和 RISC-V 启动过程中的 ROM 加载匹配。

如何用 QEMU 体验发行版?

注意!需要 QEMU 版本:>=8.0.0

自行构建镜像

参考文末链接[2][3][4]。

直接运行官方镜像

wget -r -np -nH --cut-dirs=6 -P ocs-riscv --reject="index.html*" https://mirrors.opencloudos.tech/opencloudos-stream/releases/23/images/riscv64/uefi-qemu/ && cd ocs-riscv && unxz -dv ocs23-riscv-uefi-20250716.qcow2.xz

基于 QEMU 模拟启动

  • 在 Linux 环境下:
qemu-system-riscv64 \
    -machine virt,pflash0=pflash0,pflash1=pflash1,acpi=off \
    -cpu max \
    -nographic \
    -m 8G \
    -smp 8 \
    -blockdev node-name=pflash0,driver=file,read-only=on,filename=./uefi/RISCV_VIRT_CODE_32M.fd \
    -blockdev node-name=pflash1,driver=file,filename=./uefi/RISCV_VIRT_VARS_32M.fd \
    -drive file=./luna_oc_riscv_6.6.94.qcow2,format=qcow2,if=virtio,index=0,media=disk
  • 在 Windows PowerShell 环境下:
qemu-system-riscv64 ^
	-cpu max ^
	-m 8G ^
	-smp 8 ^
	-nographic ^
	-machine virt,pflash0=pflash0,pflash1=pflash1,acpi=off ^
	-blockdev node-name=pflash0,driver=file,read-only=on,filename=./uefi/RISCV_VIRT_CODE_32M.fd ^
	-blockdev node-name=pflash1,driver=file,filename=./uefi/RISCV_VIRT_VARS_32M.fd ^
	-device usb-ehci,id=ehci ^
	-device usb-kbd,bus=ehci.0 ^
	-serial mon:stdio ^
	-boot menu=on ^
	-drive file=./luna_oc_riscv_6.6.94.qcow2,format=qcow2,if=virtio ^
	-netdev user,id=net0,hostfwd=tcp::88-:22,hostfwd=tcp::396-:5432 ^
	-device virtio-net-device,netdev=net0

QEMU 启动成功的截图

Linux 环境下

图片

Windows PowerShell 环境下

图片

下一步计划

目前正在尝试构建一个自动化构建的程序,基于 EDK2、GNU GRUB,自动构建一个可引导的 linux 系统的 iso 镜像。

该问题需要等待系统上游的一些驱动程序相关的问题被解决,否则仍需要使用现有配置文件。

鸣谢

感谢山东大学戴鸿君教授带领的 UEFI 团队的技术支持,感谢 OC 社区陈鑫龙老师的鼎力支持。

关于实习生 Luna

“一只喜欢摸鱼的大型猫科动物,有时会在电脑旁一杯咖啡坐一天”

参考链接

[1] https://mirrors.opencloudos.tech/opencloudos-stream/releases/23/images/riscv64/uefi-qemu/

[2] https://github.com/LunaticLegacy/OpencloudOsLaunch.git

[3] https://gitee.com/lunaneko/OpencloudOsLaunch

[4] https://github.com/AII-SDU/rv-sp-test-mod.git