WNDR3700v4刷回原厂固件

之前刷 Openwrt 的时候已经有人反映过说再也刷不回原厂固件,不过我是不太相信的,因为路由器本身有救砖模式。不过真正刷的时候还是折腾了好一阵子,但肯定是没问题的。这里结合网上的帖子和自己的研究分析了一下原因并列出解决步骤,本文适用于刷了 OpenWrt 或者 DD-WRT 的 NETGEAR WNDR3700v4 路由器,直接 TFTP 方式刷回原厂固件失败的情况。此方法也适用于 WNDR4300,自行查找对应的固件刷入即可。

原因分析

本人之前使用的是openwrt 15.01版本,TFTP 刷回原厂固件表现为路由器 Power 指示灯一直是橙色,似乎还不断地自动重启,因此常规的救砖方式无效。先上结论,刷回原版固件出问题基本都是因为刷入第三方固件时破坏了路由器里面 Flash 的分区

WNDR3700v4 里面的 Flash 也有空间是用来存放设置,uboot 等内容,各自存放在不同的分区,而 firmware 部分才是真正的存放 Openwrt 系统的地方,Openwrt 里面看到的可用空间也是这部分的内容。而刷入的 img 文件(平时说的固件)其实也包括了整个 Flash 的分区信息。

根据 Openwrt 官网 WNDR4300 Flash 布局的说明,WNDR3700v4/WNDR4300(两款型号硬件基本一致,也都使用 NAND Flash)原版固件的 Flash 布局(为方便理解统一称为分区)是这样的:

Screenshot 2016-12-03 09.35.17.png

Openwrt 官方固件是这样的

Screenshot 2016-12-03 09.35.23.png

对比可以看出来 Openwrt 做到了和原版一致的 Flash 分区,因此正常情况下通过 TFTP 方式刷官方固件因为分区一致是不会有什么问题的。但是如果之前刷入过增加可用空间的改版 Openwrt 固件的话,原始的 Flash 分区就会被破坏。增加空间的代码是这样的:

wndr4300_mtdlayout=mtdparts=ar934x-nfc:256k(u-boot)ro,256k(u-boot-env)ro,256k(caldata),512k(pot),2048k(language),512k(config),3072k(traffic_meter),2048k(kernel),23552k(ubi),[email protected](firmware),256k(caldata_backup),-(reserved)
改为(将ubi和firmware增加96M,完全使用128M flash)
wndr4300_mtdlayout=mtdparts=ar934x-nfc:256k(u-boot)ro,256k(u-boot-env)ro,256k(caldata),512k(pot),2048k(language),512k(config),3072k(traffic_meter),2048k(kernel),121856k(ubi),[email protected](firmware),256k(caldata_backup),-(reserved)

可以看出改版固件增大了ubifirmware的空间,的确使得 Openwrt 实际可用空间变大,但同时也破坏了原始 Flash 的空间分配(其实就是利用了后面的 reserved 空间,但这样 caldata_backup 位置也会后移,已经变得和官方固件不一致),直接刷回原版固件就很有可能出现问题。

而 DD-WRT 固件也同样会产生这个问题,其 Flash 分区如下:


mtd0
RedBoot
512KiB
mtd5
board_config
512KiB
unused
2.5MiB
mtd4
nvram
512KiB
unused
3MiB
mtd1 linux 124160KiB (121.25MiB)
unused
1152KiB
mtd2
rootfs
21504KiB
mtd3
ddwrt
101504KiB

其中 linux 分区在 Flash 上的地址对应的就是 Openwrt 和原版固件中 frimware,caldata_backup 和 reserved 的位置(0x0000006c0000-0x000008000000)。

在 TFTP 模式下似乎并不会自动对 flash 执行 erase 命令(相当于格式化),仅仅覆盖了原来的内容,所以第三方固件的残留内容很有可能影响了原版固件的运作,因此需要手动执行该命令。为了方便擦除可以先把路由器刷到 DD-WRT,然后对 linux 分区执行 erase 命令,把 frimware 以后的内容全部清空再刷回原版固件。

固件和环境准备

  1. 在控制面板“启用或关闭 windows 功能”启用“TFTP 客户端”组件。

  2. 在 DD-WRT 下载 WNDR3700v4 最新固件ftp://ftp.dd-wrt.com/betas/2014/02-04-2014-r23503/netgear-wndr3700v4/wndr3700v4-factory.img

  3. 下载最新版固件,可选择中国/俄罗斯版(PRRU)固件或者国际版固件,PRRU 固件增加了 IPTV,IP-MAC,脱机下载等国际版没有的功能,而国际版则版本较新,修复改进的项目比较多,各位可以自行斟酌选哪个版本。

Firmware Version 1.0.2.80 (All Regions Except China & Russia)
http://www.downloads.netgear.com/files/GDC/WNDR3700V4/WNDR3700v4-V1.0.2.80.zip

Firmware Version 1.0.1.60 (For China and Russia Only)
http://www.downloads.netgear.com/files/GDC/WNDR3700V4/WNDR3700v4_PRRU_FW_V1.0.1.60.zip

参考帖子:
http://www.right.com.cn/forum/thread-185263-1-1.html
http://www.right.com.cn/forum/thread-154774-1-1.html

实现

  1. 路由器断电后按住 RESET 键开机,等待电源指示灯变成绿色闪烁状态时松开,用网线连接路由器,网卡 IP 设置成 192.198.1.2(只要是同网段不是 192.168.1.1 的 IP 都可以),子网掩码 255.255.255.0,网关设置 192.168.1.1.

  2. 打开命令行窗口,切换目录到 DD-WRT 固件文件所在的目录,执行 tftp -i 192.168.1.1 put wndr3700v4-factory.img,稍等一段时间,路由器自动重启,等待电源指示灯变成绿色常亮即启动完成,如果长时间显示橙色尝试断电后重新通电。

  3. 设置路由器,浏览器打开 192.168.1.1,第一次登陆要先设置登陆用户名和密码,不更改默认会自动生成密码。主界面中点选 Service 选项卡,在下找到 Secure Shell 一栏,将 SSHd 改成 Enabled,其他保持默认,按最底部的 Apply Settings。然后切换到 Administration 选项卡,下面的 Remote Access 一栏,将 SSH Management 改成 Enabled,其他保持默认,按最底部的 Apply Settings。

Screenshot 2016-12-03 00.09.34.png

Screenshot 2016-12-03 00.23.31.png

  1. 使用 SSH 工具登入,Windows 平台个人推荐MobaXterm,SSH 登陆用户名为 root,密码是之前设置的登陆密码,成功登陆后执行以下命令:
1
2
mtd erase linux
reboot
  1. 路由器自动重启,此时因为固件已被刷除自动进入 TFTP 模式,等待电源指示灯变成绿色闪烁,切换目录到原厂固件文件所在的目录,在命令行窗口根据下载的版本输入tftp -i 192.168.1.1 put WNDR3700v4-V1.0.1.60PRRU.imgtftp -i 192.168.1.1 put WNDR3700v4-V1.0.2.80.img稍等一段时间,路由器自动重启,如果启动失败尝试重新通电。

  2. 把网卡改回自动获取 IP 地址,至此完成刷机步骤。

Screenshot 2016-11-23 16.07.45.png