CentOS系統的啓動流程:
啓動分爲:內核空間、用戶空間
一、內核級別啓動:
1、 POST:Power on system test
加電自檢:ROM:CMOS;BIOS;ROM+RAM
自檢的功能需要一個軟件程序來實現,即BIOS(Basic Input Output System)基本輸入輸出系統;它被裝載在一個硬件芯片CMOS之上,加電過程即給CMOS通電,然後啓動其上的BIOS程序,BIOS程序會根據CMOS上的一些配置信息去讀取硬件設備信息並檢測其是否存在並能正常運行,之後進行硬件設備的初始化。
2、 Bootsequence:(BIOS) 按次序尋找各引導設備,第一個有引導程序的設備即爲本次啓動要用到的設備。
3、 Bootloader:(MBR) 引導加載器
功能:提供一個菜單,允許用戶選擇要啓動的系統或不同的內核版本;
用戶選定的內核裝至RAM的特定空間中,解壓,展開,而後把系統控制權移交給內核。
所在位置: MBR,Master Boot Record 主引導記錄,一共512bytes
446bytes:bootloader
64bytes:磁盤分區表DPT:Disk Partition Table
2bytes:55AA,結束標誌
GRUB是目前使用最多最廣泛的Linux啓動管理程序,還有一種比較古老的啓動管理程序Lilo
GRUB:
bootloader: 1stage:運行Bootloader主程序,這個程序必須被安裝在啓動區,即MBR中。因爲MBR空間有限,因此在MBR中僅安裝Bootloader的最小主程序,並沒有安裝相關配置文件。
partition:filesystem driver,1.5stage:在MBR隨後的扇區中存放,主要用於與stage2所在分區的文件系統進行交互。
partition:/boot/grub,2stage:通過Bootloader加載所有配置文件及相關的環境參數信息,這些配置文件及相關的環境參數都存放於磁盤分區上的/boot/grub目錄下。
4、 Kernel:加載系統內核kernel,執行系統初始化信息
自身初始化:
探測可識別到的所有硬件設備
加載硬件驅動程序;(有可能會藉助於ramdisk加載驅動)
以只讀方式掛在根文件系統
運行用戶空間的第一個應用程序:/sbin/init
在此處需要藉助一個虛擬文件系統:RAMdisk:位於/boot目錄下,以initrd開頭的文件。
Linux內核的特性之一:使用緩衝和緩存來加速對磁盤上的文件訪問;
ramdisk --> rootfs:
CentOS 5: initrd 工具程序:mkinitrd
CentOS 6,7: initramfs 工具程序:dracut, mkinitrd
在虛擬根文件系統上加載合適的驅動程序,加載硬盤等設備,之後釋放虛擬的根文件系統,並以只讀方式掛載磁盤上真正的根文件系統,之後就開始正常的啓動過程。
5、 啓動用戶空間的第一個執行程序:/sbin/init
init程序的類型
CentOS 5-:SysV init 配置文件:/etc/inittab
CentOS 6:Upstart 配置文件:/etc/inittab;/etc/init/*.conf
CentOS 7:Systemd 配置文件:/usr/lib/systemd/system/, /etc/systemd/system/
系統初始化流程(內核級別):
POST --> BootSequence(BIOS) --> BootLoader(MBR)--> Kernel(ramdisk)--> rootfs(readonly)--> /sbin/init ()
二、用戶空間啓動:
CentOS 5
1、 /sbin/init
2、 設置默認運行級別
運行級別:爲了系統的運行或維護等目的而設定的機制;
0-6:7個級別;
0:關機, shutdown
1:單用戶模式(single user),root用戶,無須認證;維護模式;
2、多用戶模式(multi user),會啓動網絡功能,但不會啓動NFS;維護模式;
3、多用戶模式(mutli user),完全功能模式;文本界面;
4、預留級別:目前無特別使用目的,但習慣以同3級別功能使用;
5、多用戶模式(multi user), 完全功能模式,圖形界面;
6、重啓,reboot
默認級別:3, 5
級別切換:init #
級別查看:who -r runlevel
配置文件:/etc/inittab
每行定義一種action以及與之對應的process
id:runlevels:action:process
id:一個任務的標識符;
runlevels:在哪些級別啓動此任務;#,###,也可以爲空,表示所有級別;
action:在什麼條件下啓動此任務;
process:任務;
action:
wait:等待切換至此任務所在的級別時執行一次;
respawn:一旦此任務終止,就自動重新啓動之;
initdefault:設定默認運行級別;此時,process省略;
sysinit:設定系統初始化方式,此處一般爲指定/etc/rc.d/rc.sysinit腳本;
3、 運行系統初始化腳本,完成系統初始化
系統初始化腳本:/etc/rc.d/rc.sysinit
(1) 設置主機名;
(2) 設置歡迎信息;
(3) 激活udev和selinux;
(4) 掛載/etc/fstab文件中定義的所有文件系統;
(5) 檢測根文件系統,並以讀寫方式重新掛載根文件系統;
(6) 設置系統時鐘;
(7) 根據/etc/sysctl.conf文件來設置內核參數;
(8) 激活lvm及軟raid設備;
(9) 激活swap設備;
(10) 加載額外設備的驅動程序;
(11) 清理操作;
4、 關閉對應級別下需要停止的服務,啓動對應級別下需要開啓的服務
啓動或關閉/etc/rc.d/rc#.d/目錄下的服務腳本所控制服務;
K*:要停止的服務;K##*,優先級,數字越小,越是優先關閉;依賴的服務先關閉,而後關閉被依賴的;
S*:要啓動的服務;S##*,優先級,數字越小,越是優先啓動;被依賴的服務先啓動,而依賴的服務後啓動;
5、 啓動終端
CentOS6
init程序:upstart,但依然爲/sbin/init,其配置文件:
/etc/init/*.conf, /etc/inittab(僅用於定義默認運行級別)
注意:*.conf爲upstart風格的配置文件;
CentOS7
init程序:systemd,配置文件:/usr/lib/systemd/system/*,
/etc/systemd/system/*
全兼容SysV腳本機制;因此,service命令依然可用;不過,建議使用systemctl命令來控制服務;
# systemctl {start|stop|restart|status} name[.service]
總結(用戶空間的啓動流程): /sbin/init (/etc/inittab)
設置默認運行級別 --> 運行系統初始化腳本,完成系統初始化 --> 關閉對應級別下需要停止的服務,啓動對應級別下需要開啓的服務--> 設置登錄終端 [--> 啓動圖形終端]