總:POST---> Boot Squence ---> Bootloader ---> kernel ---> init ---> 完成啓動linux
系統:CentOS6ios
一、按下電源,cpu找到CMOS中的BIOS並運行起來,這個小程序會完成硬件自檢。小程序
BIOS:Basic Input and Output System緩存
二、bios會根據設置的boot squence來找設備上的MBR,找到之後控制權移交給MBR中的bootloader(1 stage). ide
MBR存在磁盤上的0號扇區。工具
有3部分組成:
446:bootloader
64: 分區表 16個字節表示一個分區
2: 55AAspa
三、bootloader加載MBR以後的一部分扇區中的基本文件系統驅動(1.5 stage),如以後的27個扇區。而後再加載引導分區中的第2階段。blog
linux上面的bootloader程序是GRUB.內存
GRUB有3個階段組成。
bootloader:1st stage
Partition:filesystem driver, 1.5 stage
Partition:/boot/grub, 2nd stageci
由於1.5階段的文件系統驅動只能驅動基本文件系統,因此第2階段所在的分區不能使用lvm或軟raid之類的上層文件系統。
四、加載第2階段之後,會提供一個選擇啓動系統的窗口。內容就是/boot/grub/grub.conf文件中的各條目。
若是所選條目就是本機的linux系統的話:
在點擊進入系統以後。GRUB會加載grub.conf文件中指定的內核和要傳遞給內核的參數。參數中有真實根的地址。有時候還要加載與內核同版本的initrd。 initrd是一個模擬根的文件,由GRUB把它與內核一塊兒加載到內存。此文件展開之後就是一個虛擬的根。內核工做於此根中並開始以只讀方掛載真實的根。所需驅動和程序在此根中加載。掛載完成之後開始把一些必要文件,如設備文件複製到真實的根。而後執行根切換。若是沒有initrd文件,內核會直接掛載真實的根,若是內核裏面沒有根分區的驅動,則系統啓動失敗。
而若是所選條目是指向其它分區的另外一個系統,則GRUB的控制權移交給那個分區首部的引導程序來管理(各個分區首部保留有引導空間(linux上面好像是1024Byte),也正是這樣纔有了雙系統或多系統)。
kernel:
自身初始化:
探測可識別到的全部硬件設備;
加載硬件驅動程序;(有可能會藉助於ramdisk加載驅動)
以只讀方式掛載根文件系統;
運行用戶空間的第一個應用程序:/sbin/init
initrd文件有兩種:
ramdisk
ramfs
Linux內核的特性之一:使用緩衝和緩存來加速對磁盤上的文件訪問;
在使用ramdisk的時候,在內存中模擬成磁盤,但由於磁盤都要有緩衝(buffer)和緩存(cache),這樣的結果就是還要在內存中使用緩衝和緩存。畫蛇添足,因此就有了ramfs。
在使用ramfs的時候,直接在內存中模擬成文件系統,不須要在內存中使用緩衝和緩存。
能夠生成initrd的工具。能夠手動用如下工具生成。
CentOS 5: initrd(ramdisk)
工具程序:mkinitrd
CentOS 6,7: initramfs(ramfs)
工具程序:dracut, mkinitrd(腳本)
五、根切換完成之後,內核開始執行第一個用戶空間應用程序(若是以前的切換根不算的話)/sbin/init。以後內核退居幕後,前面由init程序來負責。init負責啓動初始化已定義的各類服務程序和環境。
init就是用戶空間的全部程序的祖先。
init是完成系統用戶空間初始化的項目總稱,它在不一樣的系統版本上有不一樣的實現:
init程序的類型:
CentOS 5-:SysV init
配置文件:/etc/inittab
CentOS 6:Upstart
配置文件:/etc/inittab
/etc/init/*.conf
CentOS 7:Systemd
配置文件:/usr/lib/systemd/system/, /etc/systemd/system/