當(dāng)前位置:首頁 > 公眾號精選 > 嵌入式大雜燴
[導(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)。

嵌入式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、systemVsystemdOpenRC。

(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
其中,可以看出/etc/init.d/rcS是在系統(tǒng)開機(jī)之后執(zhí)行的腳本;/etc/init.d/rcK是在系統(tǒng)關(guān)機(jī)時(shí)執(zhí)行的腳本。

下面看看/etc/init.d/rcS里面的內(nèi)容:

從里面的信息我們可以知道,這個(gè)rcS腳本會(huì)循環(huán)調(diào)用/etc/init.d文件夾下的以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/111626606

2、https://blog.csdn.net/shanzhizi/article/details/39082495

3、https://blog.csdn.net/u012944254/article/details/111034628

4、https://www.cnblogs.com/xjnotxj/p/11951957.html

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉