你 免 费 了 | 给 ThinkPad x220i 装 coreboot

⚠本篇内容不是教程,只是记录一下操作过程,如果你跟着做的时候出现了什么差错导致机器出了什么问题,后果自负。⚠

1. 前言

1.1 什么是 coreboot?

coreboot (前 LinuxBIOS) 是一个开源软件项目,旨在取代计算机中专有固件(BIOS或UEFI)的软件项目,它采用轻量级固件设计,只执行加载和运行现代 32 位或 64 位操作系统所需的最少量任务。

1.2 我为什么要装 coreboot?

  • 开源软件,有各种 payload 可选,可定制化程度高,比较安全 (?) 。
  • 启动速度比原厂快。
  • 支持一些 ThinkPad 不支持的无线网卡,方便我把原先机器里自带的速度巨慢的 2.4GHz Wi-Fi 换掉。
  • 我的笔记本,我乐意。

2. 开搞

2.1 需要点啥

在 X220i 上安装 coreboot 只能采用刷写芯片的方式,所以需要准备:

  • 1 x ThinkPad X220
  • 1 x 树莓派 (我的是 2B+,其它能进行 SPI 通讯的设备也能用)
  • 1 x SOP8 烧录夹
  • 6 x 母对母杜邦线
  • 得能上网
用到的东西

2.2 树莓派侧准备工作

先更新一下 apt

>apt update

安装 flashrom 到时候烧录 ROM 的时候用

>apt install flashrom

把编译 coreboot 要用到的包一口气装好

sudo apt install build-essential git libftdi1 libftdi-dev libusb-dev libpci-dev m4 bison flex libncurses5-dev libncurses5 pciutils usbutils libpci-dev libusb-dev zlib1g-dev libusb-1.0 gnat

把 coreboot 和它的各个 submodules 一口气拉下来 (大概要占 500MB)

>git clone --recurse-submodules https://review.coreboot.org/coreboot.git ~/coreboot

编译安装 coreboot 的 ifdtool 工具 (用来分割原厂 ROM)

>cd ~/coreboot/util/ifdtool
>make && make install

2.3 把原厂 ROM 读出来

关机拔电池,按一会儿开机键给电容放干净电。

拧掉背面螺丝,拆掉掌托和键盘,露出内部

要找的芯片就在 C 面左下角处 ExpressCard 插槽旁边的黑色胶布下面。

近照

准备好树莓派和烧录夹,参考下方 pinout 图把芯片和 GPIO 用杜邦线连接好

pinout 如图

开读!先看看能不能识别芯片。

>sudo flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=16384

输出大概是这样:

flashrom on Linux 5.10.17-v7+ (armv7l)
flashrom is free software, get the source code at https://flashrom.org
Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found Macronix flash chip "MX25L6405" (8192 kB, SPI) on linux_spi.
Found Macronix flash chip "MX25L6405D" (8192 kB, SPI) on linux_spi.
Found Macronix flash chip "MX25L6406E/MX25L6408E" (8192 kB, SPI) on linux_spi.
Found Macronix flash chip "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E" (8192 kB, SPI) on linux_spi.
Multiple flash chip definitions match the detected chip(s): "MX25L6405", "MX25L6405D", "MX25L6406E/MX25L6408E", "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E"
Please specify which chip definition to use with the -c option.

虽说读出了 4 个 Macronix 芯片,不过这里只管 “MX25L6405” 这枚就好。
接下来把 ROM 内容抓下来,这里最好进行 2+ 次操作,比对抓到 ROM 的 md5,确保连接稳定正常。

>sudo flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=16384 -c "MX25L6405" rom1.bin
>sudo flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=16384 -c "MX25L6405" rom2.bin
>md5sum rom1.bin rom2.bin

2.3.1(可选) 干掉 Intel ME

把 me_cleaner 这个小工具拉下来,直接对 bin 文件使用。

>git clone https://github.com/corna/me_cleaner ~/me_cleaner
>~/me_cleaner/me_cleaner.py -S flash01.bin

用先前装好的 ifdtool 提取 ROM 内容

>ifdtool -x rom1.bin

这里分割后会得到四个新的 bin 文件,把它们重命名一下

  • flashregion_0_flashdescriptor.bin -> descriptor.bin
  • flashregion_1_bios.bin -> bios.bin
  • flashregion_2_intel_me.bin -> me.bin
  • flashregion_3_gbe.bin -> gbe.bin

然后挪到 coreboot 对应的文件夹里

> mkdir -p ~/coreboot/3rdparty/blobs/mainboard/lenovo/x220
>cp *.bin $_

2.4 配置/编译 coreboot

配置一下 coreboot 准备 make

>cd ~/coreboot
>make nconfig

Buildroot 的配置界面

我做的修改如下:

General setup:
  [*]Compress ramstage with LZMA
  [*] Include coreboot .config file into the ROM image
  [*] Allow use of binary-only repository
Mainboard:
  Mainboard vendor (Lenovo)
  Mainboard model (ThinkPad X220i)
  ROM chip size (8192 KB (8 MB))
  (0x100000) Size of CBFS filesystem in ROM
Chipset:
  [*] Enable VMX for virtualization
  [*] Add Intel descriptor.bin file (...)
  [*] Add Intel ME/TXE firmware (...)
  [*] Add gigabit ethernet firmware (...)
Generic drivers:
  [*] Support Intel PCI-e WiFi adapters
  [*] PS/2 keyboard init
Console:
  [*] Squelch AP CPUs from early console.
  [*] Show POST codes on the debug console
System tables:
  [*] Generate SMBIOS tables
Payload:
  Add a payload (SeaBIOS)
  SeaBIOS version (master)
  [*] Hardware init during option ROM execution
  [*] Include generated option rom that implements legacy VGA BIOS compatibility

F6 保存之后就可以开始 make 了 (不太建议用树莓派,过程实在是太慢太慢了,我直接把 coreboot 拷到了主力机 Windows 10 里的 WSL 里整的)

先整 crossgcc-i386

>make crossgcc-i386 CPUS=2 -b

*省略一大堆输出*
Unpacked and patched ... ok
Building packages ...
Skipping IASL v20160831 for host as it is already built Packages built ... ok
Cleaning up temporary files... ok

You can now run your IASL ACPI compiler toolchain from /home/k/coreboot/util/crossgcc/xgcc.

再整 ISAL

>make iasl

*省略一大堆输出*
Unpacked and patched … ok
Building packages …
Skipping IASL v20160831 for host as it is already built
Packages built … ok
Cleaning up temporary files… ok

You can now run your IASL ACPI compiler toolchain from /home/k/coreboot/util/crossgcc/xgcc.

最后 make 一下

>make

*依旧省略很多很多输出*
Built lenovo/x220i (ThinkPad X220i)

2.5 往芯片上刷写 coreboot ROM

(这里可以再用刚才的方法读一遍芯片上的 ROM,然后做一下 md5sum 确保连接正常,我比较懒所以就没弄。)

>sudo flashrom -p linux_spi:dev=/dev/spidev0.0 -c "MX25L6405" -w ~/coreboot/build/coreboot.rom

*省略很多输出*
Calibrating delay loop… OK.
Found Macronix flash chip "MX25L6405" (8192 kB, SPI) on linux_spi.
Reading old flash chip contents… done.
Erasing and writing flash chip… FAILED at 0x00001000! Expected=0xff, Found=0xf0, failed byte count from 0x00000000-0x0000ffff: 0x2524
ERASE FAILED!
Reading current flash chip contents… done. Looking for another erase function.
Erase/write done.
Verifying flash… VERIFIED.

如果你看到那个大大的 ERASE FAILED! ….就代表你已经成功了!

接下来把夹子拔下来收拾收拾,就可以开机看结果了。

🎉大成功🎉

享受自由吧,你免费了!X220i。

3. References

[1] https://www.coreboot.org/Board:lenovo/x220
[2] https://szclsya.me/posts/coreboot/x220/
[3] https://karlcordes.com/coreboot-x220/
[4] https://github.com/michaelmob/x220-coreboot-guide