Openwrt編譯 -- 用戶自定義添加app的開機自啟動


詳細情況請查看博文:https://songshuai0223.blog.csdn.net/article/details/103944625

 

一、概述


      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/,用來存放啟動腳本

1 # mkdir package/myapp/root

然后在 package/myapp/root/ 目錄下創建啟動腳本文件 然后在 package/myapp/root/ 目錄下創建啟動腳本文件 mycode,其內容如下

 1 #!/bin/sh /etc/rc.common
 2 
 3 START=92 # 執行的順序,按照字符串順序排序並不是數字排序
 4 STOP=92
 5 SERVICE=app
 6 PROG=/app/mycode
 7 USE_PROCD=1 # 使用procd啟動
 8 
 9 # start_service 函數必須要重新定義
10 start_service()
11 {
12     echo service mycode start
13     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 mycode
23 }
24 #reload_service重新定義,沒有操作那么可以刪掉,但是不能為空
25 reload_service()
26 {
27     echo service mycode reload
28 }
29 # stop_service重新定義,退出服務后需要做的操作,沒有操作那么可以刪掉,但是不能為空
30 stop_service()
31 {
32     echo service mycode stop
33 }
34 #restart重新定義,沒有操作那么可以刪掉,但是不能為空
35 restart() 
36 {
37     stop
38     start
39 }

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 for mycode program
 3 #
 4 
 5 include $(TOPDIR)/rules.mk
 6 include $(INCLUDE_DIR)/kernel.mk
 7 
 8 PKG_NAME := mycode
 9 PKG_VERSION := 0.1
10 PKG_RELEASE := 1
11 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
12 
13 include $(INCLUDE_DIR)/package.mk
14 
15 define Package/$(PKG_NAME)
16   SECTION:=utils
17   CATEGORY:=Songshuai Package
18   SUBMENU:=Software Testing modules
19   TITLE:=This is SongShuai's test project.
20   MAINTAINER:=Songshuai
21 endef
22 
23 define Package/$(PKG_NAME)/description
24     If you can't figure out what this program does, you're probably
25     brain-dead and need immediate medical attention.
26 endef
27 
28 define Build/Prepare
29     mkdir -p $(PKG_BUILD_DIR)
30     $(CP) ./src/* $(PKG_BUILD_DIR)/ 
31 endef
32 
33 define Build/Configure
34 endef
35 
36 define Build/Compile
37     $(MAKE) -C $(PKG_BUILD_DIR) \
38         ARCH="$(LINUX_KARCH)" \
39         CC="$(TARGET_CC)" \
40         CFLAGS="$(TARGET_CFLAGS) -Wall" \
41         LDFLAGS="$(TARGET_LDFLAGS)"
42 endef
43 
44 define Package/$(PKG_NAME)/install
45     $(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 endef
49 
50 define Package/$(PKG_NAME)/preinst
51     #!/bin/bash
52     echo 'installing $(PKG_NAME)'
53 endef
54 
55 define Package/$(PKG_NAME)/postinst
56     #!/bin/sh
57     # check if we are on real system
58     if [ -z "$${IPKG_INSTROOT}" ]; then
59         echo "Enabling rc.d symlink for $(PKG_NAME)"
60         /etc/init.d/mycode enable
61     fi
62 
63     echo '$(PKG_NAME) installed successed !'
64     exit 0
65 endef
66 
67 define Package/$(PKG_NAME)/prerm
68     #!/bin/sh
69     # check if we are on real system
70     if [ -z "$${IPKG_INSTROOT}" ]; then
71         echo "Removing rc.d symlink for $(PKG_NAME)"
72         /etc/init.d/mycode disable
73     fi
74     echo 'removeing $(PKG_NAME)'
75     exit 0
76 endef
77 
78 define Package/$(PKG_NAME)/postrm
79     #!/bin/bash
80     echo '$(PKG_NAME) remove successed !'
81 endef
82 
83 $(eval $(call BuildPackage,$(PKG_NAME)))

$IPKG_INSTROOT 這個變量如果為空,則表示在目標設備運行,否則在主機運行。

3、make menuconfig

 

 還是將 mycode 軟件包配置成 ipk 模塊

4、單獨編譯

1 # make package/mycode/compile V=99

5、 將生成的 ipk 軟件包下載到目標設備並通過 opkg 安裝,程序會自動啟動並運行

 1 # opkg install mycode_0.1-1_mipsel_24kc.ipk 
 2 Installing mycode (0.1-1) to root...
 3 installing mycode
 4 Configuring mycode.
 5 Enabling rc.d symlink for mycode
 6 mycode installed successed !
 7 service mycode start
 8 [ 00 ] This is /dev/console Test
 9 [ 01 ] This is /dev/console Test
10 [ 02 ] This is /dev/console Test
11 ...

6、卸載可以使用指令

1 # opkg remove mycode
2 Removing package mycode from root...
3 Removing rc.d symlink for mycode
4 removeing mycode
5 service mycode stop
6 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即可完成。

 

 

三、自啟動實現方式二

 

如果不涉及到內核或者模塊的編譯工作,只是單純的想在指定的開發板上的程序在開機自啟動,那么,可以直接在開發板上進行相關的工作,下面簡單的說一下步驟:
0、將編譯完成的可執行應用程序傳送到開發板上
可以使用 FileZilla、scp、、、
1、一般openwrt是自帶vi編輯器的,所以直接可以打開並編輯

1 # vi  /etc/init.d/mycode

然后輸入如下內容:

 1 #!/bin/sh /etc/rc.common
 2 
 3 START=92
 4 STOP=92
 5 SERVICE=app
 6 PROG=/app/mycode
 7 USE_PROCD=1
 8 
 9 start_service()
10 {
11     echo service mycode start
12     procd_open_instance
13     procd_set_param command $PROG
14     procd_set_param respawn
15     procd_close_instance
16 }
17 
18 service_triggers()
19 {
20     procd_add_reload_trigger mycode
21 }
22 
23 stop_service()
24 {
25     echo service mycode stop
26 }
27 
28 restart() 
29 {
30     stop
31     start
32 }

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-mycode
2 ├── Makefile
3 └── root
4     └── etc
5         ├── config
6         │   └── mycode
7         └── init.d
8             └── mycode

1)Makefile的內容為:

1 include $(TOPDIR)/rules.mk
2 
3 LUCI_TITLE:=LuCI support for mycode
4 LUCI_PKGARCH:=all
5 
6 include ../../luci.mk

2)config/mycode 內容
本例中 此文件 的內容為空,如果要需要配置的,可以進行編輯。
3)init.d/mycode 內容
與上面的自啟動腳本mycode中的內容一致,此處不再重復寫了。

2、運行下面的命令將更新luci選項
第一次編寫的話,在進行make menuconfig之前需要更新一下,不然不會在luci選項中出現

1 ./scripts/feeds update -a -i
2 ./scripts/feeds install -a

3、在 make menuconfig 進行選擇

 

 

此處直接選擇為 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 即可。

是不是炒雞簡單。。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM