最近购得一个openwrt书籍《智能路由器开发指南》,作者张永智。
Building a smart router with openwrt
作者网址:http://openwrt.bjbook.net/
作者提供软件包下载服务,和openwrt代码搜索引擎,同一网站。
书中所提到的系统使用openwrt 12.09和openwrt 15.05.1介绍。
作者希望通过本书的学习能够掌握openwrt各种技术的应用,同时在一定程度上可以参考openwrt的技术架构,使自己的职业技能有一个质的提高。
在异步社区http://www.epubit.com.cn/book/onlinechapter/43506有本书前两章内容,可供参考。
作者在前言中提到了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来启动,并在意外退出之后再次调用。
所有的这些功能并不是一次性设计出来的,而是随着时间的推进,根据用户和开发进展逐步发展起来的,每一种技术都有其独特的价值。
目录 第1章 智能路由器概述 1 1.1 OpenWrt简介 1 1.2 整体功能组件 3 1.2.1 整体架构 3 1.2.2 网络功能 5 1.2.3 系统管理 5 1.2.4 状态监控 6 1.3 开源嵌入式操作系统比较 7 1.3.1 和Android比较 9 1.3.2 和其他WRT比较 10 1.4 参考资料 12 第2章 开发环境及编译分析 13 2.1 安装编译环境 13 2.1.1 Ubuntu安装 13 2.1.2 安装编译工具 15 2.1.3 下载代码 17 2.1.4 配置及编译 19 2.2 编译脚本分析 27 2.2.1 顶层目录概述 27 2.2.2 编译脚本 29 2.2.3 下载工具 29 2.2.4 patch-kernel.sh 30 2.2.5 编译扩展机制feeds 31 2.3 使用VirtualBox部署 34 2.4 编译部署出现问题的解决方法 37 2.5 VirtualBox虚拟机网络设置 38 2.5.1 网络地址转换模式 39 2.5.2 桥接网络模式 40 2.5.3 内部网络模式 41 2.5.4 仅主机网络模式 41 2.5.5 网络模式比较 42 2.5.6 组建路由器实验环境 42 2.6 参考资料 43 第3章 OpenWrt包管理系统 44 3.1 工作原理 44 3.2 OPKG命令 45 3.2.1 命令用法 45 3.2.2 软件包的管理 46 3.2.3 查询信息 48 3.2.4 选项 49 3.3 OPKG配置 50 3.3.1 调整软件仓库地址 50 3.3.2 调整安装目录 51 3.3.3 代理设置 51 3.4 使用举例 52 3.4.1 安装软件包 52 3.4.2 查询已安装的OPKG软件包文件列表 53 3.4.3 自定义安装目录 53 3.5 OPKG包结构 55 3.6 参考资料 57 第4章 OpenWrt配置 58 4.1 UCI简介 58 4.1.1 文件语法 58 4.1.2 统一配置原理 60 4.1.3 UCI工具 61 4.1.4 配置脚本 66 4.2 UCI API编程接口 68 4.2.1 Libubox 69 4.2.2 UCI 69 4.2.3 UCI API接口 70 4.3 系统内核设置 71 4.3.1 sysctl.conf 71 4.3.2 sysctl 72 4.4 系统配置 73 4.4.1 /etc/rc.local 74 4.4.2 /etc/profile 74 4.4.3 /etc/shells 75 4.4.4 /etc/fstab 75 4.4.5 /etc/services 76 4.4.6 /etc/protocols 77 4.5 名词解释 78 4.6 参考资料 78 第5章 软件开发 79 5.1 编译构建系统 79 5.1.1 概述 79 5.1.2 变量定义 85 5.1.3 软件包定义 87 5.1.4 构建 88 5.2 HelloWorld 89 5.2.1 目录结构 91 5.2.2 Makefile 92 5.2.3 编译 94 5.3 软件启动机制 95 5.4 补丁生成及应用工具 99 5.4.1 补丁 99 5.4.2 diff工具 100 5.4.3 patch工具 102 5.5 参考资料 104 第6章 GDB调试 105 6.1 什么是GDB 105 6.2 如何启动程序调试 106 6.2.1 使用GDB启动程序 106 6.2.2 环境变量设置 107 6.2.3 设置日志文件 108 6.2.4 获取帮助 108 6.2.5 命令总结 109 6.3 断点管理 110 6.3.1 指令断点管理 110 6.3.2 观察点管理 112 6.3.3 捕获点管理 113 6.3.4 单步调试 113 6.3.5 命令总结 114 6.4 查看程序运行状态 115 6.4.1 查看栈帧信息 115 6.4.2 查看运行中的源程序信息 117 6.4.3 查看运行时数据 117 6.4.4 命令总结 119 6.5 动态改变——改变程序的执行 120 6.6 名词解释 121 6.7 参考资料 121 第7章 网络基础知识 122 7.1 概述 122 7.1.1 网络设备 123 7.1.2 计算机网络分类 124 7.2 数据链路层 124 7.2.1 以太网 124 7.2.2 MAC寻址 125 7.2.3 冲突和冲突域 125 7.2.4 广播域 126 7.2.5 ARP协议 126 7.3 IP协议 127 7.3.1 IP报文格式 127 7.3.2 IP地址分类 129 7.3.3 协议功能 131 7.4 ICMP 132 7.4.1 概述 132 7.4.2 报文格式 133 7.4.3 差错报文 134 7.4.4 查询报文及响应报文 135 7.4.5 ping 136 7.4.6 TraceRoute 137 7.5 传输层协议 137 7.6 综合 138 7.7 名词解释 141 7.8 参考资料 141 第8章 路由器基础软件模块 143 8.1 libubox 143 8.1.1 libubox 143 8.1.2 jshn 145 8.2 ubus 147 8.2.1 ubusd 148 8.2.2 ubus命令行工具 149 8.3 netifd 152 8.3.1 概述 152 8.3.2 netifd方法 154 8.3.3 netifd文件 158 8.3.4 网络配置 159 8.4 ubox 160 8.5 procd 163 8.5.1 reload_config 164 8.5.2 procd进程 164 8.5.3 procd.sh 167 8.5.4 rc.common 169 8.5.5 综合示例 170 8.6 参考资料 172 第9章 常用软件模块 173 9.1 CWMP 173 9.1.1 概述 173 9.1.2 方法和流程 174 9.1.3 如何配置 176 9.2 SSH服务器 177 9.2.1 概述 177 9.2.2 配置 177 9.3 QoS 178 9.3.1 服务模型 178 9.3.2 QoS配置 180 9.4 uHTTPd服务器 181 9.4.1 概述 181 9.4.2 配置 182 9.5 SMTP 183 9.6 NTP 184 9.7 PPPoE 185 9.7.1 CHAP验证过程 186 9.7.2 PPPoE配置 188 9.8 无线基础 188 9.8.1 什么是无线 188 9.8.2 优点 188 9.8.3 缺点 188 9.8.4 安全 189 9.8.5 认识OpenWrt无线接口 189 9.8.6 OpenWrt无线配置 191 9.9 参考资料 192 第10章 IP路由 194 10.1 路由分类 194 10.2 单播路由 195 10.2.1 路由表管理 195 10.2.2 静态路由配置 198 10.3 策略路由 199 10.3.1 概述 199 10.3.2 配置策略路由 200 10.3.3 典型配置举例 203 10.4 组播路由 205 10.4.1 组播原理 205 10.4.2 IGMP原理 207 10.4.3 IGMP代理 207 10.4.4 IGMP Proxy管理 209 10.4.5 验证及调试 210 10.5 名词解释 211 10.6 参考资料 212 第11章 DNS与DHCP 213 11.1 主机系统 213 11.2 DNS基础 215 11.2.1 域名结构 215 11.2.2 DNS报文格式 216 11.2.3 域名解析器原理 217 11.2.4 域名解析实例 218 11.3 DHCP基础 220 11.3.1 引言 220 11.3.2 DHCP原理 220 11.3.3 DHCP报文 221 11.3.4 DHCP工作流程 222 11.4 dnsmasq 223 11.4.1 概述 223 11.4.2 配置 224 11.5 动态DNS 228 11.5.1 DDNS原理 228 11.5.2 DDNS配置 229 11.5.3 DNS更新协议及算法 230 11.6 DNS测试工具 232 11.6.1 nslookup 232 11.6.2 dig 232 11.7 参考资料 234 第12章 iptables防火墙 235 12.1 防火墙概述 235 12.2 iptables中的表 236 12.2.1 filter(过滤表) 236 12.2.2 nat(网络地址转换表) 237 12.2.3 mangle(修改表) 237 12.2.4 raw(原始表) 238 12.3 处理目标 238 12.3.1 REJECT(拒绝) 239 12.3.2 DNAT(目的网络地址转换) 240 12.3.3 SNAT(源网络地址转换) 240 12.3.4 MASQUERADE(伪装) 241 12.3.5 LOG 241 12.3.6 REDIRECT 241 12.4 报文处理流程 242 12.5 报文规则匹配 245 12.6 管理防火墙规则 247 12.7 其他工具集 249 12.8 小结 250 12.9 参考资料 250 第13章 UCI防火墙 251 13.1 概述 251 13.2 防火墙配置 252 13.2.1 Defaults 252 13.2.2 Zones-安全域 253 13.2.3 转发 253 13.2.4 重定向 254 13.2.5 规则 255 13.2.6 include 257 13.3 常见用法 258 13.3.1 MAC地址黑白名单 258 13.3.2 家长控制 260 13.4 防火墙管理及调试 261 13.4.1 管理防火墙 261 13.4.2 测试防火墙 262 13.5 名词解释 263 13.6 参考资料 263 第14章 UPnP 264 14.1 UPnP简介 264 14.1.1 起源 264 14.1.2 概述 264 14.2 UPnP架构 265 14.2.1 UPnP协议术语 265 14.2.2 UPnP组件 266 14.3 UPnP协议 267 14.4 UPnP工作流程 268 14.4.1 寻址 268 14.4.2 发现 269 14.4.3 描述 269 14.4.4 控制 270 14.4.5 事件 270 14.4.6 表达 272 14.5 UPnP应用之IGD 272 14.5.1 IGD框架 272 14.5.2 端口映射在IGD中的应用 274 14.6 参考资料 277 第15章 网络测试及分析工具 278 15.1 NetCat 278 15.2 TcpDump 283 15.2.1 抓取报文 283 15.2.2 匹配规则 285 15.2.3 使用举例 287 15.3 参考资料 288