Linux 開機啟動過程
Linux系統最終呈現給使用者的,要麼是一個命令列介面,也可能是一個圖形化介面。不管是哪種呈現,能看到說明伺服器已經裝載系統成功了。 對於很多使用者來說,學習、使用Linux,可能就起始於系統已經裝載成功的介面。
總體來說,Linux啟動以 init 或 systemd 程序的啟動為標誌,分為兩個過程:1.系統引導過程 2.指令碼初始化過程
詳細的流程圖,如下:
以下,對系統引導過程作一個大概的說明:
一. BIOS階段
第一步,硬體自檢(Power-on Self Test);通過後,BIOS程式會被載入到記憶體。
然後,BIOS會按照啟動順序去查詢磁碟頭的MBR資訊,並載入、執行MBR中的Bootloader程式。
二. Boot Load階段
Briefly, boot loader is the first software program that runs when a computer starts. It is responsible for loading and transferring control to the operating system kernel software (such as the Hurd or the Linux). The kernel, in turn, initializes the rest of the operating system (e.g. GNU).
我們以GRUB為例,其作用可理解為兩級載入和3個步驟:
1,stage1的作用是查詢並載入/boot/grub
目錄的stage2
檔案。但是受限於MBR的體量,此時無法讀取到檔案系統。
2,stage1.5存放在磁碟第3個扇區往後的位置,被載入後stage1可以識別檔案系統,而後將stage2載入記憶體。
3,stage2的作用是查詢並載入核心載映象中的檔案。核心資訊儲存在grub的配置檔案/boot/grub/grub.conf
中,stage2首先會去解析它。如果檔案不存在或有異常,我們也可以在grub的命令列中去定位、指定核心檔案及initrd映象檔案的位置,並用boot命令去啟動它。
附,檔案/boot/grub/grub.conf
#boot=/dev/sda
default=0 #設定預設啟動的title的編號,從0開始
timeout=5 #等待使用者選擇的超時時間
splashimage=(hd0,0)/boot/grub/splash.xpm.gz #GRUB的背景圖片
hiddenmenu #隱藏選單
title CentOS (2.6.18-194.el5PAE) #核心標題
root (hd0,0) #核心檔案所在的裝置
kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/ #核心檔案路徑以及傳遞給核心的引數
initrd /initrd-2.6.18-194.el5PAE.img #ramdisk檔案路徑
三. 核心引導階段
這裡,首先要理解kernel和initrd檔案。kernel中只保留了最基本的模組,initrd被設計用來通過一個臨時根檔案系統來作為核心到最終的根檔案系統之間的橋樑。initrd檔案中包含了各種可執行程式和驅動程式,它們可以用來掛載實際的根檔案系統,然後再將這個 initrd RAM磁碟解除安裝,並釋放記憶體。在很多嵌入式Linux系統中,initrd 就是最終的根檔案系統。
第一步,先將initrd映象中的內容載入進一個臨時的rootfs中,並執行其中的init程式,使之完成載入驅動模組等任務,直到真正的rootfs被掛載。
然後,查詢並啟動真正的根檔案系統中的/sbin/init程序或者是systemd程序。
這一步後,系統就進入指令碼初始化的過程。
附:檢視核心版本及大小,
du -h /boot/vmlinuz-`uname -a |awk '{print $3}'`
4.0M /boot/vmlinuz-2.6.32-431.el6.x86_64