给一台 17 年前的 ThinkPad 刷入开源固件后,我让它在 2025 年「重获新生」
创始人
2025-11-13 13:16:06

编注:我们会不定期挑选 Matrix 的优质文章,展示来自用户的最真实的体验和观点。 文章代表作者个人观点,少数派仅对标题和排版略作修改。

我手上有一台 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 只提供源代码,不提供已经编译的固件,所以需要自己编译。你也许可以选用网上别人编译好的固件,但它们常常缺少正确的配置,导致功能缺失(例如,无线网卡和蓝牙不能使用)。

编程器连接

CH341A 是编程器的芯片型号,不同的厂家在用 CH341A 设计编程器时可能有不同的外观,配件也可能有不同的组装方式,故应当以资料为准。编程器的卖家通常会提供完备的资料。

就以我的编程器为例。我手上这台 CH341A「土豪金」编程器是这样子的:

左为 CH341A 编程器本体,右为配套的 SOP-16 夹具

卸下键盘与掌托

X200 的 BIOS 隐藏在掌托下,需要卸下键盘与掌托才能看到 BIOS 芯片。

卸掉笔记本底部除硬盘仓外所有带三角形标记的螺丝(还有一颗螺丝藏在电池仓,需要先卸下电池),然后小心沿着边缘拆下掌托,即可同时将键盘和掌托卸下。注意不要弄坏键盘底部的排线。

高配版的 X200 是带有指纹传感器的,它在主板上的接口是一块可拆卸的芯片,轻轻将它从主板取出。

准备编程器

编程器右侧有一个黑色的连接器。先把连接器右侧的手柄向上推,使手柄朝上:

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

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

连接 BIOS 芯片

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

红圈中的芯片就是 BIOS 芯片。右侧为 Intel 南桥芯片。

张开夹子,先让连着红色导线的夹板立在芯片右侧(对着南桥芯片那一侧),仔细对准芯片的针脚。接着缓缓将夹子夹在芯片上,确保芯片两侧的针脚都被夹住。一旦夹牢靠,就不容易松动。

接好之后,将编程器插在电脑的 USB 接口上,确保红灯亮起。连接完成的效果如下图所示。

夹具连接示意图。由于拍摄角度问题,一些细节没能准确呈现。你可以大致观察到 BIOS 芯片的位置,以及编程器的连接方式。

备份原机 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 option.

输出日志中,不止一个型号被检测出来。后续的操作,我们使用最长串的型号:MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F

提示:

  • 如果 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 值应当相同,如下:

准备 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 deor,存放闪存芯片的布局信息(必选)

  • ME Firmware,即 Intel Management Engine 的固件(可选,提取备用)

  • GbE,有线网卡的配置文件(必选)

上述组件可以直接使用 coreboot 提供的ifdtool来自动提取。

编译 ifdtool

进入 coreboot 源码目录,然后浏览到 ifdtool 的源码目录,并编译:

cd util/ifdtool

make

编译完成后,当前目录会多出一个可执行文件:ifdtool。为便于使用,可以把它安装到系统中:

sudo cp ifdtool /usr/bin/

提取组件

浏览到存放 BIOS 备份的目录,运行以下命令提取:

执行结果如下所示:

Flash Region 0 (Flash Deor): 00000000 - 00000fff

Flash Region 2 (Intel ME): 00001000 - 005f5fff

Flash Region 3 (GbE): 005f6000 - 005f7fff

Flash Region 4 (Platform Data): 005f8000 - 005fffff

此时,当前目录下就会多出几个文件。它们都是提取出的组件,属于 BIOS ROM 的组成部分。

  • flashregion_0_flashdeor.bin

  • flashregion_1_bios.bin

  • flashregion_2_intel_me.bin

  • flashregion_3_gbe.bin

  • flashregion_4_platform_data.bin

把组件放入 coreboot 源码目录中

首先,进入 coreboot 源码目录,然后建立下面的子目录:

mkdir -p 3rdparty/blobs/mainboard/lenovo/x200

然后,把提取出的以下三个组件改名,放入上述目录中:

至此,BIOS 组件准备完成,可以开始后续的配置了。

配置 coreboot

coreboot 使用 KBuild 来配置,配备一套直观易用的配置菜单,编译过 Linux 内核的开发者应该不会陌生。接下来,我们将配置 coreboot,打造出功能完备的体验,不应只满足于点亮机器进系统。

基本操作

  • 上下移动光标:选择设置项

  • Enter:

    • 进入子菜单或「多选一(给你多个选项,一次只能选一个)」菜单

    • 确认当前选项

  • Y/N/空格:勾选(或取消勾选),适用于带有方括号的项目,方括号里出现星号,表示已选中

  • 连按两次 ESC:返回上一页

进入配置菜单

进入 coreboot 源码目录,然后打开配置菜单:

make menuconfig

设置主板类型

首先,要将 coreboot 的主板类型设置为 ThinkPad X200。

1. 进入一级菜单 Mainboard(主板),然后选择 Mainboard vendor(主板厂商),按Enter进入。在列表中,光标定位到Lenovo,按空格选中。

2. 然后,选择 Mainboard model(主板型号),同样按Enter进入,在列表中,光标定位到ThinkPad X200 / X200s / X200t,按空格选中。

选好后,按两次 ESC,退回主页面。接下来的步骤都从主页面开始。

设置 BIOS 组件

进入一级菜单 Chipset(芯片组),然后勾选 Add Intel deor.bin file(添加英特尔 deor.bin 文件)。

此时,列表下方会多出下面两个选项:

  • Add Intel ME/TXE firmware(添加英特尔ME/TXE固件)

  • Add gigabit ethernet configuration(添加千兆以太网配置数据)

为了保证以太网能正常工作,你需要勾选 Add gigabit ethernet configuration。

至于Intel ME/TXE 固件,缺少该固件并不影响系统的使用,可以不勾选。关于该固件的问题,具体我会在文末「后续问题」章节讨论。

其余选项保持默认值。固件的路径默认均指向3rdparty/blobs/mainboard/lenovo/x200这一目录的相应文件,无需修改。

启用无线网卡支持

进入一级菜单 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 默认并没有开启参数保存的功能,这将导致所有参数在每次开机时还原为默认。并且,还会导致蓝牙指示灯无法点亮。

因此,我们需要手工打开它。具体步骤如下:

1. 进入一级菜单 General setup(一般配置),然后选中 Option backend to use(要使用的配置项存储后端)。

2. 回车,然后在列表中,光标定位到 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

至此,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 升级文件

上述两个工具都可以借助 Wine 在 Linux 下运行。

首先,从联想的海外版官网下载 X200 系列的 BIOS 更新工具。下载之前需要验证笔记本的序列号(位于笔记本底部)。你会得到一个安装程序,运行它,并在安装过程中记下安装目录(默认为C:\DRIVERS\FLASH\<一个6开头的文件夹(如6duj48us)>)。

进入安装目录,你会看到两个全大写字母的文件夹,BIOS 的原厂文件就在里面。其中:

  • 6DET72WW 对应的是 8MB BIOS 芯片的机型

  • 7XET72WW 对应 4MB BIOS 芯片的机型

考虑到笔者的 X200 用的是 8MB 的芯片,因此进入6DET72WW子目录。

phcomp.exe 放到该子目录中,然后运行以下命令,解压官方 BIOS 升级文件:

# Windows 下

# Linux 下(借助 Wine),注意“$”前面的转义字符

提取 VGA Option ROM

在 PhoenixTool 中打开 BIOS 升级文件后,软件就会自动解包固件,无需手动干预

解包完成后就会出现图中的提示框。

解包完成后会弹出一个提示框。确认后,进入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菜单出现在眼前。

启动成功!

内部刷写

后续的 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.ro

# 只备份 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,则取消注释这一行:

重新生成 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=1280x800x32

X200 的最佳分辨率是 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 内核推出后,电脑终于可以正常使用,不再花屏,我猜想是该版本修复了英特尔显卡的驱动程序问题。

相关内容

热门资讯

樊振东晋级全运会乒乓球男单四强 咪咕体育11月13日,第十五届全国运动会乒乓球项目在澳门银河综艺馆展开男单1/4决赛的争夺,上海队的...
如何‘山寨’企业文化 所谓奇葩...   在东莞的一次公开课程上,一位“生猛”的老总在课间休息时提了一个请求:“周老师,我们公司目前规模不...
微软个性文化的王国 微软个性文...   微软是一个商业传奇,但不是神话。正所谓,微软优秀的企业文化,成就微软优秀的企业。   微软的成功...
谁说企业文化没用 谁说企业文化...   企业文化真的有用吗?这是很多企业家心中的一个困惑,如果不排除这一困惑,那么是很难做好企业文化工作...
企业文化咨询如何告别忽悠 企业...   “企业文化咨询公司,作为独辟门类的一种业务机构,是不是中国咨询业的特色?”   “是的。”博采咨...