【概述】2017.05.15
openWrt是实现智能路由器功能的最成功的开源系统。主要在于3个方面:
领导者、
基础设施、
实现软件的技术。
openWrt是linux的发行版。
openWrt是嵌入式设备上运行的linux系统。
openWrt 的文件系统是可写的,开发者无需在每一次修改后重新编译,令它更像一个小型的 Linux 电脑系统,也加快了开发速度。
openWrt社区采用6大基础设施工具支撑整个社区的运转:
1.代码管理工具git。可以跟踪文件和目录的历史信息;
2.邮件列表。代码审查及代码提交集成的地方;
3.自动构建工具buildbot。编译机器人,支持持续集成和自动化测试,以及应用程序的自动化部署和软件开发的管理;
4.文档管理工具WiKi。可以让任何参与人员非常方便地进行编辑、访问和搜索;
5.Trac。集成WiKi和问题跟踪管理系统的项目管理平台;
6.技术论坛。技术讨论平台。
openWrt英文官网:
https://openwrt.org/ 中文官网:
http://www.openwrt.org.cn/
openWrt技术上的成功秘诀在于:
1.统一编译框架;
2.统一配置接口(uci);
3.开放的软件包管理系统及读写分区系统;
4.系统总线(ubus);
5.进程管理模块(proc);
openWrt特点:
1.代码里不含第三方开源宝,只包含开源包地址连接;
2.编译时自动下载源代码、打补丁来满足指定平台要求,并编译,还可以修改Makefile来下载最新的软件包;
3.使用LuCI作为最终用户管理界面。LuCI是以Apache许可协议发布的web管理功能代码;
4.UCI通用配置管理方法;
5.通过脚本来调用iptables来实现防火墙功能,配置保存在UCI文件中;
6.开放和可扩展的OPKG格式安装升级包。
路由器的整体架构:
管理平面、控制平面、数据转发平面。
openWrt是一个基于Linux的智能路由器操作系统,默认内置了一些基础功能,主要功能为3部分:
网络功能、系统管理功能、状态监控功能。
【开发环境及编译分析】
编译环境:
VMware虚拟机、ubuntu系统
安装详细步骤:
http://blog.csdn.net/u013142781/article/details/50529030
安装相关工具和库:
(1) 安装 SVN 工具,用于下载 openwrt 源码:
$:'
sudo apt-get install subversion
(2) 安装 git 工具
$:'
sudo apt-get install git-core
(3) 安装依赖的库文件
$:'
sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils ncurses-term zlib1g-dev libncurses5-dev gawk
下载openwrt源码:
$:'
mkdir openwrt
$:'
cd openwrt/
$:'
git clone git://git.openwrt.org/openwrt.git
下载完 openwrt 的源码后,为了使 openwrt 支持更多的软件,需要更新和安装其他源上面的软件:
$:'
./scripts/feeds update -a
$:'
./scripts/feeds install -a
编译前的配置:
$:'
make menuconfig
根据CPU和路由器进行配置,配置后生成默认的编译配置文件
.config。
编译:
$:'
make V=s -j4
大概 4、5 个小时编译就会完成,V=s可以显示详细的编译过程和出错信息,-j4通过4个线程来编译,会快一些,然后在源码目录 bin 下面生成镜像。
openwrt-ramips-rt305x-mpr-a2-squashfs-sysupgrade.bin 这个就是我们要的镜像。
>> 单独编译一个模块,以TcpDump为例:
$:' make package/tcpdump/clean // 清除编译生成的文件
$:' make package/tcpdump/prepare // 编译准备,下载、解压缩、打补丁
$:' make package/tcpdump/configure // 根据设置选项配置生成Makefile
$:' make package/tcpdump/compile // 根据Makefile进行编译
$:' make package/tcpdump/install // 生成安装包
openWrt顶层目录含义:
config/ // 编译选项配置文件
docs/ // 文档目录
include/ // 包含准备环境脚本、下载脚本、编译Makefile以及编译指令
package/ // 各种功能的安装包
scripts/ // 包含准备环境脚本、下载脚本、编译Makefile以及编译指令
target/ // 嵌入式平台
toolchain/ // 编译器和C库等
tools/ // 通用命令,用来生成固件的辅助工具
在openWrt固件中,几乎所有的东西都是软件包(package),可以编译为
.ipk 结尾的安装包,这样就可以很方便的安装、升级和卸载。
openWrt编译生成目录含义:
dl/ // 编译时下载软件代码包临时目录
feeds/ // 扩展软件包目录
bin/ // 编译完成后的最终成果目录
build_dir/ // 编译中间文件目录
staging_dir/ // 编译安装目录
log/ // 如果打开了log选项,则编译log保存在该目录下
openWrt典型编译脚本功能:
scripts/download.pl // 下载编译软件包源代码
scripts/patch-kernel.sh // 打补丁脚本
scripts/feeds // 收集扩展包的工具(该命令在编译前需要执行)
scripts/diffconfig.sh // 收集和默认配置不同之处的工具
scripts/kconfig.pl // 处理内核的配置
scripts/deptest.sh // 自动软件包依赖项检查
scripts/metadata.pl // 检查metadata
scripts/rstrp.sh // 丢弃目标文件中的符号
scripts/timestamp.pl // 生成文件的时间戳
scripts/ipkg-make-index.sh // 生成软件包的ipkg索引
scripts/ext-toolchain.sh // 工具链
scripts/strip-kmod.sh // 删除内核模块的符号信息,使文件变小
feeds脚本功能扩展:
通过feeds安装软件包后,在后面执行 make menuconfig 命令时,才可以对相关软件包选择是否编译。
例如安装 luci-app-firewall 软件包的命令为:
./scripts/feeds install luci-app-firewall【openWrt包管理系统】
软件包管理:
$:'
opkg update
// 更新可以安装的软件包列表
$:'
opkg install
// 安装软件包,需要第三个参数传递一个软件包的名称。如 opkg install file
$:'
opkg remove
// 卸载安装包,需要第三个参数传递一个软件包的名称。autoremove可以将不需要的安装包也删除。如 opkg remove file --autoremove
$:'
opkg upgrade
// 升级软件包,需要第三个参数传递一个软件包的名称。一般只用来升级应用(非内核软件)。
查询信息:
$:'
opkg list
// 列出所有可使用的软件包
$:'
opkg list-installed
// 列出系统中已经安装的软件包
$:'
opkg list-changed-conffiles
// 列出用户修改过的配置文件
$:'
opkg files
// 列出属于这个软件包中的所有文件
$:'
opkg search
// 列出提供file的软件包,需要传递文件的绝对路径
$:'
opkg find
// 列出软件包名称和regexp匹配的软件包
$:'
opkg info [pkg]
// 显示已安装pkg软件包的信息
$:'
opkg download
// 将软件包pkg下载到当前目录
$:'
opkg print-architecture
// 列出安装包的架构
$:'
opkg whardepends [-A] [pkg]
// 针对已安装的软件包,输出依赖这个软件包的软件包
opkg命令选项:
-A 查询所有软件包
-d 使用dest_name作为软件包安装的根目录
-f 使用conf_file作为opkg的配置文件
--nodeps 不按照依赖来安装,只安装软件包自己
--autoremove 卸载软件包时自动卸载不再使用的软件包
--force-reinstall 强制重新安装软件包
【openWrt系统配置】2017.05.16
MVC(Model-View-Control)模式是经典的Web开发编程模式。
openWrt也是采用该设计模式,模型层采用统一配置接口
UCI(Unified Configuration Interface)。
>>UCI简介
配置文件由配置节(section)组成,语法如下:
config [""] #section
option "" #option
错误的UCI文件语法:
option 'example" "value' (引号没有配对)
option example some value with space (带有空格的值缺少引号)
>>统一配置原理
openWrt系统的核心配置文件,都位于
/etc/config/ 目录下。
例如修改网络ip:
$:'
uci set network.lan.ipaddr=192.168.6.1
$:'
uci commit network
通过运行以下命令修改生效:
$:'
/etc/init.d/network restart
常用功能配置文件含义:
/etc/config/dhcp // dnsmasq软件包配置,包含dhcp和dns设置
/etc/config/dropbear // SSH服务器选项
/etc/config/firewall // 防火墙设置,包含网络地址转换、包过滤、端口转发等
/etc/config/network // 网络配置,包含桥接、接口、路由配置
/etc/config/system // 系统配置,包含主机名称、网络时间同步等
/etc/config/timeserver // rdate的时间服务列表
/etc/config/luci // 基本的LuCI配置
/etc/config/wireless // 无限设置和wifi网络定义
/etc/config/uhttpd // web服务器选项配置
/etc/config/upnpd // miniupnpd UPnP服务设置
/etc/config/qos // 网络服务质量的配置文件定义
UCI命令可以写入配置文件配置信息,格式如下:
$:'
uci [] []
$:'
uci
// 直接输入uci可以查看uci的帮助信息和具体参数
UCI命令含义:
add // 增加指定配置文件类型为 section-type 的匿名区段
add_list // 对已存在的list选项增加字符串
commit // 对给定的配置文件写入修改
export // 导出一个机器可读格式的配置
import // 以UCI语法导入配置文件
changes // 列出配置文件分阶段修改的内容,即未使用 uci commit 提交的修改
show // 显示指定的选项、配置节或配置文件
get // 获取指定区段选项的值
set // 设置指定配置节选项的值
delete // 删除指定的配置节或选项
rename // 对指定的选项或配置节重命名为指定的名字
revert // 恢复指定的选项,配置节或配置文件
UCI API编程接口Libubox:
Libubox是openWrt的一个必备的基础库,包含大小端转换、链表、MD5等实用工具基础库,采用Cmake来编译。
$:'
sudo apt-get install cmake
// 安装Cmake工具
$:'
tar -xzf libubox-2015-06-14-dlc66ef1131d14f0ed197b368d03fxxx.tar.gz
$:'
cd libubox-2015-06-14
$:'
cmake -D BUILD_LUA:BOOL=OFF -D BUILD_EXAMPLES:BOOL=OFF.
$:'
make
$:'
sudo make install
// 头文件 /usr/local/include/libubox;动态链接库libubox.so和libubox.a在/usr/local/lib/目录下
进入dl目录,进行解压缩和编译安装:
$:'
tar -xzf uci-2015-04-09.1.tar.gz
$:'
cd uci-2015-04-09
$:'
cmake -D BUILD_LUA:BOOL=OFF .
$:'
make
$:'
sudo make install
$:'
sudo ldconfig
$:'
gcc test.c -o test -luci // 编译test.c时连接UCI库
系统内核设置:
sysctl.conf是系统启动预加载的内核配置文件,通过sysctl命令去读和设置到系统中。
语法格式:
# comment
; comment
token = value // 以#号和分号开头的均为注释行,并且忽略空白航,配置值以 key=value 形式进行设置,例如:
// 设置打开报文转发为 net.ipv4.ip_forward=1
sysctl.conf文件位置:
package/base-files/files/etc/sysctl.conf
sysctl 是用于修改运行中的内核参数的命令,所有可用的内核参数均在
/proc/sys/ 目录下。
常用命令举例:
$:'
/sbin/sysctl -a
// 显示所有的内核配置
$:'
/sbin/sysctl -n kernel.hostname
// 查询kernel.hostname的值
$:'
/sbin/sysctl -w kernel.hostname="zhangsan"
// 修改系统主机名称为zhangsan
$:'
/sbin/sysctl -p /etc/sysctl.conf
// 加载配置
例如:
查询是否打开路由转发:
$:'
cat /proc/sys/net/ipv4/ip_forward
打开路由转发设置:
$:'
echo "1" > /proc/sys/net/ipv4/ip_forward
系统配置文件信息:
/etc/rc.local // 想要在开机后就执行的命令可以写入该文件
/etc/profile // 为系统的每个登陆用户设置环境变量
/etc/shells // openWrt采用的shell是 /bin/ash
/etc/fstab // 各种文件系统的描述信息
/etc/services // 互联网网络服务类型列表
/etc/protocols // 协议定义描述文件
【openWrt系统下的软件开发】
>>编译构建系统
以dnsmasq软件为例,会有以下文件和目录:
/dnsmasq/Makefile // Makefile提供下载、编译、安装、以及生成OPKG安装包的功能 /dnsmasq/files /dnsmasq/src
>>Makefile中变量定义
PKG_NAME // 软件包名称
PKG_VERSION // 软件版本号
...
以具体Makefile文件中的变量做实际查看。
>>软件包定义
$:'
make menuconfig
Build/
Package/
>>构建
软件包模块的编译步骤:
准备、配置、编译、安装。
总结:
通常
新增一个模块的主要步骤如下:
1. 在package下增加一个目录,例如hello/;
2. 添加src目录和files目录;
3. src目录存放模块源码;
4. files存放模块的配置文件及启动脚本等;
5. 在hello/下增加Makefile,在Makefile中增加编译脚本和安装脚本。
6. 编译;
$:'
make package/hello/build
7. 生成安装包;
$:'
make package/hello/install
或者快速重新进行整个编译过程:
$:'
make package/hello/{clean,compile,install}
如果加入平台编译过程,需要在
make menuconfig 时选择hello模块,再在隐藏的配置文件
.config 中增加一项
CONFIG_PACKAGE_hello=y这样就可以在编译整个系统时自动编译软件模块。
hello示例:Page89
Makefile示例:Page92【补丁生成及应用工具】diff工具:
diff -up 或 diff -uprN来创建补丁包。
命令使用举例:
$:'
diff -up ../src/dhcp.c ../src/dhcp_after.c -up > dhcp.patch // 修改前和修改后的文件进行多个文件的补丁包创建
diff工具主要参数如下:
-p --show-c-function // 在每一个更改处显示C函数
-u -U NUM --unified[=NUM] // 按统一格式输出,子啊补丁中输出前后NUM行,默认是3行
-N --new-file // 在补丁文件里包含新的文件内容
-r --recursive // 递归比较子目录,很多文件在不同目录里修改时使用
patch工具:
应用补丁命令如下:
$:'
patch -p1 < ../dhcp.patch
恢复应用前的补丁,使用-R参数来执行,即返回到应用补丁前的代码的命令:
$:'
patch -R -p1 < ../dhcp.patch
如果补丁文件是gzip和bzip2压缩的,使用如下命令:
$:'
zcat path/to/dhcp_patch.z.gz | patch -p1
$:'
bzcat path/to/dhcp_patch.z.bz2 | patch -p1
patch工具主要参数如下:
-f // 强制打入补丁,不用询问
-p1 // 略过一层前导目录
-E // 打完补丁后,如果文件内容为空,会将其移除
-d // 在指定目录下执行
-R // 用于删除补丁
--dry-run // 尝试打入补丁,输出打入补丁之后的结果,但不做任何真正修改
--verbose // 告诉patch输出当前尽可能多的信息
【GDB调试】2017.05.18
GDB是GNU项目开发的针对C/C++的语言代码调试工具。
GDB主要有4个功能来帮助捕捉发生bug时的状态:
1. 启动应用程序;
2. 调试断点点可停住;
3. 检查程序中当前的状态;
4. 动态改变程序;
启动程序调试:
在编译的时候加上 -g 选项即可产生调试信息,通常程序交给客户的时候会使用 -O 选项来优化,有一些编译器不能同时处理 -g 和 -O 选项。例如:
$:'
g++ -g hello.c -o hello
$:'
gdb hello
常用GDB命令:
break // 在指定的位置或函数处设置断点
run // 开始执行调试程序
bt // 查看程序运行栈信息,例如:bt full
continue // 在程序中断之后继续执行程序
next // 单步执行,如果是函数则执行完这个函数
step // 单步执行,如果是函数则进入函数内部
set args // 设置启动参数 set args
print // 输出表达式或变量值
quit // 退出程序调试
list // 输出现在执行程序停止位置附近的代码
help // 输出GDB命令的帮助信息
环境变量设置:
(gdb)
show paths
// 显示程序的查找路径列表
(gdb)
show environment HOME
// 显示系统的环境变量
(gdb)
set environment varname[=value]
// 设置环境变量
(gdb)
unset environment varname
// 取消环境变量设置
设置日志文件:
(gdb)
set logging on
// 经屏幕输出同时输出到文件中,默认输出到当前目录下的 gdb.txt
(gdb)
set logging off
// 关闭log
(gdb)
set logging file file
// 默认输出为gdb.txt 此命令可以将当前输出的log文件名改名
(gdb)
set logging overwrite
// overwrite参数可以每次重写一个全新的文件
(gdb)
show logging
// 输出当前日志的设置
获取帮助,如:
$:'
help
$:'
help stack
命令总结:
(gdb)run // 启动调试程序
(gdb)attach // 关联到正在运行中的进程
(gdb)set args // 设置程序启动时的参数
(gdb)show args // 显示启动参数
(gdb)set environment // 设置环境变量
(gdb)show environment // 如果没有参数就显示左右环境变量
(gdb)unset environment // 取消环境变量设置
(gdb)help // 获取帮助
(gdb)apropos // 搜索命令帮助
指令断点管理:
break [LOCATION] [thread THREADNUM] [if CONDITION]
LOCATION:可以是代码行号、函数名、或者一个带有星号的地址
THREADNUM:是线程号,可以用 info threads 命令来查看线程号
(gdb)
info threads // 查看线程号
(gdb)
info break // 显示断点信息命令
CONDITION:是一个布尔表达式
tbreak 用于设置一个临时断点,当命中这个断点后将删除断点。
clear 或
delete 可以用于删除断点。
disable 比断点删除更好的办法,暂时不生效,使用的时候可再次启用,格式如下:
(gdb)
disable [breakpoints] [range...]
// breakpoints 为断点编号,如果不指定,表示所有断点都不生效
(gdb)
enable [breakpoints] [range...]
// 启用所指定的断点。
例如:
(gdb)delete breakpoint 1 // 删除编号为1的断点
(gdb)disable breakpoint 1 // 禁止编号为1的断点
(gdb)enable breakpoint 1 // 允许编号为1的断点
(gdb)clear 50 // 50为源文件行号,该位置的所有断点将被清除
观察点管理:
观察点,是一个特殊的断点,如果表达式修改了值程序执行就停止了,表达式可以是变量,也可以是几个变量的组合,有时也叫数据断点。
watch // 为表达式设置一个观察点,一旦表达式值发生变化时,马上停止执行程序
rwatch // 设置读观察点,读到表达式的值时,程序停止执行
awatch // 设置访问观察点,当表达式读或写时,将停止执行程序
info watchpoints // 列出当前设置的所有观察点
捕获点管理:
使用捕获点调试某些程序事件,如C++异常、共享库的加载、系统调用、进程启动等...
当事件发生时,程序会停止执行。
throw // 一个C++抛出的异常
exec // 当程序执行exec函数创建进程时
syscall // 参数为不火系统调用他们的名字或编号
load // 加载共享库时
fork // 当程序调用fork创建进程时
tcatch // 设置临时捕获点
单步调试:
continue // continue [ignore-count] 从断点停止的地方恢复程序执行,可缩写为c,ignore-count表示忽略这个位置断点的次数
step // 继续执行程序知道控制到达不同的源码行,可进入函数,可缩写为s
next // 单步跟踪,继续执行同一函数的下一行代码,不会进入函数,可缩写为n
finish // 继续运行程序直到当前选择的栈帧返回,并输出返回值,可缩写为fin
until // 执行程序直到大于当前已经执行的代码行,在程序循环时经常会用到,即循环体如果执行过一次,使用until命令将执行循环体完成后的下一行代码处停止
查看程序运行栈帧信息:
backtrace [full]/[number] // 输出当前整个函数调用栈的信息,整个栈每个帧一行显示。
frame // 为选择和输出栈帧
up // 选择和输出栈帧
down // 不带参数表示选择向下一层栈帧
return // 返回到当前栈帧的调用处
info frame // 显示栈帧的所有信息
查看运行中的源程序信息:
list // 如果没有参数,默认输出当前10行代码或者紧接着上次的代码。
list - // 输出当前位置之前的10行代码
查看运行时数据:
print // 输出执行程序时的运行数据,可缩写为p,例如:p num
x // 输出指定参数的地址信息 - 16进制,例如:x /FMT address
d // 10进制
u // 16进制,无符号整型
o // 8进制
t // 2进制
a // 16进制
c // 字符格式
f // 浮点数格式
$pc // 程序计数器
$fp // 栈指针
$sp // 栈指针
$ps // 处理器状态
动态改变程序的执行:
print argc=2 // 修改变量的值
set // 修改程序值
jump // 跳转到指定行或地址来继续执行
signal // 向程序发信号
call // 调用函数,不输出函数返回值
【网络基础知识】
OSI互联网协议层分为7层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
TCP/IP协议层次分为4层:
应用层、传输层、网络层、数据链路层
网络设备:
集线器:HUB,在物理层上实现局域网的互联,可以实现电气信号的恢复和整型。
网桥:工作在
数据链路层,网桥负责分析目的MAC地址字段是否在对方网络上。
路由器:Router,
网络层设备,用于将两个或多个不同网络连接在一起。
防火墙:Firewall,是在两个或多个网络之间用于设置安全策略的一个或多个系统的组合。
数据链路层:
以太网:目前最流行的局域网传输标准。
MAC地址:网卡物理地址,长度为6个字节,表示为12个十六进制的数字。例如:08:00:27:26:c5:5d
广播域:发送到网络中所有节点的数据分组。网桥和交换机根据MAC地址转发数据帧,不隔离广播域。路由器不会转发广播报文,为广播域的边界。
ARP协议:根据主机的IP地址来查询其网卡MAC地址,即通过目标IP知道对方的MAC地址。
IP协议:
网络协议层主要包括两部分:IP和ICMP。
IP协议是不可靠的、无连接的网络协议,可靠性需要上层协议来保证。
IP协议报文格式可以百度查看。
IP地址分类:
ipv4("4个字节的32位地址")
ipv6 ("16个字节的128位地址")
ip地址包括两部分内容,"网络号和主机号"。
"A类":0~127 . 0~255 . 0~255 . 0~255 以0为首的8位网络地址+24位本地地址
0.0.0.0 "主机号全0不能使用 ",主机号全0代表的是网络号。
0.255.255.255 "主机号全1不能用 ",这代表的是该网络的广播地址。
127.0.0.0 127.255.255.255
"B类":128~191 . 0~255 . 0~255 . 0~255 以10为首的16位网络地址+16位本地
"C类":192~223 . 0~255 . 0~255 . 0~255 以110为首的24位网络地址+8位本地
"D类":以 1110 为首的32位多播地址(28位多播组号)
"E类":以 11110 为首的32位多播地址(27位留后待用)
子网掩码:
示例 ip(192.168.129/24, 前面24位全1,即子网掩码255.255.255.0 )
常见的特殊IP地址块:
10.0.0.0/8 // A类内部私有地址
172.16.0.0/12 // B类内部私有地址
192.168.0.0/16 // C类内部私有地址
127.0.0.0/8 // 本地回环地址,用于回路测试,不能路由到主机外部
169.254.0.0/16 // 自动配置为成功后分配的ip地址
0.0.0.0/8 // 本地网络,禁止使用
255.255.255.255 // 受限广播地址
net.255 // 网络广播地址
ICMP协议:
使用IP协议进行传输报文,是一种面向无连接的协议,用于报告传输出错及控制,每一个网络层模块必须实现该协议。
例如:
ping 命令,实际就是发送ICMP查询报文,用于查询网络连通性。
通常步骤:先ping本机ip,其次ping网关地址,最后ping目的主机地址
traceroute 命令也是基于ICMP协议的,探测网络报文经过的路径。
传输层协议:
网络传输协议主要分为传输控制协议TCP和用于数据报协议UDP。
路由器一般工作在IP层,不处理传输层协议,但智能路由器一般带有防火墙功能,需要处理端口号。
传输数据之前需要进行3次握手连接,并在传输的中间过程进行确认,保证了数据到达目标地址,如果没有到达将立即重传。
【路由器基础软件模块】
libubox
提供多种基础通用功能接口,包含链表、平衡二叉树、二进制块处理、key-value链表、MD5等,提供多种sock接口封装,提供一套基于事件驱动的机制及任务队列管理功能。
常用uloop接口函数:
uloop_fd_add // 将一个新文件描述符增加到事件处理循环中
uloop_fd_delete // 从事件处理循环中删除指定的文件描述符
uloop_init // 初始化uloop内部将调用epoll_create函数来创建epoll对象
uloop_run // 进入事件处理循环中
uloop_done // 反初始化uloop,即释放内部epoll对象,删除process对象
uloop_end // 设置uloop内部结束循环标志
uloop_timeout_set // 设置定时器超时时间,并增加到链表中
jshn
是封装JSON对象的转换库,用于脚本语言生成JSON对象和将JSON对象数据取出。
JSON是一个轻量级的数据交换格式,易于阅读和编写,对程序来说也容易解析和产生。
jshn定义的命令接口:
json_init // 初始化JSON对象
json_add_string // 增加字符串数据类型,例如json_add_string name jiang
json_dump // 以JSON格式输出所有增加的JSON内容
json_add_int // 增加整型数据,例如 json_add_int age 26
json_add_boolean // 增加布尔型数据
json_set_namespace // 定义命名空间,即定义设置变量的前缀
json_load // 将所有内容读入到JSON对象中,并将这些对象设置到环境变量
json_get_var // 从环境变量中读取JSON对象的值
json_get_type // 从环境变量读取指定JSON对象的类型
json_get_keys // 从环境变量中读取JSON对象的所有名称
json_get_values // 从环境变量中读取JSON对象的所有值
json_select // 选择JSON对象
json_add_object // 增加对象,该命令不需要参数
json_close_object // 完成对象的增加
json_add_array // 增加顺序数组,数组的内容后续通过 json_add_string 增加
json_close_array // 完成顺序数组的增加
json_cleanup // 清楚jshn所有设置的环境变量
ubus
openWrt提供的一种系统总线,主要提供系统级的进程间通信(IPC)功能。
主要由3部分组成:精灵进程、接口库、实用工具。
/etc/init.d/ubus中提供ubusd进程的启动,在系统进程启动完成后立即启动,是在网络进程netifd之前启动的,该进程监听一个文件套接字接口和其他应用程序通信。
接口库名称为libubus.so
libubus.so库中常用接口函数含义:
ubus_add_object // 将对象加入到ubus空间中,即客户端可以访问对象
ubus_register_subscriber // 增加订阅通知
ubus_connect // 连接指定的路径,创建并返回路径所代表的ubus上下文
ubus_send_reply // 执行完成方法调用后发送相应
ubus_notify // 给对象的所有订阅者发送通知
ubus_lookup // 查找对象,参数path为对象的路径,如果为空则查找所有对象
ubus_lookup_id // 查找对象的id
ubus_invoke // 调用对象
ubus_register_event_handler // 注册事件处理句柄
ubus_send_event // 发送事件消息
ubus命令行工具:
ubus提供5种命令行命令。
ubus list ... -v // 输出所有注册到ubus RPC服务器的对象
ubus call ... // 在指定对象里调用指定的方法并传递消息参数
ubus listen ... // 设置一个监听套接字来接收服务器发出的消息
ubus send ... // 发出一个通知事件,这个事件可以使用listen命令监听到
ubus wait_for ... // 等待多个对象注册到ubus中,当等待对象注册成功后退出
netifd
一个管理网络接口和路由功能的后台进程,使用C语言编写的带有RPC能力的精灵进程。
netifd不需要shell脚本就可以设置静态ip配置。
netifd主要包含设备和接口对象。
netifd注册了3中对象,分别是network、network.device、network.interface
network对象方法:
restart // 整个进程关闭后重新启动
reload // 重新读取配置来初始化网络设备
add_host_route // 增加静态主机路由
get_proto_handlers // 获取系统所支持的协议处理函数,不需要参数
network.device对象方法:
status // 获取物理网卡设备的状态,包含统计信息
network.interface对象方法:
up // 启动接口
down // 关闭接口
status // 查看接口状态
add_device // 增加设备
remove_device // 删除设备
notify_proto // 调用原型函数
remove // 删除接口
set_data // 设置额外的存储数据
netifd文件:
/sbin/ifup // 启动接口
/sbin/ifdown // 关闭接口
/sbin/devstatus // 获取网卡设备状态
/sbin/ifstatus // 获取接口的状态
网络配置文件:
网络功能配置信息在文件 /etc/config/network 中。
ifname // 物理网卡接口名称,如 eth0
type // 网络类型
proto // static表示静态配置,dhcp表示动态配置,PPPoE表示点对点拨号连接
ipaddr // ip地址
netmask // 网络掩码
dns // 域名服务器地址
mtu // mtu地址
hostname // dhcp请求中的主机名
vendorid // dhcp请求中的厂商id
ipaddr // 建议的ip地址
ifname // PPPoE所使用的物理网卡接口名称,如 eth0
username // PAP或CHAP认证用户名
password // PAP/CHAP认证密码
demand // 指定空闲时间之后将连接关闭,以时间为单位计费环境下经常使用
openWrt无线接口:
#:' iwconfig
无线接口配置文件:/etc/config/wireless
【IP路由】
路由表管理:
#:' route -n
静态路由配置文件:/etc/config/network
策略路由使用 "ip rule" 来管理,有其对应命令格式。