接近开源: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)。最近,我想要一台基于 Intel 的紧凑型 PC,它可以作为 MythTV 前端运行,能够运行 Kodi(开源影院系统),并且偶尔可以重新用作我的家庭实验室的虚拟机管理程序。

我选择了一款基于四核 N3150 处理器的 GIGABYTE BRIX,并重新利用了备用 RAM 和硬盘驱动器,以获得简单有效的解决方案。集成的 Intel HD Graphics 能够以 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 的漏洞,影响了许多关键 Intel 芯片组的 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 是 Red Hat 的开源倡导者和技术专家,自 2011 年 5 月 Red Hat 在新西兰开设办事处以来一直在 Red Hat 工作。

7 条评论

很棒的文章,感谢所有提示。

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

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

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

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

回复 作者 Pieter (未验证)

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

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

回复 作者 BrianRichardson (未验证)

太棒了,谢谢

© . All rights reserved.