Linux系統的啓動分爲4個階段,每個階段都會完成不同的啓動任務。其主要流程可以概括爲:
1.POST:Power-On Self Test,加電自檢
2.BootSequence:啓動順序
3.內核
4.Init
1、計算機啓動後,首先進行固件(BIOS)的自檢,即所謂的POST(Power On Self Test),然後把保存在MBR中的引導程序加載到內存中。
2、主引導加載程序通過分區表查找活動分區,然後將活動分區的次引導加載程序從設備讀入內存中並運行。
3、加載次引導程序(GRUB),其中次引導加載程序又可以分爲三個階段
1st stage:位於MBR中,爲了引導 2nd stage 1.5 stage:位於boot基本磁盤分區中,爲識別內核文件所在的文件系統提供文件系統識別擴展 2nd stage:位於boot基本磁盤分區中,GRUB 的引導程序(/boot/grub/) |
4、Linux內核鏡像,在內核的引導過程中,會加載必要的系統模塊,以掛載根文件系統(/),完成後內核會啓動init進程,並把引導的控制器交給init進程。
5、init進程會掛載/etc/fstab中設置的所有文件系統,並根據/etc/inittab文件來執行相應的腳本進行系統初始化。
BIOS加電自檢
x86計算機在啓動後會進行BIOS的加電自檢,檢測計算機的硬件設備,然後按照CMOS設置的順序搜索處於活動狀態並可以引導的設備。引導設備可以是軟盤、光驅、USB設備等。
一般Linux都是從硬盤上進行引導,硬盤上的主引導記錄(MBR)中保存有加載程序。MBR是一個512字節大小的扇區,位於硬盤的第一個扇區中。
引導加載程序GRUB
GRUB是Centos6.x中默認的引導加載程序。引導過程又可以分爲啓動主引導加載程序和啓動次引導加載程序兩個階段。第一階段是保存在MBR中的主引導加載程序,主引導加載程序的任務就是查找並加載保存在硬盤分區上的次引導加載程序,它通過分區表查找活動分區,將活動分區的次引導加載程序從設備讀入內存並運行,進入引導加載程序的第二個階段。
次引導加載程序也被稱爲內核加載程序,這個階段的任務是加載Linux內核。一旦次引導加載程序被加載到內存中,便顯示GRUB圖形界面。
在此界面下提供的功能有:
(1) 提供菜單、並提供交互式接口 e: 編輯模式,用於編輯菜單;c: 命令模式,交互式接口; (2) 加載用戶選擇的內核或操作系統 允許傳遞參數給內核可隱藏此菜單 (3) 爲菜單提供了保護機制 爲編輯菜單進行認證爲啓用內核或操作系統進行認證 |
單擊c進入命令行交互模式後,可使用的命令:
help: 獲取幫助列表help KEYWORD: 詳細幫助信息 find (hd#,#)/PATH/TO/SOMEFILE:root (hd#,#) hd#:磁盤編號,用數字表示;從0開始編號 #: 分區編號,用數字表示;從0開始編號 kernel /PATH/TO/KERNEL_FILE: 設定本次啓動時用到的內核文件; initrd /PATH/TO/INITRAMFS_FILE: 設定爲選定的內核提供額外文件的ramdisk; boot: 引導啓動選定的內核; |
手動在grub命令行接口啓動系統的方法:
grub> root (hd#,#) grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE quiet grub> initrd /initramfs-VERSION-RELEASE.img grub> boot |
GRUB的配置文件:/boot/grub/grub.conf
配置語法: default=0 #設定默認啓動的title的編號,從0開始 timeout=5 #等待用戶選擇的超時時長,單位是秒 splashimage=(hd0,0)/grub/splash.xpm.gz #grub的背景圖片 hiddenmenu #隱藏菜單 password #給grub添加密碼 title Red Hat Enterprise Linux Server (2.6.18-308.el5) #內核標題 root(hd#,#) #內核磁盤所在分區 hd#:磁盤編號,用數字表示;從0開始編號 #: 分區編號,用數字表示;從0開始編號 kernel #內核文件路徑,及傳遞給內核的參數 Initrd #ramdisk文件路徑 |
init進程 |
init是linux系統所有進程的起點,內核在完成內核引導後,便會加載init進程,其進程號是1。init進程啓動後,會初始化操作系統,並啓動特定的運行級別(Runlevel)下的自動運行程序。
當init進程獲得控制權後,首先會執行/etc/rc.d/rc.sysinit腳本,根據腳本中的代碼完成如下一些操作:
1、激活udev和selinux; 2、根據/etc/sysctl.conf文件,來設定內核參數; 3、設定時鐘時鐘; 4、裝載鍵盤映射; 5、啓用交換分區; 6、設置主機名; 7、根文件系統檢測,並以讀寫方式重新掛載;8、激活RAID和LVM設備; 9、啓用磁盤配額; 10、根據/etc/fstab,檢查並掛載其它文件系統; 11、清理過期的鎖和PID文件 |
接下來,init進程會執行inittab腳本中的代碼。該腳本代碼中定義了linux系統的運行級別,以及每個級別所對應的引導步驟。
0:halt關機 1: single user mode,直接以管理員身份切入,s,S,single 2:multi user mode, no NFS 3: multi user mode, text mode 4:reserved 5: multi user mode, graphic mode 6: reboot 查看運行級別:runlevel |
inittab文件的配置語法: 每一行定義一種action以及與之對應的process id:runlevel:action:process id: 操作的ID runlevels: 在哪些級別下執行此操作 action: 動作 initdefault: 設置默認運行級別,無需定義操作 sysinit:指定系統初始化腳本(/etc/rc.d/rc.sysinit) wait: 等待系統切換至此級別時運行一次; ctrlaltdel: 定義組合鍵被按下時要運行的命令; respawn: 當指定操作進程被關閉時立即再啓動一次; process: 操作 |
在linux系統中每個級別所運行的服務都不一樣,每個級別的運行服務腳本文件都分別存放在7個名爲/etc/rc.drcN.d的目錄下。
例如在運行級別爲3,那麼init進程會查找並執行/etc/rc.d/rc3.d/目錄下的所有的腳本。目錄下的腳本都是一些鏈接文件,指向了init.d目錄下,命名規則爲Snn服務名或者Knn服務名。其中,對於S開頭的文件,系統會啓動對應服務,對於K開頭的,系統會終止對應的服務;nn位數字,表示腳本執行順序,S開頭的爲文件會按數字從小到大執行,K帶頭的會從大到小關閉服務。 |
使用chkconfig命令可以配置自動運行的服務。 |
chkconfig [--list] [-- type < type >] [name] chkconfig --add <name> chkconfig --del <name> chkconfig --override <name> chkconfig [--level <levels>] [-- type < type >] <name> <on|off|reset|resetpriorities> |
在啓動過程中/etc/rc.d/rc.local是系統最後啓動的一個服務執行的一個腳本。當需要系統啓動或關閉時自動執行某些任務可以寫在此腳本中。