CentOS系統的啓動流程:
c#
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~centos
一、POST加電自檢網絡
當計算機的硬件加電後,會進行自檢,這個過程一般稱爲POST(Power On Self Test),加電的過程會檢查計算機各部件是否存在以及是否可以正常工做。ide
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
工具
二、加載bootloaderurl
自檢完成後,主板上的BIOS程序一般是轉向第一塊硬盤的第一個扇區即主引導記錄(MBR)來裝載bootloader。spa
主引導記錄MBR(Master Boot Record)在磁盤的第一個扇區中,大小爲512字節:前446字節orm
是bootloader,中間64個字節爲DPT即磁盤分區表,最後兩個字節爲MBR的有效標識,55AA表示MBR有效。htm
bootloader的做用是容許用戶選擇要啓動的系統或不一樣的內核版本;把用戶選定的內核裝載到RAM的特定空間中,解壓、展開,然後把系統控制權移交給內核;但因爲bootloader的大小隻有446字節,意味着其可以實現的代碼和任務有限,因此centos使用grub的機制來啓動系統的引導過程。blog
grub將引導的過程分紅了1,2兩個階段,第一個階段加載bootloader,此時bootloader不加載內核,而是用來加載grub的第二階段至內存中,其後能夠在內存中不受MBR的限制能夠實現不少複雜的功能以及加載用戶選擇的內核,並可以傳遞參數至內核。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
三、內核的初始化
內核(kernel)的初始化分爲四個步驟:
1、探測可識別到的全部硬件設備;
2、加載硬件驅動程序(有可能會藉助於ramdisk加載驅動);因爲內核不可能將全部硬件設備的驅動直接編譯進內核中,因此當內核沒法加載根文件系統所在設備的驅動程序時,便會由特定的工具程序來建立生成ramdisk文件,ramdisk是運行於內存中的一個簡裝版的根文件系統,其做用在於:
ramdisk會在內存中加載一個虛擬根文件系統去識別真正的根文件系統所需的驅動程序並加載,加載完成後,內核即可識別真正的根文件系統並將其掛載,此時ramdisk再將根切換給真正的根文件系統,本身退出內存
3、以只讀方式掛載根文件系統;防止內核有bug致使根文件系統上的數據丟失,在系統初始化時內核會以讀寫方式從新掛載根文件系統
4、最後將任務轉交給init程序來加載運行用戶空間的第一個應用程序:/sbin/init
內核級別的系統初始化流程總結:
POST加電自檢 --> BootSequence(BIOS) --> Bootloader(MBR) --> Kernel(ramdisk) --> rootfs(readonly) --> /sbin/init()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
四、運行init程序,接管用戶空間
以CentOS 5爲例,init程序會首先經過讀取其配置文件/etc/inittab設定系統的運行級別以及在各級別下要啓動的任務
init配置文件:/etc/inittab 決定了系統初始化中啓動哪些服務,其每行定義一種action以及與之對應的process
id:runlevels:action:process
id:一個任務的惟一標識符;
runlevel:在哪些級別啓動此任務;#,###,也能夠爲空,表示全部級別
action:在什麼條件下啓動此任務;
process:具體的任務;
action:啓動時的場景
wait:等待切換至此任務所在的級別時執行一次;
respawn:一旦此任務終止,就自動從新啓動之;
initdefault:設定默認運行級別;此時,process省略;
sysinit:設定系統初始化方式,此處通常爲指定/etc/rc.d/rc.sysinit系統初始化腳本
運行級別:是爲了系統的運行或維護等目的而設定的機制,默認運行的是3,5級別
0-6:7個級別;
0:關機,shutdown
1:單用戶模式(single user),root用戶,無需認證;維護模式
2:多用戶模式(multi user),會啓動網絡功能,但不會啓動NFS;維護模式
3:多用戶模式(multi user),徹底功能的模式,文本界面
4:預留級別:目前無特別使用目的,但習慣以同3級別功能使用
5:多用戶模式(multi user),徹底功能模式,圖形界面
6:重啓模式,reboot
一、指定運行級別
例如id:3:initdefault: 表示默認運行3級別
二、運行系統初始化腳本
例如si::sysinit:/etc/rc.d/rc.sysinit
表示在全部級別下都會運行/etc/rc.d/rc.sysinit腳本完成系統初始化
系統初始化完成後,init程序會運行/etc/init.d/*(/etc/rc.d/init.d/*)下的腳本決定系統啓動時要開啓或關閉哪些服務。
/etc/init.d/*(/etc/rc.d/init.d/*)腳本能夠接受一個運行級別數字爲參數設定對應級別下須要開啓或中止的服務
/etc/rc.d/rc#.d/中的S*:表示要啓動的服務;K*:表示要中止的服務
三、定義啓動終端,
例如:
tty1:2345:respawn:/usr/sbin/mingetty tty1
... ...
tty6:2345:respawn:/usr/sbin/mingetty tty6
表示當系統運行級別爲2345中任何一種時,會自動運行/usr/sbin/mingetty程序啓動tty1-6的虛擬終端,/usr/sbin/mingetty文件會調用login程序讓用戶登陸
總結(用戶空間的啓動流程):
讀取/sbin/init(/etc/inittab)設置默認運行級別 --> 運行系統初始化腳本,完成系統初始化 --> 關閉對應級別下須要中止的服務(K*),啓動對應級別下須要開啓的服務(S*) --> 設置登陸終端 [--> 啓動圖形終端]
當啓動登陸終端完成後,系統即啓動完成