以CentOS6.9爲例,系統啓動流程如下
POST --> Boot Sequence(BIOS)-->BootLoader --> grub --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 設定默認運行級別 --> 系統初始化腳本rc.sysinit --> 關閉或啓動對應級別的服務 --> 啓動終端
1.加電自檢POST(Power On Self Test)
主機加電開機後,首先進行硬件自檢。主機通電後,主板會自動讀取ROM中的程序,並從CMOS中加載BIOS信息,負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、串並行接口、鍵盤、CD-ROM光驅等硬件情況的檢測。如遇到硬件故障的話將按兩種情況進行處理:對於嚴重故障(致命性故障)則直接停機,此時由於各種初始化操作未完成,不能給出任何提示或信號;對於非嚴重故障,則會給出相應的提示或聲音報警信號,等待用戶處理。如果沒有遇到故障,則加電自檢通過,將後續工作交接給BIOS處理。
2.啓動順序Boot Sequence
POST完成後,系統控制權轉交到BIOS,BIOS通過預設的參數識別基礎硬件設備,啓動硬件初始化;同時按照系統啓動順序依次查找各引導設備,第一個有引導程序的設備即爲本次啓動用到設備(一般爲本地硬盤)。BIOS完成相關工作後,將後續工作交接給MBR中的Bootloader處理。
3.啓動加載BootLoader
硬盤上第0頭0道第1扇區被稱爲MBR(Master Boot Record),即主引導記錄。雖然MBR僅有512個字節,但卻存放了前446個字節的啓動加載器(Bootloader,其中裝有GRUB)、中間64個字節的磁盤分區表(Disk Partition Table)以及最後2個字節的結束標識(Magic Number)。啓動設備讀取MBR中前個446字節的Bootloader尋找GRUB,接着讀取MBR後的扇區來識別磁盤分區表DPT以及內核Kernel所在的區域,最後啓動GRUB。
4.引導加載器GRUB(GRand Uniform Bootloader)
第1階段(stage 1)
讀取磁盤設備上第0頭0道第1扇區的MBR;用來加載第2階段, 只存放了Bootloader的部分代碼
第1.5階段(stage 1.5)
讀取MBR之後的扇區,讓第1階段中的Bootloader能夠識別到第2階段所在分區上的文件系統
第2階段(stage 2)
找到grub的配置文件(/boot/grub/grub.conf <-- /etc/grub.conf或/boot/grub2/grub.cfg),並根據其中的預設內容給用戶提供一個可選擇的菜單,用於選擇想要啓動的系統或內核版本。同時stage2即/boot/目錄下還提供了Linux系統內核文件(vmlinuz文件)和虛擬文件系統文件(initramfs)等其它核心文件。
最後,GRUB把用戶選定的啓動系統或內核裝載到內存中的特定空間中解壓、展開,並把系統控制權移交給內核Kernel。
5.加載Kernel
自身初始化
探測可識別到的所有硬件設備;
加載硬件驅動程序(有可能會藉助於ramdisk加載驅動);
以只讀方式掛載根文件系統rootfs;
切換至根文件系統switchroot;
運行用戶空間的第一個應用程序:/sbin/init
至此,內核初始化完成,後續任務交給用戶空間程序,只在模式切換或系統發生中斷時,內核纔會參與。
6.初始化init
/sbin/init最主要的功能就是準備系統運行環境,包括系統的主機名稱、網絡配置、語系處理、文件系統格式及其他服務的啓動等
init程序的類型:
CentOS 5:SysV init
配置文件:/etc/inittab
CentOS 6:Upstart init
配置文件:/etc/inittab, /etc/init/*.conf
CentOS 7:Systemd systemd
配置文件:/usr/lib/systemd/system, /etc/systemd/system
7.配置文件/etc/inittab,設置默認運行級別
運行級別:爲了系統的運行或維護等應用目的而設定;
0-6:7個級別
0:關機
1:單用戶模式(root, 無須登錄), single, 維護模式;
2: 多用戶模式,會啓動網絡功能,但不會啓動NFS;維護模式;
3:多用戶模式,正常模式;文本界面;
4:預留級別;可同3級別;
5:多用戶模式,正常模式;圖形界面;
6:重啓
8.配置文件/etc/rc.d/rc.sysinit,運行系統初始化腳本,完成系統初始化
(1) 設置主機名;
(2) 設置歡迎信息;
(3) 激活udev和selinux;
(4) 掛載/etc/fstab文件中定義的文件系統;
(5) 檢測根文件系統,並以讀寫方式重新掛載根文件系統;
(6) 設置系統時鐘;
(7) 激活swap設備;
(8) 根據/etc/sysctl.conf文件設置內核參數;
(9) 激活lvm及software raid設備;
(10) 加載額外設備的驅動程序;
(11) 清理操作;
9.對應腳本程序,關閉需要關閉的服務,啓動需要啓動服務
根據運行級別的不同,系統會運行/etc/rc.d/rc0.d到/etc/rc.d/rc6.d中的響應的腳本程序,來完成相應服務的關閉和啓動,並執行用戶自定義開機啓動程序腳本/etc/rc.d/rc.local。
10.配置文件/sbin/mingetty,設置啓動終端
mingetty會調用/etc/login程序,登入成功後,整個系統啓動流程完成。