编译OpenWRT —— 快跑,前面有个大坑!

2016-03-19 15-17-47屏幕截图

一般情况下来讲,使用OpenWRT的方式还是很简单的,从OpenWRT的服务器上下载所使用路由器的编译好的镜像文件,打开路由器,用所熟悉的办法刷入。

既然如此简单,那为什么还要编译OpenWRT?对于我来说有几个很现实的需求:

理由一:我所在的学校使用的上网认证是Dr.COM网关(魔改802.1x认证),换句话说一般的路由器是没有这个认证协议的,也就没法在宿舍使用。然而有乐于折腾的大神做出了Dr.COM认证客户端的开源实现(https://github.com/drcoms/drcom-generic/),也就让路由器使用Dr.COM认证协议成为可能。不过有个前提,这个开源实现是基于Python2的,而官方编译的OpenWRT都是最小构架,没有内置Python环境,尽管安装Python环境只是一个很简单的opkg install python,不过在初始无网的环境下,就变成了一条一条的scp和安装各种dependences。

理由二:IPv6是一个令人向往的东西,我所住的公寓总共有15层左右,一层有几十间宿舍,日常的网络接入设备数以千计,IPv4公网出口的带宽早就被各种LOL和斗奶TV的流量瓜分干净了,虽然有原生的IPv6,但是不知道是什么情况,IPv6的访问权限只在0:00-6:00开启,而且只限于接入楼道内吸顶AP的设备,宿舍墙壁延伸出来的网线则没有原生IPv6,然而经过研究,发现学校有isatap隧道服务器(类似于6to4的东西,http://ipv6.bistu.edu.cn/index/201305/t20130531_17280.html),然而需要的sit语句(kernel_mod_sit)并不在基础的OpenWRT固件中。

理由三:由于OpenWRT对博通的无线芯片支持不好,所以经过筛选,把之前的RT-N66U路由器换成了EA4500,然而这货并没有现成编译好的固件镜像,而OpenWRT的Wiki里也是介绍要先刷一个叫做Candyhouse的分支作为跳板再把OpenWRT Chaos Calmer固件的tar文件放到U盘里插入路由器中进行刷写,然而我并没有这方面的经验。

总结起来就是:

作为一个懒人,能一步完成的事绝对不分两步,能一劳永逸的事情绝不每次wipe之后要一个一个重新弄!

于是,我便踏上了充满各种坑的OpenWRT编译之路……

 

按照 https://wiki.openwrt.org/doc/howto/buildroot.exigence 所说。首先,需要搭建一个Linux或者OS X环境,推荐Debian或者Ubuntu的64位系统,如果你在国外有内存大于1GB的VPS或主机最好,如果没有的话也最好有个属性为ss的梯子,至少在我这里遇到了kernel.org被墙导致Linux内核无法下载的问题,话说,连内核都没有还编译个球……

我选择在PC上新建了一个硬盘容量为60GB的Ubuntu 15.10的虚拟机,推荐将apt的源换成清华大学的镜像源(https://mirrors.tuna.tsinghua.edu.cn/),替换方法在里面。

OpenWRT的wiki中表明必须要在非ROOT用户中进行编译操作,我也就不以身试险了,sudo apt-get update 一下之后安装必备组件:

sudo apt-get install git-core build-essential libssl-dev libncurses5-dev unzip gawk subversion mercurial

说到这个,就要提一大坑点了,我再安装完必备组件之后就开始进行编译,然而尝试了数十次之后均已失败告终,询问别人有人说是gcc的问题,有人说是内存太小炸了的问题。然后我又翻回去看了一下wiki,在后面发现了这么一句话:

Here’s a table with the package name for each prerequisite separated for different GNU/Linux and Unix like distributions

@#¥%……&

Unfortunately not all dependencies are checked by make config

我…………

检查依赖是否完整是好事,但是好事做一半,就变成坏事了啊!在反复查看 https://wiki.openwrt.org/doc/howto/buildroot.exigence 表格中的内容后,确信所有的依赖组件全数安装之后,我们就可以开始克隆目录了:

git clone git://git.openwrt.org/openwrt.git

这行命令我现在都可以背下来了!

在经过漫长的等待之后就可以玩耍了,首先更新一下Packages:

cd openwrt

./scripts/feeds update -a

./scripts/feeds install -a

然后就可以使用 make menuconfig 命令开始选择材料了

2016-03-19 22-01-23屏幕截图

(我仿佛闻到了一股安卓厨房的味道,嗯,咖喱味的)

选完想整合的组件了,保存以后就想make world了?No No No,得先解决网络问题 QAQ。(要注意只有.config文件才能被make程序识别,所以在前面加了其他描述之后的文件需要重新保存为.config才可以继续后面的步骤)

在编译的过程中,遇到了多次报错,使用 make -j1 V=s运行后发现基本都为网络问题,无法连接到服务器把需要的编译材料下载到本地,经过几次测试之后发现是被墙了,无奈只能祭出梯子。

我在主机上使用的是Windows 10系统,里面有Shadowsocks-rss的客户端,shadowsocks客户端可以从本地特定端口输出socks5代理,windows版又更进一步整合了privoxy(老版本是polipo)做到了同一端口输出http/socks5代理。虚拟机使用的是虚拟 VMNET NAT交换机,主机与虚拟机又形成一个子网,通过PC上使用ipconfig与虚拟机中使用ifconfig命令后发现,两个机器都处于一个192.168.96.0的虚拟子网内,由于在虚拟机上部署ss太麻烦(现在ss的github直链已经给封的差不多了),决定使用电脑上的ss进行代理中转(需要在PC端的ss程序中开启允许局域网内设备使用),命令如下

http_proxy=192.168.96.1(PC地址):7850(ss后端地址) make -j1 V=s

然而麻烦又出来了,git.kernel.org连接不上,Linux内核无法下载,查看后发现kernel.org在这个脚本中只保留了https://git.kernel.org与ftp://git.kernel.org两种访问形式,然而代理是http,自然而然就跳过了。

怎么办?虽然还有个socks5可以用,但是linux终端内并不可以使用。

这时候就要想到proxychains这个小工具了,sudo apt-get install proxychains 之后,sudo nano /etc/proxychians.conf (在vim和nano之间我绝对选nano)

2016-03-19 22-22-13屏幕截图

按照意思修改一下配置文件,[代理类型] [服务器地址] [端口] [用户名(如果有)] [密码(如果有)]

保存之后继续使用 proxychains make -j1 V=s 进行编译吧,按理说短期时间内将会一帆风顺了,不过偶尔还是会连接错误一下,直接调回上一个指令重新执行一下继续就好了。

然后马上就快要开始编译python了,如果正常的话你会遇到一个蜜汁BUG:

Fatal: You must get working getaddrinfo() function. or you can specify “–disable-ipv6”.

当然如果没有遇到更好。经过测试,发现proxychains并不支持ipv6,解决办法超级简单,这个时候换成 http_proxy=192.168.96.1:7850 make 再一路继续下去就可以了……

如果顺利的话,就会像题图里面一样,不声不响的直接结束。然后就可以去 ~/openwrt/bin 里找编译好的固件了。

当然,不同型号的路由器对应的Target Image Format是不一样的,编译之前要先看一下对应设备型号的Wiki。

就这么点东西……我拖了三个星期……幽怨呐…… 不过久违的6in4又回来啦。

2016-03-19 22-39-01屏幕截图

7 thoughts on “编译OpenWRT —— 快跑,前面有个大坑!

  1. 厉害厉害!快提交给OpenWRT,就叫Mirro分支好了??

  2. Pingback: a source

发表评论

%d 博主赞过: