1.第一階段:BOIS(Basic Input Output System)初始化,如圖1
首先加載的是BIOS ,通過bios程序去加載CMOS(用來保存BIOS的硬件配置和用戶對某些參數的設定(如日期、時間、啓動設置等)的芯片,是主板上的一塊可讀寫的並行或串行FLASH芯片,是)的信息。取得cmos中的信息後,BIOS開始開機自檢(POST),然後執行硬件的初始化,並設定Pnp(即插即用,U盤等)設備,再定義可以開機的設備順序,接下來就是讀取開機設備的數據(就是第一個開機設備內的第0個扇區內的MBR中的Bootloader)
圖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:
stage2:也就是grub-legacy的最後階段。直接給用戶呈現的就是一個引導菜單,其中提供了操作系統的名稱,內核參數,引導分區等內容。從現在開始, 才真正進行Linux的啓動過程,之前的都是準備工作!
圖3
(2)GRUB2
GRUB2的boot.img在MBR或者是啓動分區中,boot.img會讀取core.img的第一個扇區,用以讀取core.img後面的部分,一旦完成讀取,core.img就會讀取默認的配置文件和其他需要的模塊!(centos7就是gurb2引導的):如圖4:
圖4
3.第三階段:內核引導(vmlinuz、initramfs)(圖6)
(1)vmlinuz
內核的分類: 單片型內核、模塊型內核
單片型內核:將各種硬件支持,網絡協議於文件系統管理都編譯入一個單一的文件中。
模塊型內核:允許計算機字在使用某一項功能的時候自動加載,防止核心臃腫,是大部分情況下的標準構建。
通常內核文件以壓縮的形式存儲,並不是一個可執行的內核。因此,內核階段首要工作就是自解壓內核映像。
系統內核鏡像文件(vmlinuz)是可引導,可壓縮的內核,壓縮後一般爲bzImage(大內核,大於512KB)zImage(小內核,小於512KB)。Linux能使用硬盤空間作爲虛擬內存,因此得名vm。 vmlinuz是可執行的內核文件,它的解壓程序也在內核中。內核文件一般在/boot/vmlinuz目錄中。 注意[vmlinux是未壓縮的內核,是ELF文件,即編譯出來的最原始的文件,不能用於直接加載,不能用於啓動內核,只是啓動過程中的一種中間媒體]
圖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)
圖6
(3)內核初始化
由BootLoader讀取內核文件後,將其解壓到內存中,並利用內核的功能,檢查硬件與加載驅動程序,即測試並且驅動各個周邊的設備(cpu,存儲設備,網卡,聲卡等)。此時Linux內核會一自己有的功能重新檢查一下硬件,而不一定是使用BIOS 中的硬件信息。也就是說內核從現在纔開始接管BIOS 後的工作。然後將根分區以只讀的方式掛載,接着就是載入初始進程systemd(/usr/sbin/systemd/systemd),此處在centos7一下版本中,初始進程是init(/usr/sbin/init)
圖7
4.第四階段:systemd(init)
在內核加載完畢,進行硬件的檢查和驅動加載後,此時主機硬件已經準備就緒,這時候內核會啓動第一個進程(/usr/sbin/systemd/systemd或者/etc/inittab)。這是調用的第一個使用標準C庫編譯的程序,其進程號始終爲1。
init負責觸發其他必須的進程,使系統進入可用狀態。init的這些工作根據/etc/inittab文件來完成,包括設置getty進程接受用戶登錄,設置鍵盤,字圖,網絡等。若沒有這些進程,內核即使成功啓動,也沒有多大的意義。如圖8
圖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.