OrangePi 3B 编译 UEFI 固件

发布于 2026-08-09 22:15 1255 字 7 min read

Madobi Nanami avatar

Madobi Nanami

Nanami 的个人技术博客,记录网络、运维、虚拟化与逆向的实践。

就在前几天 (2026-08-05), Proxmox VE 官方宣布了对 Arm64 平台的支持. 这使得我想起了实验室学长们送我的那块 OrangePi 3B 开发板, 索性尝试使用这块开发板来启动 Proxmox VE 原生的 iso 映像文件. 由于 Proxmox VE 官方提供的映像文件是需要使用 efi 启动的, 查了一圈发现没有专门给 OrangePi 3B 编译的 UEFI...

前言

就在前几天 (2026-08-05), Proxmox VE 官方宣布了对 Arm64 平台的支持. 这使得我想起了实验室学长们送我的那块 OrangePi 3B 开发板, 索性尝试使用这块开发板来启动 Proxmox VE 原生的 iso 映像文件. 由于 Proxmox VE 官方提供的映像文件是需要使用 efi 启动的, 查了一圈发现没有专门给 OrangePi 3B 编译的 UEFI 固件, 索性自己尝试编译

本文操作环境

       _,met$$$$$gg.             nanami114@VM-Main 
    ,g$$$$$$$$$$$$$$$P.          ----------------- 
  ,g$$P"        """Y$$.".        OS: Debian GNU/Linux 13.4 (trixie) x86_64 
 ,$$P'              `$$$.        Host: KVM/QEMU (Standard PC (i440FX + PIIX, 1996) pc-i440fx-11.0) 
',$$P       ,ggs.     `$$b:      Kernel: 6.12.74+deb13+1-amd64 
`d$$'     ,$P"'   .    $$$       Uptime: 29 days, 3 hours, 15 mins 
 $$P      d$'     ,    $$P       Packages: 3 (npm), 1526 (dpkg) 
 $$:      $$.   -    ,d$$'       Shell: bash 5.2.37 
 $$;      Y$b._   _,d$P'         Resolution: 1280x800 
 Y$$.    `.`"Y$$$$P"'            Terminal: /dev/pts/1 
 `$$b      "-.__                 CPU: Intel Xeon E5-2696 v4 (44) @ 2.1GHz 
  `Y$$                           GPU: Vendor 1234 Device 1111 
   `Y$$.                         Memory: 20.74 GiB / 31.33 GiB (66%) 
     `$$b.                       Network: Unknown 
       `Y$$b.                    BIOS: SeaBIOS 0.0 (04/01/2014) 
          `"Y$b._
              `"""                                       
                                                         

开整

1. 编译 UEFI

1.1 准备材料

  • 在 GitHub 中有一个叫做 quartz64_uefi 的项目专门给 RK356X 的平台适配了 UEFI, 所以我们可以从这里入手. 首先 clone 该仓库
git clone https://github.com/jaredmcneill/quartz64_uefi
  • 查看项目结构, 发现项目中已经包含了专门为 Orange Pi 3B 的 platform, device tree, drivers 等, 并且 build.sh 中也有适用于 OrangePi 3B 的构建流程. 所以这里可以尝试直接构建
    quartz64_uefi 项目中的 OrangePi 3B 平台目录结构
    quartz64_uefi 项目中的 OrangePi 3B 平台目录结构
for board in ${RKUEFIBOARDS}; do
        case ${board} in
        QUARTZ64)
                build_uefi Pine64 Quartz64
                build_fit Quartz64 rk3566-quartz64-a
                ;;
        SOQUARTZ)
                build_uefi Pine64 SOQuartz
                build_fit SOQuartz rk3566-soquartz-cm4
                ;;
        ROC-RK3566-PC)
                build_uefi Firefly ROC-RK3566-PC
                build_fit ROC-RK3566-PC rk3566-roc-pc
                ;;
        ROC-RK3568-PC)
                build_uefi Firefly ROC-RK3568-PC
                build_fit ROC-RK3568-PC rk3568-firefly-roc-pc
                ;;
# OrangePi 3B Here...
        ORANGEPI3B)
                build_uefi OrangePi OrangePi3B
                build_fit OrangePi3B rk3566-orangepi-3b
                ;;
        PINETAB2)
                build_uefi Pine64 PineTab2
                build_fit PineTab2 rk3566-pinetab2
                ;;
        ZERO-3W)
                build_uefi Radxa Zero-3W
                build_fit Zero-3W rk3566-radxa-zero-3w
                ;;
        ODROID-M1S)
                build_uefi HardKernel Odroid-M1S
                build_fit Odroid-M1S rk3566-hardkernel-odroid-m1s
                ;;
        *)
                echo "Unknown board ${board}"
                exit 1
                ;;
        esac
done

1.2 检查环境

  • 检查 Git 子模块状态
git submodule status

如果你当前所处的目录属主与当前执行的用户不一致, 则 Git 会报错 dubious ownership, 此时执行这条指令添加信任

git config --global --add safe.directory path/to/quartz64_uefi
  • 检查编译工具链 由于博主这里是在 amd64 架构的设备上去编译 arm64 的固件, 故这里需要配置交叉编译工具链. 我们从官方 CI 配置文件中提取依赖清单并安装
cat .github/workflows/build.yml

从这份配置文件中我们可以得到官方构建所需要的所有依赖, 分别为 gcc-aarch64-linux-gnu iasl device-tree-compiler python3-pyelftools uuid-dev. 这里我们直接安装

sudo apt-get update
sudo apt-get install -y --no-install-recommends gcc-aarch64-linux-gnu iasl device-tree-compiler python3-pyelftools uuid-dev
  • 检查 edk2-rockchip 目录性质
git -C ed2k-rockchip rev-parse HEAD
ls edk2-rockchip/.git
git ls-files | grep edk2-rockchip

执行完后我们可以发现, 项目里 edk2-rockchip/ 和 edk2-rockchip-non-osi/rkbin/ 是 platform 代码和 Rockchip 官方 vendor 组件 (DDR 初始化固件, BL31, OP-TEE, boot_merger/ddrbin_tool 工具). 我们需要确认它们是 submodule 还是直接打进 git 的:

  • .git 文件不存在, 同时 git ls-files 显示 234 个文件被直接跟踪. 因此得出它们是 vendored 进主仓库的, 我们只需要克隆主仓库就齐了.
  • 只有 edk2 是真正的 submodule, 因此只有 edk2 需要单独初始化.

1.3 初始化编译环境

  • 这里我们更新并初始化所有 submodule
git submodule update --init --recursive
  • --rescursive 的作用是连带嵌套 submodule 一起克隆 edk2 自己还有 cmocka/googletest/subhook 等测试框架子模块
  • edk2 是一个 200MB+ 的大仓库, 这里更新需要拥有一个稳定的网络环境.

1.4 尝试编译

  • 使用 make 工具启动构建
make BOARDS=ORANGEPI3B uefi

这里通常只需要等待几分钟, 如果编译时间过长请检查之前的动作有没有问题

  • 编译完成后, 使用 make 编译一个可烧录进 SD 卡的映像文件
make BOARDS=ORANGEPI3B sdcard

这里需要提前安装 parted, 否则会报错

  • 编译完成后我们会得到一份 ORANGEPI3B_EFI.img 文件, 这份文件可以直接烧录进 SD 卡尝试启动.

2. 启动 UEFI

2.1 烧录

使用 Win32DiskImager 将 ORANGEPI3B_EFI.img 烧录至 SD 卡即可.

2.2 启动

重启之后会看到 Orange Pi 的 Logo, 还有 tianocore 项目的文字. 如果没有插入任何启动设备, 则会自动进入 BIOS.

OrangePi 3B 启动后进入 UEFI 设置界面
OrangePi 3B 启动后进入 UEFI 设置界面

据了解, 在以前的版本中, 只有 USB3.0 处于可用状态. 但这里博主编译的版本, 四个 USB-A 接口都处于可用状态.

2.3 烧录系统

这里可以使用 UltraISO 之类的软件, 将可启动映像烧录至 U 盘等存储介质中, 然后直接上电启动, UEFI 会自动引导到您的安装介质.

使用镜像工具将 UEFI 固件烧录到 SD 卡
使用镜像工具将 UEFI 固件烧录到 SD 卡
至此, 整个 UEFI 编译及烧录过程就结束了.


结语

本人并非专业人士, 如有错误或疏漏请指出, 谢谢!

附件

ORANGEPI3B_EFI.zip


相关阅读

喜欢的话,留下你的评论吧~

随机文章

加载中...