嵌入式系統中程序自啟動方法
在很多嵌入式系統中,由於可用資源較少,常常在系統啟動后就直接讓應用程序自動啟動,以減少用戶操作和節省資源。如何讓自己的應用程序自動啟動呢? 在Linux系統中,配置應用程序自動啟動的方法有以下三種:
1.通過/Linuxrc腳本直接啟動
Linux內核一旦開始執行,它將通過驅動程序來初始化所有硬件設備,這個初始化過程可以在啟動時的PC顯示器上看到,每個驅動程序都打印一些相關信息。初始化完成后,通常調用的是init,通過loader調用init內的init=/app_program語句(通過loader向核心傳入init=/program可以定制首先運行的程序)。
比如在桌面Linux系統中,init進程會讀取/etc/inittab文件,來決定執行級別和哪些腳本和命令。嵌入式應用開發中,可以根據實際情況決定是否使用標准的init執行方式,也許這個init是個靜態程序,它能夠完成我們的嵌入應用的特定任務,那完全不用考慮inittab了,在這里可以采用比較靈活的措施。
2.在/etc/init.d下添加啟動腳本
主要用來啟動一些系統服務,根據runlevel執行rcx.d, 而在rcx.d中都會在最后調用rc.local
一般情況下,大多數的Linux操作系統使用/etc/init.d/(或/etc/rc.d/init.d)下的腳本來配置應用程序的自動啟動。
例如,在某些Linux系統中,corn程序通過/etc/init.d/corn腳本啟動,Apache通過/etc/init.d/httpd啟動,syslogd通過/etc/init.d/syslogd啟動,而sshd則通過/etc/init.d/sshd腳本啟動。
通常這些腳本通過來自特定rc.d目錄的符號鏈接運行。為了配置從哪個rc.d目錄運行腳本,Linux系統提供了許多不同的工具,同時也可以手工進行配置。Linux系統有一個包含所有實際啟動腳本文件的目錄。它可能是/etc/init.d,也可能是/etc/rc.d/rc.d。同時對應每個運行級別(runlevel)又有一個另外的目錄,它們可能是/etc/rc2.d,也可能是/etc/rc.d/rc2.d。這些目錄中的文件通常是指向實際腳本文件的符號鏈接。
3.直接在/etc/rc.d/rc.local腳本中添加命令
在Linux系統中,有一個類似Windows系統中autoexec.bat的文件,它就是/etc/rc.d/rc.local,系統開機后自動運行用戶的應用程序或啟動系統服務的命令保存在開發板根文件系統的這個文件中。因此可以編輯rc.local文件,將要執行的程序(命令)添加到該文件夾中。Linux系統在啟動后還未登錄前,將自動執行該程序(命令),達到開機自動運行用戶的應用程序的目的。
運行級別
Linux系統有7個運行級別(runlevel)
運行級別0:系統停機狀態,系統默認運行級別不能設為0,否則不能正常啟動
運行級別1:單用戶工作狀態,root權限,用於系統維護,禁止遠程登陸
運行級別2:多用戶狀態(沒有NFS)
運行級別3:完全的多用戶狀態(有NFS),登陸后進入控制台命令行模式
運行級別4:系統未使用,保留
運行級別5:X11控制台,登陸后進入圖形GUI模式
運行級別6:系統正常關閉並重啟,默認運行級別不能設為6,否則不能正常啟動
運行級別的原理:
1.在目錄/etc/rc.d/init.d下有許多服務器腳本程序,一般稱為服務(service)(注:自己常用的有/etc/init.d/network...)
2.在/etc/rc.d下有7個名為rcN.d的目錄,對應系統的7個運行級別
3.rcN.d目錄下都是一些符號鏈接文件,這些鏈接文件都指向init.d目錄下的service腳本文件,命名規則為K+nn+服務名或S+nn+服務名,其中nn為兩位數字。
4.系統會根據指定的運行級別進入對應的rcN.d目錄,並按照文件名順序檢索目錄下的鏈接文件
對於以K開頭的文件,系統將終止對應的服務
對於以S開頭的文件,系統將啟動對應的服務
5.查看運行級別用:runlevel
6.進入其它運行級別用:init N
7.另外init0為關機,init 6為重啟系統
init.d 目錄名,目錄內放的是各個服務的啟動腳本,比如sshd、httpd等
rcX.d 目錄名,后面的X代表着每個運行級別。目錄內有每個服務在init.d內啟動腳本的鏈接文件,根據鏈接文件的名字來的啟動狀態。K開頭表示不啟動服務,S打頭表示啟動服務
rc.local 鏈接文件,指到/etc/rc.d/rc.local。是系統初始化及服務均啟動完畢后, 最后執行的一個腳本, 一些簡單的腳本可以放到其中
linux系統開機流程
1、機器開機通電bios質檢,質檢通過后,bios會根據boot菜單,選擇從硬盤啟動。
2。讀取硬盤中的MBR(主引導記錄),加載引導程序(linux中是grub),grub程序會加載系統kernel和虛擬文件系統。
3、系統會運行init程序,該進程會讀取/etc/inittab配置文件,決定運行級別,運行/etc/rc.d/rc.sysinit腳本對系統進行初始化,該腳本會設置系統時間,主機名,開啟卷管理,以讀寫的方式重掛root文件系統,掛載本地文件系統,開啟本地磁盤配額,開啟交換空間。
4、運行該運行級別下的/etc/rc.d/rcN.d/下的腳本,開啟系統服務進程。
5、讀取/etc/rc.d/rc.local下的命令,並逐條運行。
6、啟動虛擬終端,進入登錄界面。
現實中碰到的問題
1. 想自動啟動一個應用程序,而應用程序依賴於一個環境變量
2. 自動啟動的應用程序可以使用Ctrl+C終止
對於上面兩個需求,碰到多個問題
1. 將環境變量加入到/etc/profile中,然后/etc/rc.local中使用source將這個環境變量使能,但是由於rc.local腳本開始是#!bin/sh即為dash而不是bash, 導致從log可以看出rc.local執行失敗,當然最后把#!bin/sh->#!bin/bash即可
2. 如果在rc.local中執行./application則開機啟動會一直停在rc.local中,導致無法exit,完成啟動;如果./application &則會Ctr+C無法退出,目前使用后者
#!bin/bash -e source /etc/profile ( sleep 5 cd /usr/local ./application )&