Package分类
- 服务类package
OpenWrt中会自带很多服务,一般都是采用C语言实现,包含一个独立的进程,比如uhttpd、netifd、dropbear、dnsmasq等,由于涉及到C代码,需要包含源码目录或者源码下载地址,我们自己开发的package一般都将源码放在src目录。
由于是服务类package,一般还要编写init脚本,用于控制服务的开启和关闭,init脚本有标准的编写规范。 - 脚本类package
这类package只包含脚本或者文件,一般不需要编译,只需要将文件放在指定目录即可,一般脚本和服务是一起的,这类package用的比较少。 - luci app package
luci是OpenWrt的web框架,支持以app的形式安装和卸载,从而实现菜单动态添加和删除的效果,luci app可以理解为web app,包含了lua脚本、html以及各种web需要的资源,编译后可生成一个ipk安装包。 - 内核package
linux内核支持模块的动态安装和删除,我们可以编写自己的内核模块然后组织成package,然后安装在OpenWrt系统中,该类package Makefile和服务类的Makefile有些区别,需要指定内核编译,我们开发过程中一般都按模板修改即可,后续改动不大,对于Makefile也不要投入太多时间,只要能够完成编译后,后续都是复制粘贴。
Package结构
在 OpenWrt 中,一个 Package 通常是一个独立的目录,其中包含了该 Package 的相关文件、源代码、编译规则和依赖关系等信息。
下面是一个典型的 Package 目录结构(luci app类的略有不同)
package/
├── Makefile
├── files/
│ ├── example.conf
│ └── example.init
├── src/
│ ├── example.c
│ └── Makefile
└── patches/
└── example.patch
其中:
Makefile:
定义了 Package 的编译规则、依赖关系和安装路径等信息,是 Package 目录的核心文件。
files/:
包含了一些需要安装到设备中的文件,例如配置文件、脚本等。 src/:
包含了 Package 的源代码和编译规则,通常使用 Makefile 文件定义编译规则。 patches/:
包含了对 Package 的修改和增强,通常使用 diff 或者 patch 工具生成。
init脚本
init脚本用于完成一些初始化服务,一般在系统起来时或者重启服务会调用
- 存放目录
/etc/init.d/
从上图可以看出OpenWrt系统中包含了很多服务,各个服务都有自己的启动脚本,而我们自己增加的服务也要编写对应的init脚本
init脚本支持设置优先级,在脚本中可以指定值,这样就会在rc.d中生成优先级名称文件,系统根据文件排序规则进行调度执行。
- 模板1
#!/bin/sh /etc/rc.common
START=50
STOP=50
start()
{
/usr/bin/helloworld --daemon
}
stop()
{
killall -9 helloworld
}
- 模板2
start_service()函数使用procd来定义服务的启动方式。procd是一种用于管理进程和服务的工具,它提供了一种简单而灵活的方式来定义服务的启动、停止和重启方式。通过该方式注册的服务会被procd监控,当进程挂掉后会自动拉起,可以配置尝试重试的次数。
#!/bin/sh /etc/rc.common
START=50
USE_PROCD=1
EXEC_BIN="/usr/bin/helloworld"
stop_service(){
killall -9 helloworld
}
start_service(){
procd_open_instance
procd_set_param respawn 60 5 5
procd_set_param stderr 1
procd_set_param command "$EXEC_BIN"
procd_close_instance
}
如何编译package
- 开启编译选项
在编译之前需要开启package的编译选项,OpenWrt各个package是可选编译的,只有选择的的才会集成到固件中。
make menuconfig
用于图形化选择package编译,是项目编译中经常用的命令,在图形中找到自己加的package后开启即可。 - 编译
make package/$package_name/compile V=s
注意$package_name
为package的目录名称
package安装包目录
编译后会生成ipk安装包文件,不同类型的package对应的目录有些区别,但都在bin目录
首先,不同芯片架构的目录名称有所区别,查找时切换成当前自己选择的芯片架构名称即可
以下为主要的目录(以X86为例)
- bin/targets/x86/64/packages/
- bin/packages/x86_64/base/
- bin/packages/x86_64/luci/
- bin/packages/x86_64/packages/
常用的芯片架构名称:
- aarch64_cortex-a53
- aarch64_generic
- mipsel_24kc
- x86_64
OpenWrt插件管理
OpenWrt采用opkg工具管理软件包,类似于桌面版Linux的apt、yum等工具,package以ipk为后缀,如hello.ipk。 常用命令:
pkg list
列出所有安装的packageopkg install $ipk_name
安装软件包opkg remove $ipk
卸载软件包opkg help
查看帮助
在安装OpenWrt插件时,经常遇到的问题就是依赖,当package编译时指定了depends时,会自动依赖depends中的软件包,如果依赖包没有安装会报错,需要先安装依赖包。
评论(0)