linux開機執行核心後會啟動init程序,該程序根據runlevel(如x)執行/etc/rcx.d/下的程式,其下的程式是符號鏈結,真正的程式放在/etc/init.d/下。開機啟動的程式(服務等)皆為此套路。
init是第乙個使用者程序。最主要的功能就是準備軟體執行的環境,包括系統的主機名,網路設定,語系設定,系統檔案格式及其他服務的啟動。
linux開機啟動程式詳解
我們假設大家已經熟悉其它作業系統的引導過程,了解硬體的自檢引導步驟,就只從linux作業系統的引導引導程式(對個人電腦而言通常是lilo)開始,介紹linux開機引導的步驟。
載入核心
lilo啟動之後,如果你選擇了linux作為準備引導的作業系統,第乙個被載入的東西就是核心。請記住此時的計算機記憶體中還不存在任何作業系統,pc(因為它們天然的設計缺陷)也還沒有辦法訪問機器上全部的記憶體。因此,核心就必須完整地載入到可用ram的第乙個兆位元組之內。為了實現這個目的,核心是被壓縮了的。這個檔案的頭部包含著必要的**,先設定cpu進入安全模式(以此解除記憶體限制),再對核心的剩餘部分進行解壓縮。
執行核心
核心在記憶體中解壓縮之後,就可以開始執行了。此時的核心只知道它本身內建的各種功能,也就是說被編譯為模組的核心部分還不能使用。最基本的是,核心必須有足夠的**設定自己的虛擬記憶體子系統和根檔案系統(通常就是ext2檔案系統)。一旦核心啟動執行,對硬體的檢測就會決定需要對哪些裝置驅動程式進行初始化。從這裡開始,核心就能夠掛裝根檔案系統(這個過程類似於windows識別並訪問c盤的過程)。核心掛裝了根檔案系統之後,將啟動並執行乙個叫做init的程式。
init程序
init程序是非核心程序中第乙個被啟動執行的,因此它的程序編號pid的值總是1。init讀它的配置檔案/etc/inittab,決定需要啟動的執行級別(runlevel)。從根本上說,執行級別規定了整個系統的行為,每個級別(分別由0到6的整數表示)滿足特定的目的。如果定義了initdefault級別,這個值就直接被選中,否則需要由使用者輸入乙個代表執行級別的數值。
關於linux init系統發展過程(sysvinit -> upstart -> systemd),可參閱:
readhat系(如centos)的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引數並完成相應的操作。
●在試圖執行它之前驗證這個命令指令碼程式確實存在;
注意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啟動或關閉相應的服務。
相關:
linux 開機啟動過程詳解
linux開機執行核心後會啟動init程序,該程序根據runlevel 如x 執行 etc rcx.d 下的程式,其下的程式是符號鏈結,真正的程式放在 etc init.d 下。開機啟動的程式 服務等 皆為此套路。init是第乙個使用者程序。最主要的功能就是準備軟體執行的環境,包括系統的主機名,網路...
Linux開機啟動過程詳解
計算機開機是乙個神秘的過程。我們只是按了開機鍵,就看到螢幕上的進度條或者一行行的輸出,直到我們到達登入介面。然而,計算機開機又是個異常脆弱的過程,我們滿心期望的登入介面可能並不會出現,而是乙個命令列或者錯誤資訊。了解計算機開機過程有助於我們修復開機可能出現的問題。最初始階段 當我們開啟計算機電源,計...
linux開機啟動過程
a.bios basic input output system 開機自檢,讀取硬體資訊,並選擇啟動裝置 b.讀取啟動裝置的mbr major boot record 如果是多系統引導則選擇啟動的分割槽 boot sector 否則進入c c.讀取並解壓核心檔案,檢測並驅動硬體 d.驅動硬體完畢後,...