首发时间:2022-10-19
最近修订:2025-11-07
我手上这台 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 夹具来连接编程器。夹具和编程器都可在淘宝购买到。
系统环境方面,选用 Linux 发行版。通过它来运行 Flashrom 来刷写BIOS,以及编译 coreboot。
值得注意的是,coreboot 只提供源代码,不提供已经编译的固件,所以需要自己编译。你也许可以选用网上别人编译好的固件,但它们常常缺少正确的配置,导致功能缺失(例如,无线网卡和蓝牙不能使用)。
编程器连接
编程器的卖家通常会提供完备的资料。由于 CH341A 编程器可能有不同的外观,配件也可能有不同的组装方式,故应当以资料为准。这里省略。
备份原机BIOS
连接编程器后,首先需要备份原机 BIOS ROM。一方面是防止万一,另一方面是 coreboot 需要使用官方 BIOS 的组件。
(1) 检测芯片型号
首先运行以下命令,尝试读取 BIOS 芯片,检测型号,借此检查连接情况:
1 | |
若一切正常,执行结果如下。可以看到,编程器已经识别出了芯片:
1 | |
输出日志中,不止一个型号被检测出来。后续的操作,我们使用最长串的型号:MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F。
提示:
- 检测出多型号是正常现象,因为 BIOS 芯片本身有多种型号定义,仅通过编程器是无法精确识别。
- 如果 Flashrom 出错,再改用其他列出的型号。
(2) 开始备份
运行以下命令,将整个 BIOS ROM 备份到文件x200_bios.rom中:
1 | |
正常情况下,输出结果如下所示:
1 | |
由于传输过程可能存在异常,为保险期间,多备份几次,然后比较各个备份文件(例如,SHA256 校验和)。如果完全相同,则说明备份无误。
例如,先备份,然后使用 OpenSSL 来比较 SHA256:
1 | |
如果传输无误,则上述文件的 SHA256 值应当相同,如下:
1 | |
准备 coreboot 源代码
接下来的教程中,假定我们把 coreboot 的源码目录放在用户主目录下。
(1) 克隆源码
首先,克隆 coreboot 的代码库:
1 | |
如果不小心漏掉了--recursive参数,则同步子模块:
1 | |
(2) 准备交叉编译器
coreboot 涉及到更底层的系统环境。为了保证 coreboot 的正常编译,还需要准备交叉编译器。ThinkPad X200 需要使用 i386 的 GCC 编译器,编译32位的 coreboot。
⚠️注意: ThinkPad X200 不支持64位的 coreboot。
首先,安装 GCC Ada 工具链。
coreboot包含一个显卡驱动:libgfxinit,它可以在 Intel 平台下初始化集成显卡或核芯显卡,使用 Ada 语言的子集 SPARK 编写。要给交叉编译器提供 Ada 语言的支持,必须先在当前主机上安装GCC Ada工具链。
不同的发行版有不同的包名。在Arch Linux中,使用以下命令安装:
1 | |
接下来,就可以让 coreboot 自动构建交叉编译器,只需运行以下命令:
1 | |
构建过程是全自动的,一步到位。
准备BIOS组件
coreboot 需要从原机的官方 BIOS ROM 中提取以下三个组件:
- Flash descriptor,存放闪存芯片的布局信息
- ME Firmware,即 Intel Management Engine 的固件
- GbE,有线网卡的配置文件
上述组件可以直接使用 coreboot 提供的ifdtool来自动提取。
(1) 编译ifdtool
进入coreboot源码目录,然后浏览到ifdtool的源码目录,并编译:
1 | |
编译完成后,当前目录会多出可执行文件ifdtool。为了方便,可以把它安装到系统中:
1 | |
(2) 提取组件
浏览到存放 BIOS 备份的目录,运行以下命令提取:
1 | |
执行结果如下所示:
1 | |
此时,当前目录下就会多出几个文件。它们都是提取出的组件,属于 BIOS ROM 的组成部分。
- flashregion_0_flashdescriptor.bin
- flashregion_1_bios.bin
- flashregion_2_intel_me.bin
- flashregion_3_gbe.bin
- flashregion_4_platform_data.bin
(3) 把组件放入 coreboot 源码目录中
接下来,我们把提取出的组件放入指定目录中,使 coreboot 可以识别。
首先,进入 coreboot 源码目录,然后建立下面的子目录:
1 | |
然后,把提取出的以下三个组件改名,放入上述目录中:
| 原名 | 更改的名字 |
|---|---|
flashregion_0_flashdescriptor.bin |
descriptor.bin |
flashregion_2_intel_me.bin |
me.bin |
flashregion_3_gbe.bin |
gbe.bin |
提示: ME 固件是可选的,缺少 ME 固件不影响 coreboot 在 X200 上的运行。
至此,BIOS组件准备完成,可以开始后续的配置了。
配置 coreboot
coreboot使用 KBuild 来配置,编译过 Linux 内核的开发者应该不会陌生。接下来,我们将配置 coreboot,打造出功能完备的体验,不应满足于点亮机器进系统。
基本操作
- 上下移动光标:选择设置项
- Enter:
- 进入子菜单或多选一菜单
- 确认当前选项
- Y/N/空格:勾选(或取消勾选),适用于带有方括号的项目,方括号里出现星号,表示已选中
- 连按两次 ESC:返回上一页
(1) 进入配置菜单
进入 coreboot 源码目录,然后打开配置菜单:
1 | |
(2) 设置主板类型
首先,要将 coreboot 的主板类型设置为 ThinkPad X200。
进入一级菜单 【Mainboard(主板)】,然后选择 【Mainboard vendor(主板厂商)】,按 Enter 进入。在列表中,光标定位到
Lenovo,按空格选中。然后,选择 【Mainboard model(主板型号)】,同样按Enter 进入,在列表中,光标定位到
ThinkPad X201 / X201i / X201s / X201t,按空格选中。
选好后,按两次ESC,退回主页面。接下来的步骤都从主页面开始。
(3) 设置BIOS组件
进入一级菜单 【Chipset(芯片组)】,然后勾选 【Add Intel descriptor.bin file(添加英特尔descriptor.bin 文件)】。
此时,列表下方会多出下面两个选项。依次勾选它们:
- 【Add Intel ME/TXE firmware(添加英特尔ME/TXE固件)】
- 【Add gigabit ethernet configuration(添加千兆以太网配置数据)】
其余选项保持默认值。固件的路径默认均指向3rdparty/blobs/mainboard/lenovo/x200这一目录的相应文件,无需修改。
(4) 启用无线网卡支持
一些型号的 Intel PCIe 无线网卡,如果在 ACPI 和 SMBIOS 中缺少数据,则操作系统将无法识别它们。为了保证笔记本上安装的 Intel 网卡可用,需要在 coreboot 中提供对它们的支持。
进入一级菜单 【Generic drivers(通用驱动)】 ,勾选最后一项 【Support Intel PCI-e WiFi adapters(英特尔PCIe无线网卡支持)】,即可。
(5) 启用二合一网卡蓝牙支持
有别于笔记本常见的二合一无线网卡,X200 采用独立的博通蓝牙适配器,走的是USB通道。但部分用户可能更换了二合一网卡。要想让这类网卡的蓝牙工作,需要开启 coreboot 的相关支持选项。
进入一级菜单 【Chipset】,选择 【Support bluetooth on wifi cards(为搭载于无线网卡上的蓝牙提供支持)】,按Y勾选即可。
(6) 启用NVRAM存储
coreboot 可以把 BIOS 的参数保存在 NVRAM 中,这些参数控制着笔记本的各种特性,比如显存大小、无线网卡开关、告警提示音开关等。
但是,coreboot 默认并没有开启参数保存的功能,这将导致所有参数在每次开机时还原为默认。并且,还会导致蓝牙指示灯无法点亮。
因此,我们需要手工打开它。具体步骤如下:
进入一级菜单 【General setup(一般配置)】,然后选中 【Option backend to use(要使用的配置项存储后端)】。
回车,然后在列表中,光标定位到 【Use CMOS for configuration values(用CMOS来保存设置值)】,按空格选中,搞定。
(7) 让 coreboot 在引导时自动清空内存
笔者在成功编译 coreboot 后,长期使用 X200 以进行稳定性测试,结果遇到了一个新问题:电脑隔三岔五无预兆重启。
经过一番搜索,知乎网友 flanto 的文章告诉了我答案:
根据个人使用经验,如果没有启用开机清空内存功能,就可能出现电脑随机重启现象。个人猜测,或许是通电后(特别是软重启后)内存中仍留有少数“垃圾”数据,当操作系统寻址到这些垃圾数据的地址就会发生错误。启用开机内存清空会略微延长 coreboot 启动时间,比如在 8G 内存的电脑上,从按下开机键到 SeaBIOS 运行,间隔时间会增加半秒钟。
依次进行以下步骤,开启 coreboot 的引导时清空内存功能:
进入 【Security(安全)】➡【Memory initialization(内存初始化)】 子菜单,勾选 【Always clear all DRAM on regular boot(常规启动时总是清空内存)】,保存设置即可。
启用显卡支持
coreboot 有两种显卡支持方案:
- 首选的显卡支持方案是 VGA Option ROM,即 VBIOS 镜像。它包含在官方的BIOS中,对 ThinkPad X200 的集显支持最充分。
- 如果没有 VGA Option ROM,则可以使用后备方案:libgfxinit,这是使用 Ada 语言编写的显卡驱动,可以提供基本的显示支持。
libgfxinit与Linear Frame buffer
先来介绍 libgfxinit。
libgfxinit驱动 X200 的 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
至此,coreboot 的显卡配置完成。
⚠️但要注意的是,libgfxinit对显卡的支持不充分:
- 它无法实现缩放显示,意味着如果操作系统、Bootloader(如 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中,每次开机即可利用它来初始化显卡。
a. 下载并解压 BIOS
VGA Option ROM 可以直接从官方 BIOS 升级文件中提取,需要使用两个工具,可自行检索下载:
- 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 升级文件:
1 | |
稍等片刻,工具就会在当前目录下生成一个新文件:$01B9100.FLh。
b. 提取 VGA Option ROM
运行 PhoenixTool,找到最顶部 “Original(原始 BIOS)” 那一栏,点击右侧的“..”按钮,打开刚刚生成的$01B9100.FLh文件。
此时,无须进一步操作,PhoenixTool 就会自动开始解包$01B9100.FLh这个 BIOS 升级文件,所有解包出来的文件都放到升级文件所在地的DUMP子目录中。
解包完成后会弹出一个提示框。确认后,进入DUMP子目录,
使用 Linux 的file工具来验证其中的OPROM00.ROM,可以看出这就是我们要找的 VGA Option ROM:
1 | |
c. 将 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
配置完成后,就可以立刻着手编译:
1 | |
**最终编译好的 coreboot ROM 位于build子目录,文件名为coreboot.rom **。
刷入coreboot并开机测试
连接编程器,运行以下命令,将 coreboot 刷入 BIOS 芯片中:
1 | |
若一切正常,输出结果将如下所示:
1 | |
刷好之后,松开夹具,断开编程器,扣上电池,开机!
上电后,coreboot 将初始化硬件,随后启动 SeaBIOS——一款开源的BIOS 实现。SeaBIOS 再引导硬盘上的操作系统。
在X200中,屏幕上出现 SeaBIOS 的版本号,以及本机的 UUID。不一会,本地硬盘上的 Grub 也成功引导,出现了“Welcome to Grub!”的一样,随后熟悉的 Grub 菜单出现在眼前。
启动成功!
内部刷写
刷好 coreboot 之后,尽管放心上好 X200 的盖子。后续的 BIOS 更新,无需再使用编程器,仅使用 Flashrom 就可以完成。
(1) 卸载lpc_ich驱动
通常,获取BIOS芯片状态的命令是flashrom -p internal。但一般情况下,在Arch Linux中运行时,会报错:
1 | |
网上的刷写教程,甚至是 coreboot 的官方文档,都是不会告诉你这个问题的。
所幸,Flashrom的官方文档提供了对策。只需卸载系统的lpc_ich驱动,即可释放对 BIOS 芯片的访问权限。运行以下命令:
1 | |
(2) 备份与刷写
卸载上述驱动后,直接运行 Flashrom 刷写即可。你既可以备份整颗芯片,也可以只备份 BIOS 区域而保持 ME、GbE 等其他部分不变。
例如,刷写刚刚编译好的coreboot:
1 | |
以及,备份当前版本的BIOS:
1 | |
后续问题
Grub的显示
我在测试 coreboot 的时候,启动过程中,会卡在“Welcome to Grub!”字样。但没过多久,Grub 仍能正常引导 Linux。
Grub默认会以图形方式显示菜单,这要求显卡必须初始化图形功能——有别于传统的VGA文字模式。
然而,我的 X200 在使用 libgfxinit 初始化时,如果不启用Linear Framebuffer,则默认只能使用文字模式,而 Grub 无法对此作出自适应的处理,所以菜单无法显示。
对此,有两种解决方案:
方案一:将Grub切换到文字模式
进入Linux后,修改/etc/default/grub,取消注释下面这行:
1 | |
如果是新版本的GRUB,则取消注释这一行:
1 | |
重新生成Grub配置文件:
1 | |
重启后,Grub就会以简易的文字来绘制界面,可以顺利使用了。
方案二:启用Linear Framebuffer
使用 Linear Framebuffer,就可以保证 Grub 的图形菜单能正常显示。
但是,Linear Framebuffer 不支持缩放,只能点对点显示,这意味着如果输入分辨率小于 Linear Framebuffer 指定的分辨率,画面就只能靠左上角显示。
并且,Grub 也无法获取 Linear Framebuffer 的最佳分辨率,它一律会用 640x480 的最低分辨率输出。最终的显示效果很“憋屈”。
所以,我们还需要设置 Grub 的输出分辨率。打开修改/etc/default/grub,修改参数GRUB_GFXMODE:
1 | |
X200的最佳分辨率是1280x800,32位色深。后面的x32可以省略。
修改后,更新Grub配置文件,重启生效,此时Grub能全屏显示了。
随机重启与花屏的问题
在启用“开机时自动清空内存”之前,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 内核推出后,电脑终于可以正常使用,不再花屏,我猜想是该版本修复了英特尔显卡的驱动程序问题。
参考资料
- 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 X201上刷进了Coreboot (帖主提到使用PhonenixTool来提取VGA BIOS。并且强调,有了
NATIVE_GRAPHICS_INIT,也就是libgfxinit提供的支持,就不需要VGA BIOS了。实践证明果然如此) - Thinkpad X200编译刷写自由开源BIOS——coreboot
- 本文作者: 爱拼安小匠
- 本文链接: https://anclark.github.io/2025/11/07/coreboot/x200-coreboot/
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 3.0(署名-非商用-禁止演绎 3.0) 许可协议。转载请注明出处!
