centos启动流程
啟動流程概覽
?
?init,/etc/inittab,runlevel介紹
在核心加載完畢、進行完硬件偵測與驅動程序加載后,此時你的主機硬件應該已經準備就緒了 (ready) , 此時核心會主動的呼叫第一支程序,那就是 /sbin/init 羅。?init 的 PID 號碼是一號啦。 /sbin/init 最主要的功能就是準備軟件運行的環境,包括系統的主機名稱、網絡配置、語系處理、文件系統格式及其他服務的啟動等。 而所有的動作都會透過 init 的配置檔,亦即是?/etc/inittab?來規劃,而 inittab 內還有一個很重要的配置項目,那就是默認的 runlevel (啟動運行等級) 啦!
Run level:運行等級有哪些?
那么什么是 run level 呢?他有什么功用啊?其實很簡單啦, Linux 就是藉由配置 run level 來規定系統使用不同的服務來啟動,讓 Linux 的使用環境不同。基本上,依據有無網絡與有無 X Window 而將 run level 分為 7 個等級,分別是:
- 0 - halt (系統直接關機)
- 1 - single user mode (單人維護模式,用在系統出問題時的維護)
- 2 - Multi-user, without NFS (類似底下的 runlevel 3,但無 NFS 服務)
- 3 - Full multi-user mode (完整含有網絡功能的純文字模式)
- 4 - unused (系統保留功能)
- 5 - X11 (與 runlevel 3 類似,但加載使用 X Window)
- 6 - reboot (重新啟動)
由於 run level 0, 4, 6 不是關機、重新啟動就是系統保留的,所以:『?您當然不能將默認的 run level 配置為這三個值?』, 否則系統就會不斷的自動關機或自動重新啟動.... 好了,那么我們啟動時,到底是如何取得系統的 run level 的?當然是 /etc/inittab 所配置的羅! 那么 /etc/inittab 到底有什么資訊呢?我們先來看看這個文件的內容好了:
/etc/inittab 的內容與語法
[root@www ~]# vim /etc/inittab id:5:initdefault: <==默認的 runlevel 配置, 此 runlevel 為 5 si::sysinit:/etc/rc.d/rc.sysinit <==準備系統軟件運行的環境的腳本運行檔# 7 個不同 run level 的,需要啟動的服務的 scripts 放置路徑: l0:0:wait:/etc/rc.d/rc 0 <==runlevel 0 在 /etc/rc.d/rc0.d/ l1:1:wait:/etc/rc.d/rc 1 <==runlevel 1 在 /etc/rc.d/rc1.d/ l2:2:wait:/etc/rc.d/rc 2 <==runlevel 2 在 /etc/rc.d/rc2.d/ l3:3:wait:/etc/rc.d/rc 3 <==runlevel 3 在 /etc/rc.d/rc3.d/ l4:4:wait:/etc/rc.d/rc 4 <==runlevel 4 在 /etc/rc.d/rc4.d/ l5:5:wait:/etc/rc.d/rc 5 <==runlevel 5 在 /etc/rc.d/rc5.d/ l6:6:wait:/etc/rc.d/rc 6 <==runlevel 6 在 /etc/rc.d/rc6.d/# 是否允許按下 [ctrl]+[alt]+[del] 就重新啟動的配置項目: ca::ctrlaltdel:/sbin/shutdown -t3 -r now# 底下兩個配置則是關於不斷電系統的 (UPS),一個是沒電力時的關機,一個是復電的處理 pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"1:2345:respawn:/sbin/mingetty tty1 <==其實 tty1~tty6 是由底下這六行決定的。 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6x:5:respawn:/etc/X11/prefdm -nodaemon <==X window 則是這行決定的!讓我們解析一下這個文件吧!首先,這個文件的語法是利用冒號 (:) 將配置分隔成為四個欄位,每個欄位的意義與說明如下:
[配置項目]:[run level]:[init 的動作行為]:[命令項目]| inittab 配置值 | 意義說明 |
| initdefault | 代表默認的 run level 配置值 |
| sysinit | 代表系統初始化的動作項目 |
| ctrlaltdel | 代表 [ctrl]+[alt]+[del] 三個按鍵是否可以重新啟動的配置 |
| wait | 代表后面欄位配置的命令項目必須要運行完畢才能繼續底下其他的動作 |
| respawn | 代表后面欄位的命令可以無限制的再生 (重新啟動)。舉例來說, tty1 的 mingetty 產生的可登陸畫面, 在你注銷而結束后,系統會再開一個新的可登陸畫面等待下一個登陸。 |
?
init 的處理流程
事實上 /etc/inittab 的配置也有點類似 shell script 啦,因為該文件內容的配置也是一行一行的從上往下處理的, 因此我們可以知道 CentOS 的 init 依據 inittab 配置的處理流程會是:
現在你可以知道為啥 [ctrl]+[alt]+[del] 可以重新啟動而我們默認提供 6 個虛擬終端機 (tty1~tty6) 給你使用了吧!由於整個配置都是依據 /etc/inittab 來決定的,因此如果你想要修改任何細節的話, 可以這樣做喔:
- 如果不想讓使用者利用 [crtl]+[alt]+[del] 來重新啟動系統,可以將『?ca::ctrlaltdel:/sbin/shutdown -t3 -r now?』加上注解 (#) 來取消該配置
- 規定啟動的默認 run level 是純文字的 3 號或者是具有圖形介面的 5 號 ,可經由 『?id:5:initdefault:?』那個數字來決定! 以鳥哥自己這個文件為例,我是使用默認的圖形介面。如果你想要關閉圖形介面的話,將該行 5 改成 3 即可。
- 如果不想要啟動六個終端機 (tty1~tty6),那么可以將『?6:2345:respawn:/sbin/mingetty tty6』關閉數個。但務必至少啟動一個喔!
所以說,你現在會自行修改登陸時的默認 run level 配置值了嗎?夠簡單的吧? 一般來說,我們默認都是 3 或者是 5 來作為默認的 run level 的。但有時后可能需要進入 run level 1, 也就是單人維護模式的環境當中。這個 run level 1 有點像是 Windows 系統當中的『安全模式』啦, 專門用來處理當系統有問題時的操作環境。此外,當系統發現有問題時,舉例來說,不正常關機造成 filesystem 的不一致現象時,系統會主動的進入單人維護模式呢!
好了, init 在取得 run level 之后,接下來要干嘛? 上面 /etc/inittab 文件內容不是有提到 sysinit 嗎?準備初始化系統了吧!
?
init 處理系統初始化流程 (/etc/rc.d/rc.sysinit)
還記得上面提到 /etc/inittab 里頭有這一句『 si::sysinit:/etc/rc.d/rc.sysinit 』吧? 這表示:『我開始加載各項系統服務之前,得先做好整個系統環境,我主要利用 /etc/rc.d/rc.sysinit 這個 shell script 來配置好我的系統環境的。』夠清楚了吧? 所以,我想要知道到底 CentOS 啟動的過程當中幫我進行了什么動作,就得要仔細的分析 /etc/rc.d/rc.sysinit 羅。
如果你使用 vim 去查閱過 /etc/rc.d/rc.sysinit 的話,那么可以發現他主要的工作大抵有這幾項:
讀取網絡配置檔 /etc/sysconfig/network ,取得主機名稱與默認通訊閘 (gateway) 等網絡環境。
除掛載內存裝置 /proc 之外,還會主動偵測系統上是否具有 usb 的裝置, 若有則會主動加載 usb 的驅動程序,并且嘗試掛載 usb 的文件系統。
SELinux 在此時進行一些檢測, 并且檢測是否需要幫所有的文件重新編寫標準的 SELinux 類型 (auto relabel)。
亂數產生器可以幫助系統進行一些口令加密演算的功能,在此需要啟動兩次亂數產生器。
根據核心在啟動時偵測的結果 (/proc/sys/kernel/modprobe ) 開始進行 ide / scsi / 網絡 / 音效 等周邊設備的偵測,以及利用以加載的核心模塊進行 PnP 裝置的參數測試。
使用者可以在 /etc/sysconfig/modules/*.modules 加入自訂的模塊,則此時會被加載到系統當中
系統會主動去讀取 /etc/sysctl.conf 這個文件的配置值,使核心功能成為我們想要的樣子。
在 /etc/rc.d/rc.sysinit 將基本的系統配置數據都寫好了,也將系統的數據配置完整! 而如果你想要知道到底啟動的過程中發生了什么事情呢?那么就運行『 dmesg 』吧。 另外,基本上,在這個文件當中所進行的很多工作的默認配置檔,其實都在 /etc/sysconfig/ 當中呢! 所以,請記得將 /etc/sysconfig/ 內的文件好好的瞧一瞧喔! ^_^
在這個過程當中,比較值得注意的是自訂模塊的加載!在 CentOS 當中,如果我們想要加載核心模塊的話, 可以將整個模塊寫入到 /etc/sysconfig/modules/*.modules 當中,在該目錄下, 只要記得檔名最后是以 .modules 結尾即可。 這個過程是非必要的,因為我們目前的默認模塊實在已經很夠用了,除非是您的主機硬件實在太新了, 非要自己加載新的模塊不可,否則,在經過 /etc/rc.d/rc.sysinit 的處理后, 你的主機系統應該是已經跑得很順暢了啦!就等著你將系統相關的服務與網絡服務啟動羅!
?
啟動系統服務與相關啟動配置檔 (/etc/rc.d/rc N & /etc/sysconfig)
加載核心讓整個系統準備接受命令來工作,再經過 /etc/rc.d/rc.sysinit 的系統模塊與相關硬件資訊的初始化后,你的 CentOS 系統應該已經順利工作了。 只是,我們還得要啟動系統所需要的各項『服務』啊!這樣主機才能提供我們相關的網絡或者是主機功能嘛! 這個時候,依據我們在 /etc/inittab 里面提到的 run level 配置值,就可以來決定啟動的服務項目了。 舉例來說,使用 run level 3 當然就不需要啟動 X Window 的相關服務羅,您說是吧?
那么各個不同的 run level 服務啟動的各個 shell script 放在哪?還記得 /etc/inittab 里面提到的:
l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 <==本例中,以此項目來解釋 l6:6:wait:/etc/rc.d/rc 6上面提到的就是各個 run level 要運行的各項腳本放置處啦!主要是透過 /etc/rc.d/rc 這個命令來處理相關任務! 由於鳥哥使用默認的 runlevel 5 ,因此我們主要針對上述特殊字體那行來解釋好了: /etc/rc.d/rc 5 的意義是這樣的 (建議您自行使用 vim 去觀察一下 /etc/rc.d/rc 這個文件,你會更有概念!):
- 透過外部第一號參數 ($1) 來取得想要運行的腳本目錄。亦即由 /etc/rc.d/rc?5?可以取得 /etc/rc5.d/ 這個目錄來準備處理相關的腳本程序;
- 找到 /etc/rc5.d/K??* 開頭的文件,并進行『 /etc/rc5.d/K??* stop 』的動作;
- 找到 /etc/rc5.d/S??* 開頭的文件,并進行『 /etc/rc5.d/S??* start 』的動作;
透過上面的說明我們可以知道所有的項目都與 /etc/rc5.d/ 有關,那么我們就來瞧瞧這個目錄下有些什么玩意兒吧!
[root@www ~]# ll /etc/rc5.d/ lrwxrwxrwx 1 root root 16 Sep 4 2008 K02dhcdbd -> ../init.d/dhcdbd ....(中間省略).... lrwxrwxrwx 1 root root 14 Sep 4 2008 K91capi -> ../init.d/capi lrwxrwxrwx 1 root root 23 Sep 4 2008 S00microcode_ctl -> ../init.d/microcode_ctl lrwxrwxrwx 1 root root 22 Sep 4 2008 S02lvm2-monitor -> ../init.d/lvm2-monitor ....(中間省略).... lrwxrwxrwx 1 root root 17 Sep 4 2008 S10network -> ../init.d/network ....(中間省略).... lrwxrwxrwx 1 root root 11 Sep 4 2008 S99local -> ../rc.local lrwxrwxrwx 1 root root 16 Sep 4 2008 S99smartd -> ../init.d/smartd ....(底下省略)....在這個目錄下的文件很有趣,主要具有幾個特點:
- 檔名全部以 Sxx 或 Kxx ,其中 xx 為數字,且這些數字在文件之間是有相關性的!
- 全部是連結檔,連結到 stand alone 服務啟動的目錄 /etc/init.d/ 去
服務的啟動主要是以『/etc/init.d/服務檔名 {start,stop}』來啟動與關閉的,那么透過剛剛 /etc/rc.d/rc 程序的解說,我們可以清楚的了解到了 /etc/rc5.d/[SK]xx 其實就是跑到 /etc/init.d/ 去找到相對應的服務腳本, 然后分別進行 start (Sxx) 或 stop (Kxx) 的動作而已啦!舉例來說,以上述的表格內的 K91capi 及 S10network 為例好了, 透過 /etc/rc.d/rc 5 的運行,這兩個文件會這樣進行:
- /etc/rc5.d/K91capi stop --> /etc/init.d/capi stop
- /etc/rc5.d/S10network start --> /etc/init.d/network start
所以說,你有想要啟動該 runlevel 時就運行的服務,那么利用 Sxx 并指向 /etc/init.d/ 的特定服務啟動腳本后, 該服務就能夠在啟動時啟動啦!就這么簡單!問題是,你需要自行處理這個 K, S 開頭的連結檔嗎? 并不需要的,chkconfig?就是在負責處理這個連結檔啦!這樣有沒有跟第十八章的觀念串在一起了呢? ^_^
那么為什么 K 與 S 后面要有數字呢?因為各不同的服務其實還是互有關系的。舉例來說,如果要啟動 WWW 服務,總是得要有網絡吧?所以 /etc/init.d/network 就會比較先被啟動啦!那么您就會知道在 S 或者是 K 后面接的數字是啥意思了吧?嘿嘿,那就是運行的順序啦!那么哪個文件被最后運行呢? 看到最后一個被運行的項目是啥?沒錯,就是 S99local ,亦即是:/etc/rc.d/rc.local?這個文件啦!
?
使用者自訂啟動啟動程序 (/etc/rc.d/rc.local)
在完成默認 runlevel 指定的各項服務的啟動后,如果我還有其他的動作想要完成時,舉例來說, 我還想要寄一封 mail 給某個系統管理帳號,通知他,系統剛剛重新啟動完畢,那么是否應該要制作一個 shell script 放置在 /etc/init.d/ 里面,然后再以連結方式連結到 /etc/rc5.d/ 里面呢?呵呵!當然不需要!還記得上一小節提到的 /etc/rc.d/rc.local 吧? 這個文件就可以運行您自己想要運行的系統命令了。
也就是說,我有任何想要在啟動時就進行的工作時,直接將他寫入 /etc/rc.d/rc.local , 那么該工作就會在啟動的時候自動被加載喔!而不必等我們登陸系統去啟動呢! 是否很方便啊!一般來說,鳥哥就很喜歡把自己制作的 shell script 完整檔名寫入 /etc/rc.d/rc.local ,如此一來,啟動就會將我的 shell script 運行過,真是好棒那!
?
根據 /etc/inittab 之配置,加載終端機或 X-Window 介面
在完成了系統所有服務的啟動后,接下來 Linux 就會啟動終端機或者是 X Window 來等待使用者登陸啦! 實際參考的項目是 /etc/inittab 內的這一段:
1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 x:5:respawn:/etc/X11/prefdm -nodaemon這一段代表,在 run level 2, 3, 4, 5 時,都會運行 /sbin/mingetty 這個咚咚, 而且運行六個,這也是為何我們 Linux 會提供『六個純文字終端機』的配置所在啊! 因為 mingetty 就是在啟動終端機的命令說。
要注意的是那個 respawn 的 init 動作項目,他代表『當后面的命令被終止 (terminal) 時, init 會主動的重新啟動該項目。』這也是為何我們登陸 tty1 終端機介面后,以 exit 離開后, 系統還是會重新顯示等待使用者輸入的畫面的原因啊!
如果改天您不想要有六個終端機時,可以取消某些終端機介面嗎?當然可以啊! 就將上面表格當中的某些項目注解掉即可!例如不想要 tty5 與 tty6 ,就將那兩行注解, 則下次重新啟動后,您的 Linux 就只剩下『 F1 ~ F4 』有效而已,這樣說,可以了解吧!!^_^
至於如果我們使用的是 run level 5 呢?那么除了這六個終端機之外, init 還會運行 /etc/X11/prefdm -nodaemon 那個命令喔!?他主要的功能就是在啟動 X Window 啦!
?
啟動過程會用到的主要配置檔
我們在 /sbin/init 的運行過程中有談到許多運行腳本,包括 /etc/rc.d/rc.sysinit 以及 /etc/rc.d/rc 等等, 其實這些腳本都會使用到相當多的系統配置檔,這些啟動過程會用到的配置檔則大多放置在 /etc/sysconfig/ 目錄下。 同時,由於核心還是需要加載一些驅動程序 (核心模塊),此時系統自訂的裝置與模塊對應檔 (/etc/modprobe.conf) 就顯的挺重要了喔!
關於模塊: /etc/modprobe.conf
/etc/rc.d/rc.sysinit?當中的加載使用者自訂模塊的地方嗎?就是在 /etc/sysconfig/modules/ 目錄下啊! 雖然核心提供的默認模塊已經很足夠我們使用了,但是,某些條件下我們還是得對模塊進行一些參數的規劃, 此時就得要使用到 /etc/modprobe.conf 羅!舉例來說,鳥哥的 CentOS 主機的 modprobe.conf 有點像這樣:
[root@www ~]# cat /etc/modprobe.conf alias eth0 8139too <==讓 eth0 使用 8139too 的模塊 alias scsi_hostadapter pata_sis alias snd-card-0 snd-trident options snd-card-0 index=0 <==額外指定 snd-card-0 的參數功能 options snd-trident index=0以上表的第一行為例,鳥哥使用螃蟹卡 (Realtek 的芯片組) 來作為我的網絡卡,那螃蟹卡使用的模塊就是 8139too 啦!這樣看的懂了吧?當我要啟動網絡卡時,系統會跑到這個文件來查閱一下,然后加載 8139too 驅動程序來驅動網絡卡羅!更多的相關說明,請 man modprobe.conf 喔!這個文件大多在指定系統內的硬件所使用的模塊啦!這個文件通常系統是可以自行產生的,所以你不必手動去訂正他! 不過,如果系統捉到錯誤的驅動程序,或者是你想要使用升級的驅動程序來對應相關的硬件配備時, 你就得要自行手動的處理一下這個文件了。
?/etc/sysconfig/*
? 不說您也知道,整個啟動的過程當中,老是讀取的一些服務的相關配置檔都是記錄在 /etc/sysconfig 目錄下的!那么該目錄底下有些啥玩意兒?我們找幾個重要的文件來談談:
- authconfig:
這個文件主要在規范使用者的身份認證的機制,包括是否使用本機的 /etc/passwd, /etc/shadow 等, 以及 /etc/shadow 口令記錄使用何種加密演算法,還有是否使用外部口令服務器提供的帳號驗證 (NIS, LDAP) 等。 系統默認使用 MD5 加密演算法,并且不使用外部的身份驗證機制;
- clock:
此文件在配置 Linux 主機的時區,可以使用格林威治時間(GMT),也可以使用臺灣的本地時間 (local)。基本上,在?clock 文件內的配置項目『 ZONE 』所參考的時區位於 /usr/share/zoneinfo 目錄下的相對路徑中。而且要修改時區的話,還得將 /usr/share/zoneinfo/Asia/Taipei 這個文件復制成為 /etc/localtime 才行!
- i18n:
i18n 在配置一些語系的使用方面,例如最麻煩的文字介面下的日期顯示問題! 如果你是以中文安裝的,那么默認語系會被選擇 zh_TW.UTF8 ,所以在純文字介面之下, 你的文件日期顯示可能就會呈現亂碼!這個時候就需要更改一下這里啦!更動這個 i18n 的文件,將里面的 LC_TIME 改成 en 即可!
- keyboard & mouse:
keyboard 與 mouse 就是在配置鍵盤與鼠標的形式;
- network:
network 可以配置是否要啟動網絡,以及配置主機名稱還有通訊閘 (GATEWAY) 這兩個重要資訊呢!
- network-scripts/:
至於 network-scripts 里面的文件,則是主要用在配置網絡卡~?
總而言之一句話,這個目錄下的文件很重要的啦!啟動過程里面常常會讀取到的!
?
Run level 的切換
在我們完成上面的所有資訊后,其實整個 Linux 主機就已經在等待我們使用者的登陸啦! 但是,相信您應該還是會有一點疑問的地方,那就是:『我該如何切換 run level 呢?』會不會很難啊?不會啦!很簡單~但是依據運行的時間而有不同的方式啊!
事實上,與 run level 有關的啟動其實是在 /etc/rc.d/rc.sysinit 運行完畢之后。也就是說,其實 run level 的不同僅是 /etc/rc[0-6].d 里面啟動的服務不同而已。不過,依據啟動是否自動進入不同 run level 的配置,我們可以說:
假設原本我們是以 run level 5 登陸系統的,但是因為某些因素,想要切換成為 run level 3 時, 該怎么辦呢?很簡單啊,運行『 init 3 』即可切換。但是 init 3 這個動作到底做了什么呢? 我們不是說了嗎?事實上,不同的 run level 只是加載的服務不同罷了, 亦即是 /etc/rc5.d/ 還有 /etc/rc3.d 內的 Sxxname 與 Kxxname 有差異而已。 所以說,當運行 init 3 時,系統會:
- 先比對 /etc/rc3.d/ 及 /etc/rc5.d 內的 K 與 S 開頭的文件;
- 在新的 runlevel 亦即是 /etc/rc3.d/ 內有多的 K 開頭文件,則予以關閉;
- 在新的 runlevel 亦即是 /etc/rc3.d/ 內有多的 S 開頭文件,則予以啟動;
也就是說,兩個 run level 都存在的服務就不會被關閉啦!如此一來,就很容易切換 run level 了, 而且還不需要重新啟動呢!真方便。那我怎么知道目前的 run level 是多少呢? 直接在 bash 當中輸入 runlevel 即可啊!
[root@www ~]# runlevel N 5 # 左邊代表前一個 runlevel ,右邊代表目前的 runlevel。 # 由於之前并沒有切換過 runlevel ,因此前一個 runlevel 不存在 (N)# 將目前的 runlevel 切換成為 3 (注意, tty7 的數據會消失!) [root@www ~]# init 3 NIT: Sending processes the TERM signal Applying Intel CPU microcode update: [ OK ] Starting background readahead: [ OK ] Starting irqbalance: [ OK ] Starting httpd: [ OK ] Starting anacron: [ OK ] # 這代表,新的 runlevel 亦即是 runlevel3 比前一個 runlevel 多出了上述 5 個服務[root@www ~]# runlevel 5 3 # 看吧!前一個是 runlevel 5 ,目前的是 runlevel 3 啦!那么你能不能利用 init 來進行關機與重新啟動呢?可以的啦!利用『 init 0 』就能夠關機, 而『 init 6 』就能夠重新啟動!為什么?往前翻一下 runlevel 的定義即可了解吧!
?
總結
以上是生活随笔為你收集整理的centos启动流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 根据centos系统启动过程定位故障位置
- 下一篇: 空间插值方法对比整理