👁 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 一样选系统”的机器:

  1. SPI 里刷 UEFI 固件(替代原厂 U-Boot)
  2. 制作 Arch Linux ARM 专用镜像(dd 即用)
  3. 定制 类 BIOS 开机体验(开机 Logo、图形引导菜单、多系统、快捷键)
  4. 支持任意存储上任意系统(SD 卡普通镜像也能引导)

二、开工前的功课

先把手头的固件和资料全部分析了一遍:

资源结论
原厂 SPI 备份 (32MB)是 U-Boot(引擎确认含 “BYD G98 Compiled By yifengyou”)
官方 RKDevTool + uboot.img原厂 U-Boot,平台树是 rk3588-evb(和 edk2 固件同款!)
fnOS 定制 DTSG98 硬件全配置参考(电源/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.mod
  • dm_nvme.mod → 现在是 dm_nv.mod
  • initrd.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)
GPUMesa 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.2Armbian 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 键位。等设备到货 → 逐项实测。

八、经验总结

  1. 给 RK3588 换 UEFI 不是玄学:edk2-rk3588 发布固件核心全通用,平台树都是 evb,DDR bin 和原厂一致,兼容性有底。
  2. “类 BIOS” 不需要重编译 edk2:GRUB 主题 + countdown + savedefault + fwsetup 热键,组合起来就是 PC BIOS 手感,全部文件在 ESP 里随意改。
  3. 网络坑永远是第一个大坑:分段+双源+哈希校验是脚本化安全下载的通用解法。
  4. chroot 三件套(alpm 用户 / 禁沙箱 / 修 nsswitch+DNS)是所有”qemu 里装 Arch”都绕不开的必修课。
  5. 主线内核 ≠ 全驱动:交换机/NPU 这类 BSP 驱动要用”多系统”思路而不是硬移植。

构建环境:Linux ×86_64 + qemu-aarch64-static 装 ArchLinuxARM · 全程脚本化(build-bdy-g98.sh / verify-final.sh)