Linux系統詳細啓動流程

1.第一階段:BOIS(Basic Input Output System)初始化,如圖1

首先加載的是BIOS ,通過bios程序去加載CMOS(用來保存BIOS的硬件配置和用戶對某些參數的設定(如日期、時間、啓動設置等)的芯片,是主板上的一塊可讀寫的並行或串行FLASH芯片,是)的信息。取得cmos中的信息後,BIOS開始開機自檢(POST),然後執行硬件的初始化,並設定Pnp(即插即用,U盤等)設備,再定義可以開機的設備順序,接下來就是讀取開機設備的數據(就是第一個開機設備內的第0個扇區內的MBR中的Bootloader)


wKiom1jD7BLyGBxQAADN21iIrVY146.jpg-wh_50

圖1



2.第二階段:GRUB/GRUB2的啓動引導

由於不同的操作系統,其文件系統的格式不一樣,所以需要一個開機管理的程序來處理內核文件的加載。這個管理  程序及時BootLoader,安裝在MBR 中!(MBR廣義上是指整個扇區,狹義上是僅指引導程序,在硬盤的0柱  面,0磁頭,1扇區;其中主要是有三部分的內容:主引導程序(446B),分區表(64B),硬盤有效標識   (2B),一共是512B)。BootLoader的作用是認識操作系統的文件格式,並加載內核到內存執行(讀入的數據有setup程序和一個經過壓縮的內核映像在zImage或bzImage)。因爲MBR過於小了,所以啓動引導工具往往還需要從其他地方進一步的讀取數據,這就是所謂的第二階段。這通常是一個可交互的界面。如圖3

(1)GRUB

GRUB進行第二階段引導時,讀取/boot/grub/grub.conf中的配置文件,根據配置文件的參數,加載相應的內核模塊,內核再加載相應的驅動,進行必要的硬件初始化。grub2取消了grub-legacy(即GRUB)中的stage1,stage1_5和stage2的概念。

stage1 : 這是grub-legacy寫入MBR中的那部分(對應gurb2中的boot.img)。  其作用是裝入stage1_5(對應grub2中的core.img)的第一個扇區,爲後續引導過程做準備。

stage1_5:就是寫入保留扇區的那部分,對應grub2中的core.img。(注意的是:標準MBR是在第0個扇區,而分區表中記錄的第一個分區是在63扇區,中間有62個扇區是保留扇區,由於stage1(0扇區)不能直接識別stage2(63扇區),所以中間添加了一個stage1_5(62個扇區)來過渡引導!)如圖2:


wKioL1jDrG_TqyJ1AABjuWOC1k4813.jpg-wh_50

圖2


stage2:也就是grub-legacy的最後階段。直接給用戶呈現的就是一個引導菜單,其中提供了操作系統的名稱,內核參數,引導分區等內容。從現在開始,  才真正進行Linux的啓動過程,之前的都是準備工作!

 

wKioL1jDpV3iZEvvAADqD4glPB0998.jpg-wh_50

圖3



(2)GRUB2

GRUB2的boot.img在MBR或者是啓動分區中,boot.img會讀取core.img的第一個扇區,用以讀取core.img後面的部分,一旦完成讀取,core.img就會讀取默認的配置文件和其他需要的模塊!(centos7就是gurb2引導的):如圖4:

wKioL1jDwEOzwZ80AADPNr4CmMA358.jpg-wh_50

圖4




3.第三階段:內核引導(vmlinuz、initramfs)(圖6)


(1)vmlinuz

內核的分類: 單片型內核、模塊型內核

單片型內核:將各種硬件支持,網絡協議於文件系統管理都編譯入一個單一的文件中。

模塊型內核:允許計算機字在使用某一項功能的時候自動加載,防止核心臃腫,是大部分情況下的標準構建。

通常內核文件以壓縮的形式存儲,並不是一個可執行的內核。因此,內核階段首要工作就是自解壓內核映像。

系統內核鏡像文件(vmlinuz)是可引導,可壓縮的內核,壓縮後一般爲bzImage(大內核,大於512KB)zImage(小內核,小於512KB)。Linux能使用硬盤空間作爲虛擬內存,因此得名vm。    vmlinuz是可執行的內核文件,它的解壓程序也在內核中。內核文件一般在/boot/vmlinuz目錄中。  注意[vmlinux是未壓縮的內核,是ELF文件,即編譯出來的最原始的文件,不能用於直接加載,不能用於啓動內核,只是啓動過程中的一種中間媒體]


wKioL1jD5Buh_W__AAC4_w5yVAE420.jpg-wh_50

圖5



(2)initramfs

初始化內存鏡像盤(initramfs)稱爲初始化內存盤,爲系統提供一系列的內核映像提供不了的模塊,這些模塊對正確引導系統很重要。他通常和文件系統和存儲設備有關,也支持其他特性和硬件外設。initramfs文件是用mkinitrd創建的,這個命令是Redhat(centos)專有的,其他版本有相應的命令!bootloader將其加載到內存中後,initramfs文件被解壓縮,並在內存中仿真一個根目錄(虛擬文件系統),此虛擬文件系統可以提供一個可執行程序,通過改程序來加載開機過程中所需要的模塊,通常這些模塊就是USB、RAID、LVM、SCSI等文件系統於磁盤接口的 驅動程序!

#mkinitrd        [--with=模塊 ]        initramfs-版本號.img        版本號

#mkinitrd        [--with=模塊 ]        initramfs-$(uname --r).img        $(uname -r)

wKioL1jDtOTxHhDmAACygVxGNS4914.jpg-wh_50

圖6



(3)內核初始化

由BootLoader讀取內核文件後,將其解壓到內存中,並利用內核的功能,檢查硬件與加載驅動程序,即測試並且驅動各個周邊的設備(cpu,存儲設備,網卡,聲卡等)。此時Linux內核會一自己有的功能重新檢查一下硬件,而不一定是使用BIOS 中的硬件信息。也就是說內核從現在纔開始接管BIOS 後的工作。然後將根分區以只讀的方式掛載,接着就是載入初始進程systemd(/usr/sbin/systemd/systemd),此處在centos7一下版本中,初始進程是init(/usr/sbin/init)


wKiom1jD59ix0Xd_AADDWGtMANg222.jpg-wh_50

圖7





4.第四階段:systemd(init)

在內核加載完畢,進行硬件的檢查和驅動加載後,此時主機硬件已經準備就緒,這時候內核會啓動第一個進程(/usr/sbin/systemd/systemd或者/etc/inittab)。這是調用的第一個使用標準C庫編譯的程序,其進程號始終爲1。

init負責觸發其他必須的進程,使系統進入可用狀態。init的這些工作根據/etc/inittab文件來完成,包括設置getty進程接受用戶登錄,設置鍵盤,字圖,網絡等。若沒有這些進程,內核即使成功啓動,也沒有多大的意義。如圖8


wKioL1jD6oKDpnh1AACH4rfW_FQ892.jpg-wh_50

圖8


Redhat7系統上,/etc/inittab文件不再使用,改文件只有一些註釋說明信息,如下:

[root@localhost ~]# cat /etc/inittab 
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
#
# To set a default target, run:
# systemctl set-default TARGET.target
#
[root@localhost ~]#



參考文獻:

[1]    張同光.    Linux操作系統(REHL 7/Centos 7).    北京:         清華大學出版社,2014.

[2]    鳥哥.    鳥哥的Linux私房菜(第三版).    北京:     人民郵電出版社,2015.

[3]    吳國偉等.    深入理解Linux驅動程序設計.    北京:    清華大學出版社,2015.

[4]    任橋偉.    Linux內核修煉之道.    北京:    人民郵電出版社,2010.

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