OpenWRT编译 |
您所在的位置:网站首页 › 自动打印程序编程软件 › OpenWRT编译 |
一、概述
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。 二、自启动实现方式一在原来的app应用程序的基础上实现自启动,详见:https://blog.csdn.net/zhemingbuhao/article/details/103941355 1、package/myapp/目录下创建一个目录 root/,用来存放启动脚本 # mkdir package/myapp/root然后在 package/myapp/root/ 目录下创建启动脚本文件 然后在 package/myapp/root/ 目录下创建启动脚本文件 mycode,其内容如下 #!/bin/sh /etc/rc.common START=92 # 执行的顺序,按照字符串顺序排序并不是数字排序 STOP=92 SERVICE=app PROG=/app/mycode USE_PROCD=1 # 使用procd启动 # start_service 函数必须要重新定义 start_service() { echo service mycode start procd_open_instance # 创建一个实例, 在 procd 看来一个应用程序可以多个实例 # ubus call service list 可以查看实例 procd_set_param command $PROG # mycode执行的命令是"/app/mycode" procd_append_param command para1 # 启动参数的追加,如果有多个参数可以对此追加 procd_append_param command para2 # 启动参数的追加,如果有多个参数可以对此追加 procd_set_param respawn # 定义respawn参数,告知procd当mycode程序退出后尝试进行重启 procd_close_instance # 关闭实例 } # service_triggers 重新定义,没有操作那么可以删掉,但是不能为空 service_triggers() { procd_add_reload_trigger mycode } #reload_service重新定义,没有操作那么可以删掉,但是不能为空 reload_service() { echo service mycode reload } # stop_service重新定义,退出服务后需要做的操作,没有操作那么可以删掉,但是不能为空 stop_service() { echo service mycode stop } #restart重新定义,没有操作那么可以删掉,但是不能为空 restart() { stop start } 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 如下所示 ############################################## # # OpenWrt Makefile for mycode program # ############################################## include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME := mycode PKG_VERSION := 0.1 PKG_RELEASE := 1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) include $(INCLUDE_DIR)/package.mk define Package/$(PKG_NAME) SECTION:=utils CATEGORY:=Songshuai Package SUBMENU:=Software Testing modules TITLE:=This is SongShuai's test project. MAINTAINER:=Songshuai endef define Package/$(PKG_NAME)/description If you can't figure out what this program does, you're probably brain-dead and need immediate medical attention. endef define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ endef define Build/Configure endef define Build/Compile $(MAKE) -C $(PKG_BUILD_DIR) \ ARCH="$(LINUX_KARCH)" \ CC="$(TARGET_CC)" \ CFLAGS="$(TARGET_CFLAGS) -Wall" \ LDFLAGS="$(TARGET_LDFLAGS)" endef define Package/$(PKG_NAME)/install $(INSTALL_DIR) $(1)/app $(1)/etc/init.d/ $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/app/ $(INSTALL_BIN) ./root/mycode $(1)/etc/init.d/ endef define Package/$(PKG_NAME)/preinst #!/bin/bash echo 'installing $(PKG_NAME)' endef define Package/$(PKG_NAME)/postinst #!/bin/sh # check if we are on real system if [ -z "$${IPKG_INSTROOT}" ]; then echo "Enabling rc.d symlink for $(PKG_NAME)" /etc/init.d/mycode enable fi echo '$(PKG_NAME) installed successed !' exit 0 endef define Package/$(PKG_NAME)/prerm #!/bin/sh # check if we are on real system if [ -z "$${IPKG_INSTROOT}" ]; then echo "Removing rc.d symlink for $(PKG_NAME)" /etc/init.d/mycode disable fi echo 'removeing $(PKG_NAME)' exit 0 endef define Package/$(PKG_NAME)/postrm #!/bin/bash echo '$(PKG_NAME) remove successed !' endef $(eval $(call BuildPackage,$(PKG_NAME)))$IPKG_INSTROOT 这个变量如果为空,则表示在目标设备运行,否则在主机运行。 3、make menuconfig还是将 mycode 软件包配置成 ipk 模块 4、单独编译 # make package/mycode/compile V=99 5 将生成的 ipk 软件包下载到目标设备并通过 opkg 安装,程序会自动启动并运行 # opkg install mycode_0.1-1_mipsel_24kc.ipk Installing mycode (0.1-1) to root... installing mycode Configuring mycode. Enabling rc.d symlink for mycode mycode installed successed ! service mycode start [ 00 ] This is /dev/console Test [ 01 ] This is /dev/console Test [ 02 ] This is /dev/console Test ... 6、卸载可以使用指令 # opkg remove mycode Removing package mycode from root... Removing rc.d symlink for mycode removeing mycode service mycode stop mycode remove successed !在程序运行过程中,可以使用指令停止程序 service mycode stop 停止程序运行 service mycode start 启动程序运行 service mycode restart 重新启动 如果想要禁止在系统启动的时候自启动,则可以在不 remove的情况下使用 /etc/init.d/mycode disable 禁止启动, /etc/init.d/mycode enable 允许自启动 说明:如果在make menuconfig 过程中选择编译到内核 ,即选择为 y ,那么在编译的时候需要使用指令进行内核编译 $ make V=99 -jn #n为使用的线程数 7、在编译完成之后,直接重新烧写内核文件,启动之后,应用程序 mycode 已经自动加载并运行。效果与前面的一致。 说明:关于重新烧写内核文件,一般uboot里面根据选项即可完成。 不死UBOOT:采用直接文件在网页端上传即可完成 普通UBOOT :使用tftpboot即可完成。 三、自启动实现方式二如果不涉及到内核或者模块的编译工作,只是单纯的想在指定的开发板上的程序在开机自启动,那么,可以直接在开发板上进行相关的工作,下面简单的说一下步骤: 0、将编译完成的可执行应用程序传送到开发板上可以使用 FileZilla、scp、、、 1、一般openwrt是自带vi编辑器的,所以直接可以打开并编辑 # vi /etc/init.d/mycode然后输入如下内容: #!/bin/sh /etc/rc.common START=92 STOP=92 SERVICE=app PROG=/app/mycode USE_PROCD=1 start_service() { echo service mycode start procd_open_instance procd_set_param command $PROG procd_set_param respawn procd_close_instance } service_triggers() { procd_add_reload_trigger mycode } stop_service() { echo service mycode stop } restart() { stop start } 2、增加mycode的可执行权限 # chmod +x mycode // 或者使用 chomd 777 mycode 3、使能自启动 # /etc/init.d/mycode enable 4、重新启动 # reboot之后你会看到,重启已经自己开始运行了。 说明:是的,你没有看错,这个方法其实和第一种方法一致,只是省去了在openwrt SDK中编译的过程。相对于来说,这种板卡其实还是比较省事情的。 但是问题也是比较明显。就是内核文件中其实是不包含mycode的可执行应用程序,自启动脚本的,需要将对应的文件通过工具上传到开发板文件系统中的。 如果是需要大量的进行类似的系统的重新烧写的话,还是推荐采用编译的方式,直接在make menuconfig 的时候选择为 y,编译到内核中更省事,剩下的工作就是烧写内核文件的事情了。 四、自启动实现方式三当然,还有一种类似的启动方式,可以在 make meunuconfig 中选择是否自动启动并如果和luci有相关的支持的话,可以使用这种方式进行选择,下面简单说明一下 1、新建文件首先,在 ./feeds/luci/applications/ 下新建文件夹 luci-app-mycode,然后新建相关的文件或者文件夹,如果本程序需要配置文件,则可以新建一个 config 的文件,写入相关的配置项 与 值。 luci-app-mycode ├── Makefile └── root └── etc ├── config │ └── mycode └── init.d └── mycode 1)Makefile的内容为: include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI support for mycode LUCI_PKGARCH:=all include ../../luci.mk 2)config/mycode 内容本例中 此文件 的内容为空,如果要需要配置的,可以进行编辑。 3)init.d/mycode 内容与上面的自启动脚本mycode中的内容一致,此处不再重复写了。 2、运行下面的命令将更新luci选项第一次编写的话,在进行make menuconfig之前需要更新一下,不然不会在luci选项中出现 ./scripts/feeds update -a -i ./scripts/feeds install -a 3、在 make menuconfig 进行选择此处直接选择为 y, 如果选择为 M ,也可以用opkg等安装手段进行测试。 4、编译 # make V=99 5、重新烧写内核文件烧写完成,重新启动之后你会发现,mycode应用程序已经自动启动了。 五、自启动实现方式四这中方式感觉有点投机取巧并且貌似不是很正规,但是在一般的场合下还是可以使用的,就是自己编写中二的启动脚本,在里面直接启动自己的应用程序即可。 0、将编译完成的可执行应用程序传送到开发板上可以使用 FileZilla、scp、、、 1、在/etc/rc.local 编写启动的脚本 # vi /etc/rc.local在文件里面新增内容 app/mycode & # 以后台服务的形式启动应用程序 2、赋予/etc/rc.local 可执行的权限 # chmod +x rc.local 3、重启系统 # reboot启动之后,应用程序也随之启动。 六、自启动实现方式五如果直接在开发板子上增加启动项,那么可以将编译好可执行程序的文件拷贝到文件夹下,比如还是 /app/mycode 文件,此启动的方式很直接也很简单,那就是将需要启动的应该程序连接到 /etc/rc.d/ 下。 1、自启动的设置具体使用指令 # ln -s /app/mycode /etc/rc.d/S92mycode其中: S92mycode 中的 92 就是start的优先级的数字,详细请翻前面或者自行搜寻。 自动重启之后,你会发现,真的也是自动启动了(说了貌似和还不如不说,但是不说又觉得少点什么…) 2、取消自启动的设置删除 /etc/rc.d/S92mycode 即可。 是不是炒鸡简单。。。。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |