編注:我們會不定期挑選 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。
提示: 檢測出多型號是正常現象,因為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 備份的目錄,運行以下命令提取:
執行結果如下所示:
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 源碼目錄,然后建立下面的子目錄:
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 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 默認并沒有開啟參數保存的功能,這將導致所有參數在每次開機時還原為默認。并且,還會導致藍牙指示燈無法點亮。
因此,我們需要手工打開它。具體步驟如下:
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。
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(最大像素寬度),指定為
1280Maximum 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 升級文件
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子目錄中。
![]()
在 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菜單出現在眼前。
啟動成功!
內部刷寫
刷好 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.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,取消注釋下面這行:
_TERMINAL=console
如果是新版本的 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=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 內核推出后,電腦終于可以正常使用,不再花屏,我猜想是該版本修復了英特爾顯卡的驅動程序問題。
忘記 BIOS 管理員密碼,給我掌控手上這臺 ThinkPad X200 帶來了麻煩,無法進系統,近似于變磚。幸運的是,我有開源的力量——借助開源固件 coreboot,順利繞開了官方 BIOS 的安全保護。
coreboot 的表現非常驚艷,按下電源鍵的一瞬間,就立即進入了 SeaBIOS,隨后迅速引導硬盤中的 Arch Linux。啟動速度遠遠快于官方 BIOS(僅支持MBR啟動),表現堪比 UEFI 固件,不像官方 BIOS 在按下電源鍵后還要磨蹭那么幾秒鐘才亮屏。
如今,X200 成功煥發新生,不再吃灰,繼續作為我的第二主力。在這里衷心感謝 coreboot 團隊的匠心和努力,以及開源世界生生不息的力量。
https://sspai.com/post/88834?utm_source=wechat&utm_medium=social
作者:愛拼安小匠
責編:張奕源Nick
題圖來自 Unsplas h : @ foegra
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.