编译openwrt官方不支持的路由型号固件——以WR720N为例

1.前言

众所周知,在第三方开源路由固件中,就数Openwrt支持的型号最多了(当前opnwrt支持的路由型号),如果想刷Openwrt固件,那么对着官方支持的型号买就可以了。

但若碰巧你已经先买了,而这款路由不再官方支持的范围之内,或者你想买的那款不在首官方的支持之内,或者高端点,玩家们所编译的固件中集成的功能不是你所想要的——比如对于我而言,对那些NAS,离线下载,多播之类没兴趣,只想发挥路由的本质作用,用tc+iptables做HTB流量整形,那么怎么办,1.自己搭编译环境,自己开发移植?2.等高人发布?

但是作为普通玩家,我们还有一个很犀利的办法:搭编译环境,从硬件配置很相近的路由器修改编译配置文件,自己编译。简单来说,就是在编译环境中,把已经受官方支持的型号的相关字符串替换为我们自己的路由器的型号等,然后编译自己的型号的固件,简称“偷梁换柱”。此方法的基本思想源自恩山论坛的众多网友的实践操作-http://www.right.com.cn/forum/thread-100342-1-1.html,但是网友们的方法显得繁琐也极易出错,我做了改进,用几条命令行,然后修改几处地方就可以实现自己编译的目的。

2.注意事项

两路由器的硬件配置要非常相近,比如我的WR720N和WR703N的差别是,WR720N多一个LAN网口,其他诸如CPU,内存及ROM大小,网卡芯片都一模一样。

openwrt最新的trunk版已经添加了Wr720n支持了,如果是编译wr720n固件的,无需再按照本文来折腾。

 

3.搭建编译环境

这儿我就不细说了,官方有很规范的教程:官方编译教程。我这里列出我搭建编译环境的命令流程,你若是想偷懒,从前往后复制命令运行即可,不过我还是建议你弄明白你在做什么,这是基本功。

#创建用户,并修改密码,编译的时候不允许使用root账号

useradd openwrt

passwd openwrt

su openwrt

#我用的是Ubuntu,这个系统简易好使,源质量很好,安装及更新软件的命令是apt-getinstall。个人觉得,用Redhat(Centos)做编译不是什么好主意。

sudo apt-get install gcc g++ binutils patch bzip2 flex bisonmake autoconf gettext texinfo unzip sharutils subversi-devncurses-term zlib1g-dev

#创建一个编译用的目录,编译的所有文件都放在这儿。确保目录至少还有10G可用空间,编译可是很耗空间的。

sudo mkdir /openwrt

sudo chown -R openwrt:openwrt /openwrt/

cd /openwrt

#svn或git同步,获取OpenWrt源代码和安装包并更新、安装。接下来的操作请确保使用openwrt账户来进行(已经不使用sudo命令)。

git clone git://git.openwrt.org/12.09/openwrt.git 或
svn co svn://svn.openwrt.org/openwrt/branches/attitude_adjustment openwrt
cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a

好,关于编译环境的配置就在此打住,其他多余的操作为接下来的工作带来麻烦及增加出错的可能性。

4.添加路由型号的支持

我手头只有WR720N,那么就以WR720N为例,首先仔细看看http://www.right.com.cn/forum/thread-100342-1-1.html ,从这里我们知道,我们的核心工作是要,仿照WR703N的格式,在源码添加WR720N的信息及相关内容,并添加一个名为mach-tl-wr720n.c源码文件,事实上这是一个很繁琐的活,那么我们换个方式思考:直接把和路由型号"WR703N"的信息替换为"WR720N"的。

4.1.源码中查找字符串

这里我们用命令来查找。

grep -i 703n /openwrt/openwrt/* -r -l

理论上,会列出如下列些文件,这些文件都和编译WR703N有关。

/openwrt/openwrt/target/linux/ar71xx/generic/profiles/tp-link.mk
/openwrt/openwrt/target/linux/ar71xx/base-files/lib/ar71xx.sh
/openwrt/openwrt/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
/openwrt/openwrt/target/linux/ar71xx/base-files/etc/diag.sh
/openwrt/openwrt/target/linux/ar71xx/base-files/etc/uci-defaults/network
/openwrt/openwrt/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr703n.c
/openwrt/openwrt/target/linux/ar71xx/config-3.3
/openwrt/openwrt/target/linux/ar71xx/patches-3.3/610-MIPS-ath79-openwrt-machines.patch
/openwrt/openwrt/target/linux/ar71xx/image/Makefile
/openwrt/openwrt/tmp/.kconfig-ar71xx
/openwrt/openwrt/tmp/.kconfig-ar71xx_generic
/openwrt/openwrt/tmp/info/.targetinfo-ar71xx
/openwrt/openwrt/tmp/.targetinfo
/openwrt/openwrt/tmp/.kconfig-ar71xx_nand
/openwrt/openwrt/tmp/.config-target.in
/openwrt/openwrt/tools/firmware-utils/src/mktplinkfw.c

若是以svn同步过来的,则有标识为.svn-base的文件时svn同步过来的文件,是只读文件,不用管。

把这个mach-tl-wr703n.c文件改个名,改成编译WR720N所有需要的文件名

cp./target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr703n.c ./target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr720n.c

4.2.替换字符串

这里非常关键,请手动按照上面的帖子的方法做一次字符串替换,虽然这个会比较耗时且繁琐,但会是你对编译有更进一步的了解。

我们用如下几个命令来替换这些相关的字符串。

#由于文件较多,命令比较耗时,安安静静等着就好

sed -i "s/0x07030101/0x7200103/g" `grep -i 0x07030101 ./* -r-l`
sed -i "s/070300/072001/g" `grep -i '"070300"' ./* -r -l`

sed -i "s/wr703n-v1/wr720n-v3/g" `grep -i wr703n-v1 ./* -r-l`
sed -i "s/WR703N_V1/WR720N_V3/g" `grep -i WR703N_V1 ./* -r-l`
sed -i "s/wr703nv1/wr720nv3/g" `grep -i wr703nv1 ./* -r -l`

A1="WR703N v1"
B1="WR720N v3"
sed -i "s/$A1/$B1/g" `grep -i "$A1" ./* -r -l`

A2="TP-LINK TL-WR703N v1"
B2="TP-LINK TL-WR720N v3"
sed -i "s/$A2/$B2/g" `grep -i "$A2" ./* -r -l`

sed -i "s/WR703/WR720/g" `grep -i WR703 ./* -r -l`
sed -i "s/wr703/wr720/g" `grep -i wr703 /./* -r -l`

 

#grep -i WR703 ./* -r-l命令用以从目录/openwrt/openwrt/中查找有字符串wr730字符串的文本(-i参数表示不区分大小写),sed -i"s/WR703/WR720/g"的作用是用WR720替换WR703,这里的-i表示替换。

在Windows的浏览器中,上面的命令会出现编码问题,建议在linux下用浏览器打开本页面进行复制,最好是能够自己动手输入。

#类似诸如TP-LINK TL-WR703Nv1之类的字符,由于中间有空格,上面的命令不能执行(至少现在我还没想到办法),你可以自己去修改文件,不修改对编译没影响了,只有会在界面某些地方显示WR720N的版本为v1。(此问题已经解决。)

正常情况下,这些命令执行完成之后,会连.svn-base这类型的只读文件都改掉,运行grep -i 703n/openwrt/openwrt/* -r -l是查找不到任何文本了的,如果能查询到结果,请仔细检查上面每个步骤。

到现在最关键步骤完成了,但是如果要让你的路由更完善的支持WR720N,还有最重要的一步工作。

5.修改匹配

虽说,WR720N和WR703N硬件基本一致,但是毕竟WR720N比WR703N多出个网口,你也不想刷上的固件,只有一个网口吧,那么还需要修改一些地方,使之能更好匹配WR720N。

接下来的文本编译,若你不习惯用命令行,可以用图形编辑器,但是必须用openwrt户登录图形界面,且最好不要用windows下的文本编辑器,windows和linux两个平台在诸如换行,退格上是不同的。

5.1.添加一个网口

vi ./target/ar71xx/base-files/etc/uci-defaults/network

若是trunk版,这个文件有变,路径为

vi ./target/ar71xx/base-files/etc/uci-defaults/02_network

找到tl-wr720n出现的地方,下面的那行文本应该是

ucidef_set_interface_lan"eth0"

着表示只有一个网口,那么我们添加一个,把文本改为

ucidef_set_interfaces_lan_wan"eth1" "eth0"

5.2.分配网口信息

vi./target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr720n.c

径直翻到最下面去,如下添加修改内容。

ath79_register_usb();

ath79_init_mac(ath79_eth0_data.mac_addr,mac, 1);
ath79_init_mac(ath79_eth1_data.mac_addr,mac, 2);

ath79_register_mdio(0, 0x0);
ath79_register_eth(0);
ath79_register_eth(1);

ath79_register_wmac(ee, mac);

注:在最底下,应该能看到这样一行:MIPS_MACHINE(ATH79_MACH_TL_WR720N, "TL-WR720N","TP-LINK TL-WR720N v1",看不惯的话,就把这个“TP-LINK TL-WR720N v1”改成“TP-LINKTL-WR720N v3”。

5.3.启用无线

默认情况下,openwrt不启用无线(不知道是为啥),需要改文件:

vi ./package/mac80211/files/lib/wifi/mac80211.sh

翻到最下面,把如下内容中数字1改成0,当然按照它的提示,把option disable这行删掉也可以。

# REMOVE THIS LINE TO ENABLE WIFI:
option disabled 0

6.编译配置

确保你是在用openwrt用户操作。

#再次强调,绝对不能用root用户,如果你用非openwrt用户操作过,那么用sudo chown -Ropenwrt:openwrt /openwrt/做一次修复

su openwrt

cd /openwrt/openwrt/

make defconfig

make menuconfig

然后进行选择(在这里是看不到WR703N的信息了,完全被我们修改替换了):

Target System  ---> Atheros AR7xxx/AR9xxx

Target Profile ---> TP-LINK TL-WR720N

官方的默认配置是没有LUCI WEB管理页面,如下导航到相应的地方,按“y”自行添加:

LuCI  --->

1. Collections  --->

<*> luci

到此,按ESC退出make menuconfig界面,看到如下提示的时候,直接按回车保存配置,不然这个配置就白忙活了

┌────────────────────────────────────┐

│ Do you wish to save your new OpenWrt configuration? │
├────────────────────────────────────┤
│                           < Yes> < No > │
└────────────────────────────────────┘

7.进行编译

7.1.首次编译

su openwrt

cd /openwrt/trunk

make V=99

7.2.再次编译

#编译前运行下面这个命令,清除掉旧的编译文件,不然,对编译的配置修改不起作用,然后再运行make V=99进行编译

make clean

首次编译会消耗大量时间——至少1个小时,若CPU强悍,可以试试命令make j=2V=99,j后面的数字表示CPU是双核。编译的时候,需要的软件源码包会从网络上下载,而下载下来的文件会存放在/openwrt/trunk/dl/文件夹中,编译过程中发现某个安装包不能下载,请自行上网下载,并放入该目录中,然后重新开始编译。

编译完成后,在目录./bin/目录中能看到刚编译成的文件,其中

openwrt-ar71xx-generic-tl-wr720n-v3-squashfs-factory.bin

openwrt-ar71xx-generic-tl-wr720n-v3-squashfs-sysupgrade.bin

这两个文件是你用得着的固件文件,factory.bin是用于从原厂的固件刷到openwrt,而sysupgrade.bin是用于openwrt之间互刷。

8.重点注意事项

8.1.免责说明

一步一步操作下来,只确保openwrt能在你的Linux中能正常编译WR720N的固件(截至至2012.12月的官方源码),不保证能WR720N刷上固件后能正常工作,不过一般是不会刷死的。对于出现的一些故障,本人概不负责,刷机有风险,请小心谨慎。

8.2.刷"砖"或刷"死"了

若刷固件后,不能连不上路由器,那么就要捅“reset”,在通电蓝灯亮起的一瞬间,按照reset按钮不放,大概3秒后,会看到蓝色指示灯狂闪,用电脑连接其LAN口(也可以试试WAN口),telnet192.168.0.1登录进去,刷个别个玩家做个正常的固件,具体方法网上搜之。

若真刷砖了,那么USB-TTL线伺候。

8.3.不能刷其他人编译的固件

目前发现一些改自wr703n的wr720n固件的sysupdate.bin的文件头信息还是w703n的0703101,而720n得信息是0720103。如果你恰好遇上该问题,请刷factory.bin.

8.4.强烈建议

可以先尝试编译个x86 vmwarevmdk的版本,在虚拟机上慢慢折腾,你需要了解一些关于openwrt这个linux的一些东西,比如熟悉其/etc/目录结构、命令配置网络,如何安装及更新.ipk文件。最好去了解下/openwrt/turnk目录下这些源文件的作用,尝试用/openwrt/trunk/files/etc/做些编译。关于编译中的一些自定义(定制)的东西,若有时间和条件,会另写一篇文章。(文件已经写好,点击链接去查看:http://www.zoublog.com/?p=997)

你可能感兴趣的:(杂七杂八技术)