几乎开放:Linux 用户的 BIOS 和固件更新技巧

8 位读者喜欢这篇文章。
Penguins on beach

原始照片由 Rikki Endsley 拍摄。 CC BY-SA 4.0

我想我很幸运,在超过 10 年的时间里,我的主要工作环境都是基于 Linux 的,但我也经常被迫翻出 DOS 或 Windows 镜像,因为我需要修补一些 BIOS 设备固件。如今,我没有任何拥有有效 Windows 许可证的东西,甚至我的 2008 年白色 MacBook 的大部分时间也都在运行 Ubuntu 或 Fedora。幸运的是,大多数硬件制造商已经开始提供可启动的镜像,用于修补系统固件,对于企业级硬件,他们甚至提供 Linux 就绪的工具。在本文中,我将介绍我最近在 Linux 上进行的固件更新,并分享一些基于该经验的建议。

在消费者/专业消费者领域,台式机和笔记本电脑已经转向基于 UEFI 的系统,并且在此过程中,许多制造商似乎已经取消了从 USB 闪存盘更新 BIOS 的选项。历史上,我们只会看到企业级旋转磁盘(硬盘驱动器)的固件更新,但许多 SSD 制造商也为消费级设备提供定期的固件更新。虽然我们经常应该坚持旧格言“如果没坏,就别修”,但我坚信在建立新环境时要确保我的所有固件都是最新的。所以我的旅程开始了...

我的更新冒险

多年来,我一直参与 MythTV 项目(开源 DVR),包括一度在新西兰生产面向消费者的系统 (myPVR)。最近,我想要一台基于英特尔的紧凑型 PC,它可以作为 MythTV 前端运行,能够运行 Kodi(开源影院系统),并且偶尔可以重新用作我的家庭实验室的虚拟机管理程序。

我选择了一款基于四核 N3150 处理器的 GIGABYTE BRIX,并重新利用了备用 RAM 和硬盘驱动器,以获得一个简单有效的解决方案。集成的英特尔高清显卡能够以 24 帧/秒的速度处理 H265/HEVC,而且 CPU 具有 VT 用于硬件加速虚拟化(遗憾的是只能升级到 8GB RAM,但对于简单的测试平台来说足够了)。

Gigabyte Brix

对于任何新设备,我的第一步是尝试 live USB 镜像来测试硬件。我手头有许多可启动的镜像,包括 Fedora、Ubuntu 和 Red Hat Enterprise Linux,现在我倾向于使用 64 位镜像进行测试,因为最终我将运行 64 位操作系统。我还确认系统已设置为启用 VT 以进行硬件加速虚拟化,因为令人惊讶的是,仍然有许多系统在 BIOS 或 UEFI 中禁用了此设置。

 

screeshot

在 live 镜像中,此时非常有用的工具是 dmidecodelspci,用于提取固件和硬件信息

$ sudo dmidecode
System Information
        Manufacturer: GIGABYTE
        Product Name: GB-BACE-3150
        Version: 1.x
        Serial Number: To be filled by O.E.M.
        UUID: 0XXXXXXX-0XXX-XXXX-XXXX-XXXXXXXXXXXX
        Wake-up Type: Power Switch
        SKU Number: To be filled by O.E.M.
        Family: To be filled by O.E.M.

Handle 0x0000, DMI type 0, 24 bytes
BIOS Information
        Vendor: American Megatrends Inc.
        Version: F2
        Release Date: 06/29/2015


$ sudo lspci
00:00.0 Host bridge: Intel Corporation Device 2280 (rev 21)
00:02.0 VGA compatible controller: Intel Corporation Device 22b1 (rev 21)
00:10.0 SD Host controller: Intel Corporation Device 2294 (rev 21)
00:13.0 SATA controller: Intel Corporation Device 22a3 (rev 21)
00:14.0 USB controller: Intel Corporation Device 22b5 (rev 21)
00:1a.0 Encryption controller: Intel Corporation Device 2298 (rev 21)
00:1b.0 Audio device: Intel Corporation Device 2284 (rev 21)
00:1c.0 PCI bridge: Intel Corporation Device 22c8 (rev 21)
00:1c.1 PCI bridge: Intel Corporation Device 22ca (rev 21)
00:1c.3 PCI bridge: Intel Corporation Device 22ce (rev 21)
00:1f.0 ISA bridge: Intel Corporation Device 229c (rev 21)
00:1f.3 SMBus: Intel Corporation Device 2292 (rev 21)
01:00.0 Unassigned class [ff00]: Realtek Semiconductor Co., Ltd. Device 522a (rev 01)
02:00.0 Network controller: Intel Corporation Wireless 3160 (rev 83)
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)

我预计唯一可能出现问题的设备是基于 Realtek 522a 的 MicroSD 卡读卡器。所有其他设备都受到现代 Linux 发行版的良好支持。

查看 GIGABYTE 的网站确认了 UEFI BIOS 的 新固件更新,它解决了 USB 设备和选定显示器的一些问题。鉴于我的主要用例之一是 HTPC,良好的显示器支持至关重要,因此是时候更新了。

快速检查提供的 brix_bios_gb-bace-3150_f3.zip 更新确认缺少 Linux 工具,而且我从未尝试过直接从 UEFI shell 进行固件更新。BIOS 风格的前端也没有更新固件的选项。

screenshot

在线搜索 AMI UEFI 补丁,找到了 Phoronix 关于 MSI 硬件的旧文章 (MSI:从 Linux 桌面更新您的 BIOS),表明名为 afulnx_64 的工具可能是一个选项。由于有点担心使用来自文件托管站点的随机工具修补我的系统,我发现 GIGABYTE 为他们的机架式企业级系统提供了 该工具的版本

让我们尝试一下 GIGABYTE 提供的 ZIP 文件工具文件夹中的 afulnx_64 可执行文件

./afulnx_64 
Error: Cannot locate kernel source.
e - Error: Kernel source files cannot be found.

该工具需要构建一个内核模块才能修补我的 BIOS。从安全角度来看,这有点令人担忧,但看起来比 Matthew Garret 近年来谈到的一些 UEFI 工具要好。

此外,最近还出现了一些安全漏洞,包括一个标记为 ThinkPwn 的漏洞,它存在于许多关键英特尔芯片组的 UEFI 中,影响了联想、技嘉、惠普和许多其他厂商的产品。关注您硬件的新 UEFI 版本可能比旧时代的 BIOS 更新重要得多,特别是考虑到现代硬件上 UEFI 子系统的强大功能。

此时,我尝试寻找真正的开源替代方案,例如 flashrom

$ sudo flashrom --programmer internal -V
flashrom v0.9.9-rc1-r1942 on Linux 4.4.0-28-generic (x86_64)
flashrom 是自由软件,在 https://flashrom.org 获取源代码

flashrom 使用 libpci 3.3.1、GCC 5.3.1 20160225、小端字节序构建

找到 Macronix 闪存芯片 "MX25U6435E/F" (8192 kB, SPI)。
该芯片可能包含一次性可编程内存。flashrom 无法读取,也可能永远无法写入它,因此它可能无法完全克隆此芯片的内容(有关详细信息,请参阅手册页)。未指定任何操作。
在 0x7fc38d7470fc 恢复 MMIO 空间

情况不妙,所以回到 afulnx_64 工具。幸运的是,大多数 live USB 镜像都允许您安装额外的软件包,所以我拉取了内核头文件并再次尝试 afulnx_64。我无法在 Ubuntu 14.04 或 16.04 上使其工作,但它在 RHEL 7.2 上有效。出于对我的新硬件的偏执,我首先检查了当前的 bios 安装,以确认该工具“似乎可以工作”

$ sudo ./afulnx_64 /S
+--------------------------------------------------------+
           AMI Firmware Update Utility  v3.05.02         
Copyright (C)2013 American Megatrends Inc. All Rights Reserved.
+--------------------------------------------------------+
 Reading flash ............... done                
 - System ROM ID = 000
 - System ROM GUID = 206a14ad-fcd9-4e0c-91fbd419d9e41972
 - System ROM Secure Flash = Disable.

然后执行现有 ROM 的备份,作为该工具的进一步测试

$ sudo ./afulnx_64  ./F2.ROM /O
+--------------------------------------------------------+
           AMI Firmware Update Utility  v3.05.02         
Copyright (C)2013 American Megatrends Inc. All Rights Reserved.
+--------------------------------------------------------+
 Saving current BIOS into file: ./F2.ROM
 Reading flash ............... done             

验证该工具是否理解为此主板提供的新 ROM

$ sudo ./afulnx_64 ../image.bin /D
+--------------------------------------------------------+
           AMI Firmware Update Utility  v3.05.02         
Copyright (C)2013 American Megatrends Inc. All Rights Reserved.
+--------------------------------------------------------+
 Reading flash ............... done                
 - ME Data Size checking . ok
 - FFS checksums ......... ok
 - ROM File Capsule Header checking.. fail
 - ROM File Size checking ........... ok
 - ROM ID checking .................. ok
 - ROM File verification status ..... ok 

祈祷一切顺利,因为我们上面确实收到了一个错误

$ sudo ./afulnx_64 ../image.bin 
+--------------------------------------------------------+
           AMI Firmware Update Utility  v3.05.02         
Copyright (C)2013 American Megatrends Inc. All Rights Reserved.
+--------------------------------------------------------+
 Reading flash ............... done                
 - ME Data Size checking . ok
 - FFS checksums ......... ok
 Erasing Main Block .......... done                
 Updating Main Block ......... done                
 Verifying Main Block ........ done  

通过 dmidecode 确认 BIOS 更新

Handle 0x0000, DMI type 0, 24 bytes
BIOS Information
        Vendor: American Megatrends Inc.
        Version: F3
        Release Date: 03/23/2016

嗯,那是大约两个月前的事了,从那时起硬件一直运行完美。

建议

  1. 更多供应商应该允许直接从 BIOS 风格的界面进行 UEFI BIOS 更新。UEFI shell 命令行不适合普通用户。
  2. 如果您的供应商提供可启动镜像,请首先尝试使用它。
  3. 调查有哪些受支持的工具可用,但考虑使用 live 镜像进行修补。我有点担心构建和安装自己内核模块的工具。
  4. 帮助像 flashrom 这样的项目,以避免将来出现这些问题。

在我的下一篇文章中,我将分享修补 SSD 固件的乐趣。

资源

User profile image.
Steven 是一位开源倡导者和技术专家,自 2011 年 5 月 Red Hat 在新西兰开设办事处以来,一直在 Red Hat 工作。

7 条评论

很棒的文章,感谢所有的技巧。

非常有趣的文章。感谢您告诉我们您尝试了什么以及什么有效!

感谢分享。我的技嘉主板也支持以下固件更新程序:将固件文件复制到 DOS/WinVFat 格式的 USB 闪存盘,启动电脑并立即按下一个热键(我记得是 F2),然后让内置的 BIOS 更新功能从 USB 闪存盘抓取新的固件版本并启动更新过程。希望这有帮助。

我有一些较旧的主板仍然支持通过 F2 或类似的热键更新 BIOS。

我发现很多基于 UEFI 的主板已经取消了此功能。

回复 作者 Pieter (未验证)

实际上,我有一些关于它的笔记,用于一篇仍在草稿中的后续文章。

遗憾的是,我正在使用的硬件没有任何支持,但很高兴看到该项目在整合许多固件管理任务方面取得了一些进展。

回复 作者 BrianRichardson (未验证)

太棒了,谢谢

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.