智能路由器开发指南(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-16 11:03:26

点击下载

作者:张永智 李章明

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

智能路由器开发指南

智能路由器开发指南试读:

前言

OpenWrt成功的秘密

可以实现路由器功能的开源软件很多,为什么只有OpenWrt成功了?OpenWrt软件成功的关键在于3个方面:领导者、基础设施以及实现软件的技术。通常领导者是最重要的,因为领导者决定着社区的规则和技术方向,但是每个人都是独特的而且是无法复制的,因此通常无法借鉴。基础设施和实现软件的技术则是可以借鉴的。

OpenWrt社区采用六大基础设施工具支撑整个社区的运转,这六大基础设施工具分别是代码管理工具Git、邮件列表、自动构建工具buildbot、文档管理工具WiKi、Trac和技术论坛。

代码管理工具Git可以跟踪文件和目录的历史信息,包含4个W(Who、When、Why和What),即谁做了修改,什么时间做了修改,为什么修改以及修改的内容是什么。此外,Git还支持分布式代码仓库,适合开源软件项目的跨地域开发,这个工具可以让每个人看到代码的变化过程。OpenWrt经过了12年的发展,代码仓库还保留了最初的提交记录。

邮件列表是代码审查及代码提交集成的地方,开发人员将修改代码生成补丁发送给所有的邮件订阅者,每个人都可以进行代码评审,核心开发人员看到后会将代码集成到代码仓库中。邮件内容可以永久保存到邮件列表中。邮件列表和普通邮件的主要区别在于订阅机制和存档机制,每个人都可以自由订阅并查看历史邮件。

自动构建工具buildbot的核心是一个作业调度系统,它会将任务排队,当提供了任务所需的资源时,执行任务并报告结果。buildbot不仅仅支持持续集成及自动化测试,还支持应用程序的自动化部署和软件发布的管理。同时在多个平台开发时,通常最后的编译验证都是重复的,编译机器人(buildbot)将这一部分接管过来,每日自动下载代码进行编译验证,并将安装包上传到文件服务器上,如果编译失败则将用邮件通知感兴趣的人。

文档管理工具WiKi的特点是具有开放性,可以让任何参与人员非常方便地进行编辑、访问和搜索。大多数软件公司的软件文档均保存为二进制格式,在经过一段时间和人员流动之后,这些文档就会成为固定的资料,因为它会被遗落在某个角落而无法找到,而OpenWrt社区的软件开发文档和使用手册均保存到WiKi上。WiKi是一个协同写作和分享平台,允许所有人修改页面。WiKi使用简化的语法来代替复杂的HTML语言,降低了内容维护的门槛。

Trac是一个集成WiKi和问题跟踪管理系统的项目管理平台,可以帮助开发人员更好地管理软件开发过程,从而开发出高质量的软件。任何人都可以使用该系统来提交Bug并查询当前的进展。Trac采用面向进度的项目管理模型,采用里程碑的方式来组织开发。里程碑是以ticket(问题)来组织的,所有的问题都解决了,就到达了里程碑。但社区并不完全遵从这个标准,因为其开发人员全部是志愿者,通常到了一定时间会发布一个版本。

技术论坛是一个技术讨论的平台,每个注册用户均可发帖参与讨论。在开发过程中,每个新版本的说明通过该平台发布。

社区的运转是通过以上所述的六大基础设施工具来实现的,我们通过这些工具可以理解到,开源软件和社区的精髓在于其开放性,任何人员均可以通过网络自由地获取其信息并参与其中,这样可以激励每个人贡献出自己的力量,开发人员同时也从社区获得回报。开源社区的工具大多都是相同的,掌握这些工具可以帮助你深入了解开源社区和OpenWrt。

OpenWrt技术上成功的秘诀在于:统一编译框架、统一配置接口(Unified Configuration Interface,UCI)、开放的软件包管理系统及其读写分区系统、系统总线ubus和进程管理模块procd。● 统一编译框架使得数千个软件以相同的方式进行编译,并且可以

在几十个平台编译。每个软件模块按照相同的步骤进行代码下载、

解压缩、打补丁、配置、编译及生成安装包。● 统一配置接口使得数千个软件在几十个平台上以相同的方式来存

取配置数据,配置以统一格式的文本文件进行管理。● 开放的软件包管理系统和读写分区系统使得软件管理非常方便,

并且能够方便地处理软件包的依赖关系。读写分区系统可以自由

地安装软件,而不像大多数专有系统需要全部重新编译才能安装

新的软件。● 系统总线ubus。每个进程均可以注册到系统总线上进行消息传

递,并且提供命令行工具来访问系统总线。● 进程管理模块procd。每一个进程交给procd来启动,并在意外退

出之后再次调用。

所有的这些功能并不是一次性设计出来的,而是随着时间的推进,根据用户和开发进展逐步发展起来的,每一种技术都有其独特的价值。写作本书的目的

我从写下第一行C语言代码到现在已经有近20年了,实际从事嵌入式软件开发也有12年的时间了。由于在工作中经常会分析一些开源软件,因此在接触OpenWrt的过程中,我发现它的设计和实现思路非常好。但是在实际工作中往往会受到时间进度、项目研发人员的水平以及研发人员的更迭等因素的影响,导致软件架构存在种种不足或者过度设计的问题,但并没有很好的解决方法,开发进度一再延迟,因此有了写出本书的想法。

本书可以帮助各种嵌入式设备开发工程师对OpenWrt技术有一个清晰的认识,并能够帮助他们对开源的OpenWrt进行借鉴,提高软件开发水平。

OpenWrt始终在发展,本书中所提到的系统使用OpenWrt 12.09和OpenWrt 15.05.1来介绍,大部分不区分版本,如有区分,我会特别说明。

希望大家通过学习本书能够掌握OpenWrt各种技术的应用,同时在一定程度上可以参考OpenWrt的技术框架,使自己的职业技能有一个质的提高,从而加快企业产品项目的开发,提高开发效率。读者对象

本书的读者对象如下:● 软件架构师;● 软件开发工程师;● 软件测试工程师;● 计算机相关专业的学生。如何阅读本书

本书的结构是按照通常对路由器的认识顺序来编写的,全书内容共分为15章。

第1章对路由器进行了概述,主要介绍了OpenWrt的发展历史,OpenWrt的主要功能和几种开源路由器操作系统的对比。

第2章介绍了开发环境的搭建以及如何编译代码,并对常用编译脚本和编译选项进行了分析,也讲述了VirtualBox虚拟网络环境的设置。

第3章介绍了OPKG软件包管理系统。OPKG用于管理软件包的下载、安装、升级、卸载和查询等,并处理软件包的依赖关系。

第4章介绍了统一配置接口,OpenWrt数千个软件均采取该该配置接口,它包含3个部分:配置文件、访问API和命令行工具。

第5章介绍了如何在OpenWrt中新增一个软件包,提供了一个简易模块供参考,还介绍了OpenWrt的软件启动机制和补丁文件的格式以及补丁工具的使用。

第6章介绍了GDB的使用。首先介绍了如何使用GDB启动程序调试,然后介绍了在GDB中如何设置断点以及查看程序的运行状态,最后介绍了使用GDB对运行中程序的执行流程进行修改,这样能以最快的速度定位问题所在。

第7章介绍了TCP/IP网络模型,从下到上依次讲述了数据链路层、IP层和传输层协议,并以一个综合案例来讲述报文的网络处理流程。

第8章介绍了OpenWrt路由器最近几年新增的核心模块,包括系统总线ubus、网络设备和接口管理模块netifd、进程管理模块procd等。

第9章介绍了在各种领域内的常用软件模块,例如CWMP用于远程网络管理,SSH用于用户登录,QoS用于保障服务质量,uHTTPd用于提供Web服务,SMTP用于发送邮件,NTP用于网络时间协议,PPPoE用于网络拨号服务等。

第10章介绍了路由功能,包括普通的路由及源地址路由和组播路由。

第11章介绍了域名系统和动态主机服务,并讲述了动态域名更新系统。

第12章和第13章讲述防火墙。首先介绍了iptables,它是用来设置、维护和检查Linux内核的防火墙IP报文过滤规则和网络地址转换规则。Netfilter是在内核中依据规则对报文进行处理。UCI防火墙设置了一个易用的防火墙模型来对防火墙进行管理。

第14章介绍了UPnP标准框架和UPnP工作流程,并以增加端口映射为例讲述了Internet网关如何实现广域网访问局域网提供的服务。

第15章首先介绍了网络调试和诊断的“瑞士军刀”NetCat,它可以用来进行传输文件,扫描端口等;其次介绍网络流量分析工具TcpDump,它可以输出网卡接口上的网络报文,也可以根据选项将报文保存为文件。

大家可以根据自己的需求选择阅读的侧重点,不过我还是建议你首先通读前8章,再根据自己的需求来阅读其他章节,这样可以对OpenWrt架构上有一个清晰的认识,还可以对架构中的技术有一个简单的对比。致谢

感谢本书的第二作者李章明,他负责UPnP一章和Wi-Fi一节的编写。另外,还要感谢程晶对本书的贡献。

感谢本书编辑胡俊英对本书的仔细审读,她耐心地帮助修改了很多文字错误,使本书的写作质量有了很大的提高。

感谢OpenWrt开发社区,没有迈克·贝克和格里·罗泽马创立的OpenWrt社区,这本书就不能完成。本书的很多资料都参考了社区邮件列表、WiKi以及代码,感谢OpenWrt社区所有人员的贡献。同时,本书有一些素材来自Linux社区,也感谢林纳斯和他所创建的Linux。

最后感谢在工作和生活中曾经帮助过我的所有人,感谢你们,正是因为有了你们,才有了本书的面世。关于勘误

虽然花了很多时间和精力去核对书中的文字、代码和图片,但因为时间仓促和水平有限,书中仍难免会有一些错误和纰漏,如果大家发现什么问题,恳请反馈给我,相关信息可发到我的邮箱zyz323@163.com。由于时间和技术水平有限,可能不能及时回答大家的所有问题,但我会定期将问题整理并放在网上。

如果大家对本书有任何疑问或想与我探讨OpenWrt和防火墙相关的技术,可以访问我的个人网站,网址为http://openwrt.bjbook.net。大家在编译的过程中如果遇到下载软件包失败,可以在我的镜像地址进行下载,网址为http://openwrt.bjbook.net/download。另外,我还提供了OpenWrt代码搜索引擎,网址为http://openwrt.bjbook.net/source,大家可以在学习过程中在该地址浏览并搜索代码。第1章智能路由器概述

近年来,智能路由器领域越来越火,但这方面的开发资料却很少,并且不成体系。因此,本书针对智能路由器领域的开发进行了详细介绍,也可以用于指导其他智能家庭设备的开发。

接入网络的家庭用户终端越来越多,路由器控制越来越复杂,因此需要一个智能网关来管理家庭的设备。另外,这个智能网关直接连在互联网上,需要隔离家庭网和互联网的连接,因此需要带有防火墙功能。智能路由器就像智能手机一样,其定义并非其字面含义所表现出的那样(可以智能地选择路由),而是其带有可扩展功能,用户自己可以安装软件进行扩充。传统的路由器仅可以升级厂商自己的操作系统版本,且未提供扩展接口。

公共场所无线接入是一个大的需求,因此无线接入市场越来越大。接入费用谁来负担?一个思路是商家提供接入费用,另外一个思路是通过广告来分担接入费用。OpenWrt就是这样一个智能路由器操作系统,它可以提供Web认证等成熟的功能给这类用户进行选择。

OpenWrt是一个针对嵌入式设备的Linux发行版,有非常高的可扩展性,可以非常容易地从零开始构建出全功能的智能路由或服务器设备。1.1 OpenWrt简介

OpenWrt是一个嵌入式设备的Linux发行版,以GPL许可协议发行。

OpenWrt项目始于2004年1月,其第一个版本采用了LinkSys的源码。在LinkSys的代码收费后,改为采用正式发布的Linux内核来集成,并将OpenWrt完全模块化,不断推出补丁和驱动。OpenWrt的主要特点在于其高扩展性,并且文件系统可写,开发者无需在每一次修改后完全重新编译,只要编译自己的软件包即可,这样就加快了开发的进度。另外OpenWrt提供了SDK,每个运行软件均能够以SDK来进行编译,以软件包形式进行安装和卸载。其主要特点有如下几个。● 代码里不含第三方开源包,只包含开源包地址链接。● 编译时自动下载源代码、打补丁来满足指定平台要求,并编译。

还可以修改Makefile来下载最新的软件包。● 使用LuCI作为最终用户管理界面。LuCI以Apache许可协议发布

Web管理功能代码。● UCI通用配置管理方法。● 通过脚本来调用iptables来实现防火墙功能,配置保存在UCI文件

中。● 开放和可扩展的OPKG格式安装升级包。

OpenWrt历史

OpenWrt在2004年由迈克·贝克和格里·罗泽马创立,到今天为止已经发展了12个年头了。OpenWrt定期发布版本,发行版本以代码线和日期作为版本号。它的第一个正式版为Kamikaze 7.06,第二个正式版本为Backfire 10.03。

Backfire

2010年4月7日,OpenWrt发布Backfire 10.03正式版。相对上一个稳定版本,其内核升级为Linux 2.6.32,使用了新的Web服务器uhttpd,支持了一些新的平台硬件(如TP-Link TL-WR1043ND等),增加了机器可读的版本信息/etc/openwrt_release。

2011年12月21日,OpenWrt发布了Backfire 10.03.1正式版。期间,OpenWrt发布了6个RC版本。这一版本将内核升级为Linux 2.6.32.16,修正了很多BUG,并增加了对TP-Link、TL-MR3420等的支持。

Attitude Adjustment

2013年4月25日,OpenWrt发布12.09正式版。相对于Backfire版本,Attitude Adjustment将内核更新至Linux 3.3,改进了并行编译支持;使用密文存储密码;各种防火墙功能增强;无线驱动更新及稳定性增强;新平台支持ramips、bcm2708(树莓派)等;发布镜像文件中支持网桥防火墙。

Barrier Breaker

2014年7月31日,OpenWrt发布14.07正式版。相对于Attitude Adjustment版本,内核升级到3.10,增加了原生IPv6支持,文件系统增强;UCI配置增强,支持测试配置和回滚最近工作状态机制,增加配置更改按需触发服务重启机制;网络功能增强,可以支持动态防火墙规则,增加网桥的多播传输到单播传输的转换等。

Chaos Calmer

OpenWrt于2015年9月11日发布15.05正式版。Chaos Calmer中间发布了3个RC版本。相对于 Barrier Breaker,其内核升级到了3.18;网络功能增强,添加了多个3G/4G路由器支持,改进了IPv6等功能增强,增加了自管理网络的支持;各种平台和驱动设备的支持,例如飞思卡尔i.MX23/28系列等各种品牌,增加了树莓派的支持。这个版本在64位平台的VirtualBox下运行还存在问题。表1-1 OpenWrt最近历史版本版  本内核版发布日发布代码地址本期2010-0svn://svn.openwrt.org/openwrt/tags/8.09.2Kamikaze 8.09.22.6.261-10svn://svn.openwrt.org/openwrt tags/2010-0Backfire 10.032.6.32backfire_10.034-07svn://svn.openwrt.org/openwrt/tags/2011-1Backfire 10.03.12.6.32backfire_10.03.12-21Attitude svn://svn.openwrt.org/openwrt/tags/2013-03.3.8Adjustment 12.09attitude_adjustment_12.094-25svn://svn.openwrt.org/openwrt/branches/Barrier Breaker 2014-13.10barrier_breaker -r4262514.070-02svn://svn.openwrt.org/openwrt/branches/Chaos Calmer 2015-03.18chaos_calmer -r4676715.059-11

注1:对于各种硬件平台内核版本可能不一致。因为每个平台的内核版本在独立的文件中定义(target/linux/<平台>/ Makefile:LINUX_VERSION),在Barrier Breaker及以后的发布版中,内核版本定义变量改为KERNEL_PATCHVER。

注2:最新的两个发布版本没有创建标签,需要根据SVN版本号来下载代码。

注3:2016年3月,OpenWrt已经从SVN代码仓库切换到Git代码仓库了,因此不再支持SVN。1.2 整体功能组件1.2.1 整体架构

路由器的典型架构划分为管理平面、控制平面和数据转发平面,如图1-1所示。图1-1 OpenWrt架构

管理平面是提供网络管理人员使用UCI、Web、SNMP和TR069等方式来管理路由器,以及执行这些管理功能所需的配置命令等,管理平面提供了控制平面正常运行所需的配置参数。

控制平面用于控制和管理所有网络协议的运行,例如ARP、DHCP、DNS及组播协议的管理和控制。

转发平面用于处理和转发不同网络接口上各种类型的数据,例如进行网络地址转换、路由、ACL等。典型路由器在数据转发平面占用最多的系统资源。转发平面应用控制平面提供的路由信息对数据报文的接收,进行网络地址转换,查找路由表,从出接口发出报文等工作。如果找不到路由,则发送ICMP不可达消息,我们可以使用route命令查看路由转发数据库。路由器的3平面划分仅是逻辑意义上的功能划分,在实际的功能模块并没有完全区分。

OpenWrt是一个基于Linux的智能路由器操作系统。用户可以自定义安装各种应用软件。OpenWrt提供各种功能插件,使用户可以自定义安装来管理路由器;默认内置了一些基础功能。其主要功能可以分为3个部分:网络功能、系统管理功能和状态监控功能。以下各节将分别详细介绍。1.2.2 网络功能

网络功能是路由器的核心功能,如图1-2所示。“Network”标签高亮显示表示正在使用网络管理功能,下一层标签是静态路由管理。主要包含以下几个功能。● 网络接口设置和管理。● DHCP协议支持,家庭网内作为DHCP服务器,在广域网作为

DHCP客户端。● 主机及DNS功能,可以加快DNS响应和减少广域网DNS流量。● 静态路由及组播路由功能。● 便捷的网络问题诊断工具 ping、traceroute和nslookup等。● 防火墙功能(IPv4网络地址转换、DMZ、报文过滤及防洪水攻击

等)。● IP带宽控制(QoS)。● 设备即插即用(UPnP)。图1-2 静态路由管理功能1.2.3 系统管理

系统管理是路由器除了网络管理之外的其他管理功能,如图1-3所示。系统管理主要包含以下几个功能。● 主机名称设置、日志服务器设置、NTP(网络时间)和密码设置

等。● 远程安全登录设置(SSH)。● 软件管理/配置备份等,如图1-3所示。● 进程启动管理及定时任务管理。● 系统属性设置。如时区、时间设置及语言设置等。图1-3 软件管理功能1.2.4 状态监控

状态监控主要用于监控路由器的当前状态,并且只能查看当前的路由器状态。如图1-4所示,“Status”标签高亮显示表示正在使用状态监控功能,下一层标签是“Overview”,用于查看路由器的系统状态和内存占用情况。状态监控主要包含以下几个功能。● 查看系统固件版本、运行时间、平均负载及内存占用等。● 网络状态、DHCP用户及无线用户等。● 防火墙状态统计、路由转发表及ARP表。● 系统日志和内核启动日志。● 系统进程负载状态,包括CPU使用率及内存使用率。图1-4 状态监控功能

此外OpenWrt还为开发人员提供了一些开发支撑功能以及代码调试工具等,例如:● 编译工具链(gcc、binutils和libc)。● build固件工具(mksquashfs、mkcramfs)。● 编译SDK功能,不用完全编译整个系统,即可编译单独模块。● 可写磁盘分区,便于安装验证功能。1.3 开源嵌入式操作系统比较

开源嵌入式操作系统,其字面意思有3点,即开放源代码、嵌入式和操作系统,但实质上其流行的关键在于其可扩展性。

开源是指开放源代码,是指软件在开放源代码许可证下发布软件,保障软件用户自由查看软件源代码的权利。这同时也保障了用于修改、复制和再分发的权利,但仍需遵守开源许可协议中的一些约束。开放源代码不仅仅指开放源代码的软件,也是一种软件开发模式。“许可证”是指授权条款,是指使用、修改、复制和再分发的条款和条件的法律文件。最常见的开源许可证有几种:GNU GPL许可证、Apache许可证等。许可证通常也称为许可协议。“Apache许可证”是著名非盈利开源组织Apache采用的协议。该协议鼓励代码共享和尊重原作者的著作权,同样允许代码修改、再发布(作为开源或商业软件)。获得该许可证需要满足以下4个条件。● 需要给代码的用户一份Apache许可协议。● 如果你修改了代码,需要在被修改的文件中说明。● 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来

代码中的协议、商标、专利声明和其他原来作者规定需要包含的

说明。● 如果再发布的产品中包含一个Notice文件,则在Notice文件中需

要带有Apache 许可证。你可以在Notice文件中增加自己的许可

内容,但不可以表现为对Apache许可证构成更改。

Apache许可协议是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布和销售。

GPL是著名的开源软件Linux采用的许可协议。GPL许可证和Apache许可证等鼓励代码重用的许可很不一样。GPL许可证的出发点是代码的开源使用和引用/修改/衍生代码的开源使用,但不允许修改和衍生的代码做为闭源的商业软件发布和销售。这也就是为什么我们能用使用各种商业软件公司发布各种Linux系统以及他们的源代码。

GPL许可证主要有以下两个特点。● 程序运行不受许可协议的限制。● 只要在一个软件中使用GPL许可证的产品,则该软件产品发布时

也必须采用GPL许可证,即必须同时发布其源代码。这就是所谓

的“传染性”。并且在发布任何基于GPL许可的软件时,不能添

加任何限制性的条款。

嵌入式系统,是指嵌入到硬件系统内部,为特定应用功能而设计的专用软件系统。与个人计算机的通用操作系统不同,嵌入式系统通常只针对特殊的用途。因此可以对它进行优化,并裁剪到最小。现在通用的硬件系统发展非常迅速,因此出现了在通用硬件系统上的嵌入式操作系统。目前在嵌入式领域广泛使用的操作系统有:Linux、Windows Embedded和VxWorks等。

基于Linux内核也衍生出很多操作系统发行版本。Linux基金会负责Linux内核的开发、发行及维护工作。对于各个基于Linux内核的发行版本来说,可以选择某款Linux内核长期支持版(LFS)作为自己操作系统的内核。如果对主干版本进行修改,可以将修改反馈给上游。等到下次升级内核版本时,就会得到包含自己修改代码的内核了。

相对于专有的闭源操作系统,如Windows和Mac,开源Linux操作系统最大的特点就是其可扩展性非常好。但如果从头开始构建操作系统,则会因为使用者的技术水平、软件包的依赖关系、软件包的版本等出现很多不可预知的兼容性问题。这就要求个人和企业用户在选择操作系统时需要注意根据自己的实际情况来选择,这也是目前使用开源Linux操作系统较为困难的最主要原因。还好有些技术社区组织已经针对某些领域做了一些特殊的定制和优化。例如,针对防火墙的操作系统有IPFire;针对智能路由器领域通常使用的嵌入式操作系统有Tomato和OpenWrt等;针对个人桌面领域操作系统有Ubuntu和Fedora等;针对手机有Android和Firefox OS等。它们均是基于Linux内核的操作系统。1.3.1 和Android比较

Android是谷歌研发的一款智能终端操作系统,是一种基于Linux的开放源代码的操作系统,主要使用于移动设备 ,如智能手机、平板计算机等,也应用于智能电视等。它由谷歌公司和开放手机联盟领导开发。Android操作系统最初由安迪·鲁宾开发,最初目的是用于数码相机的操作系统。2005年8月谷歌全资收购了Android操作系统。2007年11月,谷歌与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟,共同研发改良Android系统。随后谷歌以Apache开源许可协议的授权方式发布了Android的源代码,Android以JAVA层封装了系统层提供给应用开发者统一的API接口。第一部Android智能手机发布于2008年10月。目前,Android已逐渐扩展到平板计算机及其他领域,如电视、智能手表、数码相机和游戏机等。2015年,Android以85%的市场占有率占据移动操作系统市场之首。表1-2所示为OpenWrt和Android的比较。

Android操作系统已经演化为一个移动设备开发平台,其软件层次大体上分为4层,即操作系统内核、中间层、应用程序框架层和应用程序。应用程序框架层为应用程序开发者提供了功能强大的API,包括图形显示的各种组件,如视图、列表、文本框、按钮以及嵌入式的Web浏览器等。表1-2 OpenWrt和Android操作系统的比较 AndroidOpenWrt内核Linux内核Linux内核许可Apache2.0GNU License协议面向终端用户,手持设备。用服务器、家庭路由器等,用户接口默使用户接口采用JAVA提供图形用认为UCI命令行提供,也支持通过场景户界面GUIWeb方式来管理开发由OpenWrt.org社区主导,社区由个人主导由谷歌公司主导开发组成,更开放模式1.3.2 和其他WRT比较

1.Tomato WRT

Tomato是一种小型的LinkSys的WRT54G是博通路由器的另外一种可选的替换固件。它有一个新的易于使用的GUI,一个新的带宽监控工具,更为先进的服务质量(QoS)和访问限制,使用新的无线功能,如WDS和无线客户端模式,P2P最大连接上的限制,允许你运行自定义脚本或者Telnet、SSH登录到路由器,在做各种各样的事情。例如重新编程的SES/AOSS按钮,添加无线站点调查来查看你的Wi-Fi邻居,等等。Tomato有以下特点。● 代码压缩包35.4MB,仅提供必要的代码,其他代码需要自己手

动下载。● 在LinkSys提供的源码上仅做少量修改,内核还是采用2.4版本。● 在编译时需要特别注意设置环境变量,例如:Export

LC_ALL=en_US.UTF-8。● 编译时代码有时间依赖,复制时需要保留时间,使用命令“cp –

a”。●“ www.polarcloud.com/tomato”提供源代码及二进制包,源代码

和思科发布的代码相近,仅修改一些必须的代码。编译时需要首

先下载思科的代码,并替换相应的文件。● 代码地址为git://repo.or.cz/tomato.git, 最新版本为Tomato1.28,

更新日期为2010-6-29。

它有一些明显缺点,例如仅有发布说明,没有详细修改记录;最近不再更新等。

2.DD-WRT

DD-WRT是一个基于Linux的开源固件,适合各种各样的无线路由器和嵌入式操作系统。其重点在于提供最简单的处理,同时在各种硬件平台的框架内支持大量的功能。它是另外一款路由器代码发行版,从2006年2月开始开发,没有分支稳定版本。代码库包含所有的代码,包含SVN信息共大约18GB。其代码始终在更新,2015年10月也有代码提交。有一个缺点是SVN上包含所有的代码,没有分支及标签,无法区分稳定版本。用在私人用途,DD-WRT是免费的,如果用在商业用途则需要获取软件许可。

表1-3所示为开源路由器各种发行版本的对比。表1-3 开源路由器各种发行版本对比路Tomato WrtDD-WRTOpenWrt由器www.openwrt.网www.dd-wrt.www.polarcloud.com/tomatoorg站com2004年2月开历2006年2月开始始,平均两年未知史开发发布一个稳定版本svn://svn.dd-svn://svn.wrt.com/DD-openwrt.org/WRT,包含所代openwrt/,diff有的代码,没码git://repo.or.cz/tomato.git,仅提供自己修改文件进行提交有分支及标管的代码。仅有一个可用版本管理。不同版签,无法确定理本使用分支来哪个是稳定版管理本问题跟采用trac管理无无踪缺陷管理● 代码压缩包35.4MB,仅提  供必要的● 构建时需代码,其他代码  需要自己手动下载● 包含所有代要联网,编译● 在编译时需要特别注意  设置环境变码,一次下载时根  据选编量,例如:  Export LC_ALL=en_US.   完  成后,编择自动下载第译UTF-8译构建时不用三方代码● 编译时代码有时间依赖,  复制时需联网● 支持编译要保留时间,使  用命令cp -aSDK一直在更新,活一直在更新,2015-10-06也跃Tomato1.28最后更新日期为2010-06-292015-10-6也有有提交,最新程提交稳定版本为度15.05文自己网站英文资料较少中文资料较多档资料较多无法确定稳定缺版本;商业版X86平台不支持,已经不再更新无明显缺点点本需要获取软件许可

注1:最后更新日期为2015年10月6日统计。

3.比较结果

OpenWrt相对于其他几个无线路由器操作系统来说,版本管理最为规范,社区最活跃,是最适合选为基础来进一步开发的。当然,OpenWrt也适合初学者来学习。本书中采用了OpenWrt来论述智能路由器的开发过程,非常有利于初学者快速上手。1.4 参考资料● Tomato介绍(http://www.polarcloud.com/tomato [2015-07-12])。● DD-WRT介绍(http://dd-wrt.com/site/content/about

[2015-07-12])。● OpenWrt官方网站(https://openwrt.org/)。● OpenWrt版本历史(http://wiki.openwrt.org/about/history

[2015-10-07])。● GNU通用公共许可证(http://www.copu.org.cn/node/24

[2016-01-23])。● Apache 许可协议(2.0版)(http://www.copu.org.cn/node/366

[2016-01-23])。● 5种开源协议的比较(http://www.copu.org.cn/node/25

[2016-01-23])。第2章开发环境及编译分析

如果你想从事智能路由器OpenWrt开发,首先必须掌握如何编译OpenWrt。本章将从搭建环境,到编译代码,再到安装部署运行以及VirtualBox虚拟网络环境的搭建,一步一步地教你如何进入到OpenWrt大门。

OpenWrt是一个针对嵌入式设备的Linux发行版。OpenWrt提供了非常方便的开发环境,使用流行的Linux操作系统Ubuntu即可搭建好编译环境。OpenWrt有非常多的平台适应性,可以运行在ARM/MIPS/X86平台上,因此我们的研发网络部署也可以在虚拟机VirtualBox上运行(这样可以降低研发中的硬件成本),待软件开发成熟后再在实际环境中进行运行。因此最后我们也会讲解VirtualBox的网络环境设置。2.1 安装编译环境2.1.1 Ubuntu安装

首先安装Linux操作系统Ubuntu 14.4。个人机器多为Windows 操作系统,为了方便使用及节省硬件资源,我们采用虚拟机VirtualBox来安装编译软件环境。如果是实体机安装Linux操作系统,则可略过安装虚拟机这一步。硬件设备只需要一台连接互联网的计算机。软件从互联网下载。建议使用VirtualBox虚拟机来搭建编译环境及开发调试。

下载和安装VirtualBox和ubuntu 14.04.3。下载地址分别为:● http://download.virtualbox.org/virtualbox/5.0.0/

VirtualBox-5.0.0-101573-Win.exe● http://releases.ubuntu.com/14.04/ubuntu-14.04.3-desktop-i386.iso

VirtualBox是一个跨平台的虚拟化应用程序。这意味着什么?第一,是它可以安装在你已存在的Intel或AMD兼容的机器上,无论是它运行Windows、Mac、Linux还是Solaris操作系统。第二,它可以扩展你已存在的计算机系统的能力,你可以同时运行多个操作系统(在多个虚拟机内部),例如,可以在你的Mac机上运行Windows和Linux,在Linux服务器上运行Windows Server 2008,在Windows系统上运行Linux等等,这些都在你的VirtualBox应用程序中。你可以安装运行很多虚拟机器,唯一的限制是磁盘空间和内存。

虚拟机软件VirtualBox完成安装后,在VirtualBox软件中新建计算机,并分配20GB左右的硬盘空间。然后在虚拟机中安装Ubuntu操作系统。Ubuntu操作系统及编译环境需要5GB左右硬盘空间,OpenWrt编译根据选择软件包的多少不同,编译所需空间大小不同。我这里编译完成需要7.1GB的硬盘空间,一般我们会同时编译至少两个版本进行,因此建议虚拟机预留20GB以上的磁盘空间。

安装增强功能

虚拟机和主机之间如何传递内容和文件?这就需要“安装增强功能”来在虚拟机和宿主机之间共享剪切板和共享文件目录。可在虚拟机软件上进行以下设置。● 依次单击“设备→安装增强功能”,安装完成后重启生效。● 依次单击“设备→共享文件夹”,进行共享文件夹设置,这样虚

拟机将宿主机的文件目录挂载在自己的根目录下,两个机器可以

相互传递文件。● 依次单击“设备→共享剪切板”,改为双向。这样虚拟机和宿主

机之间就可以相互复制粘贴了。

设置完成后在Ubuntu系统下进行自动挂载设置。在/etc/fstab增加如下一行:

  share      /mnt      vboxsf  rw 0    0

这样宿主机的共享目录share就可以挂载在虚拟机的/mnt目录下,虚拟机和宿主机均可以对该目录进行操作。这个就可以将编译完成后的文件从虚拟机中传递出来。

另外一种方式是通过telnet或SSH或串口来登录到Ubuntu上进行控制,使用FTP等工具来进行文件传输。2.1.2 安装编译工具

Ubuntu采用APT(Advanced Packaging Tool)来管理软件包安装、更新、升级及删除等。APT系统的配置文件为/etc/apt/sources.list和/etc/apt/sources.list.d目录。sources.list文件格式如下:deb uri distribution [component1] [component2] [...]

首先第一列为类型,可选类型为deb或deb-src,deb表示为二进制安装包;deb-src表示源代码包。第二列为URI地址,例如,为通过HTTP访问的统一资源定位符。第三列用于指定一个发布版,例如,为trusty表示14.4发布版。最后一列为各个组件标识。

设置Ubuntu配置升级及更新路径的文件为/etc/apt/sources.list,修改为国内网易的镜像服务器,这样下载速度会比较快。为了防止修改错误,修改之前应事先进行备份,并增加以下内容(参考http://mirrors.163.com/.help/ubuntu.html)。deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiversedeb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiversedeb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiversedeb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiversedeb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse

OpenWrt选择了一种自动化的方式来生成固件:编译环境检查、生成交叉编译链、下载代码包、打补丁、编译及生成固件,一切均从源代码开始,没有隐藏任何细节。我们先来安装代码管理工具Subversion及编译工具。首先输入以下命令进行更新:sudo apt-get update

这条命令用于更新Ubuntu软件仓库中软件包的索引文件。软件仓库的地址是由/ etc/apt/sources.list文件指定的。更新之后安装编译工具,编译工具安装命令如下:sudo apt-get install subversionsudo apt-get install g++ flex patchsudo apt-get install libncurses5-dev zlib1g-devsudo apt-get install git-coresudo apt-get install libssl-devsudo apt-get install gawksudo apt-get install xz-util(1)Subversion 是一个版本管理系统,可以跟踪文件和目录的历史信息,包含4个W(Who、When、Why和What),即谁做了修改、何时做了修改、为什么修改以及修改的内容。它像CVS一样保存数据源的单份复制,称为仓库,仓库包含了项目中文件的所有历史信息。

Subversion允许对源代码进行并行修改及管理,知名的Apache社区就采用Subversion来管理代码,其中最重要的是代码管理客户端工具,缩写为svn。这里我们只用到其下载代码功能。

Subversion采用集中式版本控制系统,其特点是其高可靠性,可用作一种有价值的数据安全的避风港;它的模型使用简单;它支持各种各样的用户和项目需求的能力,包括从小型单人到大型企业的管理需求,因此大多数软件研发公司均采用Subversion作为其代码管理工具。如果个人在Windows平台上使用,推荐采用“VisualSVN Server”作为服务器,其可视化安装及管理非常便于用户使用。(2)g++是GNU工程的C/C++编译工具,用于将C语言及C++语言编译为动态链接库或二进制可执行程序。它对代码进行预处理、编译、汇编和链接。通过命令选项可以控制整个编译过程。(3)FLEX(The Fast Lexical Analyzer)一个快速词法分析工具。(4)patch是将diff文件应用到原始文件的工具,用于在程序开发过程中提交代码,是应用差异文件的工具。这些差异文件由diff程序按行产生。(5)libncurses5-dev用于屏幕终端控制。这个包中包括运行那些使用ncurses编译的程序所必须的共享库,同样包含开发使用的头文件、静态库和开发使用的链接文件、文档等。(6)zlib1g-dev是压缩及解压缩开发库。包含头文件、静态库、开发示例和文档等。(7)git-core是设计用于大型工程的分布式版本管理工具,是另外一种代码管理工具软件。它的每一个仓库都完全保存了整个代码历史,可以脱离网络而使用,首先应用于Linux社区。这里用于下载一些以git管理的软件包。(8)libssl-dev 是openssl开发库,用于加密解密、计算哈希和数据签名等。(9)gawk是GNU工程实现的AWK语言工具,是文本模式扫描和处理的工具。(10)xz-util是xz格式的压缩工具集。它有非常高的压缩比率,并且更快更容易解压缩。2.1.3 下载代码

OpenWrt社区同时使用Subversion和Git两种工具来管理代码。Subversion管理代码非常灵活,通常会创建tags、branches和trunk共3个目录管理代码。trunk目录用来保存开发的主线,一般最新的功能均在trunk目录提交。 branches目录存放分支,用于功能开发完成之后创建分支、修改BUG及发布版本使用,或者某些功能开发分支。tags目录保存标签复制,一个标签是一个项目在某一时间点的“快照”,用来给发布版本的代码创建快照,以便多数开发人员基于这个版本进行开发修改及测试使用,一般永远不再修改。

OpenWrt也是采用了Subversion的推荐目录配置,除此之外还增加了docs、feeds和packages这3个目录,我们采用svn list命令来查看代码仓库共有6个目录。zhang@zhang-laptop:~$ svn list svn://svn.openwrt.org/openwrt/branches/docs/feeds/packages/tags/trunk/(1)分支(branches)用于功能开发完成之后创建分支、修改bug及发布版本使用,或者某些功能开发分支。OpenWrt社区每隔两年左右会创建一个分支用于发布特定版本,最新的代码线分支为chaos_calmer。社区在2015年9月12日发布了15.05版本,但未使用SVN创建标签。最近3个分支信息地址请参见表2-1。(2)docs保存文档,使用SVN来查看修改历史信息,得出最后修改时间为2007-10-24,现在OpenWrt已经不再使用这个目录。(3)feeds保存一些额外扩展的软件包,最后修改时间为2012-11-14,也逐渐不再使用,其中代码已转到使用Git仓库来管理。地址为https://github.com/openwrt。(4)packages保存OpenWrt基础软件包,会被经常用到。最后修改时间为2015-06-01。(5)标签(tags)下为发布版本代码,最近稳定版本标签有backfire_10.03.1,attitude_adjustment_12.09。以后版本未创建标签。(6)主干(trunk)始终是最新的代码,OpenWrt社区将最新的代码线命名为“Designated Driver”。最新代码包含实验性质的代码,可能会碰到编译或运行的问题,建议新手不要采用。

注:以上修改时间均为2015年10月12日查询得出,OpenWrt的外围代码已经逐渐转到github提供的Git托管空间上。表2-1 OpenWrt版本对比表分chaos calmer Barrier Breaker 14.07(BB)Attitude Adjustment 支15.05(CC)12.09(AA)内Linux kernel Linux kernel 3.10Linux kernel 3.3核3.18.21SVsvn://svn.openwrt.Nsvn://svn.openwrt.org/org/openwrt/svn://svn.openwrt.org/openwrt/openwrt/branches/代branches/branches/barrier_breaker码attitude_adjustmentchaos_calmer地址Gitgit://git.openwrt.代git://git.openwrt.org/14.07/git://git.openwrt.org/12.org/15.05/码openwrt.git09/openwrt.gitopenwrt.git地址● 增加大量的● 增加并行编译支● 增加procd 新的preinit、init、3G/4G调制  解持热  拔插及事件通知机制调器支持● 使用密文密码● 原生IPv6支持● Netfliter性能增强● 各种防火墙功能其● 文件系统增强增强他● 网络栈多核● UCI配置增强:支持测试配主支持● 无线驱动更新及置和  回滚最近工作状态机要稳定  性增强制,增加配置  更改按需触发● 支持只能队修服务重启机制列管理Qos等改● 新平台支持:ramips,  bcm2708 ● 网络功能增强:例如,支持● DNSSEC增(Raspberry   Pi)等等动态  防火墙规则,增加网桥强支持的多播传输  到单播传输的转● 发布镜像文件中● 增加自管理换,等等支持  网桥防火墙网络支持等svn://svn.openwrt.发svn://svn.openwrt.org/org/openwrt/svn://svn.openwrt.org/openwrt/布openwrt/tags/branches/branches/barrier_breaker -r42625版attitude_adjustment_1chaos_calmer -本2.09r46767

我们选择“Chaos Calmer”的发布代码进行编译,因此使用目录“cc”下载代码。OpenWrt在2016年3月将代码库由Subversion彻底转换为GIT,因此我们使用git命令来下载代码,下载命令如下所示:git clone git://git.openwrt.org/15.05/openwrt.git cc2.1.4 配置及编译

现在代码和编译环境准备好了,我们可以开始配置和编译了。我们进入代码目录cc下进行编译。通常分3步,第1步首先更新和安装所有可选的软件包。

./scripts/feeds update 更新最新的包定义

./scripts/feeds install -a 安装所有的包

feeds命令将安装扩展代码包编译选项。如果不运行该命令,在menuconfig配置时将没有选择这些扩展包的机会。

第2步进行编译配置。输入“make defconfig”,在这里会检查所需的编译工具是否齐备,并生成默认的编译配置文件“.config”。

输入“make menuconfig”后系统将进入配置工具选项菜单来配置编译固件的内容,如图2-1所示。配置选项和Linux内核的编译配置非常相似,使用上下左右箭头按键来在编译选项菜单上导航。按Enter键进入子菜单,连续两次按下Esc键返回上一级菜单,输入问号键将获取帮助信息,顶层配置选项含义如表2-2所示。OpenWrt提供模块化选择编译,每一个模块通常都有3个选项[Y|N|M]可供选择,输入Y该模块将包含在固件中;输入M将作为一个模块来编译,可以后续再进行安装;输入N将不编译该模块。还有一些是单选选项菜单,按空格键进行选择,再次按空格键则取消选择。

另外还有一些高级功能可以输入字符串进行配置。例如下载文件夹路径设置,可以不使用编译系统默认的源代码下载目录dl,输入系统路径“/opt/dl”来设置,这样在很多人使用同一服务器来编译代码时,不用多次下载相同的代码文件。

为了便于开发及调试,我们选择x86平台进行编译,并选择自己所需要的软件包,例如网络开发中最常用的抓包工具TcpDump、代码调试工具GDB和Web管理界面luCI等。图2-1 OpenWrt配置选项菜单表2-2 OpenWrt配置选项含义编译配置选项含  义Target System 目标平台,例如一般Windows系统均为X86系统架构,嵌入(x86)式路由器通常有ARM、MIPS系统和博通系统等编译生成物控制,根据目标平台不同选项不同。例如根文件Target Images系统格式、内核空间大小和是否生成VirtualBox映像文件等

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载