跳转至

flashrom

简介

flashrom 是一个自由开源的跨平台软件,用于访问闪存芯片。除了其他编程器之外,它还支持刷写一些同时也被 iPXE 支持的网卡的启动 PROM(例如许多 3Com 和 Intel 网卡)。

下文假定你已经在 PATH 中有可用的 flashrom,并且在当前工作目录中有一个编译好的、名为 ipxe.rom 的 iPXE 镜像。

首先,你应该检查你的网卡是否受支持,以及 flashrom 的哪个编程器模块支持它。为此,请查看 flashrom wiki 中的受支持硬件列表

多个 PCI 设备

如果你安装了多个由同一编程器支持的设备,你必须告诉 flashrom 要访问哪一个。为此,你需要把 PCI 地址作为参数指定。你可以用 lspci -nn 找到 PCI 地址。

[user@machine ~]# lspci -nn
...
00:0d.0 Ethernet controller [0200]: 3Com Corporation 3c900B-TPO Etherlink XL [Cyclone] [10b7:9004] (rev 04)
^^^^^^^\
        \_ this is the PCI bus:device.fn address
00:0e.0 Ethernet controller [0200]: 3Com Corporation 3c905B 100BaseTX [Cyclone] [10b7:9055] (rev 24)
...

探测测试

假设你有两块 3Com 网卡,想要烧写上面的第一块,它由 flashrom 的 nic3com 编程器处理。要查看 flashrom 是否检测到网卡的闪存芯片,只需运行以下命令(以 root 身份或使用 sudo):

[user@machine ~]# flashrom -p nic3com:pci=00:0d.0
flashrom v0.9.7-r1710 on Linux 2.6.32-5-686 (i686)
flashrom is free software, get the source code at http://www.flashrom.org

Calibrating delay loop... OK.
Found Winbond flash chip "W29C010(M)/W29C011A/W29EE011/W29EE012" (128 kB, Parallel) on nic3com.

如果它没有找到芯片,请先确保芯片安装到位。如果这没有帮助,请检查该闪存芯片是否在 flashrom 的 wiki 中标记为受支持(注意:此列表会定期更新,如果你的 flashrom 版本太旧,它可能无法反映你的版本的状态)。

创建备份

如果 flashrom 检测到你的芯片,你应该先把现有数据读取到文件中做备份:

[user@machine ~]# flashrom -p nic3com:pci=00:0d.0 -r backup.rom

flashrom v0.9.7-r1710 on Linux 2.6.32-5-686 (i686)
flashrom is free software, get the source code at http://www.flashrom.org

Calibrating delay loop... OK.
Found Winbond flash chip "W29C010(M)/W29C011A/W29EE011/W29EE012" (128 kB, Parallel) on nic3com.
Reading flash... done.

如果你期望其中有有效数据(例如厂商的 option ROM),你应该在十六进制查看器中检查该文件,以确保 flashrom 工作正常。空芯片看起来是这样的:

[user@machine ~]# hd empty.rom
00000000  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00020000

写入

准备镜像

flashrom 要求提供给它的文件与要写入的闪存芯片大小相同。由于 iPXE 不会生成这种对齐的文件,你需要通过在末尾追加数据来填充它们(全部填 1 最好,因为这等于空闲空间,还能加快刷写速度)。假设你的 ipxe.rom 是 67584 字节,而你有一个 128 kB/1 Mb 的闪存芯片,那么你必须追加

131072 - 67584 = 63488

字节。下面这行 shell 脚本正好完成这个工作。

[user@machine ~]# tr '\0' '\377' < /dev/zero | dd bs=1 count=63488 of=ipxe.rom conv=notrunc seek=67584
63488+0 records in
63488+0 records out
63488 bytes (63 kB) copied, 0,0920346 s, 690 kB/s

烧录

镜像准备好之后,就可以用 flashrom 写入了:

flashrom -p nic3com:pci=00:0d.0 -w ipxe.rom
flashrom v0.9.7-r1710 on Linux 2.6.32-5-686 (i686)
flashrom is free software, get the source code at http://www.flashrom.org

Calibrating delay loop... OK.
Found Winbond flash chip "W29C010(M)/W29C011A/W29EE011/W29EE012" (128 kB, Parallel) on nic3com.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.

有些芯片(尤其是较旧的)已经磨损和/或存在一些时序问题。如果 flashrom 自行放弃并报错,在放弃之前再重试一两次。如果 flashrom 最后报告 VERIFIED,那么一切正常。