一、前言
服務器在正常的運行過程中,很少有重啟的機會。在正常的情況下,也很少有出現啟動異常的情況,但是在遭到了人為或者誤操作的情況后,可能會出現啟動異常的情況。為了加深學習系統啟動流程,能夠更加深入理解Linux系統的啟動流程??偨Y了這篇文字。
二、簡述啟動流程
在服務器被加電后,大體流程如下:POST—->MBR(bootloader)—->kernel(ramdisk)—->掛載rootfs(ro)—->運行/sbin/init—->運行系統初始化腳本—->啟動終端
1、第一階段POST(POWER ON and SELF TEST即加電自檢)是主板上的BIOS系統在加電后自動檢測硬件設備比如:cpu、內存、主板等等,加載各種硬件運行參數,確保硬件正常運行,保護硬件的作用。如果在此過程中出現故障,一般會有提示音。或者會在屏幕上面顯示故障信息,提醒用戶處理;如果正常,則進入下一步,根據BIOS的設定的啟動順序(BootLoader),找到第一序列的啟動設備,一般是的啟動設備就是硬盤(在特定的情況下也有光盤或者U盤)。
2、在找到第一啟動設備后,系統會去讀該設備的MBR(Master Boot Record),然后系統就可以根據引導加載程序(Boot Loader)開始執行以下的工作:
BootLoader主要安裝在啟動設備的第一個扇區.系統會在第一個扇區446bytes加載grub程序成為一個階段,以及在加載2-27扇區的第1.5階段,最后找到/boot/grub,完成第二階段。在Linux系統目錄下,有一個/boot目錄,里面有grub目錄以及VMLinuz(內核)、initramfs等文件。
而在grub目錄中,則有grub啟動的第一階段、第1_5階段以及第二階段,還有grub的配置文件(grub.conf)提供啟動配置。
3、grub在啟動的過程中提供啟動菜單、并提供交互式接口;加載用戶選擇的內核或者操作系統;為菜單提供保護機制。同時,編輯grub的配置文件grub.conf能夠改變啟動是提供給用戶的交互接口。grub.conf的內容如下:
相應的配置:
default=#: 設定默認啟動的菜單項;落單項(title)編號從0開始
timeout=#:指定菜單項等待選項選擇的時長
splashimage=(hd#,#)/PATH/TO/XPM_FILE:菜單背景圖片文件路徑
hiddenmenu:隱藏菜單
password [–md5] STRING: 啟動菜單編輯認證
title TITLE:定義菜單項“標題” , 可出現多次
root (hd#,#): grub查找stage2及kernel文件所在設備分區;為grub“根”
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啟動的內核
initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件
password [–md5] STRING: 啟動選定的內核或操作系統時進行認證
在啟動的時候,grub提供的界面如下:
供用戶選擇在配置文件grub.conf里面設置啟動選項,通過下面的提示符,可以進入某一個選項,里面的配置如下:
是不是和在配置文件里面看到的一樣。如果在配置文件里面加入password字段的話,要進入這個界面是需要密碼的,這也提供了很好的保護機制,不是每個人都有權利進入這個界面的。
當啟動流程進入這個步驟后,下一步就是grub程序的引導下找到/boot目錄下找到內核文件以及為服務加載內核的文件initramfs。然后就是將內核文件成功的加載到內存中。
4、內核加載完成后,就可以掛載根文件系統(rootfs)。但是要加載rootfs,就必須要其下的設備,而設備的驅動是在根文件系統中,而根文件系統現在還沒有掛載就沒辦法取得設備的驅動,這就形成了一個死循環。而/boot下面的initramfs文件就是解決這一問題的。為加載后的內核提供根文件系統的所在設備的驅動,讓能正常掛載。initramfs文件里面的內容如下:
可以看見它提供了很多為掛載根文件系統的很多程序以及驅動。將initramfs加載后,相當于運行了一個過度系統,該系統有根文件系統的設備驅動,能夠將其掛載上,但是,此時掛載的根文件系統是以只讀的方式。到此內核空間的任務完成,開始進入用戶空間的進程。
5、進入用戶空間流程,執行的第一個程序就是/sbin/init,該程序完成了用戶空間的啟動流程,完成后啟動/etc/inittab文件,初始化用戶空間。/顎突出/inittab如下:
設定啟動的默認模式,默認的是多用戶命令行模式:
0:關機
1:單用戶模式
2:不帶網絡文件系統個功能的多用戶模式
3:多用戶模式
4:未設置
5:圖形界面模式
6:重新啟動
上圖中小框的內容是系統初始化腳本:
(1)設置主機名
(2) 設置歡迎信息
(3) 激活udev和selinux
(4) 掛載/etc/fstab文件中定義的文件系統
(5) 檢測根文件系統,并以讀寫方式重新掛載根文件系統
(6) 設置系統時鐘
(7) 激活swap設備
(8) 根據/etc/sysctl.conf文件設置內核參數
(9) 激活lvm及software raid設備
(10) 加載額外設備的驅動程序
(11) 清理操作
大框內的內容是設定不同啟動模式下的服務啟動配置:在/etc/rc.d目錄下的文件是這樣的
rc#.d中的數字#代表是7中啟動模式,每個目錄定義的是在不同的啟動模式下啟動或關閉的服務的設置,里面的文件如下:
里面的文件按都是以S#和K#開頭的文件,且都是軟連接的文件,它們都指向/etc/init.d目錄下的文件,K即kill,代表在該模式下停止服務,S為start,代表在不同的模式下啟用服務,數字定義服務開啟或者關閉的順序。而每個文件的格式如下:
框內的為固定格式,chkconfig后面的3組數字分別代表在3、4、5模式下的動作(啟動或者關閉)、啟動順序和關閉順序。
上圖從上到下分別定義:
a、定義ctrl+alt+delete組合鍵的功能
b、定義在斷電是ups電源的設定
c、設置虛擬終端,可以通過修改這些設置添加或者減少虛擬終端
d、定義圖像界面啟動設置
在/etc/rc.d中有一個腳本rc.local,在開機最后加載,可以根據自己的需求將一些執行命令或是腳本寫到里面,當開機時,就可以加載。
最后,完成所有用戶空間的設置,進入登錄提示界面,啟動完成。
總結,在整個啟動過程中,至關重要的文件有:
A、boot 一般將這個目錄單獨分區掛載為簡單分區
B、grub以及grub.conf文件
C、vmlinuz以及initrd文件
D、/etc/inittab腳本
E、/etc/rc.d/rc.sysinit腳本等
原創文章,作者:王更生,如若轉載,請注明出處:http://www.www58058.com/60456