《智能路由器开发指南》——导读

前 言

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。

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

目 录

第1章 智能路由器概述
1.1 OpenWrt简介
1.2 整体功能组件
1.2.1 整体架构
1.2.2 网络功能
1.2.3 系统管理
1.2.4 状态监控
1.3 开源嵌入式操作系统比较
1.3.1 和Android比较
1.3.2 和其他WRT比较
1.4 参考资料
第2章 开发环境及编译分析
2.1 安装编译环境
2.1.1 Ubuntu安装
2.1.2 安装编译工具
2.1.3 下载代码
2.1.4 配置及编译
2.2 编译脚本分析
2.2.1 顶层目录概述
2.2.2 编译脚本
2.2.3 下载工具
2.2.4 patch-kernel.sh脚本
2.2.5 编译扩展机制feeds
2.3 使用VirtualBox部署
2.4 编译部署出现问题的解决方法
2.5 VirtualBox虚拟机网络设置
2.5.1 网络地址转换模式
2.5.2 桥接网络模式
2.5.3 内部网络模式
2.5.4 仅主机网络模式
2.5.5 网络模式比较
2.5.6 组建路由器实验环境
2.6 参考资料
第3章 OpenWrt包管理系统
第4章 OpenWrt配置
第5章 软件开发
第6章 GDB调试
第7章 网络基础知识
第8章 路由器基础软件模块
第9章 常用软件模块
第10章 IP路由
第11章 DNS与DHCP
第12章 iptables防火墙
第13章 UCI防火墙
第14章 UPnP
第15章 网络测试及分析工具

时间: 2024-12-03 13:53:43

《智能路由器开发指南》——导读的相关文章

《深入理解Scala》——第1章,第1.2节当函数式编程遇见面向对象

1.2 当函数式编程遇见面向对象 深入理解Scala 函数式编程和面向对象编程是软件开发的两种不同途径.函数式编程并非什么新概念,在现代开发者的开发工具箱里也绝非是什么天外来客.我们将通过Java生态圈里的例子来展示这一点,主要来看Spring Application framework和Google Collections库.这两个库都在Java的面向对象基础上融合了函数式的概念,而如果我们把它们翻译成Scala,则会优雅得多.在深入之前,我们需要先理解面向对象编程和函数式编程这两个术语的含义

《深入理解Scala》——第1章,第1.4节与JVM的无缝集成

1.4 与JVM的无缝集成 深入理解Scala Scala的吸引力之一在于它与Java和JVM的无缝集成.Scala与Java有很强的兼容性,比如说Java类可以直接映射为Scala类.这种紧密联系使Java到Scala的迁移相当简单,但在使用Scala的一些高级特性时还是需要小心的,Scala有些高级特性是Java里没有的.在Scala语言设计时已经小心地考虑了与Java无缝交互的问题,用Java写的库,大部分可以直接照搬(as-is)到Scala里. 1.4.1 Scala调用Java 从S

《深入理解Scala》——第2章,第2.1节学习使用Scala交互模式(REPL)

第2章 核心规则深入理解Scala 本章包括的内容: • 使用Scala交互模式(Read Eval Print Loop 简称REPL) • 面向表达式编程 • 不变性(Immutability) • Option类 本章内容覆盖了每个新Scala开发者都需要知道的几个主题.本章不会深入到每个主题里,但是会讲到可以让你自己去接着探索的程度.你将学会使用REPL,学会如何利用这个工具做软件的快速原型开发.然后我们会学到面向表达式编程,并从另一个视角来看控制结构是怎么回事.在此基础上,我们来研究不

《深入理解Scala》——第1章,第1.3节静态类型和表达力

1.3 静态类型和表达力 深入理解Scala 开发人员中有一个误解,认为静态类型必然导致冗长的代码.之所以如此是因为很多继承自C的语言强制要求程序员必须在代码中多处明确地指定类型.随着软件开发技术和编译器理论的发展,情况已经改变.Scala利用了其中一些技术进步来减少样板(boilerplate)代码,保持代码简洁. Scala做了以下几个简单的设计决策,以提高代码表达力. • 把类型标注(type annotation)换到变量右边. • 类型推断. • 可扩展的语法. • 用户自定义的隐式转

《深入理解Scala》——第1章,第1.5节总结

1.5 总结 深入理解Scala 本章中,你学到了一些Scala的设计理念.设计Scala的初衷在于把不同语言中的多种概念融合起来.Scala融合了函数式和面向对象编程,尽管显然Java也已经这么做了.Scala精选其语法,极大地减少了语言中的繁冗之处,使一些强大的特性可以优雅地表达,比如类型推断.最后,Scala和Java能够紧密集成,而且运行在Java虚拟机上,这或许是让Scala变成一种实用选择的最重要的一点.几乎不花代价就可以把Scala用于我们的日常工作中. 因为Scala融合了多种概

《深入理解Scala》——第1章,第1.1节Scala一种混合式编程语言

第1章 Scala--一种混合式编程语言 Scala是一种将其他编程语言中的多种技巧融合为一的语言.Scala尝试跨越多种不同类型的语言,给开发者提供面向对象编程.函数式编程.富有表达力的语法.静态强类型和丰富的泛型等特性,而且全部架设于Java虚拟机之上.因此开发者使用Scala时可以继续使用原本熟悉的某种编程特性,但要发挥Scala的强大能力则需要结合使用这些有时候相互抵触的概念和特性,建立一种平衡的和谐.Scala对开发者的真正解放之处在于让开发者可以随意使用最适合手头上的问题的编程范式.

《深入理解Scala》——第2章,第2.2节优先采用面向表达式编程

2.2 优先采用面向表达式编程 深入理解Scala 面向表达式编程是个术语,意思是在代码中使用表达式而不用语句.表达式和语句的区别是什么?语句是可以执行的东西,表达式是可以求值的东西.在实践中这有什么意义呢?表达式返回值,语句执行代码,但是不返回值.本节我们将学习面向表达式编程的全部知识,并理解它对简化程序有什么帮助.我们也会看一下对象的可变性,以及可变性与面向表达式编程的关系. 作者注:语句VS表达式 语句是可以执行的东西,表达式是可以求值的东西. 表达式是运算结果为一个值的代码块.Scala

《深入理解Scala》——第2章,第2.3节优先选择不变性

2.3 优先选择不变性 深入理解Scala 编程中的不变性指对象一旦创建后就不再改变状态.这是函数式编程的基石之一,也是JVM上的面向对象编程的推荐实践之一.Scala也不例外,在设计上优先选择不变性,在很多场景中把不变性作为默认设置.对此,你可能一下子会不适应.本节中,我们将学到不变性对于判等问题和并发编程能提供什么帮助. Scala里首先要明白的是不变对象和不变引用(immutable referene)的区别.Scala里的所有变量都是指向对象的引用.把变量声明为val意味着它是个不变"引

《深入理解Scala》——第2章,第2.4节用None不用null

2.4 用None不用null深入理解Scala Scala在标准库里提供了scala.Option类,鼓励大家在一般编程时尽量不要使用null.Option可以视作一个容器,里面要么有东西,要么什么都没有.Option通过两个子类来实现此含义:Some和None.Some表示容器里有且仅有一个东西,None表示空容器,有点类似List的Nil的含义. 在Java和其他允许null的语言里,null经常作为一个占位符用于返回值,表示非致命的错误,或者表示一个变量未被初始化.Scala里,你可以用

《深入理解Scala》——第2章,第2.5节多态场景下的判等

2.5 多态场景下的判等 深入理解Scala 众所周知,为多态的面向对象系统定义合适的判等和散列方法是个特别难的过程.这是因为子类可能在整个过程中造成一些相当怪异的问题,尤其是当类型层次上有多个实体(concrete)级别的时候.一般来说,对于需要比引用判等更强的判等(译者注:比如需要判断对象内部数据)的类,最好避免多层实体类层次.这是什么意思呢?有些时候类只需要引用判等就够了.也就是说只要两个对象不是同一个实例就判为不等.但是如果我们需要判断两个不同实例是否相等,而且又有多层实体类层次(mul