首先要說一下這部分內容,只是幫助大家瞭解
Linux
系統的啓動
流程,這樣當
Linux
系統在啓動過程
中遇到故障,我們可以很清楚到底是在哪一步遇到問題,然後我們就可以針對性地去排查故障。先來一張
圖幫助大家理解啓動流程爲了更好地體驗大家可以在線觀看
http://www.apelearn.com/study_v2/boot.jpg
。
第一階段,硬件引導啓動。首先是
BIOS
加電自檢,
BIOS
找啓動介質,是硬盤還是光盤或者其他啓動
介質,然後再啓動介質中找到
MBR
。
M
BR
是啓動介質(比如硬盤)的第一個分區的第一個扇區,大小爲
22
512
字節。其中前面
446
字節是
bootloader
(
CentOS
安裝的時候會安裝一個
grub
程序在這裏),緊接着的
64
字節是分區表,最後面
2
字節是用來校驗的,我們把它叫做
55AA
。
第二階段,
grub
啓動引導程序。既然找到了
MBR
,那麼就找到了
grub
,它就是一個引導程序,它會
幫我們引導我們想啓動的系統,
grub
引導分爲兩個階段執行
stage1
和
stage2
。
stage1
是直接在
MBR
中的,
也就是那前面
446
字節裏面,而
stage2
比較大不能放到
M
BR
裏,所以只能放到文件系統裏,按理說
stage1
執行後就直接調用
stage2
了。但對於目前較新的文件系統(比如
ext4
)來說,
stage2
是不能識別到的,所
以還得藉助於一箇中間橋樑
stage1_5
來識別
stage2
所在的文件系統。當
stage2
被執行後,它就會去解析配
置文件
/boot/grub/grub.conf
,在該配置文件中它又找到了內核和內核映像
(initrd
)的位置。
第三階段內核引導階段。內核和內核映像(
initrd
)找到了,所以內核接管控制權。按理說內核能夠識
別到幾乎所有的硬件設備,但實際上內
核的身材是非常小的,它只含有最基本的硬件驅動,而其他有常見
硬件驅動是在
initrd
中的。所以在這一階段,
initrd
先釋放到內存中,臨時構成一個只讀的文件系統,在這
個只讀的文件系統中,內核去執行臨時文件系統裏面的
init
進程,目的是加載各種硬件的驅動。當所需的
驅動加載完後,內核再次掛載真正的根文件系統,內核把控制器教給了
/sbin/init
進程。
第四階段系統初始化階段。
/sbin/init
進程是系統其他所有進程的父進程,當它接管了系統的控制權先
之後,它首先會去讀取
/etc/inittab
文件來執行相應的腳
本進行系統初始化,如設置鍵盤、字體,裝載模塊,
設置網絡等。主要包括以下工作:
1)
執行系統初始化腳本
(/etc/rc.d/rc.sysinit)
,對系統進行基本的配置,以讀寫方式掛載根文件系統及其
它文件系統,到此係統算是基本運行起來了,後面需要進行運行級別的確定及相應服務的啓動。
rc.sysinit
所做的事情
(
不同的
Linux
發行版,該文件可能有些差異
)
如下:
(
1
)獲取網絡環境與主機類型。首先會讀取網絡環境設置文件
"/etc/sysconfig/network"
,獲取主機名
稱與默認網關等網絡環境。
(
2
)測試與載入內存設備
/proc
及
usb
設備
/sys
。除了
/proc
外,系統會主動檢測是否有
usb
設備,並
主動加載
usb
驅動,嘗試載入
usb
文件系統。
(
3
)決定是否啓動
SELinux
。
(
4
)接口設備的檢測與即插即用(
pnp
)參數的測試。
(
5
)用戶自定義模塊的加載。用戶可以再
"/etc/sysconfig/modules/*.modules"
加入自定義的模塊,此時
會加載到系統中。
23
(
6
)加載核心的相關設置。按
"/etc/sysctl.conf"
這個文件的設置值配置功能。
(
7
)設置系統時間(
clock
)。
(
8
)設置終端的控制檯的字形。
(
9
)設置
raid
及
LVM
等硬盤功能。
(
10
)以方式查看檢驗磁盤文件系統。
(
11
)進行磁盤配額
quota
的轉換。
(
12
)重新以讀取模式載入系統磁盤。
(
13
)啓動
quota
功能。
(
14
)啓動系統隨機數設備(產生隨機數功能)。
(
15
)清楚啓動過程中的臨時文件。
(
16
)將啓動信息加載到
"/var/log/dmesg"
文件中。
當
/etc/rc.d/rc.sysinit
執行完後,系統就可以順利工作了,只是還需要啓動系統所需要的各種服務,這
樣主機纔可以提供相關的網絡和
主機功能,因此便會執行下面的腳本。
2)
執行
/etc/rc.d/rc
腳本。該文件定義了服務啓動的順序是先
K
後
S
,而具體的每個運行級別的服務狀
態是放在
/etc/rc.d/rc*.d
(
*=0~6
)目錄下,所有的文件均是指向
/etc/init.d
下相應文件的符號鏈接。
rc.sysinit
通過分析
/etc/inittab
文件來確定系統的啓動級別,然後纔去執行
/etc/rc.d/rc*.d
下的文件。
/etc/init.d
-
> /etc/rc.d/init.d
/etc/rc
-
>/etc/rc.d/rc
/etc
/rc*.d
-
>/etc/rc.d/rc*.d
/etc/rc.local
-
> /etc/rc.d/rc.local
/etc/rc.sysinit
-
> /etc/rc.d/rc.sysinit
也就是說,
/etc
目錄下的
init.d
、
rc
、
rc*.d
、
rc.local
和
rc.sysinit
均是指向
/etc/rc.d
目錄下相應文件和文
件夾的符號鏈接。我們以啓動級別
3
爲例來簡要說明一下。
24
/etc/rc.d/rc3.d
目錄,該目錄下的內容全部都是以
S
或
K
開頭的鏈接文件,都鏈接到
"/etc/rc.d/init
.d"
目
錄下的各種
shell
腳本。
S
表示的是啓動時需要
start
的服務內容,
K
表示關機時需要關閉的服務內容。
/etc/rc.d/rc*.d
中的系統服務會在系統後臺啓動,如果要對某個運行級別中的服務進行更具體的定製,通過
chkconfig
命令來操作,或者通過
setup
、
ntsys
、
system
-
config
-
services
來進行定製。如果我們需要自己增加
啓動的內容,可以在
init.d
目錄中增加相關的
shell
腳本,然後在
rc*.d
目錄中建立鏈接文件指向該
shell
腳
本。這些
shell
腳本的啓動或結束順序是由
S
或
K
字母后面的數字決定,數字越小的腳本越先執行。例如,
/etc/rc.d/rc3.d /S01sysstat
就比
/etc/rc.d/rc3.d /S99local
先執行。
3)
執行用戶自定義引導程序
/etc/rc.d/rc.local
。其實當執行
/etc/rc.d/rc3.d/S99local
時,它就是在執行
/etc/rc.d/rc.local
。
S99local
是指向
rc.local
的符號鏈接。就是一般來說,自定義的程序不需要執行上面所說
的繁瑣
地
建立
shell
增加鏈接文件的步驟,只需要將命令放在
rc.l
ocal
裏面就可以了,這個
shell
腳本就是保
留給用戶自定義啓動內容的。
4)
完成了系統所有的啓動任務後,
linux
會啓動終端或
X
-
Window
來等待用戶登錄。
tty1,tty2,tty3...
這
表示在運行等級
1
,
2
,
3
,
4
的時候,都會執行
"/sbin/mingetty"
,而且執行了
6
個,所以
linux
會有
6
個純
文本終端,
mingetty
就是啓動終端的命令。
除了這
6
個之外還會執行
"/etc/X11/prefdm
-
nodaemon"
這個主要啓動
X
-
Window
。至此,系統就啓動完
畢了