OpenWrt探索之路(一)
漫长的国创项目之路开始了第一步,在学长的指导下,我开始学习OpenWrt这个开源的路由器系统,来设计我们新的路由器协议,简单总结一下这周学的东西,方便以后自己查阅。
OpenWrt系统的安装
首先,我们需要确认所有的依赖软件已安装。下面以Debian/Ubuntu为例:
1
2sudo apt-get install subversion g++ zlib1g-dev build-essential git python rsync man-db
sudo apt-get install libncurses5-dev gawk gettext unzip file libssl-dev wget zip time接下来,使用以下命名获取OpenWrt的源代码:
1
2git clone https://github.com/openwrt/openwrt.git
cd openwrt这里找了好多源,官网上给的源无法git,会出现错误,只好使用Github上面的源。
下载完OpenWrt的源码后,为了使OpenWrt支持更多的软件,需要更新和安装其它源上面的软件。
1
2./scripts/feeds update -a
./scripts/feeds install -a这里还是会出现无法更新的问题,还是源的问题,这里还是把目录下的feeds.conf.default文件打开,修改其中的源:
1
2
3
4src-git packages https://github.com/openwrt/packages.git
src-git luci https://github.com/openwrt/luci.git
src-git routing https://github.com/openwrt-routing/packages.git
src-git telephony https://github.com/openwrt/telephony.git最后一个命令就是打开菜单配置你想编译出来的功能和路由器型号等等:
1
make menuconfig
就拿我手上现有的NETGEAR WNDR4300来说:
Target System —> Atheros AR7xxx/AR9xxx
Subtarget —> Generic devices with NAND flash
Target Profile —> NETGEAR WNDR4300v1
然后退出并选择保存。
由于具体的config中的配置我还没去了解,所以具体的config的配置将会在下一篇博客写出。
- 编译:说明一下,make的时候记得加系统变量FORCE_UNSAFE_CONFIGURE=1 这样就不会报错了(错误信息里面给的,至于为什么我也不是很清楚)。-j N中N为CPU内核数+1,这种方法可以加快编译速度,但是容易出错。如果遇到编译错误,在没有-j N的情况下再次编译。建议在并行编译之前使用make download命令以防止出现这些错误(对于那些拥有更快Internet连接的用户来说,使用-jN命令在下载环节通常可以更安全)。V=s是显示详细信息。
1
2make FORCE\_UNSAFE\_CONFIGURE=1 -j N V=s
到此,Openwrt的大致安装和编译过程介绍完毕。
路由器救砖之路
咳咳咳,原本以为自己直接make编译出了相应的刷机文件,刷进路由器就可以使用最简单的功能了呢,结果很不幸,路由器变成了一块板砖(具体原因推测是config文件配置问题,少选了很多东西)。于是就出现了下面的救砖之路……
此次使用的是TFTP刷机:
- 首先,下载需要的固件以及Tftp软件
下载固件(需解压): http://www.downloads.netgear.com/files/GDC/WNDR4300/WNDR4300_V1.0.1.60.zip
TFTP软件这里我使用的是Tftpd,读者可自行网上下载。 - 拔掉路由器连接外网的网线,仅保留与电脑的lan口连接,电脑改为固定IP:192.168.1.171(这个随意,固定的就好),子网掩码:255.255.255.0,DNS:192.168.1.1
- 按复位键(位于机器底部,用卡针按)不放,此时路由器应处于断电状态
- 通电,直到电源指示灯变为绿色并开始闪烁,使用TFTP软件上传固件,服务器IP填写192.168.1.1,稍等5分钟,然后关闭路由器电源,再打开。电脑改为DHCP自动获取IP地址,稍等几分钟路由器便会正常启动,然后浏览器键入192.168.1.1进入路由器后台管理界面即可。
OpenWrt系统源码目录概述
原始目录
下载源码后,源文件如下图所示,下面我们来一一解释:
- scripts
存放了一些脚本,使用了bash,python,perl等多种脚本语言.编译过程中,用于第三方软件包管理的feeds文件也是在这个目录当中.在编译过程中,使用到的脚本也统一放在这个目录中。 - tools
编译时,主机需要使用一些工具软件,tools 里包含了获取和编译这些工具的命令.软件包里面有Makefile文件,有的还包含了patch.每个Makefile当中都有一句$(eval $(call HostBuild)),这表明编译这个工具是为了在主机上使用的。 - config
存放着整个系统的配置文件 - toolchain
嵌入式的童鞋应该都知道交叉编译链,这个文件中存放的就是编译交叉编译链的软件包.包括:binutils,gcc,libc等等。 - target
openwrt的源码可以编译出各个平台适用的二进制文件,各平台在这个目录里定义了firmware和kernel的编译过程。 - package
存放了openwrt系统中适用的软件包,包含针对各个软件包的Makefile。openwrt定义了一套Makefile模板.各软件参照这个模板定义了自己的信息,如软件包的版本、下载地址、编译方式、安装地址等。在二次开发过程中,这个文件夹我们会经常打交道。
事实上,通过./scripts/feed update -a和./scripts/feed install -a的软件包也会存放在这个目录之中。 - include
openwrt的Makefile都存放在这里。文件名为 *.mk 。这里的文件上是在Makefile里被include的,类似于库文件.这些文件定义了编译过程。 - 其他单个文件:
8.1 Makefile:
在顶层目录执行make命令的入口文件。
8.2 rules.mk
定义了Makefile中使用的一些通用变量和函数。
8.3 Config.in
在include/toplevel.mk中我们可以看到,这是和make menuconfig相关联的文件。
8.4 feeds.conf.default
是下载第三方一些软件包时所使用的地址。
8.5 LICENSE & README
即软件许可证和软件基本说明.其中README描述了编译软件的基本过程和依赖文件。
生成目录
在我们编译完成后除了下载的源码文件,多出来的部分很明显就是编译过程中新生成的.如下图:
- feeds
openwrt的附加软件包管理器的扩展包索引目录.有点绕,简单来说就是下载管理软件包的。默认的feeds下载有packages、management、luci、routing、telephony。如要下载其他的软件包,需打开源码根目录下面的feeds.conf.default文件,去掉相应软件包前面的#号,然后更新源:
./scripts/feeds update -a
安装下载好的包:
./scripts/feeds install -a - build_dir
在前面的原始目录中,我们提到了host工具,toolchain工具还有目标文件.openwrt将在这个目录中展开各个软件包,进行编译.所以这个文件夹中包含3个子文件夹:
2.1 host
在该文件夹中编译主机使用的工具软件
2.2 toolchain-XXX
在该文件夹中编译交叉工具链
2.3 target-XXX
在此编译目标平台的目标文件,包括各个软件包和内核文件。 - bin
保存编译完成后的二进制文件,包括:完整的bin文件,所有的ipk文件。 - dl
在编译过程中使用的很多软件,刚开始下载源码并没有包含,而是在编译过程中从其他服务器下载的,这里是统一的保存目录。 - staging_dir
用于保存在build_dir目录中编译完成的软件。所以这里也和build_dir有同样的子目录结构。
比如,在target-XXX文件夹中保存了目标平台编译好的头文件,库文件.在我们开发自己的ipk文件时,编译过程中,预处理头文件,链接动态库,静态库都是到这个子文件夹中。 - tmp
从名字来看,是临时文件夹.在编译过程中,有大量中间临时文件需要保存,都是在这里。 - logs
这个文件夹,有时可以看到,有时没有.这是因为这个文件夹保存的是,编译过程中出错的信息,只有当编译出错了才会出现.我们可以从这里获取信息,从而分析我们的软件编译为什么没有完成。
这些只是最最基础的对基本目录的了解,以后会更深入地去了解。