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列出所有安装的package
  • opkg install $ipk_name 安装软件包
  • opkg remove $ipk 卸载软件包
  • opkg help查看帮助

在安装OpenWrt插件时,经常遇到的问题就是依赖,当package编译时指定了depends时,会自动依赖depends中的软件包,如果依赖包没有安装会报错,需要先安装依赖包。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。