Jarvis's Blog

白帽子、全栈、IoT安全专家、嵌入式系统专家

mw4530r/wdr4320编译Openwrt Designated Driver

记得大一的时候开始接触的Openwrt,那时候当时最新的版本还是Backfire,我的路由器还是渣渣WR740N,flash只有4M,那时自己改了8M的flash和64M的RAM,并且给它编译了一个backfire还在里面集成了闪讯客户端,那时候还解决了闪讯拨路由器多人共享的问题。

大三那年openwrt出了Attitude Adjustment,就重新编译了一版一直用到了现在,研究生的时候也用的这个,后来就好久没关注了。

最近路由器变得有点不稳定,wifi总是自动消失,实在不能忍,于是决定是不是该重新刷个新版本了。关注了一下最新的openwrt,发现竟然已经更新到Designated Driver了。就所以打算给路由器重新编译一个新固件,这次的luci界面官方支持了shadowsocks-libev,可以一起编译进去,就更方便了。

记得n多年前那时候mw4530r还没有得到官方支持,所以得自己改源代码的一些属性和函数来保证比较好的适配usb以及led的正常显示,但是现在mw4530r已经得到官方支持了,所以这次编译就方便了很多。另外,wdr4320/wdr4310和mw4530r其实是互为马甲关系,所以官方把配置归了在了一起。

在openwrt官方就已经能下载到这两款路由器的8M flash已经编译好的固件。

传送门:

最新trunk开发版:

https://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/

最新的稳定分支是Chas Calmer 15.05.1,也可以在这里下载到openwrt官方编译的固件:

https://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/

但是,对于我来说,由于我已经将flash改成了EN25Q128(16MB),所以必须修改代码中的flash配置信息自己编译才行。

接下来踩坑开始:

首先由于我一贯的激进作风,当然要选择最新的开发版本了,目前最新的开发版是Designated Driver,直接git clone源代码:

git clone https://github.com/openwrt/openwrt.git

源代码非常大,竟然有144M,学校渣网太垃圾,只有20多K/s,而且还经常会衰减到0,实在没办法我只能从国外的vps上clone然后打个包下载回来。

然后就可以准备编译了,由于我需要16M固件,那么下面几个文件需要修改一下:
1.target/linux/ar71xx/image/tp-link.mk

找到

define Device/tplink-16mlzma
$(Device/tplink)
  TPLINK_FLASHLAYOUT := 16Mlzma
  IMAGE_SIZE := 15872k
endef

改成:

define Device/tplink-16mlzma
$(Device/tplink)
  TPLINK_FLASHLAYOUT := 16Mlzma
  IMAGE_SIZE := 16128k
endef

这里改了IMAGE_SIZE,因为我以前编译一直都是用16128k这个大小编译的,不知道后来官方为什么改了。
还有一处:

define Device/tl-wdr4300-v1
$(Device/tplink-8mlzma)
  BOARDNAME = TL-WDR4300
  DEVICE_PROFILE = TLWDR4300
  TPLINK_HWID := 0x43000001
endef

把上面的tplink-8mlzma改成tplink-16mlzma,也就是下面这个样子:

define Device/tl-wdr4300-v1
$(Device/tplink-16mlzma)
  BOARDNAME = TL-WDR4300
  DEVICE_PROFILE = TLWDR4300
  TPLINK_HWID := 0x43000001
endef

这样编译的时候就会生成16M固件了。

2.tools/firmware-utils/src/mktplinkfw.c
找到:

}, {
	.id		= "16Mlzma",
	.fw_max_len	= 0xf80000,
	.kernel_la	= 0x80060000,
	.kernel_ep	= 0x80060000,
	.rootfs_ofs	= 0x100000,
}, {

改成:

}, {
	.id		= "16Mlzma",
	.fw_max_len	= 0xfc0000,
	.kernel_la	= 0x80060000,
	.kernel_ep	= 0x80060000,
	.rootfs_ofs	= 0x100000,
}, {

其实就是fw_max_len那里改成0xfc0000以对应前面的16128k。
另外,由于我用的是EN25Q128这个flash,官方没有支持这款flash的JEDEC ID,所以如果就这样编译的话,刷进去会因为无法加载正常的spi nor flash驱动而造成kernel panic,不过这个地方不能直接改,因为代码是从网上下载下来编译的,只能用patch的方式进行修改,patch文件我也打包方在这里给大家参考:

999-add-support-for-the-EON-EN25Q128.patch

这个patch文件只要放在target/linux/ar71xx/patches-4.4下就可以

 

接下来我们就可以进行编译了,先删除代码目录下的tmp文件夹,以使我们上面的改动生效:

rm -rf ./tmp
make menuconfig

接下来就是一些编译配置,下面是我的配置,大家可以参考:

config.zip
解压出来的.config文件放到openwrt源码根目录即可。

主要改动就是:

支持ipv6,浙大的vpn所需要的l2tp模块,另外还加入了shadowsocks-libev,minidlan,aria2,samba,openvpn,usb打印服务器和transmission。

新的分支加入了新的luci管理界面主题luci-theme-material,这里也一并编译进去。

最后,就可以开始编译了:

make -j8 V=99

我开了8个线程同时编译,同时输出编译过程以方便调试,这里还踩了几个坑:
1.我用的是archlinux,不知道为什么/usr/bin/core_perl虽然在环境变量里面,但是编译的时候执行pod2man竟然command not found然后直接编失败,非得要我手动export一下才行。
2.学校的破网!破网!破网!破网!,导致在下载组件源代码包的过程中直接断了,导致一堆组件里面有那么几个下载下来的源代码压缩包不完整,没法解压以致编译失败,这个问题搞了我很久,最后是一个个手工下载下来放进openwrt的dl目录里,最后才编译通过,唉,还是早毕业早超生,早点不用学校这破网的好。

最后,折腾完毕,编译好的固件我也贡献出来吧:

链接: https://pan.baidu.com/s/1i4IWRpN 密码: eqb3

打开web管理界面,切换到material主题,嗯,的确不错,是我喜欢的主题:

最后提醒一点,如果在Openwrt中要让内网机器使用网关作为DNS的话,记得在DHCP/DNS设置中关闭重绑定保护,否则内网机器就没法解析域名了,见下图:

CTF Rank网站开发笔记(五)——passport.js+geetest+bcrypt整合

上一篇

关于最新的Openwrt DD ipv6配置

下一篇
评论
发表评论 说点什么
  • 你好 我们学校上网是通过L2TP拨号 但是我装了xl2tpd后20M的宽带只能用出10M 请问我应该怎么做 另外补充下拿别人的路由刷明月的16M固件可以满速 但是8M固件就不行 不知道是不是少了哪个软件

    • 你电脑用的有线还是无线?这个具体还是和路由器的无线信号质量有关系,你的和别人的是同型号吗?

    • 谢谢你的回答 有线无线都一样的速度 同一个型号下刷8M固件L2TP就慢 刷16M固件就没问题 不知道是缺少了什么 用其它固件安装XL2TPD依旧是慢速;另外如果把它作为二级路由wan口设置为DHCP客户端就速度正常 只有L2TP拨号上网才会慢;我拿的是三个AR9331的路由测试的 分别刷16M和8M 都是一样的情况;后来我发现16M固件比8M多了pppol2tp和两个有关L2TP的KMOD包 我尝试自行安装这三个软件后依旧没有解决问题

    • 具体的我就不清楚了,浙大的校园网只有12M,非常垃圾,平时都不关心速度了。

    • 我记得浙大好像也是L2TP拨号的吧 我是计量的

  • 8M 的4530各种痛苦。。。 想问问,我下了一个wdr4310的固件,但是不能刷到4530R 上,咋办

    • 不能刷是什么意思,wdr4310和4530r除了led灯映射不同之外,是可以通刷的,具体现象?

浙公网安备 33011002014706号