前言
一個正常的Linux系統(tǒng)通常倆說開關(guān)機的機會不多鳞仙,但是如果能夠清楚了解linux系統(tǒng)開機的流程韧涨,對于系統(tǒng)維護來說是有益無害的振坚,與此同時也能加深對Linux系統(tǒng)的了解玖翅。
下圖為Centos 6 Linux系統(tǒng)啟動的大體流程张肾,可以概括為:POST加電-->BIOS-->GRUB-->kernel-->init 五個階段判导。
POST加電自檢
Linux系統(tǒng)在接通電源后恃锉,首先系統(tǒng)會啟動POST程序來對內(nèi)部的各個配件進行自檢棺牧,若自檢過程中發(fā)現(xiàn)錯誤,則有可能出現(xiàn)下述兩種情況:若出現(xiàn)的錯誤為嚴重錯誤犹菱,則系統(tǒng)會停機拾稳,無法開啟;若出現(xiàn)的錯誤為非嚴重錯誤腊脱,則系統(tǒng)會發(fā)出報警提示或聲音報警熊赖,用戶可根據(jù)相關(guān)提示判斷錯誤的類型。
BIOS
加電自檢完后虑椎,系統(tǒng)啟動進入了BIOS階段震鹉。在此階段系統(tǒng)會啟動Boot Sequence來查找各引導設(shè)備俱笛,當查找到第一個有引導程序的設(shè)備時,該設(shè)備即為本次啟動要用到的設(shè)備传趾。隨后BIOS會讀取該引導設(shè)備中的MBR來進行系統(tǒng)啟動的下一階段迎膜。MBR表通常為硬盤的第一個扇區(qū),大小為512字節(jié)浆兰,其中前446個字節(jié)為bootloader磕仅,其后緊跟的64個字節(jié)為分區(qū)表,剩下兩個字節(jié)為結(jié)束標識簸呈。
GRUB
在BIOS讀取了MBR后榕订,系統(tǒng)就來到了GRUB啟動引導階段。其實Linux還有一個啟動工具叫LILO蜕便,但是其全面性和靈活性都不及grub劫恒,還容易因為配置的失誤導致MBR錯誤。GRUB引導階段大致分為三個階段:
1轿腺、1st stage:啟動Boot loader來加載2nd stage的內(nèi)容至內(nèi)存中两嘴。
2、1.5 stage:位于MBR的分區(qū)表中族壳,能夠識別出2nd stage所在的分區(qū)上的文件系統(tǒng)憔辫。
3、2nd stage :讀取配置文件/etc/grub/grub.conf仿荆,該文件為grub啟動提供了菜單及加載的kernel位置贰您,當kernel被成功加載到內(nèi)存中的時候,系統(tǒng)進入到kernel啟動階段拢操。
kernel
當系統(tǒng)啟動來到了kernel階段锦亦,kernel為Linux系統(tǒng)的核心程序。進入kernel階段后庐冯,系統(tǒng)會先探測可識別的所有硬件設(shè)備,隨后kernel會加載硬件驅(qū)動程序坎穿,并在內(nèi)存中生成一個臨時的只讀的rootfs系統(tǒng)展父。這個臨時的rootfs系統(tǒng)通常是由initrd文件生成的,該文件在grub的2nd stage就被拷貝進內(nèi)存玲昧,該文件包含了必要的驅(qū)動模塊栖茉,在掛載了真正的rootfs后,initrd才會從內(nèi)存中被移除掉孵延。在運行了臨時的rootfs系統(tǒng)后吕漂,系統(tǒng)將開始運行第一個程序/sbin/init。
在Centos 6中系統(tǒng)的初始化程序是/sbin/init尘应,但是到了Centos 7 則該用了systemd作為系統(tǒng)的初始化程序惶凝。
init初始化
到了這個階段吼虎,系統(tǒng)開始進行完成啟動前的初始化操作,其實際上是根據(jù)/etc/inittab的設(shè)定進行腳本執(zhí)行苍鲜。第一個執(zhí)行的腳本為/etc/rc.d/rc.sysinit思灰,這是系統(tǒng)的初始化腳本,其完成的操作有下述幾點:
1)設(shè)置主機名混滔;
2)設(shè)置歡迎信息洒疚;
3)激活udev和selinux;
4)掛載/etc/fstab文件中定義的所有文件系統(tǒng)坯屿;
5)檢測根文件系統(tǒng)油湖,并以讀寫方式重新掛載根文件系統(tǒng);
6)設(shè)置系統(tǒng)時鐘领跛;
7)根據(jù)/etc/sysctl.conf文件來設(shè)置內(nèi)核參數(shù)乏德;
8)激活lvm及軟raid設(shè)備;
9)激活swap設(shè)備隔节;
10)加載額外設(shè)備的驅(qū)動程序鹅经;
11)清理過期的鎖和進程文件;
執(zhí)行完成后怎诫,根據(jù)配置/etc/inittab文件中定義啟動級別執(zhí)行對應級別目錄下的腳本瘾晃,最后執(zhí)行/etc/rc.d/rc.local腳本文件完成系統(tǒng)啟動。
Runlevel
runlevel運行級別幻妓,不同的運行級別對應的運行的服務(wù)不一樣蹦误,init程序會根據(jù)相應的級別去執(zhí)行相應目錄下的腳本,Linux的啟動級別分為:
級別 | 說明 | 對應目錄 |
---|---|---|
0 | 關(guān)機模式 | /etc/rc.d/rc0.d/ |
1 | 單用戶模式 | /etc/rc.d/rc1.d/ |
2 | 多用戶模式(不加載網(wǎng)絡(luò)驅(qū)動) | /etc/rc.d/rc2.d/ |
3 | 多用戶模式(常規(guī)模式) | /etc/rc.d/rc3.d/ |
4 | 保留 | /etc/rc.d/rc4.d/ |
5 | 圖形化模式 | /etc/rc.d/rc5.d/ |
6 | 重啟 | /etc/rc.d/rc6.d/ |
上述各級別對應的目錄下包含著各種以K和S開頭的腳本文件肉津,K開頭的表示系統(tǒng)啟動后需要關(guān)閉的服務(wù)强胰,S開頭表系統(tǒng)啟動后需要開啟的服務(wù)。