openwrt配置内核驱动_Openwrt编译 -- 用户自定义添加app的开机自启动

本文介绍了在OpenWrt系统中如何配置内核驱动,并让应用程序在启动时自动运行的多种方法。包括在/etc/init.d创建脚本、自定义启动优先级,以及使用procd管理服务。此外,还提到了通过修改package/myapp/Makefile来实现应用的编译和安装,以及在开发板上直接编辑自启动脚本的简化流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

1、在openwrt系统内init进程被procd取代,procd作为父进程可以监控子进程的状态。一旦子进程退出后即可在某一个时刻尝试进行重启进程。

2、如果应用软件需要在 boot 时自动运行,则需要在/etc/init.d 中增加相应的脚本文件。脚本文件需要 START 参数, 说明在 boot 时的优先级, 如果在 boot 过程启动后再关闭, 则需要进一步设置 STOP 参数。如果 STOP 参数存在, 其值必须大于 START。

3、脚本文件需要start() 和stop() 两个函数,start() 是执行程序, stop() 是关闭程序。

4、由/etc/rc.d/S10boot 知道,装载內核驱动模块的优先级为 10,需要使用自己设计的內核驱动模块的程序其 START 的值必须大于 10。

5、同样由/etc/rc.d/S40network 知道, 使用网络通信的程序其 START 的值必须大于 40。

二、自启动实现方式一

1、package/myapp/目录下创建一个目录 root/,用来存放启动脚本

1 # mkdir package/myapp/root

然后在 package/myapp/root/ 目录下创建启动脚本文件 然后在 package/myapp/root/ 目录下创建启动脚本文件 mycode,其内容如下

1 #!/bin/sh /etc/rc.common2

3 START=92# 执行的顺序,按照字符串顺序排序并不是数字排序4 STOP=92

5 SERVICE=app6 PROG=/app/mycode7 USE_PROCD=1# 使用procd启动8

9 # start_service 函数必须要重新定义10 start_service()11 {12 echoservice mycode start13 procd_open_instance # 创建一个实例, 在 procd 看来一个应用程序可以多个实例14 # ubus call service list 可以查看实例15 procd_set_param command $PROG # mycode执行的命令是"/app/mycode", 若后面有参数可以直接在后面加上16 procd_set_param respawn # 定义respawn参数,告知procd当mycode程序退出后尝试进行重启17 procd_close_instance # 关闭实例18 }19 # service_triggers 重新定义,没有操作那么可以删掉,但是不能为空20 service_triggers()21 {22 procd_add_reload_trigger mycode23 }24 #reload_service重新定义,没有操作那么可以删掉,但是不能为空25 reload_service()26 {27 echoservice mycode reload28 }29 # stop_service重新定义,退出服务后需要做的操作,没有操作那么可以删掉,但是不能为空30 stop_service()31 {32 echoservice mycode stop33 }34 #restart重新定义,没有操作那么可以删掉,但是不能为空35 restart()36 {37 stop38 start39 }

1). start_service()

为注册服务到procd中,如果自己的应用程序没有配置文件,只要实现start_service()就好, procd_set_param设置设置好多参数,command为自己的应用路径, respawn可以检测自己的应用,如果挂掉可以重启,也可以设置重启间隔,其它参数可以自己查阅。

2). stop_service()

这个是procd kill自己的应用程序后调用的,若果你的应用程序关掉后,需要一些清理工作,需要实现这个。

3). service_triggers()

如果自己的应用需要关联一个配置文件test,(需要放在/etc/config/ 目录下),可以跟踪文件的修改情况,如果这个文件有改变,就调用reload_service()。在service_triggers也可以添加跟踪网络的修改,也可以同时跟踪多个配置文件。

4). reload_service()

配置文件改变后,需要调用这个函数,可以根据自己需要实现功能。

注:start和reload区别是

start:一般是指应用程序启动

reload:一般是指只是重新加载与配置文件改变相关的部分,不把整个应用程序重新启动。

2、然后修改 package/myapp/Makefile,修改后的 Makefile 如下所示

1 #2 # OpenWrt Makefile formycode program3 #4

5 include $(TOPDIR)/rules.mk6 include $(INCLUDE_DIR)/kernel.mk7

8 PKG_NAME :=mycode9 PKG_VERSION := 0.1

10 PKG_RELEASE := 1

11 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)12

13 include $(INCLUDE_DIR)/package.mk14

15 define Package/$(PKG_NAME)16 SECTION:=utils17 CATEGORY:=Songshuai Package18 SUBMENU:=Software Testing modules19 TITLE:=This is SongShuai's test project.

20 MAINTAINER:=Songshuai21 endef22

23 define Package/$(PKG_NAME)/description24 If you can't figure out what this program does, you're probably25 brain-dead and need immediate medical attention.26 endef27

28 define Build/Prepare29 mkdir -p $(PKG_BUILD_DIR)30 $(CP) ./src/*$(PKG_BUILD_DIR)/31 endef32

33 define Build/Configure34 endef35

36 define Build/Compile37 $(MAKE) -C $(PKG_BUILD_DIR) \38 ARCH="$(LINUX_KARCH)" \39 CC="$(TARGET_CC)" \40 CFLAGS="$(TARGET_CFLAGS) -Wall" \41 LDFLAGS="$(TARGET_LDFLAGS)"42 endef43

44 define Package/$(PKG_NAME)/install45 $(INSTALL_DIR) $(1)/app $(1)/etc/init.d/46 $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/app/47 $(INSTALL_BIN) ./root/mycode $(1)/etc/init.d/48 endef49

50 define Package/$(PKG_NAME)/preinst51 #!/bin/bash52 echo 'installing $(PKG_NAME)'53 endef54

55 define Package/$(PKG_NAME)/postinst56 #!/bin/sh57 # check if we are on real system58 if [ -z "$${IPKG_INSTROOT}" ]; then59 echo "Enabling rc.d symlink for $(PKG_NAME)"60 /etc/init.d/mycode enable61 fi62

63 echo '$(PKG_NAME) installed successed !'64 exit 065 endef66

67 define Package/$(PKG_NAME)/prerm68 #!/bin/sh69 # check if we are on real system70 if [ -z "$${IPKG_INSTROOT}" ]; then71 echo "Removing rc.d symlink for $(PKG_NAME)"72 /etc/init.d/mycode disable73 fi74 echo 'removeing $(PKG_NAME)'75 exit 076 endef77

78 define Package/$(PKG_NAME)/postrm79 #!/bin/bash80 echo '$(PKG_NAME) remove successed !'81 endef82

83 $(eval $(call BuildPackage,$(PKG_NAME)))

$IPKG_INSTROOT 这个变量如果为空,则表示在目标设备运行,否则在主机运行。

3、make menuconfig

9f475b8d29b9fdbfe5fdc66d7d5e6cbd.png

还是将 mycode 软件包配置成 ipk 模块

4、单独编译

1 # make package/mycode/compile V=99

5、 将生成的 ipk 软件包下载到目标设备并通过 opkg 安装,程序会自动启动并运行

1 # opkg install mycode_0.1-1_mipsel_24kc.ipk2 Installing mycode (0.1-1) to root...3 installing mycode4 Configuring mycode.5 Enabling rc.d symlink formycode6 mycode installed successed !

7 service mycode start8 [ 00 ] This is /dev/console Test9 [ 01 ] This is /dev/console Test10 [ 02 ] This is /dev/console Test11 ...

6、卸载可以使用指令

1 # opkg remove mycode2 Removing package mycode from root...3 Removing rc.d symlink formycode4 removeing mycode5 service mycode stop6 mycode remove successed !

在程序运行过程中,可以使用指令停止程序

1 service mycode stop 停止程序运行2 service mycode start 启动程序运行3 service mycode restart 重新启动

如果想要禁止在系统启动的时候自启动,则可以在不 remove的情况下使用

1 /etc/init.d/mycode disable 禁止启动,2 /etc/init.d/mycode enable 允许自启动

#说明:

如果在make menuconfig 过程中选择编译到内核 ,即选择为y ,那么在编译的时候需要使用指令进行内核编译

1 $ make V=99 -jn #n为使用的线程数

7、在编译完成之后,直接重新烧写内核文件,启动之后,应用程序 mycode 已经自动加载并运行。

效果与前面的一致。

说明:

关于重新烧写内核文件,一般uboot里面根据选项即可完成。

不死UBOOT:采用直接文件在网页端上传即可完成

普通UBOOT:使用tftpboot即可完成。

6d55d1570364d62eb44f455d42203967.png

三、自启动实现方式二

如果不涉及到内核或者模块的编译工作,只是单纯的想在指定的开发板上的程序在开机自启动,那么,可以直接在开发板上进行相关的工作,下面简单的说一下步骤:

0、将编译完成的可执行应用程序传送到开发板上

可以使用 FileZilla、scp、、、

1、一般openwrt是自带vi编辑器的,所以直接可以打开并编辑

1 # vi /etc/init.d/mycode

然后输入如下内容:

1 #!/bin/sh /etc/rc.common2

3 START=92

4 STOP=92

5 SERVICE=app6 PROG=/app/mycode7 USE_PROCD=1

8

9 start_service()10 {11 echoservice mycode start12 procd_open_instance13 procd_set_param command $PROG14 procd_set_param respawn15 procd_close_instance16 }17

18 service_triggers()19 {20 procd_add_reload_trigger mycode21 }22

23 stop_service()24 {25 echoservice mycode stop26 }27

28 restart()29 {30 stop31 start32 }

2、增加mycode的可执行权限

1 # chmod +x mycode //或者使用 chomd 777 mycode

3、使能自启动

1 # /etc/init.d/mycode enable

4、重新启动

1 # reboot

之后你会看到,重启已经自己开始运行了。

说明:

是的,你没有看错,这个方法其实和第一种方法一致,只是省去了在openwrt SDK中编译的过程。相对于来说,这种板卡其实还是比较省事情的。

但是问题也是比较明显。就是内核文件中其实是不包含mycode的可执行应用程序,自启动脚本的,需要将对应的文件通过工具上传到开发板文件系统中的。

如果是需要大量的进行类似的系统的重新烧写的话,还是推荐采用编译的方式,直接在make menuconfig 的时候选择为 y,编译到内核中更省事,剩下的工作就是烧写内核文件的事情了。

四、自启动实现方式三

当然,还有一种类似的启动方式,可以在 make meunuconfig 中选择是否自动启动并如果和luci有相关的支持的话,可以使用这种方式进行选择,下面简单说明一下

1、新建文件

首先,在./feeds/luci/applications/ 下新建文件夹luci-app-mycode,然后新建相关的文件或者文件夹,如果本程序需要配置文件,则可以新建一个 config 的文件,写入相关的配置项 与 值。

1 luci-app-mycode2 ├── Makefile3 └── root4 └── etc5 ├── config6 │ └── mycode7 └── init.d8 └── mycode

1)Makefile的内容为:

1 include $(TOPDIR)/rules.mk2

3 LUCI_TITLE:=LuCI support formycode4 LUCI_PKGARCH:=all5

6 include ../../luci.mk

2)config/mycode 内容

本例中 此文件 的内容为空,如果要需要配置的,可以进行编辑。

3)init.d/mycode 内容

与上面的自启动脚本mycode中的内容一致,此处不再重复写了。

2、运行下面的命令将更新luci选项

第一次编写的话,在进行make menuconfig之前需要更新一下,不然不会在luci选项中出现

1 ./scripts/feeds update -a -i2 ./scripts/feeds install -a

3、在 make menuconfig 进行选择

8ee1ecea2bd2faef7ff19a59f61e1cc9.png

此处直接选择为y, 如果选择为M ,也可以用opkg等安装手段进行测试。

4、编译

1 # make V=99

5、重新烧写内核文件

烧写完成,重新启动之后你会发现,mycode应用程序已经自动启动了。

五、自启动实现方式四

这中方式感觉有点投机取巧并且貌似不是很正规,但是在一般的场合下还是可以使用的,就是自己编写中二的启动脚本,在里面直接启动自己的应用程序即可。

0、将编译完成的可执行应用程序传送到开发板上

可以使用 FileZilla、scp、、、

1、在/etc/rc.local 编写启动的脚本

1 # vi /etc/rc.local

在文件里面新增内容

1 app/mycode & # 以后台服务的形式启动应用程序

2、赋予/etc/rc.local 可执行的权限

1 # chmod +x rc.local

3、重启系统

1 # reboot

启动之后,应用程序也随之启动。

六、自启动实现方式五

如果直接在开发板子上增加启动项,那么可以将编译好可执行程序的文件拷贝到文件夹下,比如还是/app/mycode 文件,此启动的方式很直接也很简单,那就是将需要启动的应该程序连接到/etc/rc.d/ 下。

1、自启动的设置

具体使用指令

1 # ln -s /app/mycode /etc/rc.d/S92mycode

其中:

S92mycode 中的 92 就是start的优先级的数字,详细请翻前面或者自行搜寻。

自动重启之后,你会发现,真的也是自动启动了(说了貌似和还不如不说,但是不说又觉得少点什么......)

2、取消自启动的设置

删除 /etc/rc.d/S92mycode 即可。

是不是炒鸡简单。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值