openWRT平台搭建(一)

一. 选择Openwrt平台的理由

传统的路由器固件是由官方提供的。这些固件是不开源的,而且这些路由器的功能也比较单一,很难满足日益变化的智能家居需求。因此,在构建物联网核心时,需要考虑第三方固件平台。

Openwrt、DD-Wrt以及Tomato是三个最为著名的第三方路由器固件平台。当然还有其他一些更加小众的版本,和很多从这三大固件衍生出来的修改版固件,在此我就不赘述了。

选择Openwrt而不选择DD-Wrt或者Tomato的理由如下:

1. DD-WRT:是三个固件平台中第三方软件支持最为丰富一个平台。

对于新的路由器的支持也是非常迅速的。然而,正是由于各种丰富的软件或工具的加入,导致DD-WRT的系统不稳定,经常会出现Bug,使得用户体验不友好。往往在一个版本中修改过的Bug,在下一次版本check的时候,又会出现,对于开发者来说比较头疼。

此外,DD-WRT对于无线信号处理方面能力较弱,Qos功能更是被许多玩家吐槽。(由于智能家居需要多设备同时接入,并且不同设备之间会存在流量的冲突,因此Qos显得比较重要,基于该原因)

2. Tomato:官方的Tomato固件是三个平台中最为稳定的。

Tomato较为封闭,对于新的路由器支持力度不够,特别是对于Atheros主控支持力度很小。于是, 我果断放弃了Tomato。

3. Openwrt:三大固件中扩展性最好的。

对于版本的控制较为严谨,通常以往出现的bug在新的版本中极少出现,在稳定性上较之DD-WRT有了很大的提升。

Openwrt对于Qos的功能做了优化,其性能可以媲美Tomato。

Openwrt是基于Linux的,适合开发者进行二次开发。(此外,Openwrt的固件有许多功能是远超过路由器本身的功能的,例如samba局域网文件共享,transmission脱机下载,ushare,uPnP等),这正是我想要的!!

当然,Openwrt本身的web,luci界面是比较丑的,系统设置也没有DD-WRT方便,易用性不是很好。(这个问题嘛,可以通过第三方软件进行改进,对于我来说就不是问题了)

4. 其他平台的固件,我就没有深究了(在此声明一下,并非其他平台的固件不好,只是开发方便,通用固件的使用率高一些,在开发中遇到问题也更方便查找)。

 

二、Openwrt平台搭建

1. 在平台搭建之前,有几点需要说明一下的:

所谓的平台搭建,不仅包括固件的烧写,还包括开发,编译和调试的环境搭建。

Openwrt平台是基于Linux的,其支持虚拟机安装,对于手边没有设备的亲们,可以通过安装虚拟机感受一下(木有图形界面,需要命令行控制)。

2. Openwrt开发环境搭建流程(仅列出我本人所搭建的环境,以Atheros 9344为例):

(1)操作系统: Ubuntu12.04。(版本有点老,推荐使用更行的版本)。

(2)在Ubuntu下搭建Openwrt开发环境:

安装依赖库:

复制代码
apt-get install g++
apt-get install libncurses5-dev 
apt-get install zlib1g-dev 
apt-get install bison 
apt-get install flex 
apt-get install unzip 
apt-get install autoconf 
apt-get install gawk 
apt-get install make 
apt-get install gettext 
apt-get install gcc
apt-get install binutils 
apt-get install patch 
apt-get install bzip2 
apt-get install libz-dev 
apt-get install asciidoc 
apt-get install subversion
复制代码

下载官方源码(以Atheros9344为例):

cd /home/XXX# XXX: user name 
mkdir attitude_adjustment 
svn co svn://svn.openwrt.org/openwrt/tags/attitude_adjustment_12.09

上述命令,会将svn上的源码check到本地attitude_adjustment目录下.

我使用的是attitude_adjustment版本,这个版本较为稳定,且

进行源码版本更新:

cd attitude_adjustment/
svn up
./scripts/feeds update -a 
./scripts/feeds install -a

到目前为止,Openwrt的开发环境已经搭好了.

(3)Openwrt系统的首次编译(p.s. 在编译过程中,程序会自动通过feed机制,在网上下载相应的依赖文件,这要求编译者所在网络环境良好!):

进行环境检查,查看编译所需依赖库是否都安装:

make defconfig

若提示有某个依赖库没有安装,请按照提示按照对应的依赖库. 直到上述检查无返回。

进行编译配置:

make menuconfig

image

对目标固件进行配置. 由于首次编译时间会较长,因此我创建一个无外加软件的固件:(下面三幅图,分别对应于Target System,Subtarget和Target Profile)

image

image

image

 

最后保存设置:

image

之后就是漫长的编译的时间了:

make #默认安装,无提示 make V=99 #显示编译日志,并打印在shell中

等待漫长的时间之后,如果成功,可在编译目录下 bin/

image

可以看到多个.bin文件,这些.bin文件中

image

openwrt-ar71xx-generic-db120-kernel.bin:对应于只烧写内核固件

openwrt-ar71xx-generic-db120-rootfs-squashfs.bin:对应于文件系统固件

openwrt-ar71xx-generic-db120-squashfs-sysupgrade.bin:对应于完整的固件

至此,一个可以烧写的固件就编译好了。当然,可以看出这个系统只能将路由器启动,能够正常加电运转,但是其没有任何功能。(在后面,我们需要对其添加各种软件支持,甚至是通过编译内核的方式添加软件应用)

(4)  固件烧写

对于固件烧写呢,有多种方式,我仅将我所使用过的方式列出来:

++Web在线固件升级,这个一般适用于原厂固件升级,或者Openwrt镜像烧写。此方法难度低,如果固件没有问题并且少些过程中没有断电的话,都能成功烧写。

++tftp方式升级,本人使用的Atheros9344路由,机身自带有console口,可以通过网线直连的方式,直接通过PC进行烧写。

      此过程难度较高,需要有一定的开发基础。

此外,还有好多方法,在网上都能找到,由于暂时不需要,我就不一一列出了。

(5) 路由重启,测试

进入这一步,整个开发、编译、调试和烧写的过程就到最后了。


以下是上面的补充:

一、关于Openwrt版本的选择

  Openwrt官方wiki:http://wiki.openwrt.org/about/history 列出了Openwrt的版本演变历史。

  (1)可以看到我所选择的Attitude_adjustment为目前最新的稳定版本。

  (2)由于我还有一台Netgear Wndr3700路由器,所以我也尝试过编译backfire10.03。

  (3)主干版本trunk,是持续变化的一个版本,对于开发者来说,是一个既爱又恨的版本。一则,trunk版本往往对新出的硬件是最早提供支持的,开发者可以针对新出的硬件做开发;二则,trunk版本变化较大,往往在上一个版本支持的路由产品,在下一个版本中可能由于Bug较多而被舍弃,对开发者造成困扰。

  (4)需要特别的指出的是,在国内也有一个团队在做基于Openwrt的开源项目,其内部开发版本为Openwrt-DreamBox,大家如果有兴趣可以参与一下https://dev.openwrt.org.cn/wiki/WikiStart

  官方给出的Openwrt的版本路线图如下,有兴趣的朋友可以关注一下:

  

  (图片转自Openwrt官方wiki http://wiki.openwrt.org/about/history )

二、关于Openwrt的编译

1. feeds机制  

  传统的Linux系统在安装或者编译某一个软件的时候,会检查其依赖库是否安装,如果没有安装,则会报错,安装或编译退出。

  这种机制使得开发者在安装一个软件之前,不得不查找该软件所需的依赖库,并手动去安装这些软件,有时候碰到比较娇贵的软件时,嵌套式的安装依赖文件,会使得开发者头昏脑涨。

  好在Openwrt通过引入feeds机制,较好的解决了这个问题。下文是Openwrt的官方wiki对于feeds的表述:

"In OpenWrt, a "feed" is a collection of packages which share a common location. Feeds may reside on a remote server, in a version control system, on the local filesystem, orin any other location addressable by a single name (path/URL) over a protocol with a supported feed method."
Feeds are additional predefined package build recipes for OpenWrt Buildroot.

  我个人的理解是: 在Openwrt系统中,“feed”是一系列的软件包,这些软件包需要通过一个统一的接口地址进行访问。“feed”软件包中的软件包可能分布在远程服务器上、在svn上、在本地文件系统中或者其他的地方,用户可以通过一种支持feed机制的协议,通过同一个地址进行访问。(有些绕,简单来说,就是系统将一系列的软件包进行了地址映射,只能通过同一个接口进行访问)。 

  这样做有什么好处呢?我们下载的Openwrt源码是较为纯净的系统,feeds提供了我们在编译固件时所需的的许多额外扩展软件。

  

  当我们下载了Openwrt对应源码之后,进行如下操作:

$ ./scripts/feeds update -a
$ ./scripts/feeds install -a

    上述操作,就是从feeds提供的接口地址将Openwrt所需的一些扩展软件先行下载。

2. Openwrt在编译的过程中,系统会根据Makefile自动的去判断和下载软件的依赖库。

  在Makefile文件中,设置了自动查找软件依赖。如果某个依赖文件在本地文件系统中不存在,那么系统就会根据feeds所示下载路径去下载对应的依赖文件。在首次编译的过程中,之所以耗时比后续编译时间长,其中一个原因就是系统需要下载很多的依赖文件。特别地,在TC编译Openwrt的时候,会出现有些依赖文件所在的url无法访问,从而报错。那么,没有别的办法了,要么在网上查找对应的替代源,要么就FQ吧。。。

 

三、关于Openwrt的固件烧写

这个部分呢,没有统一的标准,针对不同的路由硬件环境,其烧写的方式不同。

有些设备可以通过web的方式进行升级,有些则没有提供相应的接口。

有些设备可以通过tftp的方式进行升级,而有些不能。

此处,我就不细讲了,仅把我所使用的Netgear Wndr3700v1固件烧写的方式列一下,如果有对应Wndr3700 v2,v3以及Wndr3800设备的朋友可以参考一下:

1. 原装官方系统刷Openwrt

  这个过程极为简单

  (1)下载对应路由型号的Openwrt映像文件,我的设备Wndr3700 v1,因此固件为 “openwrt-ar71xx-wndr3700-squashfs-factory.img”

  (2) 将PC用无线连接到路由器;

  (3) 通过浏览器输入“192.168.1.1”进入路由器的管理界面。

    进入“高级”》》“管理”》》“路由器升级”,点击“浏览”,从本地文件夹中找到Openwrt固件,点击上传。之后就是大概4~5分钟的等待,当电源变成绿灯,并且不再闪烁时,路由已经成功启动了。

    (p.s. 此过程设备不能断电,否则可能发生未知的情况)

   (4)若成功刷入Openwrt,将PC与路由器通过网线直连的方式(将网线与路由器连接一端插入4个LAN口中任意一个即可)连接。

    将PC的本地网卡IP设置为“192.168.1.X” X可以为2~254 任意一个数字。

    在浏览器中输入“192.168.1.1”,如果能进入Openwrt欢迎界面,则成功输入Openwrt。

2.通过TFTP的方式刷回原版官方固件

  对于Netgear Wndr3700来说,该设备背面有一个红色圆孔“Restore Factory Settings”,我们需要通过该按钮进行回刷操作。

进入restore factory settings的步骤是这样的: 
1. 关闭路由器 
2. 按住Reset键,打开路由器(reset键即为红色圆孔,使用较细的笔尖或者牙签,伸进该圆孔,进行按压,在下一步完成前请勿松手) 
  该步骤的功能是擦除Flash,为后续TFTP传入数据做准备。
3. 直到power灯开始闪绿色,松开reset键(大约45秒)

  首先在netgear的官网上下载对应固件版本,我以“WNDR3700-V1.0.16.98.img”为例。

  然后将改固件放入C:或者D:的根目录下,打开cmd,进入对应的盘符分区:(WNDR3700-v1.0.16.98.img放在D盘根目录下)

  

  输入如下命令:

具体命令的内容如下:
(1)使用 win+R组合键,输入cmd进入Windows Shell。
(2)进入固件存放位置,我将固件放在D盘根目录下,因此输入下面的命令,跳转到D盘下面:
   C:\Users\Administrater>D:3)输入tftp命令上传固件: tftp -i 192.168.1.1 put XXXX.bin ; 其中XXXX.bin 为固件的名称

  

  之后呢,就是默默的等待了(大概1~2分钟),之后路由器会重启。之后进行1中步骤(4)操作。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值