👁 795
⚠️ 刷 UEFI 高风险,没有自救能力的千万别刷!
刷 SPI 固件属于高风险操作:万一不开机(变砖),没有外置 SPI 编程器、烧录夹和原机 SPI 备份,基本救不回来。刷前务必先完整备份原机固件(mtd0 全量)。本博客不对你刷 UEFI 承担任何风险!刷坏了自己负责。
关键词:RK3588 · UEFI · edk2 · GRUB · Arch Linux ARM · 多系统引导 · 类BIOS · 彼度云 G98
日期:2026-08-27 · 全文通读约 15 分钟
一、起因
手里有一台彼度云 BDY G98——RK3588 的 NAS 设备:16GB LPDDR4X、eMMC、双 M.2 NVMe、SATA、RTL8126 2.5G 网卡、8口交换机、HDMI。出厂是 fnOS/NAS 系统,U-Boot 引导。
想把它改造成一台”想装哪装哪、开机跟 PC BIOS 一样选系统”的机器:
- SPI 里刷 UEFI 固件(替代原厂 U-Boot)
- 制作 Arch Linux ARM 专用镜像(dd 即用)
- 定制 类 BIOS 开机体验(开机 Logo、图形引导菜单、多系统、快捷键)
- 支持任意存储上任意系统(SD 卡普通镜像也能引导)
二、开工前的功课
先把手头的固件和资料全部分析了一遍:
| 资源 | 结论 |
|---|---|
| 原厂 SPI 备份 (32MB) | 是 U-Boot(引擎确认含 “BYD G98 Compiled By yifengyou”) |
| 官方 RKDevTool + uboot.img | 原厂 U-Boot,平台树是 rk3588-evb(和 edk2 固件同款!) |
| fnOS 定制 DTS | G98 硬件全配置参考(电源/PCIe/SATA/HDMI…) |
| Armbian wayos-g98 镜像 | 官方适配,内核 6.1.141,有 yt921x 交换机驱动 + r8126 |
| 启动故障日志 | 确认:DDR v1.18、16GB LP4X 2112MHz、UART2、Verified-boot=0 |
关键发现:edk2-rk3588 的所有板级固件,核心(UEFI+ATF+TEE+DDR bin)完全相同,差异只在板级 DTB;而且它们用的平台树和 G98 原厂 U-Boot 一样都是 rk3588-evb——天生兼容。
三、踩过的坑(本篇精华)
坑 1:这个网络环境会”吃掉”大文件
下载 800MB 的 ArchLinuxARM rootfs,无论 wget/curl/aria2 都反复损坏,TLS 连接直接被中间设备破坏(SSL decryption failed),HTTP 大流量也会被篡改。小文件却没事。
解法:分段 + 双源对比下载。写了个 Python 脚本:每个 8MB 段同时从 ustc 和 aliyun 各下一次,MD5 一致才保留,不一致自动重试;包管理阶段对 464 个包同样处理(大包分段双源、小包直下重试)。
[42/461] mutter: ✓ (2MB) [27/27] linux-aarch64: ✓ (61MB)
坑 2:pacman 沙箱在 qemu/chroot 下罢工
error: restricting filesystem access failed because Landlock is not supported by the kernel! error: switching to sandbox user 'alpm' failed!
解法(三层):
useradd -r alpm(补沙箱用户)- pacman.conf 启用
DisableSandboxFilesystem/DisableSandboxSyscalls - 顺带
#CheckSpace关掉空间误判(chroot 里 statvfs/mount 解析会误报磁盘满)
坑 3:chroot 里 DNS 全挂
Could not resolve host: mirrors.ustc.edu.cn
排查半天:Arch 的 nsswitch.conf 用了 resolve 模块(systemd-resolved 的 NSS),chroot 里没有 → [!UNAVAIL=return] 直接拦截后不再走 DNS。
解法:
hosts: files myhostname dns ← 去掉 resolve rm -f /etc/resolv.conf ← 干掉指向 /run 的软链 echo nameserver 223.5.5.5 > /etc/resolv.conf
坑 4:镜像源路径不对
ArchLinuxARM 的 pacman 镜像结构是 $arch/$repo(不是 os/aarch64):
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/$arch/$repo
试过的路径里只有 aarch64/core/core.db 返回 200。
坑 5:GRUB arm64 模块名”改名”了
grub-mkimage 报找不到模块:
devicetree.mod→ 现在是fdt.moddm_nvme.mod→ 现在是dm_nv.modinitrd.mod/efi_uga.mod不存在了(内建/去掉)
grub-mkimage -O arm64-efi -p /boot/grub -o bootaa64.efi linux normal search search_fs_file ext2 fat btrfs chain configfile terminal gfxterm help reboot halt all_video font efi_gop part_gpt part_msdos disk efifwsetup fdt cat echo test sleep ...
坑 6:loop 镜像满盘 & dd 超时
第一次做镜像 dd 4GB 用掉 30+ 分钟还超时(外接盘写零慢)——改用 truncate 稀疏镜像秒建,再分区格式化。rootfs 比预估大,第一次 3.4G 根分区写满 rsync 报错,重建 12GB 镜像解决。
坑 7:FIT 打包签名
想”照着 h88k 改一个显示 G98 的固件”:
- 提取 FIT → 改板级 DTB 的
model/compatible→ mkimage 重打包 - 原固件 FIT 是 RSA2048 签名(dev key),改 DTB 需要私钥——拿不到
- 但发现 G98 原机日志
Verified-boot: 0(未开安全启动)→ SPL 不强制验签,只查 hash - 于是去掉签名节点、mkimage 自动重算 SHA256 → 产物 hash 与 DTB 完全匹配 ✓
产出:bdy-g98_UEFI_Release_v1.1.img——UEFI 阶段机型显示 “BDY G98″,与 h88k 原版仅差板级 DTB 标识。
四、构建产物
1. G98 专用 UEFI 固件(SPI,6.2MB)
- 基于 edk2-rk3588 v1.1(h88k 版)定制
- 平台树 model/compatible 改为 “BDY G98″(保留 evb 结构保证兼容)
- DDR bin v1.18 与原厂完全一致(从原 SPI 提取对比确认)
- idblock 区逐字节不变,FIT hash 验证通过
2. Arch Linux ARM UEFI 镜像(12GB,dd 即用)
| 组件 | 版本 |
|---|---|
| 内核 | Linux 7.2 (linux-aarch64) |
| 桌面 | GNOME 50 + GDM (Wayland) |
| GPU | Mesa 26.2 / Panfrost (Mali G610) |
| 引导 | GRUB 2.14 (UEFI) + 备用 systemd-boot |
| 分区 | p1 ESP 512MB + p2 ROOT 11.5GB (GPT) |
| 驱动 | NVMe / AHCI / SDHCI / dw-mmc 内建 |
3. 类 BIOS 定制引导环境(ESP 内)
ESP/ ├── EFI/BOOT/bootaa64.efi GRUB 主引导 (1.1MB PE32+) ├── boot/grub/grub.cfg BIOS 风格多系统菜单 + countdown ├── boot/grub/themes/bdy98/ 红色 FreeBSD 开机 Logo + godsun 品牌 ├── Shell.efi UEFI Shell ├── Image + initramfs + dtbs/rockchip/(60个rk3588+专用g98树)
开机流程(类 BIOS):
上电 → 红标 Logo 全屏 → 8秒 countdown(Press any key…) ├─ 无按键 → 自动引导上次/默认系统 (savedefault) ├─ 任意键 → 完整菜单(Arch/fnOS/UEFI Shell/重启/关机/设备引导…) └─ 菜单按 F2 → UEFI 固件设置
4. SD 卡普通镜像启动补丁
普通 Armbian/Ubuntu 镜像没有 EFI 结构,UEFI 扫不到。补丁原理:Armbian 内核是标准 Image 格式(验证过),GRUB 可以直接引导;补丁 = bootaa64.efi + grub.cfg,复制进 SD 的 boot 分区即可。
五、驱动实况(诚实清单)
| 硬件 | 主线 Arch 7.2 | Armbian 6.1 / fnOS |
|---|---|---|
| GPU (Panfrost) | ✅ | ✅ |
| RTL8126 2.5G | ✅(r8169 原生 10ec:8126) | ✅ vendor |
| 双千兆 | ✅ 内建 | ✅ |
| YT9215 交换机 8口 | ❌ 主线无驱动 | ✅ (yt921x) |
| NVMe ×2 / SATA / eMMC | ✅ 内建 | ✅ |
| NPU | ❌ 主线无 | fnOS 有 |
所以多系统方案最有价值:桌面日常用 Arch,需要满血 NAS 网络/NPU 时切 fnOS——开机菜单一键换。
六、刷机三步
# 1. SPI 刷 UEFI(先备份原厂!) sudo dd if=/dev/mtd0 of=spi-backup.img bs=1M sudo flash_erase /dev/mtd0 0 0 sudo flashcp -v bdy-g98_UEFI_Release_v1.1.img /dev/mtd0 # 2. 存储写入镜像 sudo dd if=bdy-g98-archlinux-uefi-20260827.img of=/dev/nvme0n1 bs=4M status=progress # 3. 开机 F2 进设置选 Device Tree 模式 → 自动进系统
七、待真机验证项
静态验证过了:分区、固件结构、DDR bin、hash、驱动内建、grub 语法、路径存在。只有真机才能确认的:UEFI 点亮、DDR 初始化、GRUB 实际引导、交换机驱动工作与否、SPI 键位。等设备到货 → 逐项实测。
八、经验总结
- 给 RK3588 换 UEFI 不是玄学:edk2-rk3588 发布固件核心全通用,平台树都是 evb,DDR bin 和原厂一致,兼容性有底。
- “类 BIOS” 不需要重编译 edk2:GRUB 主题 + countdown + savedefault + fwsetup 热键,组合起来就是 PC BIOS 手感,全部文件在 ESP 里随意改。
- 网络坑永远是第一个大坑:分段+双源+哈希校验是脚本化安全下载的通用解法。
- chroot 三件套(alpm 用户 / 禁沙箱 / 修 nsswitch+DNS)是所有”qemu 里装 Arch”都绕不开的必修课。
- 主线内核 ≠ 全驱动:交换机/NPU 这类 BSP 驱动要用”多系统”思路而不是硬移植。
构建环境:Linux ×86_64 + qemu-aarch64-static 装 ArchLinuxARM · 全程脚本化(build-bdy-g98.sh / verify-final.sh)
💖 打赏支持
如果这篇文章帮到了你,欢迎打赏支持
微信扫一扫,赞赏支持
发表回复