![实践中如何在Linux下刷固件?](https://linux22.com/image/41710/%E5%AE%9E%E8%B7%B5%E4%B8%AD%E5%A6%82%E4%BD%95%E5%9C%A8Linux%E4%B8%8B%E5%88%B7%E5%9B%BA%E4%BB%B6%EF%BC%9F.png)
好吧,我感觉自己已经太老了,无法通过通常的特定于供应商的方式跳过几个烧环来升级多个固件:下载一些 DOS 工具,浪费一些时间创建(免费)DOS 启动介质并浪费更多时间来制作 BIOS实际上从那里启动并最后刷新固件升级。
这就是 1980 年代的风格。
我遇到一些Linux 闪存工具来自核心启动项目。好像支持各种FLASH芯片。但它在实践中是如何运作的呢?
我猜想将供应商提供的固件升级转换为正确的格式存在一些陷阱。或者如何确定正确的目标芯片?
目前我可能必须升级,例如:
- 某些 Seagate 1.5 TB 磁盘的固件
- 旧 Abit Athlon 64 主板的固件(Award BIOS)
- Thinkpad 的 Bios/嵌入式控制器 Bios
如何在 Linux 系统上升级设备固件?
答案1
使用 FreeDOS 进行刷新,一次重新启动并且没有可移动设备
- 确保您使用的是 GRUB2(检查您是否
grub-pc
在 Ubuntu 上安装了该软件包) - 获取 SYSLINUX 的 MEMDISK。在 Ubuntu 上,安装该软件包
syslinux-common
,您的内存磁盘将驻留在/usr/lib/syslinux/memdisk
- 下载fdboot.img,将其保存在您的主目录中,或者您可以使用美式键盘布局轻松键入的其他目录中
- 将您的刷新软件嵌入 FreeDOS 映像中:
sudo -s
mkdir -p /mnt/floppy
mount -o loop -t msdos fdboot.img /mnt/floppy
cp -via FLASH.EXE BIOS.IMG /mnt/floppy/
(FLASH.EXE
和BIOS.IMG
是示例)umount /mnt/floppy
- 引导系统并在 GRUB2 中中断它(按 ESC)
- 按c进入GRUB2的命令行。
- 加载MEMDISK:
- 进入
linux16 (hd
。现在按选项卡。将显示硬盘列表。 linux16 (hd0,
例如,完成硬盘选择,以便该行显示。- 再次按 Tab 键即可获取分区列表。您需要
/usr/lib/syslinux
在 Linux 安装中找到您安装的分区。 - 现在您已经有了硬盘和分区规范,您可以完成路径,使其如下所示:
linux16 (hd0,msdos3)/usr/lib/syslinux/memdisk
。按回车键。
- 进入
- 加载 FreeDOS:
- 使用相同的制表符完成来查找
fdboot.img
,但用命令initrd16
代替linux16
。你最终会得到这样一行:initrd16 (hd0,msdos3)/home/janus/fdboot.img
。按回车键。
- 使用相同的制表符完成来查找
- 写入
boot
并按 Enter 键。 - FreeDOS 启动菜单将会出现。
- 选择“安全模式”选项,因为您不需要驱动程序。
- 在 DOS 提示符下,写入固件刷新可执行文件的名称,例如:
FLASH.EXE
。按回车键。 - 等待闪烁完成。
- 固件刷新器可能会自行启动计算机,或者您可能会收到提示。如果再次出现提示,请按 Control-Alt-Delete 重新启动。
- 由于您没有永久更改 GRUB 配置,因此它将立即启动回到您的默认操作系统。
如果图像上没有足够的空间,请使用最小的图像欧盟网站。解压缩图像并对其进行过滤xxd
。现在搜索55氨基酸。应该是在0x1fe
。您可以将映像offset=$((0x200))
作为附加安装标志来安装。请注意,该$(())
语法是 Bash 特定的,但也适用于 Zsh。
答案2
答案3
对于希捷 3TB 视频 (ST3000VX000-9YW1):
sg_write_buffer -v -m 5 -I <FW file> <dev>
答案4
您可以使用闪存更新主板的 BIOS。
示例(升技 KN9 Ultra):
该主板为AMD Athlon 64主板,AM2插槽,Nvidia芯片组,2006年发布。它具有可更换的256 KB闪存芯片。 BIOS上标有“Award”字样,似乎是Phoenix的商标。
Flashrom 支持该芯片组和闪存芯片。
可以使用如下命令测试支持:
# flashrom --programmer internal
Calibrating delay loop... OK.
Found chipset "NVIDIA MCP55".
Enabling flash write... OK.
Enabling full flash access for board "abit KN9 Ultra"... OK.
Found PMC flash chip "Pm49FL004" (512 kB, LPC, FWH) mapped at physical address 0x00000000fff80000.
首先备份闪存芯片的当前内容是有意义的:
# flashrom --programmer internal -c Pm49FL004 -r backup.bin
然后可以将其与供应商提供的普通图像文件进行比较(使用例如xxd
和vimdiff
)。
预计会有一些差异 - 因为某些 BIOS 还在闪存中存储附加信息(例如 DMI)和配置(例如 MAC 地址)。升技KN9 Ultra也是如此。 DMI 数据存储在前 1872 个字节中,并且可以在引导期间由 BIOS 轻松重新生成。 MAC 地址存储在偏移量 0x74E30 处。
供应商固件文件打包在 zip 存档中,其中包含awdflash.exe
一个BIN
文件,例如M520A_23.BIN
.在此示例中,bin 文件按原样包含 BIOS 映像,即可以使用如下命令直接将其写入闪存芯片:
# flashrom --programmer internal -c Pm49FL004 -w M520A_23.BIN
Calibrating delay loop... OK.
Found chipset "NVIDIA MCP55".
Enabling flash write... OK.
Enabling full flash access for board "abit KN9 Ultra"... OK.
Found PMC flash chip "Pm49FL004" (512 kB, LPC, FWH) mapped at physical address 0x00000000fff80000.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.
根据更新,可能需要清除互补金属氧化物半导体以便下次重新启动 - 否则 BIOS 可能无法启动。在该板上,可以通过跳线设置清除 CMOS。也可以通过软件清除(例如通过CMOS密码)。
为了保持唯一的默认 MAC 地址,可以在刷新之前修补新的供应商映像,例如:
dd if=backup.bin of=mac.bin bs=1 count=16 skip=$(echo 16 i 74E30 p | dc)
dd if=mac.bin of=M520A_23_with_mac.bin bs=1 seek=$(echo 16 i 74E30 p | dc) \
conv=notrunc
陷阱:
- 由于主板特定原因,闪存写入可能会失败板使能(即禁用写保护)尚未由 flashrom 实现的代码。