干貨 | 淺析程序開機自啟動
時間:2021-09-03 10:10:57
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]關注「嵌入式大雜燴」,選擇「星標公眾號」一起進步!在《實用|如何遠程登錄開發(fā)板?》這篇文章中我們給開發(fā)板配置了網(wǎng)絡,但是板子重啟之后,又得手動輸入命令去配置連接WiFi。在《實用|10分鐘教你搭建一個嵌入式web服務器》、《實用|10分鐘教你通過網(wǎng)頁點燈》及這兩篇文章中我們每次都...
關注「嵌入式大雜燴」,選擇「星標公眾號」一起進步!
在《實用 | 如何遠程登錄開發(fā)板?》這篇文章中我們給開發(fā)板配置了網(wǎng)絡,但是板子重啟之后,又得手動輸入命令去配置連接WiFi。
在《實用 | 10分鐘教你搭建一個嵌入式web服務器》、《實用 | 10分鐘教你通過網(wǎng)頁點燈》及這兩篇文章中我們每次都是先登錄開發(fā)板,再啟動我們的boa服務器。顯然,這很不方便。這篇筆記我們就一起來解決這個痛點。設置板子重啟之后自動連接WiFi、boa服務器開機自動啟動,以及設置我們的應用程序開機自啟動。2、init的種類
在嵌入式Linux中,不同的文件系統(tǒng)有不同的init的實現(xiàn)。對于Buildroot_2019.02,其支持兩種system init:BusyBox init、systemV。對于Buildroot_2020.02,其支持四種system init:BusyBox init、systemV、systemd及OpenRC。
套用其模板修改S100Test為:
在《實用 | 如何遠程登錄開發(fā)板?》這篇文章中我們給開發(fā)板配置了網(wǎng)絡,但是板子重啟之后,又得手動輸入命令去配置連接WiFi。
在《實用 | 10分鐘教你搭建一個嵌入式web服務器》、《實用 | 10分鐘教你通過網(wǎng)頁點燈》及這兩篇文章中我們每次都是先登錄開發(fā)板,再啟動我們的boa服務器。顯然,這很不方便。這篇筆記我們就一起來解決這個痛點。設置板子重啟之后自動連接WiFi、boa服務器開機自動啟動,以及設置我們的應用程序開機自啟動。
嵌入式Linux初始化程序
1、init進程
init進程是內核加載的第一個用戶空間的進程,PID為1,負責加載用戶空間的服務和程序。如:2、init的種類
在嵌入式Linux中,不同的文件系統(tǒng)有不同的init的實現(xiàn)。對于Buildroot_2019.02,其支持兩種system init:BusyBox init、systemV。對于Buildroot_2020.02,其支持四種system init:BusyBox init、systemV、systemd及OpenRC。(1)BusyBox init
BusyBox init非常適合在嵌入式系統(tǒng)開發(fā)中使用,被譽為“嵌入式Linux的瑞士軍刀”,它可以為嵌入式系統(tǒng)提供只要的init功能,并且通過定制可以做得非常 精煉。inittab是幫助init完成系統(tǒng)配置的主要文件。(2)systemV
SystemV
是類 Unix 操作系統(tǒng)傳統(tǒng)的也是首款初始化系統(tǒng)。SystemV為服務啟動設置嚴格的順序。每個服務都分配有一個優(yōu)先級編號,init會按優(yōu)先級順序啟動服務。如果需要確保網(wǎng)絡連接后啟動服務,則必須手動為服務分配更高的優(yōu)先級。System V初始化腳本都存儲在/etc/rc.d/init.d/或/etc/init.d目錄中。這些腳本用于控制系統(tǒng)的啟動和關閉。(3)systemd
systemd是Linux下的一套中央化系統(tǒng)及設置管理程序(init),包括有守護進程、程序庫以及應用軟件。其開發(fā)目標是提供更優(yōu)秀的框架以表示系統(tǒng)服務間的依賴關系,并依此實現(xiàn)系統(tǒng)初始化時服務的并行啟動,同時達到降低Shell的系統(tǒng)開銷的效果,最終代替現(xiàn)在常用的System V與BSD風格init程序。目前絕大多數(shù)的Linux發(fā)行版都已采用systemd代替原來的System V。(4)OpenRC
OpenRC是一個基于依賴關系的rc系統(tǒng),可以和系統(tǒng)所提供任何init程序配合運行,一般指的是/sbin/init。但是她不是用來取代/sbin/init的。基于SystemV的開機自啟動
上面我們簡單地了解了相關地概念。我這里地開發(fā)板用的是Buildroot_2020.02,初始化系統(tǒng)用的是SystemV。下面我們基于這個環(huán)境做一些簡單的程序自啟動的實踐。我這里的System V初始化腳本都存儲在/etc/init.d目錄中:init進程啟動之后,會對/etc/inittab文件的解釋及執(zhí)行。我們看看/etc/inittab文件里有什么內容:可以看到里面用到了兩個腳本文件:- /etc/init.d/rcS
- /etc/init.d/rcK
S 數(shù)字
開頭的腳本文件,即:其中,S后面的數(shù)字表示啟動的順序,數(shù)字小的先啟動。下面我們一起來簡單驗證一些是不是這樣的。示例代碼:test.c#include?
int?main(void)
{
?for?(int?i?=?0;?i?5;?i )
?{
??printf("Hello?world\n");
?}
?return?0;
}
編譯:arm-linux-gnueabihf-gcc?test.c?-o?test
把test傳到開發(fā)板的home目錄:scp?test?root@192.168.1.8:/home
在開發(fā)板/etc/init.d/目錄下新建文件S100Test:#!/bin/sh
cd?/home
./test?>?test_log.txt
腳本很簡單,把test程序輸出的信息存放到同目錄下的test_log.txt文件中。保存S100Test腳本,修改其權限:chmod?777?S100Test
重啟板子:reboot
可以看到,test同目錄下會生成一個test_log.txt文件:表明我們已經(jīng)可以設置我們的程序開機自啟動了。上面只是進行簡單地演示,S100Test啟動腳本可能不夠規(guī)范,我們可以模仿/etc/init.d/目錄下地其它腳本的格式編寫我們的啟動腳本,如S99myirhmi2腳本的內容如:套用其模板修改S100Test為:
#!/bin/sh
case?"$1"?in
????????start)
????????????????cd?/home
????????????????./test?>?test_log.txt
????????????????;;
????????stop)
????????????????;;
????????*)
????????????????echo?"Usage:?$0?{start|?stop|restart}"
????????????????exit?1
esac
exit?$?
以上就是本次關于程序自啟動的一些學習分享。回到文章開頭的問題,我們就可以用類似的方法來設置我們的板子,讓其開機自動配置網(wǎng)絡、自動啟動boa服務器,為了圖方便,我直接把相關執(zhí)行命令加入到/etc/init.d/rcS中,如:重啟,可以看到,相關程序已經(jīng)自啟動了:巨人肩膀:1、https://blog.csdn.net/weixin_39607935/article/details/1116266062、https://blog.csdn.net/shanzhizi/article/details/390824953、https://blog.csdn.net/u012944254/article/details/1110346284、https://www.cnblogs.com/xjnotxj/p/11951957.html