助力 OpenCloudOS 适配 Milk-V Megrez 开发板
近日,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