在 Lenovo ThinkPad X200 与 HP EliteBook 820 G2 上构建并刷写带 UEFI 的 coreboot

警告:作者在笔记本看似正常工作后编写了此指南,未来可能会遇到问题。作者不对按照此指南操作造成的任何损害负责。

前言

我曾在我的 Lenovo ThinkPad X200HP EliteBook 820 G2 上刷写过 Libreboot,但它们仅支持 SeaBIOS,而 SeaBIOS 仅支持 CSM。Libreboot 文档说明其 U-Boot 支持 EFI 启动,但我从未成功。Tianocore 是自由软件社区中成熟的 UEFI 实现,我最近发现可以使用 EDK II(Tianocore 的一个项目)构建并刷写 coreboot,从而获得 EFI 启动支持。

昨天,我完成了两台机器的构建与刷写,现分享操作流程。

Lenovo ThinkPad X200

对于 Lenovo ThinkPad X200,步骤相对简单,可以直接在原厂固件上刷写。如果你当前使用 Libreboot,我建议先恢复原厂固件,因为直接覆盖 Libreboot 我未测试过。

步骤 1:检查芯片容量

使用 iomem=relaxed 参数启动机器。如果你使用 Debian 13 或其仓库已包含 flashprog,可直接安装而无需编译源代码:

 # apt install flashprog

在机器上执行:

 # flashprog -p internal

你将看到芯片容量。如果是 4 MiB,你的机器可能不支持 EDK II 下的 coreboot,固件构建很可能失败,但仍可尝试。如果是 8 MiB,则支持——我的 X200 为 8 MiB。

步骤 2:构建固件

获取并准备 coreboot:

 $ git clone https://review.coreboot.org/coreboot
 $ cd coreboot
 $ make help_toolchain
 $ make crossgcc-i386 CPUS=$(nproc)
 $ make -C payloads/coreinfo olddefconfig
 $ make -C payloads/coreinfo

打开 menuconfig:

 $ make menuconfig

操作如下:

  • Mainboard 部分选择 Lenovo, ThinkPad X200 / X200s / X200t 及芯片容量。
  • Payload 部分选择 edk2,禁用 Enable UEFI Secure Boot support,启用 Disable TPM support in edk2
  • 其他保持默认,退出并保存配置。

然后运行:

 $ make -j$(nproc)

固件将生成在 ./build/coreboot.rom

步骤 3:刷写固件

在另一台机器上准备 flashprog,可通过包管理器安装或自行编译。

按照 此指南 的第 2、5 步以及第 6 步前半部分操作,然后仅刷写 bios 区域:

 # flashprog -p serprog:dev=/dev/ttyACMx,spispeed=8M -w /path/to/rom/file.rom -c "MX25L6405D" --ifd -i bios

启动机器,应显示 coreboot Logo。完成。

HP EliteBook 820 G2

该流程比 Lenovo ThinkPad X200 稍复杂。

步骤 1:刷写 Libreboot

我不清楚如何在原厂固件上刷写 coreboot,请先按 此指南 刷写 Libreboot,然后再在其上刷写 coreboot。

步骤 2:提取 blobs

步骤 2.1:提取芯片内容

多次提取芯片,并比较 ROM 文件的哈希:

 # flashprog -p serprog:dev=/dev/ttyACMx,spispeed=8M -r /path/to/rom/file1.rom -c "MX25L12805D"
 # flashprog -p serprog:dev=/dev/ttyACMx,spispeed=8M -r /path/to/rom/file2.rom -c "MX25L12805D"
 ...
 $ sha256sum /path/to/rom/file1.rom
 $ sha256sum /path/to/rom/file2.rom
 ...

哈希不同则重复,若一致则继续。

步骤 2.2:从 ROM 文件提取 blobs

提取 memory reference code 和 external reference code:

 $ ./build/cbfstool /path/to/extracted/rom/file.rom extract -n mrc.bin -f /path/where/you/want/to/store/your/mrc.bin -m x86
 $ ./build/cbfstool /path/to/extracted/rom/file.rom extract -n fallback/refcode -f /path/where/you/want/to/store/your/refcode.bin -m x86

步骤 3:构建固件

获取并准备 coreboot:

 $ git clone https://review.coreboot.org/coreboot
 $ cd coreboot
 $ make help_toolchain
 $ make crossgcc-i386 CPUS=$(nproc)
 $ make -C payloads/coreinfo olddefconfig
 $ make -C payloads/coreinfo

打开 menuconfig:

 $ make menuconfig

操作如下:

  • Mainboard 部分选择 HP, EliteBook 820 G2 及芯片容量,设置 Size of coreboot owned area in ROM0x600000
  • Chipset 部分选择步骤 2.2 提取的 memory reference code 和 external reference code。
  • Payload 部分选择 edk2。
  • 其他保持默认,退出并保存。

然后运行:

 $ make -j$(nproc)

固件位于 ./build/coreboot.rom

步骤 4:刷写固件

在另一台机器上准备 flashprog,连接编程器,仅刷写 bios 区域:

 # flashprog -p serprog:dev=/dev/ttyACMx,spispeed=8M -w /path/to/rom/file.rom -c "MX25L12805D" --ifd -i bios --no-verifyall

请勿移除 --no-verifyall,否则可能出错。即使使用该选项,flashprog 仍会在刷写后验证。

启动机器,应显示 coreboot Logo。完成。