歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux開機啟動過程詳解

Linux開機啟動過程詳解

日期:2017/2/28 13:51:09   编辑:Linux教程

Linux開機執行內核後會啟動init進程,該進程根據runlevel(如x)執行/etc/rcx.d/下的程序,其下的程序是符號鏈接,真正的程序放在/etc/init.d/下。開機啟動的程序(服務等)皆為此套路。

init是第一個用戶進程。最主要的功能就是准備軟件執行的環境,包括系統的主機名,網絡設定,語系設置,系統文件格式及其他服務的啟動。

Linux開機啟動程序詳解

我們假設大家已經熟悉其它操作系統的引導過程,了解硬件的自檢引導步驟,就只從Linux操作系統的引導加載程序(對個人電腦而言通常是LILO)開始,介紹Linux開機引導的步驟。

加載內核
LILO啟動之後,如果你選擇了Linux作為准備引導的操作系統,第一個被加載的東西就是內核。請記住此時的計算機內存中還不存在任何操作系統,PC(因為它們天然的設計缺陷)也還沒有辦法存取機器上全部的內存。因此,內核就必須完整地加載到可用RAM的第一個兆字節之內。為了實現這個目的,內核是被壓縮了的。這個文件的頭部包含著必要的代碼,先設置CPU進入安全模式(以此解除內存限制),再對內核的剩余部分進行解壓縮。

執行內核
內核在內存中解壓縮之後,就可以開始運行了。此時的內核只知道它本身內建的各種功能,也就是說被編譯為模塊的內核部分還不能使用。最基本的是,內核必須有足夠的代碼設置自己的虛擬內存子系統和根文件系統(通常就是ext2文件系統)。一旦內核啟動運行,對硬件的檢測就會決定需要對哪些設備驅動程序進行初始化。從這裡開始,內核就能夠掛裝根文件系統(這個過程類似於Windows識別並存取C盤的過程)。內核掛裝了根文件系統之後,將啟動並運行一個叫做init的程序。

圖解Linux系統啟動流程 http://www.linuxidc.com/Linux/2014-03/97862.htm

注意:在這裡我們故意略去了Linux內核啟動的許多細節,這些細節只有內核開發人員才感興趣。如果你好奇的話,可以訪問http://www.RedHat.com:8080地址處的"Kernel Hackers Guide"。
init進程
init進程是非內核進程中第一個被啟動運行的,因此它的進程編號PID的值總是1。init讀它的配置文件/etc/inittab,決定需要啟動的運行級別(Runlevel)。從根本上說,運行級別規定了整個系統的行為,每個級別(分別由0到6的整數表示)滿足特定的目的。如果定義了initdefault級別,這個值就直接被選中,否則需要由用戶輸入一個代表運行級別的數值。

ReadHat系的runlevel定義如下:
  # 0 - 停機(千萬別把initdefault設置為0,否則系統永遠無法啟動)
  # 1 - 單用戶模式
  # 2 - 多用戶,沒有 NFS
  # 3 - 完全多用戶模式(標准的運行級)
  # 4 – 系統保留的
  # 5 - X11 (x window)
  # 6 - 重新啟動 (千萬不要把initdefault 設置為6,否則將一直在重啟 )

輸入代表運行級別的數字之後,init根據/etc/inittab文件中的定義執行一個命令腳本程序。缺省的運行級別取決於安裝階段對登錄程序的選擇:是使用基於文本的,還是使用基於X-Window的登錄程序。
rc命令腳本程序我們已經知道,當運行級別發生改變時,將由/etc/inittab文件定義需要運行哪一個命令腳本程序。這些命令腳本程序負責啟動或者停止該運行級別特定的各種服務。由於需要管理的服務數量很多,因此需要使用rc命令腳本程序。其中,最主要的一個是/etc/rc.d/rc,它負責為每一個運行級別按照正確的順序調用相應的命令腳本程序。我們可以想象,這樣一個命令腳本程序很容易變得難以控制!為了防止這類事件的發生,需要使用精心設計的方案。

對每一個運行級別來說,在/etc/rc.d子目錄中都有一個對應的下級目錄。這些運行級別的下級子目錄的命名方法是rcX.d(還有一個rcS.d目錄,其下的腳本也為指向/etc/init.d中的腳本的鏈接,但是會在/etc/rc.d/rc[0~6].d中的腳本執行前首先被執行),其中的X就是代表運行級別的數字。比如說,運行級別3的全部命令腳本程序都保存在/etc/rc.d/rc3.d子目錄中。在各個運行級別的子目錄中,都建立有到/etc/rc.d/init.d子目錄中命令腳本程序的符號鏈接,但是,這些符號鏈接並不使用命令腳本程序在/etc/rc.d/init.d子目錄中原來的名字。如果命令腳本程序是用來啟動一個服務的,其符號鏈接的名字就以字母S打頭;如果命令腳本程序是用來關閉一個服務的,其符號鏈接的名字就以字母K打頭。
許多情況下,這些命令腳本程序的執行順序都很重要。如果沒有先配置網絡接口,就沒有辦法使用DNS服務解析主機名!為了安排它們的執行順序,在字母S或者K的後面緊跟著一個兩位數字,數值小的在數值大的前面執行。比如:/etc/rc.d/rc3.d/S50inet就會在/etc/rc.d/rc3.d/S55named之前執行(S50inet配置網絡設置,55named啟動DNS服務器)。存放在/etc/rc.d/init.d子目錄中的、被符號鏈接上的命令腳本程序是真正的實干家,是它們完成了啟動或者停止各種服務的操作過程。當/etc/rc.d/rc運行通過每個特定的運行級別子目錄的時候,它會根據數字的順序依次調用各個命令腳本程序執行。它先運行以字母K打頭的命令腳本程序,然後再運行以字母S打頭的命令腳本程序。對以字母K打頭的命令腳本程序來說,會傳遞Stop參數;類似地對以字母S打頭的命令腳本程序來說,會傳遞Start參數。編寫自己的rc命令腳本在維護Linux系統運轉的日子裡,肯定會遇到需要系統管理員對開機或者關機命令腳
本進行修改的情況。
從以上也可看出,事實上不同的運行級別 只是加載的服務不同。
有兩種方法可以用來實現修改的目的:
●如果所做的修改只在引導開機的時候起作用,並且改動不大的話,可以考慮簡單地編輯一下/etc/rc.d/rc.local腳本。這個命令腳本程序是在引導過程的最後一步被執行的。
●如果所做的修改比較細致,或者還要求關閉進程使之明確地停止運行,則需要在/etc/rc.d/init.d子目錄中添加一個命令腳本程序。這個命令腳本程序必須可以接受Start和Stop參數並完成相應的操作。
第一種方法,編輯/etc/rc.d/rc.local腳本,當然是兩種方法中比較簡單的。如果想在這個命令腳本程序中添加內容,只需要使用喜歡的編輯器程序打開它,再把打算執行的命令附加到文件的末尾就可以了。這對一兩行的修改來說的確很便利。

如果確實需要使用一個命令腳本程序,這時必須選擇第二個方法。編寫一個rc命令腳本程序的過程並不像想象中那麼困難。我們下面就給出一個例子,看看它是怎樣實現的(順便說一句,你可以把我們的例子當作范本,按照自己的需要進行修改和添加)。
假設你打算每隔60分鐘調用一個特殊的程序來彈出一條消息,提醒自己需要從鍵盤前面離開休息一會兒,命令腳本程序將包括下面幾個部分:
●關於這個命令腳本程序功能的說明(這樣就不會在一年之後忘記它);
●在試圖運行它之前驗證這個命令腳本程序確實存在;
●接受start和stop參數並執行要求的動作。

參數給定後,我們就可以編寫命令的腳本程序。這個程序很簡單,大家可以自己編寫一下,我在這裡就不給出了。
編寫好新的命令腳本程序之後,再從相關的運行級別子目錄中加上必要的符號鏈接,來控制這個命令腳本程序的啟動或者停止。在我的印象中,只想讓它在運行級別3或者運行級別5中啟動,原因是我認為只有這兩個運行級別才是日常工作的地方。最後,希望這個命令腳本程序在進入運行級別6(重啟動)的時候被關閉。

激活或者禁止服務項目有的時候會發現,在引導的時候並不需要某個特定的服務被啟動。如果你正在考慮使用Linux替換Windows NT的文件和打印服務器,就更是如此。我們已經知道,在特定的運行級別子目錄中給符號鏈接改個名稱,就可以讓該服務不被啟動,如把其名稱的第一個字母由S改為K。一旦熟練掌握了命令行和符號鏈接,就會發現這是激活或者禁止服務的最快辦法。

在學習這個改名方法的時候,可能會覺得圖形化的操作界面ksysv比較容易掌握。雖然它原來是設計使用在KDE環境裡的,但在Red HatLinux 7.2下缺省安裝的GNOME環境裡也運行得很好。如果想啟動它,只需簡單地打開一個xterm窗口,並輸入ksysv命令就可以了。屏幕上會出現一個窗口,其中列出了能夠修改的全部參數,需要時還包括在線幫助。警告:如果是在一個現實中的系統上學習本文的知識,要多多運用常識。當試著對啟動腳本程序進行修改的時候,要記住所做的修改可能會造成你的系統不能正常工作,而且無法采用重啟動的方法恢復。不要在正常運轉的系統上實驗新的設置,對你准備修改的文件要全部進行備份。最重要的是,在手邊要准備一張引導盤以防不測。

注意

debian系(包括Ubuntu)的runlevel級別定義如下: 0 – Halt,關機模式 1 – Single,單用戶模式 2 - Full multi-user with display manager (GUI) 3 - Full multi-user with display manager (GUI) 4 - Full multi-user with display manager (GUI) 5 - Full multi-user with display manager (GUI) 6 – Reboot,重啟 可以發現2~5級是沒有任何區別的。他們為多用戶模式,這和一般的linux不一樣。 我們可以對比下rc[?].d(debian系的rc[?].d在/etc/而非/etc/rc.d/目錄下,後者不存在)下的內容驗證上面的說法:

ubuntu與傳統的linux略有不同,它使用upstart完成系統的啟動(但表面上仍維持init程序的形式),系統啟動後處於哪一種級別傳統Linux由init讀取/etc/inittab文件中的缺省級別設置來確定,一般圖形界面的系統是進入級別3。

但是ubuntu與傳統的不太一樣,默認情況下是找不到/etc/inittab文件的,而且運行級別也有差別。同時系統的默認級別設定也不是在inittab文件中,而是寫在/etc/init/rc- sysinit.conf文件中。 打開此文件,可以找到下面一句: env DEFAULT_RUNLEVEL=2 這表明系統當前默認是進入級別2。 另外,在此文見中還有一段以if [ -r /etc/inittab ] 開始的代碼,這裡保留了使用inittab指定系統默認運行級別的功能,也就是說,如果用戶手動創建了/etc/inittab,那麼init將以 /etc/inittab中指定的默認運行級別進行系統的啟動。比如說用戶希望系統以級別3為默認運行級別,則只需在inittab文件中加入如下一行: id:3:initdefault: 在經過/etc/init/rc-sysinit.conf確定運行級別後,init將進一步運行/etc/init.d/rc,然後根據級別進入 /etc/rc[?].d啟動或關閉相應的服務。
Copyright © Linux教程網 All Rights Reserved