ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Windows下用flashrom v1.5.1备份与刷写BIOS实战指南

Windows下用flashrom v1.5.1备份与刷写BIOS实战指南

前阵子帮 A 同学处理一块刷 BIOS 刷到一半断电的旧主板,Windows 系统里官方刷写工具已经完全不认设备。网上查了一圈,不少回复都是“去下个 Linux 启动盘”,可手头没有空闲 U 盘,机器又靠在 Windows 环境里。后来我用 flashrom v1.5.1 的 Windows 版本在命令行下把备份写回去,十几分钟救回来。这篇文章把整个过程整理成一条可以照着走的路线:从哪里拿 v1.5.1,驱动怎么装,读取备份、写入验证的命令怎么写,以及我在 Windows 下实际踩过的坑。如果你需要在 Windows 下备份或刷写 BIOS、路由器固件、网卡启动模块,或者机器已经半砖,本文应该能省掉你大半天的折腾时间。

flashrom 是个开源固件烧录工具,作用是直接跟主板上的 SPI Flash 芯片打交道,完成读取、擦除、写入和校验。它并不是 Windows 专用工具,但 v1.5.1 的 Windows 构建版在原生命令行下用起来足够顺,不需要为了一次刷写专门切系统。下面我按自己实际操作顺序逐段讲,不少细节是看官方文档也不会特别注意到的。

1. 为什么 Windows 用户也需要 flashrom v1.5.1 这个工具

1.1 官方工具做不到的事

大多数主板厂商都会提供自家刷写工具,界面友好,点击鼠标就能刷。可这类工具有三个典型问题:第一,只适配自家主板,换了平台、二手板就失效;第二,救砖能力弱,系统本身起不来时工具也跟着没了;第三,操作不透明,刷写过程中到底擦没擦、写没写、要不要验证,用户根本不知道。flashrom 走的是另一条路:它不关心品牌,只认芯片和总线协议,只要能检测到 SPI Flash 芯片,就可以读写。所以当官方工具失灵、BIOS 损坏、或者你想在旧设备上备份一份原厂固件时,flashrom 往往是最后能用的工具。

v1.5.1 的 Windows 版不是那种需要虚拟机中转的玩具,它就是用本地驱动访问硬件,速度和其他平台基本一致。我试过在 Windows 10/11 环境下读取一颗 16MB 的 SPI Flash,完整备份耗时在几十秒到两三分钟,和 Linux 下没有明显差别。很多人一听到 flashrom 就默认是 Linux 专用工具,这是误会。它本来就是跨平台的,Windows 构建版一直跟着主线走,只是资料相对少、大家不常用而已。

1.2 在 Windows 原生环境跑,比启动到 Linux 更省事

很多人遇到这种情况第一反应是做个 Linux 启动盘。但说实话,为一次两次的刷写操作去下载 ISO、写 U 盘、重启进另一个系统,成本并不低。如果你的电脑能进入 Windows,且 CPU、芯片组允许访问 SPI 控制器,直接以管理员权限运行 flashrom 的 Windows 版完全可行。v1.5.1 的 Windows 版不是那种需要虚拟机中转的玩具,它就是用本地驱动访问硬件,速度和其他平台基本一致。我试过在 Windows 10/11 的环境下读取一颗 16MB 的 SPI Flash,完整备份耗时在几十秒到两三分钟,和 Linux 下没有明显差别。

注意:这里说的“Windows 原生环境”不包括 WSL。WSL 对 USB 设备和底层硬件访问的支持很绕,尤其是 flashrom 需要直接操作 I/O 端口时,在 WSL 里跑容易多一层莫名其妙的故障。直接用 CMD 或 PowerShell 跑官方 Windows 构建版最稳。

1.3 适合的场景清单

  • 主板 BIOS/UEFI 救砖、备份、还原。
  • 路由器、交换机的 SPI Flash 固件读写。
  • 网卡 Boot ROM 固件更新。
  • 老服务器 BMC、IPMI 固件的备份与恢复。
  • 学习 SPI Flash 芯片的读、写、擦除原理。

其中主板 BIOS 备份是最常见的入门操作,风险相对低,建议新手从这里开始练手。

1.4 版本选择:为什么是 v1.5.1

flashrom 版本号一直在滚动,v1.5.1 不是最新也不是最老,但在 Windows 下属于比较稳的版本。它编译周期覆盖了近年常见的 SPI Flash 芯片,也在驱动识别和日志输出上做了不少改进。相比更早的版本,v1.5.1 对 Windows 路径、长文件名和中文环境的处理更不容易出问题;相比某些开发版快照,它又不会天天变参数。我的建议是:生产环境刷写别追开发版,锁在 v1.5.1 这个稳定版上;等出了下一个正式版再评估迁移。

2. 拿到正确版本:v1.5.1 的获取与运行前准备

2.1 从官方渠道下载并校验

flashrom 的 Windows 构建版一般从它的官方网站或官方版本发布页下载,不要从第三方下载站拿,因为这是直接操作硬件的工具,被塞进恶意修改的版本后果很严重。下载后第一件事就是校验哈希。Windows 下可以用 PowerShell:

Get-FileHash .\flashrom-v1.5.1-windows.zip -Algorithm SHA256

把输出的哈希值和发布页公布的哈希逐位对比,一致再解压。这一步不能省,尤其你手里还有其他来源的下载包。很多人觉得“我下载的肯定是官方包”,但现实中第三方镜像、网盘转存满天飞,校验一遍花不了十秒钟,却能避免一堆后续问题。

2.2 解压与运行环境

我习惯把压缩包解压到一个干净目录,比如C:\flashrom,不要解压到桌面带中文或空格的路径,更不要放在 OneDrive 同步目录里。flashrom 在 Windows 下对带空格路径的处理时好时坏,为避免“Error opening file”这种低级问题,路径越简单越好。解压后你会看到flashrom.exe和一批驱动、配置文件,Linux 版常见的flashrom可执行文件在 Windows 下就是 exe。

然后打开 PowerShell 或 CMD,注意一定要“以管理员身份运行”。flashrom 访问 SPI 控制器硬件需要管理员权限,普通权限下很可能出现 “Could not open...” 或找不到设备。验证一下版本:

cd C:\flashrom .\flashrom.exe --version

能看到版本号输出,说明程序本身没问题。如果提示缺少 DLL,或者直接被系统拦截,先检查下载包是否完整、杀毒软件是不是把某个组件隔离了。程序能跑起来,后面的操作才有基础。

2.3 驱动:最容易卡住的一环

flashrom 在 Windows 下访问硬件有两种常见情况:

  1. 读取主板内置 SPI Flash 时,它通过厂商提供的底层驱动或 Windows 自身的驱动访问 I/O 端口。这种情况通常不需要额外安装第三方驱动,但必须以管理员运行。
  2. 使用外部编程器(比如常见的 USB 编程器)时,操作系统需要为编程器安装驱动。很多廉价编程器用的驱动和 flashrom 能识别的驱动不一致,或者驱动识别成了错误设备,导致 flashrom 发指令过去没反应。

判断方式很简单:插上编程器后打开设备管理器,看设备是否出现在“通用串行总线设备”或“libusb-win32 设备”这类分类下。如果显示为未知设备,需要用通用 USB 驱动安装工具把它切换成 WinUSB 兼容模式,然后再运行 flashrom。

注意:如果你只刷主板内部 BIOS,不需要碰外部编程器驱动这一块。但一旦主板变砖、内部 CPU 都初始化不了,外部编程器就是救命的最后手段,所以驱动这关迟早要过。

2.4 关闭干扰项

Windows 自带的实时防护、第三方杀毒软件,以及主板配套的 RGB 灯控、超频软件、硬件监控软件,都可能在你刷写过程中突然干预硬件访问。尤其是杀毒软件扫描到一个正在直接写底层设备的进程,说不定会当场隔离进程。我的做法是:把 flashrom 所在目录加入杀毒软件白名单,关闭其他不相关的硬件监控工具,刷写过程中不要打开别的程序。这不是玄学,我曾经有一次刷到 67% 被杀毒弹窗打断,进度条卡住,最后只能重来。

3. 刷写之前不偷懒:识别芯片、备份与规划

3.1 第一次运行,先识别芯片而不是直接写

拿到 flashrom 后,建议第一条命令只做识别:

.\flashrom.exe -p internal

-p指定编程器,internal表示使用主板内置的控制器,不接外部编程器。输出里如果出现类似 “Found flash chip ... SPI” 的信息,说明控制器和芯片都被识别了;如果提示找不到芯片,先去处理驱动和 BIOS 写保护,再继续。

v1.5.1 还支持更精细的芯片查询参数,比如:

.\flashrom.exe -p internal --flash-name

这条命令专门输出芯片的制造商、型号和容量。把型号记下来,后面写操作可以配合-c手工指定,避免多颗芯片型号接近时 flashrom 猜错。自动识别虽然方便,但碰到 JEDEC ID 类似、容量一样、只是厂商不同的芯片时,手工指定往往更安心。

3.2 备份永远先做

识别成功后,先备份,再谈刷写。备份命令:

.\flashrom.exe -p internal -r backup.bin

-r是读取(read)的意思,backup.bin是输出文件名。整个读取过程会有进度条和百分比,完成后建议把 backup.bin 复制一份到另一个磁盘,甚至再压缩一份放到网盘。原因很简单:原厂固件和当前 BIOS 状态,是你之后所有操作的最后退路。如果刷坏了,想刷回原样,没有备份就只能去官网碰运气。

备份完成后,强烈建议做一次读取验证,用-v参数把备份文件再读一遍比对:

.\flashrom.exe -p internal -v backup.bin

这条命令会重新读取芯片内容,和 backup.bin 做逐字节比较。如果验证通过,说明这次备份大概率是完整可靠的。我见过有人备份完从不验证,结果真到需要回刷时才发现文件是坏的,那种绝望还是别体验了。

3.3 写之前规划:全片写入还是只写某个区域

主板 BIOS 芯片里往往不只有 BIOS/UEFI 代码,还包含主板固件描述符(IFD)、Management Engine 等区域。如果手头的新固件是整片镜像,直接-w写入没问题;但如果手里只有一个单独的 BIOS 区域镜像,而你想保留主板原有的描述符,就应该指定只写 BIOS 区域。v1.5.1 支持类似:

.\flashrom.exe -p internal --ifd -i bios -w new_bios_region.bin

--ifd告诉 flashrom 解析固件描述符,-i bios表示只操作其中名为 bios 的区域。这个操作比全片写入温和得多,也是我在 Windows 下最常用的救砖方式。要注意的是,不同主板的区域划分名称可能不同,-i后面能填哪些区域,可以用--ifd配合帮助参数确认。拿不准时,优先选择全片镜像写入,避免因为区域定义不一致而写出一个半残固件。

3.4 供电、静电和意外中断的管理

刷写芯片最怕的就是中途断电。这句话我说过不止一次,但每次总会有人不当回事。实际操作时注意这几点:

  • 笔记本:插上原装电源适配器,并到系统设置里把“接通电源后睡眠”关掉,最好把合盖动作改成“不采取任何操作”。
  • 台式机:不要依赖 UPS 或者“普通电源很稳”的错觉,刷写时尽量别同时开大功率设备,以免电源波动。
  • 防静电:接触机箱金属部位放一下静电,特别是在干燥季节。
  • 外部编程器:用尽量短的 USB 线,别用几米长的延长线,信号质量不稳定时刷写到一半可能直接报错。

4. 实战命令行:读取、擦除、写入与验证的一次完整操作

4.1 一条标准的备份流程

把前面三步串起来,在管理员 PowerShell 里执行:

cd C:\flashrom .\flashrom.exe -p internal --flash-name .\flashrom.exe -p internal -r backup_20250101.bin .\flashrom.exe -p internal -v backup_20250101.bin

这三条命令依次做识别、备份、验证。如果识别输出正常,备份没有报错,验证能通过,说明你的 Windows 环境已经可以正常操作这颗芯片。这时候再进入写操作,心里才有底。不要跳过验证,这一步不花多少时间,却能避免事后才发现备份文件不完整。

4.2 写入新固件的完整命令

准备好要写入的镜像文件,放在同一个目录里,文件名不要带中文和空格,比如new_fw.bin。执行:

.\flashrom.exe -p internal -w new_fw.bin

-w会自动完成擦除和写入,一般不需要你手动执行-e擦除。整个流程大概是:先识别芯片,擦除整片,然后逐块写入,最后自动校验。注意,如果镜像大小和芯片容量不一致,flashrom 会拒绝写入或提示你加-f强制,但我不建议一上来就加-f,还是要先搞清楚文件来源对不对。镜像校验和、来源确定没问题,再考虑强制参数。

写完以后如果没有自动校验,或者你想再确认一次,可以单独执行:

.\flashrom.exe -p internal -v new_fw.bin

验证通过后再关机重启。如果验证不过,说明写入结果和源文件不一致,这时候重启等于给自己找砖。

4.3 常用参数速查

参数含义我的建议
-p internal使用主板内置 SPI 控制器刷主板 BIOS 时最常用
-r 文件名读取芯片内容到文件备份必用
-w 文件名擦除并写入文件常规写入
-v 文件名验证文件与芯片内容是否一致写完、备完都跑一遍
-c 芯片型号指定芯片型号自动识别失败时再用
-f强制操作,忽略部分警告谨慎使用
-i 区域名只操作指定区域配合--ifd做局部刷写
-V输出完整详细日志排查问题时必开

这张表基本覆盖了 80% 的使用场景。不要背参数,关键是理解每条命令在做什么:-r是读,-w是写,-v是验证,其余都是修饰。

4.4 写入过程中的实时观察

v1.5.1 在 Windows 下写入时,默认会打进度百分比。别走开,就盯着它。正常情况进度条缓慢但均匀推进,有时候会卡在某个百分比几秒钟,那可能是擦除或较慢的写入阶段,属于正常现象。但如果卡了很久没有动静,或者出现重复重试提示,就要警惕连接问题和中断风险。这时候的应急处理是:先等 30 秒,如果依然没有进展,记录当前日志,不要直接拔设备或硬重启,等 flashrom 自己超时退出的概率通常比手动打断更安全。

4.5 验证不通过怎么办

写入完成后如果验证失败,有两种常见原因:一是写入过程受到干扰,比如后台程序抢占了硬件资源;二是镜像本身和芯片不匹配,比如芯片容量标识不一致。我的处理顺序是:先重跑一次验证确认是不是偶发问题;再用-V看详细日志,定位是哪一步出了差异;最后把备份文件重新写回,恢复到可启动状态,再慢慢研究新镜像的问题。不要带着验证失败的结果直接重启,否则大概率变成砖头。

5. 我在 Windows 下踩过的坑:驱动、路径与奇怪的报错

5.1 报错“找不到芯片”时的完整排查链路

这个问题在 Windows 下出现频率最高。你运行flashrom -p internal,结果提示找不到芯片,不代表 flashrom 没用,而是环境有问题。我建议按下面顺序排查:

  1. 查看设备管理器,确认 SPI 控制器没有被禁用、没有黄色感叹号。
  2. 进入主板 BIOS/UEFI,找到 Flash Write Protection、SPI Lock 之类的选项,确认没有被锁。
  3. 用管理员身份重开 PowerShell,确认当前窗口确实是提升权限的。
  4. 运行.\flashrom.exe --version,如果程序无法输出版本,说明文件本身在 Windows 上被拦截或受损。
  5. 加-V参数再运行一次,把日志贴到搜索引擎里找关键词。

我处理过的多数案例,最后都卡在第 2 步:主板默认开了 SPI 写保护,flashrom 能看到控制器但无法访问芯片。如果你从来没进过 BIOS 开关,建议先去查一下主板说明书里与“Flash”“Write”“Protect”相关的选项。不要一上来就怀疑驱动,Windows 下“找不到芯片”多数不是驱动坏了,而是写保护没解除。

5.2 驱动装不上、设备反复掉线的处理

使用外部编程器时,最常见的坑是驱动识别成了错误的设备类型。Windows 总是自动给设备装一个看似正常的驱动,但 flashrom 根本不认。这时需要用通用 USB 驱动安装工具,把设备驱动切换成 WinUSB 兼容模式。切换后设备管理器里会出现一个新的设备节点,再重新插拔编程器,通常 flashrom 就能识别了。

如果设备反复掉线,先换 USB 口。优先用主板后置 USB 2.0 口,不要用前置面板 USB,也不要接到 USB Hub 上。刷写操作对信号连续性敏感,Hub 会增加一层不确定性。线材也要留意,我曾经被一根很细的“装饰性”USB 线坑过,表面没问题,负载一大就掉线。

5.3 中文路径和杀毒拦截的教训

有一次帮 A 同学处理问题,他坚持把镜像放在“D:\下载\新BIOS”目录里,结果 flashrom 一直报 “Error opening file”。我把文件复制到C:\flashrom\new.bin后,一次通过。不是 flashrom 不支持中文,而是 Windows 命令行环境下路径编码容易出幺蛾子。我的原则是:所有涉及 flashrom 的路径,一律用纯英文、无空格、无 Unicode 字符。

杀毒拦截的问题在 Windows 上特别突出。系统自带杀毒会扫描新释放的 exe,甚至会后台实时扫描正在写入的镜像。应对方法:先把解压出的 flashrom 目录加到白名单,再开始操作。如果已经跑到一半被杀毒弹窗打断,不要慌,先记录进度,然后重新执行一次完整写入,写完后一定要验证。

5.4 为什么建议用-V保留完整日志

flashrom 的报错信息其实是比较友好的,但 Windows 下不少问题被系统级别的错误掩盖,只显示一两行英文。-V参数会把每一步操作都打到屏幕上,包括检测到的控制器、使用的驱动、芯片 ID、写入状态。排查问题的标准动作:

.\flashrom.exe -p internal -V -r backup.bin > flashrom_log.txt 2>&1

把日志重定向到文件,然后慢慢看最后 30 行。绝大多数“看起来诡异”的问题,在日志里都能找到对应原因:驱动加载失败、设备句柄为空、芯片识别结果异常、文件打开失败。日志不是给人背的,它是定位问题的地图。

6. 风险控制与最后的建议

6.1 接受风险,但用流程降低风险

刷写 BIOS 是有变砖风险的操作,任何教程都不能保证 100% 安全。我自己的风险管理原则是:

  • 第一次接触设备,只做读取和备份,不写入。
  • 确需写入,先找有没有局部写入方案,不全片覆盖。
  • 写入前确认镜像来源,不要用来路不明的“破解版”固件。
  • 保留原厂备份,放两个地方。
  • 准备一条外部编程器救砖路线,至少知道它的驱动和接线方式。

这些原则听起来很保守,但它们能拦住绝大多数翻车现场。救砖靠的不是运气,而是备份和流程。

6.2 把常用命令做成批处理

Windows 下命令行操作其实很适合自动化。我建了一个backup.bat:

@echo off cd /d C:\flashrom flashrom.exe -p internal --flash-name flashrom.exe -p internal -r backup_%date:~0,4%%date:~5,2%%date:~8,2%.bin flashrom.exe -p internal -v backup_%date:~0,4%%date:~5,2%%date:~8,2%.bin pause

每次刷写前,先双击备份一次,文件名自动带当天日期。这个习惯帮我省了很多事——后来有一次刷新固件翻车,我手里正好有一周前的备份,直接写回去就恢复了。批处理的好处是减少手误,减少漏步骤,尤其是半夜赶工的时候特别有用。

6.3 如果已经变砖,外部编程器怎么准备

如果内置控制器已经无法初始化,比如 BIOS 写坏导致 CPU 起不来,flashrom 的-p internal基本没救,这时候需要外部编程器。选择常见的 USB SPI 编程器,搞清楚芯片封装和接线方式(夹子或焊线)。外部编程器在 Windows 下用 flashrom 时,编程器驱动是关键,需要把设备切换成 WinUSB 兼容模式。接线时要确认芯片供电、地线、时钟、数据线一一对应,夹子容易接触不良,可以先通电测试读取。如果读取都不行,就先去处理接线。这个过程不是每台机器都需要,但手里有一套,面对变砖时会更从容。

6.4 别迷信“刷写后必须清 CMOS”之类的口头经验

网络上有很多刷写后的“必做事项”,比如必须断电清 CMOS,或者必须用某种方式重置。这些不一定都对。真正重要的只有两点:写入是否验证通过,以及设备能不能自检。如果验证通过但机器不亮,先别急着否定 flashrom,考虑是不是镜像本身的问题,或者 BIOS 电压、跳线设置的问题。保持记录,一步一步排除。很多时候问题出在镜像来源,而不是刷写工具本身。

6.5 最后一点经验

真正在 Windows 下把 flashrom 用顺,需要的不是背参数,而是建立一套“识别—备份—写入—验证”的动作习惯。刚开始可以拿一台旧机器练手,反复读取、验证,什么时候读操作不报错了,再考虑写操作。等你经历过一次救砖成功,就会明白 v1.5.1 这个版本和 Windows 这个环境,远比听起来靠谱。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进