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