openwt啓動流程學習

 

  • init進程是所有系統進程的父進程,它被內核調用起來並負責調用所有其他的進程。 如果任何進程的父進程退出,init進程將成爲它的父進程。

內核啓動完成後讀取/etc/inittab文件,然後執行inittab中的sysinit所指的腳本。

openwrt的initab文件如下

root@AOTUO:/etc# cat inittab
::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K shutdown
::askconsole:/usr/libexec/login.sh

 

內核啓動完成後首先調用"/etc/init.d/rcS",然後再由rcS逐個啓動各個軟件進程。

如果按照通常的簡單做法,我們會將每個待啓動的程序啓動命令按行放入rcS文件中,順序執行。這種實現方法在軟件啓動進程列表不變的時候工作非常好,如果需要動態修改,則不容易。

 

在/etc/rc.d目錄下創建每個軟件軟連接方式,由rcS腳本在該目錄讀取啓動命令的軟鏈接,然後啓動軟鏈接所指向的程序,由於每一個軟鏈接均包含一個數字,就可以按照數字順序讀取並進行啓動了

所有軟件的啓動腳本都放在/etc/init.d目錄下,如果需要隨系統啓動,將啓動腳本鏈接到/etc/rc.d/S*下即可

 

系統啓動時將執行/etc/init.d/rcS腳本,並傳遞兩個參數S和boot。  S表示軟件啓動模塊,是和K(軟件關閉)相對應的;boot則表示首次啓動。rcS腳本通過run_scripts函數來啓動軟件,將每一個以/etc/rc.d/S開頭的腳本按照數字順序傳遞boot參數並調用。這些啓動腳本通常包含start、stop和restart這3個函數。

 以/etc/init.d 下的user_init文件爲例(用戶自己創建的腳本文件)

 

這個初始化腳本是一個shell腳本,包含變量定義和函數的定義,通過"/etc/rc.common"腳本回調來完成的。第一行是註釋行,表示使用"/etc/rc.common"來提供一些基本函數,包含主函數的默認功能以及檢查腳本等。

腳本的執行順序通過START和STOP變量定義。改變之後再次運行/etc/init.d/user_init enable纔會再次生效。這將刪除以前創建的啓動鏈接,然後再根據新的變量定義創建鏈接。創建的啓動鏈接保存在"/etc/rc.d"目錄下。腳本中最重要的的函數是start和stop,這兩個決定如何啓動和停止服務。

程序中的執行流程由rc.common來控制,其中包含了以下命令

函 數     含 義
start  啓動服務。相當於 C++語言中的虛函數,通常情況下每一個服務均需重寫該函數
stop 關閉服務。相當於 C++語言中的虛函數,通常情況下每一個服務均需重寫該函數
restart 重啓服務。調用 stop 函數退出進程,然後再調用 start 函數啓動進程
reload 重新讀取配置,如果讀取配置失敗則調用 restart 函數重啓進程
enable 打開服務自啓動,即將啓動腳本軟鏈接文件放在/etc/rc.d 目錄下
disable    關閉服務自啓動,刪除在/etc/rc.d 的軟鏈接文件
enabled   提供服務自啓動的狀態查詢
boot   調用 start 函數
shutdown 調用 stop 函數
help   輸出幫助信息
boot函數與start函數的關係:命令在啓動時取代 start 函數而執行 boot 函數,如果 boot 函數沒 有被重新定義,將執行 rc.common 中預定義的 boot 函數,boot 函數再次調用 start 函數


   啓動和停止命令通常在init序列中執行,在系統啓動時rcS僅僅執行在/etc/rc.d目錄下的腳本,我們的啓動腳本作爲軟鏈接放在這裏。使用enable或disable命令可以自動完成這些任務。

通過調用"enable"命令可安裝成功。START = 98意味着啓動文件將創建軟鏈接"/etc/rc.d/S98user_init"   來指向''/etc/init.d/user_init",在START = 97之後啓動,在START = 99之前啓動

如果多個初始化腳本有相同的啓動優先值,則調用順序取決於啓動腳本名稱的字母順序 
  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章