1.post加電自檢
這個過程是開機後,BIOS或UEFI進行硬件檢查的階段
2.MBR引導
自檢硬件沒有問題時候,這裡以BIOS為例,BIOS將會直接去找硬盤的第一個扇區,找到前446字節,將MBR加載到內存中,MBR將告訴程序下一階段去哪裡找系統grub引導。此階段屬於grub的第一階段。grub還有1.5階段和2階段。
3.GRUB引導
grub第1.5和2階段,信息默認存放在扇區中,如果使用grub-install生成的2階段的文件是存放在/boot分區中的。
為了加載內核系統,不得不加載/boot分區,而加載/boot分區,需要有/boot分區的驅動,/boot分區驅動是放在/boot分區中的,啊,我們好像進入了死循環了,Linux是怎麼解決的呢?就是靠放在1.5階段中的數據,是放在第一個扇區後的後續扇區中,具體佔用多少字節,不太清楚,只知道1.5階段和2階段總共27個扇區。
stage1.5:
mbr之後的扇區,識別stage2所在的分區上的文件系統
stage2:
開機啟動的時候看到的Grub選項、信息,還有修改GRUB背景等功能都是stage2提供的,stage2會去讀入/boot/grub/grub.conf或者menu.lst等配置文件
4.讀取grub.conf文件
讀取grub.conf文件以確定內核啟動的參數,準備啟動內核
5.啟動內核
加載內核,核心開始解壓縮,啟動一些最核心的程序。
因為為了讓內核足夠輕小,硬件驅動並沒有放在內核文件裡面,我們可以看到內核很小,才4M左右,我們可以想象Windows中的驅動,安裝系統時候還需要使用驅動軟件下載好長時間呢
因此需要使用/initramfs-2.6.32-696.el6.x86_64.img來驅動硬件
6.加載偽文件系統(ramdisk),
內核已將啟動起來了,再調用ramdisk文件,嘗試驅動所有的硬件設備,到這一步,內核起來了,所有驅動也裝上了,因此後面的啟動就可以交給程序了
7.啟動init進程
grub中默認指定init=/sbin/init程序,可以在grub.conf中kernel行自定義執行程序init=/bin/bash,此時可以繞過下面步驟直接進入bash界面。
內核源代碼文件中顯示996行左右,規定了init啟動的順序,/sbin/init->/etc/init->/bin/init->/bin/sh,/bin/bash沒有寫,應該是和/bin/sh一樣吧
(1)讀取/etc/inittab文件
inittab文件裡面定義了系統默認運行級別,這一步做了一些工作如下:
a)初始運行級別(RUN LEVEL)
b)系統初始化腳本
c)對應運行級別的腳本目錄
d)定義UPS電源終端/恢復腳本
e)在虛擬控制檯生成getty,以生成終端
f)在運行級別5初始化X
(2)執行/etc/rc.d/rc.sysinit程序
系統初始化一些腳本,主要完成以下工作
a)設置主機名
b)設置歡迎信息
c)激活udev和selinux可以在grub.conf中,kernel行添加selinux=0以關閉selinux
d)掛載/etc/fstab文件中定義的文件系統
e)檢測根文件系統,並以讀寫方式重新掛載根文件系統
f)設置系統時鐘
g)激活swap設備
h)根據/etc/sysctl.conf文件設置內核參數
i)激活lvm及software raid設備
j)加載額外設備的驅動程序
k)清理操作
(3)/etc/rc3.d/文件(各種服務)
裡面定義的是各種服務的啟動腳本,可以ls查看,S開頭代表開機啟動的服務,K開頭的是關機要執行的任務。#代表數字,一個數字代表一個運行級別,共7個運行級別。
(4)/etc/rc.d/rc.local文件
這裡面可以自定義開機啟動的命令。
8.執行/bin/login
執行/bin/login程序,等待用戶登錄
CentOS7啟動流程
CentOS7和CentOS6啟動流程差不多,只不過到init程序時候,改為了systemd,因此詳細解釋一下systemd後的啟動流程
1.uefi或BIOS初始化,開始post開機自檢
2.加載mbr到內存
3.GRUB階段
4.加載內核和inintamfs模塊
5.內核開始初始化,使用systemd來代替centos6以前的init程序
(1)執行initrd.target
包括掛載/etc/fstab文件中的系統,此時掛載後,就可以切換到根目錄了
(2)從initramfs根文件系統切換到磁盤根目錄
(3)systemd執行默認target配置
centos7表面是有“運行級別”這個概念,實際上是為了兼容以前的系統,每個所謂的“運行級別”都有對應的軟連接指向,默認的啟動級別時/etc/systemd/system/default.target,根據它的指向可以找到系統要進入哪個模式
模式:
0 ==> runlevel0.target, poweroff.target
1 ==> runlevel1.target, rescue.target
2 ==> runlevel2.target, multi-user.target
3 ==> runlevel3.target, multi-user.target
4 ==> runlevel4.target, multi-user.target
5 ==> runlevel5.target, graphical.target
6 ==> runlevel6.target, reboot.target
(4)systemd執行sysinit.target
有沒有很眼熟?是的,在CentOS6上是被叫做rc.sysint程序,初始化系統及basic.target準備操作系統
(5)systemd啟動multi-user.target下的本機與服務器服務
(6)systemd執行multi-user.target下的/etc/rc.d/rc.local
6.Systemd執行multi-user.target下的getty.target及登錄服務
7.systemd執行graphical需要的服務
閱讀更多 pengpeng2008 的文章