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,那么一切正常。