我认为我是幸运的,因为超过 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,但足以满足简单的测试平台)。
对于任何新设备,我的第一步是尝试使用 live USB 镜像来测试硬件。我手头有许多可启动镜像,包括 Fedora、Ubuntu 和 Red Hat Enterprise Linux,现在我倾向于使用 64 位镜像进行测试,因为最终我将运行 64 位操作系统。我还确认系统已设置为启用 VT 进行硬件加速虚拟化,因为令人惊讶的是,许多系统仍然在 BIOS 或 UEFI 中禁用了此设置。
此时,live 镜像中的好工具是 dmidecode
和 lspci
,用于提取固件和硬件信息
$ 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 更新 UEFI 固件。BIOS 风格的前端也没有更新固件的选项。
在线搜索 AMI UEFI 修补程序,找到了 Phoronix 上一篇关于 MSI 硬件的旧文章 (MSI:从 Linux 桌面更新您的 BIOS),表明一个名为 afulnx_64
的工具可能是一个选择。由于有点担心使用来自文件托管站点的随机工具修补我的系统,我发现 GIGABYTE 为其机架式企业级系统提供该工具的一个版本。
让我们尝试一下 GIGABYTE 提供的 ZIP 文件中的 tools 文件夹中的 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
好吧,那是大约两个月前的事了,从那以后硬件一直表现完美。
建议
- 更多供应商应该允许直接从 BIOS 风格的界面更新 UEFI BIOS。UEFI shell 命令行不适合普通用户。
- 如果您的供应商提供可启动镜像,请首先尝试使用它。
- 调查有哪些受支持的工具可用,但考虑使用 live 镜像进行修补。我有点担心那些构建和安装自己的内核模块的工具。
- 帮助像 flashrom 这样的项目,以避免将来出现这些问题。
在我的下一篇文章中,我将分享修补 SSD 固件的乐趣。
7 条评论