Linux 系統啓動流程
下面按照系統的啓動順序來進行逐一的講解。
一、POST
當我們按下開機的電源後,主板上的芯片組會首先向CPU發出一個reset指令,之後待芯片組檢測到電源供電穩定後便撤去reset指令,CPU就 會跳轉到BIOS中的啓動代碼位置; BIOS首先要檢測關鍵設備(如內顯、顯卡等)是否正常,這個過程就稱爲POST(加電後自檢)。
POST完成後BIOS會調用其它代碼來進行完整的硬件檢測。
二、(BIOS) boot sequence
引導次序:按次序找引導設備,第一個有引導程序的設備,即爲啓動PC Server所用到的設備。
三、MBR(Bootloader)
MBR(Mater Boot Record),即主引導記錄。其位置在第一個扇區的前512字節。Bootloader是安裝於MBR當中的引導 管理程序,早期比較常見的Bootloader程序爲LILO,但因爲其不支持1023柱面以後的分區,所以現在比較常用的爲GRUB。
GRUB(Grand Unified Bootloader)是由GNU下的FSF組織所推行的;CentOS 5和CentOS 6上使用的版本爲Grub 0.97,而CentOS 7上使用的版本爲Grub2 1.96。
下面以CentOS 6爲例來了解一下GRUB:
我們先來看一下系統的上GRUB目錄中的內容,如下圖所示:
從上圖中可以看到stage1、*_stage1_5和stage2這三類文件,它們分別表示GRUB引導時的三個階段。
1)stage 1
stage 1文件其實是MBR中Bootloader的備份文件,雖然stage 1也是512B但只有前446B與MBR相同,後64B完成不一樣。
2)stage1_5
grub目錄中存在許多以stage1_5結尾的文件,這些文件都是stage1_5階段功能的文件,裏面存放着文件系統的格式,其作用是連接stage1和stage2的一個通道。
stage1_5文件的內容保存在MBR後面的32K中;其實stage1.5文件會在安裝GRUB時安裝到MBR後的32K中,系統啓動時會直接讀取MBR後面的內容,即使這些文件不存在也不會影響GRUB的正常工作。
3)stage 2
在此階段會讀取grub.conf配置文件中設置信息來完成系統的引導,並且可以實現引導功能的擴展。
GRUB的功能如下:
1)提供菜單,並提供交互式接口
e:進入編輯模式;
a:直接修改內核參數;
c:進入命令行模式。
2)選擇要啓動的內核或系統
允許傳遞引導參數給內核;
選擇界面可隱藏。
3)爲編輯功能提供機制
可以爲指定的內核得添加密碼。
grub.conf文件內容:
default=:選擇第幾個title配置的內核或系統,各title從0開始編號;
timeout=#:菜單顯示的超時時長;
splashp_w_picpath=/path/to/some-p_w_picpath_file:指定菜單背景圖片,此圖片只能爲14bits色,xpm格式,gzip壓縮;
hiddenmenu:隱藏菜單;
tiltle TITLE SIRING:顯示於菜單中的標題;
root:指定引導分區;
kernel:指明kernel的位置;
initrd:指明initramfs的位置。
四、kernel+ramdisk (initramfs)
在GRUB的選擇界面裏按e,進入編輯模式,可以看到kernel和ramdisk,如下圖所示:
kernel是操作系統的內核程序,所有的軟硬件都是通過kernel來溝通的。在上圖中的vmlinuz文件就是開機時所用的kernel。
initrd(initial ramdisk),是激活系統所必須加載的文件系統。
當kernel被載入到內存後,需要加載相應驅動程來識別文件系統,這時initrd就充當了臨時的系統被掛載到rootfs上,其作用就是協助kernel來加載驅動程序。
五、/sbin/init(/etc/init/*.conf)設定默認運行級別
/sbin/init會使用/etc/init/目錄中的.conf配置文件來對系統進行配置,之後調用/etc/rc.d/rc.sysinit文件對系統進行初始化。
在進行系統配置的過程時,init會檢測系統默認的runlevel(運行級別),並根據runlevel的信息來做相應的配置,在說明啓動服務時會集中講解runlevel,這裏就只是先介紹一下CentOS的7個運行級別:
0:關機;
1:單用戶,s,S,single;
2:多用戶,不支持NFS功能;
3:完全多用戶,文本接口;
4:未使用,預留級別;
5:完全多用戶,圖形接口;
6:重啓。
六、使用/etc/rc.d/rc.sysinit初始化系統
1、設定主機名:讀取/etc/sysconfig/network文件中的HOSTNAME參數,並以之設定主機名;
2、打印文本歡迎信息;
3、激活SElinux和udev;
4、掛載/etc/fstab文件中定義的其它文件系統;
5、激活swap;
6、檢測根文件系統,並以讀寫方式重新掛載;
7、設置系統時鐘;
8、根據/etc/sysctl.conf設置內核參數;
9、激活LVM和RAID;
10、加載額外設備的驅動程序;
11、清理工作。
七、啓動或關閉指定服務
啓動指定的級別默認爲啓動的服務,停止指定的級別下默認爲關閉的服務。
/etc/rc.d/目錄中rc0.d-rc6.d這7個目錄中分別存放了不同運行級別啓動或關閉時所要執行的腳本。
以rc3.d爲例,在上面列出的所有腳本文件都是鏈接文件,其中:S##表示啓動的服務,K##表示要停止的服務,##的範圍是從0到99,數字越小,優先級越高。
根據系統默認的運行級別來調用各級別對應的腳本,默認運行級別在配置文件/etc/inittab中設置。
也可以手動修改腳本的默認運行級別。
使用chkconfig命令來調整服務腳本在各運行級別下默認的啓動與關閉。
如果期望自定義的腳本使用chkconfig來控制,需要按照以下步驟操作:
1、在腳本中添加以下語句:
#chkconfig: – 85 15
-:當此腳本由chkconfig控制時,默認哪些級別是開啓的,“-”表示全部級別;
85:啓動優先級;
15:關閉優先級;
2、將腳本複製到/etc/init.d/目錄中;
3、加入腳本到運行級別列表:
chkconfig –add 腳本名
從運行級別列表中刪除腳本:chkconfig –del 腳本名
/etc/rc.d/rc.local(/etc/rc.local):是一個腳本,通常爲系統啓動完成的最後運行的一個腳本。