我手上有一台 ThinkPad X200,诞生于 2008 年,是当年的旗舰笔记本。十几年过去了,依然宝刀不老,长期以来一直都是我写程序写论文的主力。
不过,前主人给它设置了超级管理员密码,由于相隔已久,早已忘了密码。幸好超级密码只锁定 BIOS 设置,不影响进系统,倒也相安无事。
然而,有密码始终影响我对笔记本的掌控。我尝试像台式机那样,拔掉 BIOS 电池来清除密码。殊不知,X200 是商务笔记本系列,联想早已经做足了防范。结果很惨:每次开机都得输入管理员密码,否则就无法引导进系统!
最终,我决定,刷 coreboot,一劳永逸解决。
coreboot 是一款自由、开源的系统固件,是 BIOS 和 UEFI 的替代品。它早已对 ThinkPad X200 提供完备的支持。何不用它,绕过密码验证,直接引导系统?
准备工具
BIOS 刷写需要准备以下工具:
- 一台安装了 Linux 发行版的电脑
- CH341A 编程器
- SOP-16 夹具
既然电脑无法进系统,想要刷 BIOS,当然离不开编程器了。我选用的是著名的 CH341A「土豪金」编程器,接下来用到的刷写工具 Flashrom 为它提供了官方支持。
X200 的 BIOS 芯片是「25」型,拥有16根引脚,可以直接通过 SOP-16 夹具来连接编程器。夹具和编程器都可在淘宝购买到。我手上的 X200 为高配版本,芯片容量为 8.0 MiB。
系统环境方面,选用 Linux 发行版。通过它来运行 Flashrom 来刷写 BIOS,以及编译 coreboot。
值得注意的是,coreboot 只提供源代码,不提供已经编译的固件,所以需要自己编译。你也许可以选用网上别人编译好的固件,但它们常常缺少正确的配置,导致功能缺失(例如,无线网卡和蓝牙不能使用)。1
编程器连接
CH341A 是编程器的芯片型号,不同的厂家在用 CH341A 设计编程器时可能有不同的外观,配件也可能有不同的组装方式,故应当以资料为准。编程器的卖家通常会提供完备的资料。
就以我的编程器为例。我手上这台 CH341A「土豪金」编程器是这样子的:

卸下键盘与掌托
X200 的 BIOS 隐藏在掌托下,需要卸下键盘与掌托才能看到 BIOS 芯片。
卸掉笔记本底部除硬盘仓外所有带三角形标记的螺丝2(还有一颗螺丝藏在电池仓,需要先卸下电池),然后小心沿着边缘拆下掌托,即可同时将键盘和掌托卸下。注意不要弄坏键盘底部的排线。
高配版的 X200 是带有指纹传感器的,它在主板上的接口是一块可拆卸的芯片,轻轻将它从主板取出。
准备编程器
编程器右侧有一个黑色的连接器。先把连接器右侧的手柄向上推,使手柄朝上:

按下图的方式,将夹具的 8 个针脚插入连接器左半边的 8 个孔位。注意区分方向,不要接反了。

最后,将手柄向下压,即可将夹具固定住,这样编程器与夹具就连接上了。

连接 BIOS 芯片
X200 的 BIOS 芯片位于主板下沿、Intel 南桥芯片左侧。先展示一下芯片的特写:

张开夹子,先让连着红色导线的夹板立在芯片右侧(对着南桥芯片那一侧),仔细对准芯片的针脚。接着缓缓将夹子夹在芯片上,确保芯片两侧的针脚都被夹住。一旦夹牢靠,就不容易松动。
注意不要把夹子的方向弄反了,否则芯片会识别不出来。
接好之后,将编程器插在电脑的 USB 接口上,确保红灯亮起。连接完成的效果如下图所示。

备份原机 BIOS
连接编程器后,首先需要备份原机 BIOS ROM。一方面是防止万一,另一方面是 coreboot 需要使用官方 BIOS 的组件。
检测芯片型号
首先运行以下命令,尝试读取 BIOS 芯片,检测型号,借此检查连接情况:
sudo flashrom -p ch341a_spi若一切正常,执行结果如下。可以看到,编程器已经识别出了芯片:
flashrom v1.2 on Linux 5.15.65-1-MANJARO (x86_64)
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 ch341a_spi.
Found Macronix flash chip "MX25L6405D" (8192 kB, SPI) on ch341a_spi.
Found Macronix flash chip "MX25L6406E/MX25L6408E" (8192 kB, SPI) on ch341a_spi.
Found Macronix flash chip "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F" (8192 kB, SPI) on ch341a_spi.
Multiple flash chip definitions match the detected chip(s): "MX25L6405", "MX25L6405D", "MX25L6406E/MX25L6408E", "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F"
Please specify which chip definition to use with the -c <chipname> option.输出日志中,不止一个型号被检测出来。后续的操作,我们使用最长串的型号:MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F。
提示:
- 检测出多型号是正常现象,因为BIOS芯片本身有多种型号定义,仅通过编程器是无法精确识别的。
- 如果 Flashrom 在运行的时候出错,再改用其他列出的型号,如
MX25L6406E/MX25L6408E。
开始备份
运行以下命令,将整个 BIOS ROM 备份到文件x200_bios.rom中:
sudo flashrom -p ch341a_spi -c "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F" -r x200_bios.rom正常情况下,输出结果如下所示:
flashrom v1.2 on Linux 5.15.65-1-MANJARO (x86_64)
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 "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F" (8192 kB, SPI) on ch341a_spi.
Reading flash... done.由于传输过程可能存在异常,为保险起见,多备份几次,然后比较各个备份文件(例如,SHA256 校验和)。如果完全相同,则说明备份无误。
例如,先备份,然后使用 OpenSSL 来比较 SHA256:
# 再备份3次
sudo flashrom -p ch341a_spi -c "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F" -r x200_bios_2.rom
sudo flashrom -p ch341a_spi -c "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F" -r x200_bios_3.rom
sudo flashrom -p ch341a_spi -c "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F" -r x200_bios_4.rom
# 然后,比较它们的SHA256校验和
openssl sha256 x200_bios_*.rom如果传输无误,则上述文件的 SHA256 值应当相同,如下:
SHA256(x200_bios.rom)= 038481951bb5d3412392fc1fd02b3996a9ac5394e82aaa4593b84f90362afce4
SHA256(x200_bios_2.rom)= 038481951bb5d3412392fc1fd02b3996a9ac5394e82aaa4593b84f90362afce4
SHA256(x200_bios_3.rom)= 038481951bb5d3412392fc1fd02b3996a9ac5394e82aaa4593b84f90362afce4
SHA256(x200_bios_4.rom)= 038481951bb5d3412392fc1fd02b3996a9ac5394e82aaa4593b84f90362afce4准备 coreboot 源代码
接下来的教程中,假定我们把 coreboot 的源码目录放在用户主目录下。
克隆源码
首先,克隆 coreboot 的代码库:
git clone --recursive https://github.com/coreboot/coreboot.git coreboot
cd coreboot如果不小心漏掉了--recursive参数,则同步子模块:
cd coreboot
git submodule update --init --recursive准备交叉编译器
coreboot 涉及到更底层的系统环境。为了保证 coreboot 的正常编译,还需要准备交叉编译器。ThinkPad X200 需要使用 i386 的 GCC 编译器,编译 32 位的 coreboot。
⚠️ 注意: ThinkPad X200 不支持 64 位的 coreboot。
首先,安装 GCC Ada 工具链。
coreboot 包含一个显卡驱动:libgfxinit,它可以在 Intel 平台下初始化集成显卡或核芯显卡,使用 Ada 语言的子集 SPARK 编写。要给交叉编译器提供 Ada 语言的支持,必须先在当前主机上安装 GCC Ada 工具链。
不同的发行版有不同的包名,可以在 pkgs.org 网站检索。例如,在 Arch Linux 中,使用以下命令安装:
sudo pacman -S gcc-ada接下来,就可以让 coreboot 自动构建交叉编译器,只需运行以下命令:
# 使用单处理器(单个线程)进行构建。会很慢!
make crossgcc-i386
# 使用多个处理器(多个线程)进行构建。
make crossgcc-i386 CPUS=$(nproc)构建过程是全自动的,一步到位。
准备 BIOS 组件
coreboot 需要从原机的官方 BIOS ROM 中提取以下三个组件:
- Flash descriptor,存放闪存芯片的布局信息(必选)
- ME Firmware,即 Intel Management Engine 的固件(可选,提取备用)
- GbE,有线网卡的配置文件(必选)
上述组件可以直接使用 coreboot 提供的ifdtool来自动提取。
编译 ifdtool
进入 coreboot 源码目录,然后浏览到ifdtool的源码目录,并编译:
cd util/ifdtool
make编译完成后,当前目录会多出一个可执行文件:ifdtool。为便于使用,可以把它安装到系统中:
sudo cp ifdtool /usr/bin/提取组件
浏览到存放 BIOS 备份的目录,运行以下命令提取:
ifdtool -x x200_bios.rom执行结果如下所示:
File x200_bios.rom is 8388608 bytes
Flash Region 0 (Flash Descriptor): 00000000 - 00000fff
Flash Region 1 (BIOS): 00600000 - 007fffff
Flash Region 2 (Intel ME): 00001000 - 005f5fff
Flash Region 3 (GbE): 005f6000 - 005f7fff
Flash Region 4 (Platform Data): 005f8000 - 005fffff此时,当前目录下就会多出几个文件。它们都是提取出的组件,属于 BIOS ROM 的组成部分。
- flashregion_0_flashdescriptor.bin
- flashregion_1_bios.bin
- flashregion_2_intel_me.bin
- flashregion_3_gbe.bin
- flashregion_4_platform_data.bin
把组件放入 coreboot 源码目录中
接下来,我们把提取出的组件放入指定目录中,使 coreboot 可以识别。
首先,进入 coreboot 源码目录,然后建立下面的子目录:
mkdir -p 3rdparty/blobs/mainboard/lenovo/x200然后,把提取出的以下三个组件改名,放入上述目录中:
| 原名 | 更改的名字 | 作用 |
|---|---|---|
| flashregion_0_flashdescriptor.bin | descriptor.bin | BIOS 固件的布局,相当于分区表 |
| flashregion_2_intel_me.bin | me.bin | Intel Management Engine 固件 |
| flashregion_3_gbe.bin | gbe.bin | 板载千兆网卡的配置文件 |
至此,BIOS 组件准备完成,可以开始后续的配置了。
配置 coreboot
coreboot 使用 KBuild 来配置,配备一套直观易用的配置菜单,编译过 Linux 内核的开发者应该不会陌生。接下来,我们将配置 coreboot,打造出功能完备的体验,不应只满足于点亮机器进系统。
基本操作
- 上下移动光标:选择设置项
- Enter:
- 进入子菜单或「多选一(给你多个选项,一次只能选一个)」菜单
- 确认当前选项
- Y/N/空格:勾选(或取消勾选),适用于带有方括号的项目,方括号里出现星号,表示已选中
- 连按两次 ESC:返回上一页
进入配置菜单
进入 coreboot 源码目录,然后打开配置菜单:
make menuconfig设置主板类型
首先,要将 coreboot 的主板类型设置为 ThinkPad X200。
- 进入一级菜单 Mainboard(主板),然后选择 Mainboard vendor(主板厂商),按Enter进入。在列表中,光标定位到
Lenovo,按空格选中。 - 然后,选择 Mainboard model(主板型号),同样按Enter进入,在列表中,光标定位到
ThinkPad X200 / X200s / X200t,按空格选中。
选好后,按两次 ESC,退回主页面。接下来的步骤都从主页面开始。
设置 BIOS 组件
进入一级菜单 Chipset(芯片组),然后勾选 Add Intel descriptor.bin file(添加英特尔 descriptor.bin 文件)。
此时,列表下方会多出下面两个选项:
- Add Intel ME/TXE firmware(添加英特尔ME/TXE固件)
- Add gigabit ethernet configuration(添加千兆以太网配置数据)
为了保证以太网能正常工作,你需要勾选 Add gigabit ethernet configuration。
至于Intel ME/TXE 固件,缺少该固件并不影响系统的使用,可以不勾选。关于该固件的问题,具体我会在文末「后续问题」章节讨论。
其余选项保持默认值。固件的路径默认均指向3rdparty/blobs/mainboard/lenovo/x200这一目录的相应文件,无需修改。
启用无线网卡支持
一些型号的 Intel PCIe 无线网卡,如果在 ACPI 和 SMBIOS 中缺少数据,则操作系统将无法识别它们。为了保证笔记本上安装的 Intel 网卡可用,需要在 coreboot 中提供对它们的支持。
进入一级菜单 Generic drivers(通用驱动),勾选最后一项 Support Intel PCI-e WiFi adapters(英特尔 PCIe 无线网卡支持),即可。
启用二合一网卡蓝牙支持
有别于笔记本常见的二合一无线网卡,X200 采用独立的博通蓝牙适配器(BCM2045B),走的是 USB 通道。但部分用户可能更换了二合一网卡。要想让这类网卡的蓝牙工作,需要开启 coreboot 的相关支持选项。
进入一级菜单 Chipset,选择 Support bluetooth on wifi cards(为搭载于无线网卡上的蓝牙提供支持),按Y勾选即可。
启用 NVRAM 存储
coreboot 可以把 BIOS 的参数保存在 NVRAM 中,这些参数控制着笔记本的各种特性,比如显存大小、无线网卡开关、告警提示音开关等。
但是,coreboot 默认并没有开启参数保存的功能,这将导致所有参数在每次开机时还原为默认。并且,还会导致蓝牙指示灯无法点亮。
因此,我们需要手工打开它。具体步骤如下:
- 进入一级菜单 General setup(一般配置),然后选中 Option backend to use(要使用的配置项存储后端)。
- 回车,然后在列表中,光标定位到 Use CMOS for configuration values(用 CMOS 来保存设置值),按空格选中,搞定。
让 coreboot 在引导时自动清空内存
笔者在成功编译 coreboot 后,长期使用 X200 以测试 coreboot 的稳定性,结果遇到了一个严重的问题:电脑隔三岔五无预兆重启,长则开机十几分钟重启,短则还没进入桌面就重启,严重影响系统使用。
经过一番搜索,知乎网友 flanto 的文章告诉了我答案:
根据个人使用经验,如果没有启用开机清空内存功能,就可能出现电脑随机重启现象。个人猜测,或许是通电后(特别是软重启后)内存中仍留有少数“垃圾”数据,当操作系统寻址到这些垃圾数据的地址就会发生错误。
经过测试,答案的确如此,让 coreboot 每次开机后清空内存,无故重启的故障终于彻底解决。
依次进行以下步骤,开启 coreboot 的引导时清空内存功能:
进入 Security(安全)——Memory initialization(内存初始化)菜单,勾选 Always clear all DRAM on regular boot(常规启动时总是清空内存),保存设置即可。
启用显卡支持
coreboot 有两种显卡支持方案:
- 首选的显卡支持方案是 VGA Option ROM,即 VBIOS 镜像。它包含在官方的 BIOS 中,对 ThinkPad X200 的集显支持最完备最充分。
- 如果没有 VGA Option ROM,则可以使用后备方案:libgfxinit,这是使用 Ada 语言编写的开源显卡驱动,用于为 coreboot 提供基本显示功能。目前仅支持 Intel 的核显和集显。
libgfxinit 与 Linear Frame buffer
先来介绍 libgfxinit。
ThinkPad X200 配备 GM45 集显,libgfxinit 驱动 GM45 不在话下。在它的基础上,再启用 Linear Framebuffer 功能建立一个帧缓冲(frame buffer),允许程序直接在 coreboot 中调用显卡绘图,从而使显卡在系统引导阶段发挥应有效能。
具体步骤如下:
- 进入一级菜单 Devices(设备),选择 Graphics initialization(图形初始化)。在选项列表中,光标定位到 Use libgfxinit(使用libgfxinit),按空格确认。
- 然后,依次进入子菜单 Display(显示)——Framebuffer mode(帧缓冲模式)。在选项列表中,光标定位到 Linear “high-resolution” framebuffer(线性高分辨率帧缓冲)。
- 之后,在 Framebuffer mode 子菜单中,会多出以下两个选项,指定为X200显示器的最佳分辨率即可:
- Maximum width in pixels(最大像素宽度),指定为
1280 - Maximum height in pixels(最大像素高度),指定为
800
- Maximum width in pixels(最大像素宽度),指定为
至此,coreboot 的显卡配置完成。
⚠️ 但要注意的是,libgfxinit对显卡的支持不充分:
- 它无法实现缩放显示,意味着如果操作系统、引导程序(如 Grub、Ventoy)的分辨率小于最佳分辨率,就只能显示在左上角那一块。
- 它支持纯字符模式显示(也就是 「Legacy Text Mode」),但该模式不兼容 Grub 等使用图形模式的 Bootloader——你会看不到任何东西,只能盲操作。
我仍然建议你优先选择 VGA Option ROM。
VGA Option ROM
最懂英特尔集显的还是自己人,只有官方的 VGA Option ROM (VBIOS 镜像)才能完美驱动 X200 的集显。coreboot 在集成了 VGA Option ROM 之后,使用体验和官方 BIOS 一样丝滑:同时兼容字符模式和图形模式,二者可以无缝切换,皆可满屏显示。
用户需要获取当前显卡的 VGA Option ROM,编译时将它集成在 coreboot 中,每次开机即可利用它来初始化显卡。
VGA Option ROM 可以直接从官方 BIOS 升级文件中提取,接下来笔者就来演示如何提取 Option ROM,并将其配置到 coreboot 中。
下载并解压 BIOS
要从官方升级文件中提取 VGA Option ROM,需要使用两个工具,可自行检索下载:
- PhoenixTool:用于解包 BIOS 升级文件
phcomp.exe:用于将经过压缩的 BIOS 升级文件解压成 PhoenixTool 可识别的格式
上述两个工具都可以借助 Wine 在 Linux 下运行。
首先,从联想的海外版官网下载 X200 系列的 BIOS 更新工具。下载之前需要验证笔记本的序列号(位于笔记本底部)。你会得到一个安装程序,运行它,并在安装过程中记下安装目录(默认为C:\DRIVERS\FLASH\<一个6开头的文件夹(如6duj48us)>)。
进入安装目录,你会看到两个全大写字母的文件夹,BIOS 的原厂文件就在里面。其中:
6DET72WW对应的是 8MB BIOS 芯片的机型7XET72WW对应 4MB BIOS 芯片的机型
考虑到笔者的 X200 用的是 8MB 的芯片,因此进入6DET72WW子目录。
把phcomp.exe放到该子目录中,然后运行以下命令,解压官方 BIOS 升级文件:
# Windows 下
phcomp.exe /D $01B9100.FL1
# Linux 下(借助 Wine),注意“$”前面的转义字符
wine ./phcomp.exe /D \$01B9100.FL1稍等片刻,工具就会在当前目录下生成一个新文件:$01B9100.FLh。
提取 VGA Option ROM
运行 PhoenixTool,找到最顶部「Original(原始 BIOS)」那一栏,点击右侧的「..」按钮,打开刚刚生成的$01B9100.FLh文件。
此时,无须进一步操作,PhoenixTool 就会自动开始解包$01B9100.FLh这个 BIOS 升级文件,所有解包出来的文件都放到升级文件所在位置的DUMP子目录中。

解包完成后就会出现图中的提示框。
解包完成后会弹出一个提示框。确认后,进入DUMP子目录,
使用 Linux 的file工具来验证其中的OPROM00.ROM,可以看出这就是我们要找的 VGA Option ROM:
$ file OPROM00.ROM
OPROM00.ROM: BIOS (ia32) ROM Ext. IBM comp. Video "IBM VGA Compatible BIOS. \003Z" (128*512) jmp 0xf6ff; at将 VGA Option ROM 添加到 coreboot 中
把OPROM00.ROM更名为vgabios.bin(或者是其他便于记忆的名字),放到 coreboot 源码树的根目录中。
然后,运行make menuconfig,打开 coreboot 配置菜单,依次修改以下设置:
- 进入一级菜单 Devices(设备),勾选 Add a VGA BIOS image(添加一个 VGA BIOS 镜像);
- 随后,下方会多出几个选项。选中 VGA BIOS path and filename(VGA BIOS 路径与文件名) ,回车,输入 VGA Option ROM 的文件名(
vgabios.bin),然后回车确认。 - 回到 Devices 菜单后,选择第一个 Graphics initialization ,在选项列表中,光标定位到 Run VGA Option ROMs(运行 VGA Option ROM),回车确认,保存设置即可。
- 其余选项保持默认值。
这样,我们就成功把 VGA Option ROM 集成到了 coreboot 中,现在 coreboot 就有了火力全开的显卡支持。
建议的显卡设置:让 SeaBIOS 全权接管显卡初始化
在 ThinkPad X200 中,我们默认使用 SeaBIOS——一款开源的 BIOS 实现,作为 coreboot 的 payload。上电后,coreboot 先初始化基本硬件,然后调用 SeaBIOS 来提供我们熟悉的 BIOS 功能,并引导系统。
SeaBIOS 自身支持显卡初始化,在运行过程中会自动调用 VGA Option ROM。因此我们可以直接把 Graphics Initialization 设为「None」,意味着把初始化集显的工作全权交给 SeaBIOS,不需要 coreboot 来初始化。
实测该设置比「Run VGA Option ROMs」更为稳定,避免 coreboot 和 SeaBIOS 重复调用 VGA Option ROM 在极个别情况下造成的兼容性问题(如开机报错、无法调节亮度等,虽然发生的可能性不大)。
编译 coreboot
配置完成后,就可以立刻着手编译:
# 使用单处理器(单个线程)进行构建。会很慢!
make
# 使用多个处理器(多个线程)进行构建。
make -j$(nproc)最终编译好的 coreboot ROM位于build子目录,文件名为coreboot.rom。
刷入 coreboot 并开机测试
连接编程器,运行以下命令,将 coreboot 刷入 BIOS 芯片中:
sudo flashrom -p ch341a_spi -c "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F" -w build/coreboot.rom若一切正常,输出结果将如下所示:
flashrom v1.2 on Linux 5.15.65-1-MANJARO (x86_64)
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 "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F" (8192 kB, SPI) on ch341a_spi.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.刷好之后,松开夹具,断开编程器,扣上电池,开机!
上电后,coreboot 将初始化硬件,随后启动 SeaBIOS——一款开源的 BIOS 实现。SeaBIOS 再引导硬盘上的操作系统。
按下电源键不久,屏幕上出现 SeaBIOS 的版本号,以及本机的 UUID。不一会,本地硬盘上的 Grub 也成功引导,出现了「Welcome to Grub!」的字样,随后熟悉的Grub菜单出现在眼前。
启动成功!
内部刷写
刷好 coreboot 之后,将键盘、掌托及指纹识别器的排线按原样装回去,然后就可以放心上螺丝了。
后续的 BIOS 更新,无需再使用编程器,仅使用 Flashrom 就可以完成。
卸载lpc_ich驱动
使用 Flashrom 获取 BIOS 芯片状态的命令是flashrom -p internal。但一般情况下,在 Arch Linux 中运行时,会报错:
flashrom v1.2 on Linux 5.15.72-1-lts (x86_64)
flashrom is free software, get the source code at https://flashrom.org
Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found chipset "Intel ICH9M".
Enabling flash write... Error accessing ICH RCRB, 0x4000 bytes at 0x00000000fed1c000
/dev/mem mmap failed: Operation not permitted
FAILED!
FATAL ERROR!
Error: Programmer initialization failed.网上的刷写教程,甚至是 coreboot 的官方文档,都是不会告诉你这个问题的。
所幸,Flashrom 的官方文档提供了对策。只需卸载系统的lpc_ich驱动,即可释放对BIOS芯片的访问权限。运行以下命令:
sudo modprobe -r lpc_ich备份与刷写
卸载上述驱动后,直接运行 Flashrom 刷写即可。你既可以备份整颗芯片,也可以只备份 BIOS 区域而保持 ME、GbE 等其他部分不变。
例如,刷写刚刚编译好的 coreboot:
# 刷写整个 BIOS 芯片
sudo flashrom -p internal -c "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F" -w build/coreboot.rom
# 只刷写 BIOS 区域,保持其他部分不变
sudo flashrom -p internal -c "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F" -w build/coreboot.rom --ifd -i bios以及,备份当前版本的 BIOS:
# 备份整个 BIOS 芯片
sudo flashrom -p internal -c "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F" -r coreboot_backup.rom
# 只备份 BIOS 区域
sudo flashrom -p internal -c "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F" -r coreboot_backup.rom --ifd -i bios排查后续问题
libgfxinit 下 Grub 的显示问题
我在测试启用了 libfgxinit 的 coreboot 时,启动过程中,会卡在「Welcome to Grub!」字样。但没过多久,Grub 仍能正常引导 Linux。
Grub 默认会以图形方式显示菜单,这要求显卡必须初始化图形功能——有别于传统的 VGA 文字模式。
然而,在使用 libgfxinit 引导系统时,如果不启用 Linear Framebuffer,则默认只能使用文字模式,而 Grub 无法对此作出自适应的处理,所以菜单无法显示。
对此,有两种解决方案:
方案一:将 Grub 切换到文字模式
进入 Linux 后,修改/etc/default/grub,取消注释下面这行:
#GRUB_TERMINAL=console如果是新版本的 Grub,则取消注释这一行:
#GRUB_TERMINAL_OUTPUT=console重新生成 Grub 配置文件:
sudo grub-mkconfig -o /boot/grub/grub.cfg重启后,Grub 就会以简易的文字来绘制界面,可以顺利使用了。
方案二:启用 Linear Framebuffer
使用 Linear Framebuffer,就可以保证 Grub 的图形菜单能正常显示。
但是,Linear Framebuffer 不支持缩放,只能点对点显示,这意味着如果输入分辨率小于 Linear Framebuffer 指定的分辨率,画面就只能靠左上角显示。
并且,Grub 也无法获取 Linear Framebuffer 的最佳分辨率,它一律会用 640x480 的最低分辨率输出。最终的显示效果很“憋屈”。
所以,我们还需要设置 Grub 的输出分辨率。打开修改/etc/default/grub,修改参数GRUB_GFXMODE:
GRUB_GFXMODE=1280x800x32X200 的最佳分辨率是 1280x800,32位色深。后面的x32可以省略。
修改后,更新 Grub 配置文件,重启生效,此时 Grub 能全屏显示了。
Intel ME 造成的问题
Intel ME(Management Engine)是内置在英特尔处理器中的底层软件框架,用于远程管理、系统启动保护(Bootguard)等。它的固件集成在官方 BIOS 中,同时 coreboot 也提供了对 ME 的支持。
不过,据笔者实测,将 ME 集成到 coreboot 中,可能会导致一些潜在的问题,包括但不限于:
- 电脑关机后,有很大几率无法一次点亮,需要反复重试;
- 睡眠之后无法唤醒;
- 关机后立即重启时,电脑会发出尖锐的蜂鸣声。
笔者在近期(2024年5月初)重新构建 coreboot 时,就把 ME 剔除在外。即,在make menuconfig配置过程中,不开启【Add Intel ME/TXE firmware】这个选项。刷入固件后,电脑无法一次点亮的问题就不再出现。
更新源码树后,记得重新编译工具链
你可以随时使用git pull命令来更新coreboot源码树。
但要注意的是,coreboot 会始终使用最新版本的 GCC 来作为交叉编译工具。如果编译时出现了以下的错误,则说明工具链需要重新构建了:
The coreboot toolchain for 'x86_32' architecture was not found.此时,请使用以下命令,先执行清理,然后再重新编译工具链:
make crossgcc-clean
make crossgcc-i386 CPUS=$(nproc)注意:如果不运行make crossgcc-clean,那么编译 GCC 时将会发生一些莫名其妙的错误,光搜索错误信息是完全找不到任何答案的。
随机重启与花屏的问题
在启用「开机时自动清空内存」之前,X200 会有无预兆重启的情况,长则十几分钟,短则一分钟不到,严重影响使用体验。后来在 coreboot 中让其每次开机时清空内存,该问题不再出现,电脑稳定性有了本质提升。
不过,使用过程中我发现,无预兆重启没了,反而多了无预兆花屏:Arch Linux 启动后,电脑会随机出现花屏的现象,表现为杂色色块像表格一样分布在屏幕上,同时电脑死机。
为此,我尝试各种方法抓取 coreboot 日志,例如使用cbmem工具获取日志(sudo cbmem -c)。然而折腾许久才明白,coreboot 的日志只记录到 SeaBIOS 完成系统引导的时候,操作系统启动后就不会再继续记录了。
那么,会不会是显卡问题?
我接着尝试在 Grub 中关闭显卡驱动,方法是在 Grub 菜单中选择 Arch Linux 的启动项,按e键编辑,在linux这行命令最后加上nomodeset参数。之后,Linux 成功引导,并且能通过Ctrl+Alt+F2快捷键切换到 TTY——还是最原始的 VGA 文本模式的 TTY。此时电脑很稳定,长时间运行 pacman 更新系统都没有花屏。
看来可以判断是显卡驱动的原因了。在 Linux 6.12.57 LTS 内核推出后,电脑终于可以正常使用,不再花屏,我猜想是该版本修复了英特尔显卡的驱动程序问题。
写在最后
忘记 BIOS 管理员密码,给我掌控手上这台 ThinkPad X200 带来了麻烦,无法进系统,近似于变砖。幸运的是,我有开源的力量——借助开源固件 coreboot,顺利绕开了官方 BIOS 的安全保护。
coreboot 的表现非常惊艳,按下电源键的一瞬间,就立即进入了 SeaBIOS,随后迅速引导硬盘中的 Arch Linux。启动速度远远快于官方 BIOS(仅支持 MBR 启动),表现堪比 UEFI 固件,不像官方 BIOS 在按下电源键后还要磨蹭那么几秒钟才亮屏。
如今,X200 成功焕发新生,不再吃灰,继续作为我的第二主力。在这里衷心感谢 coreboot 团队的匠心和努力,以及开源世界生生不息的力量。
参考资料
- Installing coreboot on the Thinkpad X200, X201 and on the ASUS P5Q(如何正确使用Flashrom刷写X200的BIOS)
- coreboot: Board:lenovo/x200(coreboot官方关于X200的文档)
- How can I do about /dev/men errors?(如何正确使用Flashrom进行内部刷写,解决/dev/map error的问题)
- Thinkpad X200编译刷写自由开源BIOS——coreboot(解决电脑无故重启的问题)
> 关注 少数派公众号,解锁全新阅读体验 📰
> 实用、好用的 正版软件,少数派为你呈现 🚀
- 1coreboot 的衍生项目 Libreboot 也为 ThinkPad 提供了官方支持,以及预编译好的 BIOS ROM。但是这个项目不包含专有组件,例如缺少官方的 VBIOS,可能会影响使用体验。
- 2螺丝旁的标记表示该螺丝用于固定的组件,如键盘、盖子等。