歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Ubuntu init啟動流程分析

Ubuntu init啟動流程分析

日期:2017/2/28 15:46:11   编辑:Linux教程

  現行的Linux distros主流的有兩種init方式:一種是廣為流傳的System V initialization,它來源於Unix並且至今仍被各種Linux distros所采用;另一種是近幾年提出的Upstart方式,基於事件機制,系統的所有服務,任務都是由事件驅動的。據我所知,采用後一種方式的目前有Ubuntu(6.10 and later),Fedora(9.10 and later),Debian(optional)。雖然采用Upstart的發行版並不多,但它旨在取代舊式的System V initialization。

  作為知識梳理,我現在就先在這裡總結一下這兩種方式各自的初始化流程,這也是為了方便整理思路:

  之前在查找Linux系統init流程的相關資料時總是能夠看到inittab的身影,但是在我的Ubuntu上是沒有這個文件的,到後來才知道采用 Upstart方式的Ubuntu上是沒有inittab這個文件的。在舊式的System V initialization中,/etc/inittab可是個相當重要的文件。init進程啟動後第一時間找的就是它!inittab負責初始化系統,設置系統runlevel及進 入各runlevel對應要執行的命令。假設當前inittab中設置的默認runlevle是5,則init會運行/etc/init.d/rc 5命令,該命令會依據系統服務的依賴關系遍歷執行/etc/rc5.d中的腳本/程序。進入/etc/rc5.d目錄可以發現裡面的文件都是到/etc /init.d/下對應的腳本/程序的軟鏈接。以S開頭的為啟動的意思,以K開頭的為停止。並且S/K後面的兩位數數字代表了服務的啟動順序(由服務依賴關系決定)。

  那麼Upstart job是怎麼樣的呢?我們知道,System V initializaiton是以runlevel為核心,依據服務間依賴關系的init方式,但在Upstart job,runlevel雖說對於服務的啟動也有影響但已不是關鍵所在。Upstart job是事件驅動的,系統服務的啟動、停止等等均是由事件決定的,反過來,系統服務的啟動、停止也可以作為事件源觸發其他服務。並且事件並不一定得由系統內部產生,用戶可以手工的鍵入start/stop [Service]產生事件來啟動/終止服務。man upstart-evnets查看upstart job所定義的事件,可以發現,runlevel也被當作事件來對待(因runlevel的改變而產生的事件),諸如此類還有其他如 startup,started,filesystem等等。那麼系統服務又是如何知道自己應該什麼時候啟動,什麼時候終止的呢?答案就在於/etc /init中(有的distros可能是在/etc/event.d)。進入/etc/init目錄下一看,均是系統服務的配置文件,或者說,是job definition files。(實際上Upstart init只需要/etc/init這麼一個目錄,不像System V init,“拐彎抹腳”轉好多圈才到達目的地,在性能上不如前者)。隨便打開一個文件,比如cron.conf:

# cron - regular background program processing daemon
#
# cron is a standard UNIX program that runs user-specified programs at

# periodic scheduled times

description "regular background program processing daemon"

start on runlevel [2345]
stop on runlevel [!2345]

expect fork

respawn

exec cron
Copyright © Linux教程網 All Rights Reserved