2013-06-21 17 views
2

幾乎所有的linux課程都表示init進程在給定運行級別的情況下會執行適當的shell腳本來初始化環境。但是非課程詳細描述了init進程如何執行它。初始化進程與shell cript的交互

據我所知,init進程基本上是一個C程序,很像任何Hello World C代碼。只有更復雜。有誰知道這個C程序是如何實際運行所有腳本並調用它們的?

我真的很感激任何答案,特別是如果你有一個例子源代碼的鏈接。

+0

sysvinit的源代碼:(http://linux.softpedia.com/progDownload/SysVinit-Download-6314.html) –

回答

1

你可以找到它做什麼不同的文檔中解釋:

,你可以找到在那裏它的源代碼:

基本上,init與方法1,對角色fork()您的系統上的每個應用程序。如果在引導時使用命令行init=/bin/sh引導linux,內核分叉的進程1將是一個shell。 sysvinit程序使處理複雜啓動更容易一些。它增加了運行級別的概念,定義了基本的環境等等,這樣可以很容易地啓動一個系統並且擁有許多服務,而不僅僅是一個shell。所有這一部分在我給你的文件中有很好的解釋。

有沒有人知道這個C程序實際上是如何運行所有腳本並調用它們的?

那麼,就像在你的問題一樣簡單。當你啓動你的系統時,init會讀取inittab文件,找出你的首選項(默認的運行級別是什麼?產生什麼程序?有多少個控制檯?),並且對於所選的運行級別,將fork一個將執行的shell啓動腳本。然後,該shell腳本將自動啓動到您從/etc/init.d激活的shell腳本。通常shell腳本部分是非常分佈特定的,這就是爲什麼我給了你兩個關於這個的鏈接,你可能會發現它在Ubuntu和Debian上是不同的...

有關源代碼的更多細節,從init.c的底部開始,其中包含init的主循環。

並在您的問題+1您的好奇心!

+0

謝謝你,你真的幫了我。我可以問另一個問題嗎?例如,init進程發現,例如當前運行級別爲2,然後因爲它有權訪問文件系統,它會找出/etc/rc2.d目錄的內容,併爲該文件夾中的每個腳本分配一個shell程序。請糾正我,如果我錯了 –

+0

不完全,它執行在'l0:0:wait:/etc/init.d/rc 0'行內的給定運行級別的inittab中配置的程序(那個是debian Linux使用,其他發行版可能會有所不同)。所以'/etc/init.d/rc'就是找到'/ etc/rc * .d/*'文件的角色並將它們分開。 – zmo