Linux系統啓動流程

1.linux系統啓動流程

1.加載BIOS的硬件信息,獲取第一個啓動設備
Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、串並行接口、鍵盤、CD-ROM光驅等硬件情況的檢測。
BIOS保存着有關計算機系統最重要的基本輸入輸出程序,系統信息設置、開機加電自檢程序和系統啓動自舉程序等,這一程序知道一些直接連接在主板上的硬件,現在大部分BIOS允許從軟盤,硬盤,光盤中選擇一個來啓動計算機,BIOS會獲得其中一個設備,通常情況下是硬盤,特殊情況是光盤。
2.裝載主引導程序boot loader
當BIOS獲取到第一個啓動設備後,計算機會讀取這個設備的起始的512字節,這512字節叫做主引導記錄MBR,MBR能夠告訴計算機從該設備的某一個分區來裝載引導加載程序boot loader。boot loader存儲有操作系統的相關信息,我的計算機是裝載硬盤上的,可以通過下面的命令查看硬盤的前512字節:

hexdump -C -v -n 512 /dev/sda

執行結果如下:
Linux系統啓動流程
-C是以16進制方式顯示,-v不忽略其中的0,-n 512 只顯示前512字節,/dev/sda是我的硬盤。
3.boot loader加載內核
boot loader主要有三個功能,如下:
1.提供啓動菜單
2.加載內核
3.將引導交給其他的loader
啓動系統時,可以選擇需要啓動的操作系統,會列出一個啓動菜單,這部分功能是boot loader提供的。其次是加載內核,內核加載成功後,boot loader會把引導交給別的loader,boot loader只能引導linux系統啓動,並不能引導Windows等其他的操作系統啓動,但是,boot loader有着其他loader不具有的特點,就是他可以將引導交給其他的loader,但Windows等操作系統的loader卻沒有這種功能。
我們先來看一下啓動菜單:如下圖:
Linux系統啓動流程
我們可以通過上下鍵來選擇我們想要的啓動項,當然此處我們只有一個啓動項。
第二步是加載內核,首先我們要知道當計算機開機的時候,文件系統模塊還沒有被加載,但我們的系統盤卻是一個ext3或者ext4,xfs的文件系統,裏面存放着我們的內核文件,具體是存在boot下,那我們在不知道boot沒有文件系統的情況下如何去讀取內核文件,並把它加載進內存呢?
我們先看加載內核的過程,加載內核一共是分爲3個步驟,分別爲stage1,stage1.5,stage2,上面我們看到的MBR分區表結構,我們知道,這一塊硬盤的第一個扇區一共512字節,其中第447到512是我們的分區表和55aa,那麼前446字節是什麼呢,前446字節存放就是我們的stage1,他的功能是實現基本的引導,例如判斷分區的文件系統類型。
我們知道現在文件系統還沒有被加載,我們讀取了第一個扇區的內容,知道了stage1的內容,如何去讀取實現stage1.5呢?
通過stage1到stage1.5是通過硬件中斷來實現的,具體不在研究。
stage1.5是通過stage1判斷分區的文件系統類型,在stage1.5中加載對應的分區文件系統模塊。我們可以看一下/boot下的內容如下:
Linux系統啓動流程
我們的系統才用的是grub引導的,我們在/boot下可以看到有一個grub的目錄,進入這個目錄,我們可以看到下面的內容:
Linux系統啓動流程
我們可以看到很多文件系統名下stage1_5的文件名,這些即是我們在stage1.5要加載的文件系統模塊,stage1.5的功能也即是加載這些文件系統模塊。
在grub下我麼可以看到一個叫做grub.conf的文件,這就是我們的grub配置文件,也是stage2階段要加載的文件,我們可以看一下這個文件中的內容如下:
Linux系統啓動流程
default=0是默認加載第一個啓動項,我們也只有這一個啓動項。當我們有多個啓動項是可以將默認設爲別的,如下面的配置文件:
Linux系統啓動流程
timeout是在多長時間內切換啓動項,我們一般是不用修改的。
接下來的一行是啓動時的背景圖片,這個可以修改,但是意義不大。
接下來的是啓動菜單,每一個title是一個啓動項,title後面是啓動項的名字,如上第一個title的名字是Red Hat Enterprise Linux Server 1111111 (2.6.18-164.el5)接下來的root (hd0,0)是指根是第一塊硬盤的第一個分區,即我們的/boot,kernel後是我們的內核路徑,然後加載內核,根是root=後面的內容,ro是以只讀方式加載根,rhgb是以圖形化加載,quite是保持安靜,即不加載內核中的模塊加載,initrd是我們需要加載的服務的映像文件,我們可以用下面的命令來生成鏡像文件:

mkinitrd /boot/initrd-$(uname -r).img $(uname -r)
或者
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)

4.啓動init
我們可以查看/etc/inittab的內容如下:
Linux系統啓動流程
這裏面是我們的init級別,我們可以看到就一共有7個級別,我們分別說一下這七個級別:
init0,inin0和halt是一樣的,所以不要把0設置爲默認級別
init1,單用戶模式,可以理解爲救援模式
init2,沒有網絡服務的多用戶模式
init3,多用戶模式,我們一般將3設置爲morenjibie
init4,保留的,並沒有被使用的模式
init5,帶有圖形化的多用戶模式
init6,init6和reboot一樣,所以也不要將6設置爲默認級別
我們可以看到上面有一行如下:

id:5:initdefault:

這代表當前的默認級別是5級別。
當內核啓動後會讀取init配置文件啓動相應的服務。這時系統就完全啓動完成了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章