前言:當我們了解了系統的啟動過程,那麼系統啟動出問題時,我們就能知道什麼地方出錯了,就能哪裡出錯修哪裡,不需要重裝系統。
CentOS6和CentOS7啟動流程類似,不過CentOS6和7在啟動後期不一樣,CentOS6後期是init,CentOS7是systemd,那麼細節之處呢,跟着我一塊看看吧!
linux啟動流程(如下圖)

上圖大概介紹了過程,現在來讓我詳細介紹一下:
一、POST加電自檢
按下電源鍵首先要檢測硬體裝置是否能正常運作,如:cpu、記憶體、硬碟等硬體裝置。當然POST不是由硬體去檢測(因為硬體也不會啊!),而是依靠一個軟體來完成的,這個軟體就是BIOS(Basic Input Output System)基本輸入輸出系統,它安裝在CMOS晶片上,上電就是給CMOS加電,然後啟動BIOS程式,BIOS會根據CMOS上記錄的硬體資訊去讀取硬體并檢測是否能正常運作,之後初始化硬體裝置。
二、MBR引導
MBR是存儲在硬碟上的0磁道第一扇區中,其大小為512位元組;自檢硬體沒有問題時候,這裡以BIOS為例,BIOS将會直接去找硬碟的第一個扇區,找到前446位元組,将MBR加載到記憶體中,MBR将告訴程式下一階段去哪裡找系統grub引導。此階段屬于grub的第一階段。grub還有1_5階段和2階段。
1、stage 1階段
上圖中從位址0000000到000001b0标記的内容便是BootLoader所在的位置,共446位元組,即stage1階段,這一階段的任務比較簡單,就是初始化環境,為後面的階段做準備,存放在MBR上。
2、stage1_5階段
由于stage1階段并不加載檔案系統的驅動,是以stage1_5的作用主要是加載/boot所在分區檔案系統類型的驅動,使系統能夠找到/boot。這些資料最後以*stage1_5這種格式的檔案存放在/boot/grub目錄下。
3、stage2階段
有了stage1_5階段的引導,系統臨時以/boot為根,此時系統将去找/boot/grub/grub.conf(針對CentOS 7之前的系統,CentOS 7采用的grub2),這個檔案在系統的啟動流程中占據這重要的作用;而且在這個檔案中定義了系統的核心檔案,以及虛拟根檔案系統檔案。
補充:grub.conf檔案:使用vim打開grub.conf檔案。另外grub也有自己的配置檔案:/boot/grub/grub.conf且通常有個符号連結檔案:/etc/grub.conf;
[ root@localhost boot ]#vim grub/grub.conf default=0 timeout=5 hiddenmenu title linux root (hd0,0) kernel /vmlinuz root=/dev/sda2 init=/sbin/init initrd /initramfs-2.6.32-696.el6.x86_64.img
default=0:表示預設以哪個核心啟動
timeout=N:表示預設啟動倒計時,如果你不選擇啟動項,倒計時N秒将以預設核心啟動
hiddenmenu:表示顯示菜單,如果你不寫這一項,啟動時将隐藏菜單
root (hd0,0):指定根所在的分區
kernel:指定啟動的核心檔案;root所在的分區,以及初始化第一個程序等資訊
initrd :指定initramfs檔案,即虛拟根檔案系統
注意:上述kernel和initrd的順數是不能交換的。如果順序颠倒,系統将不能啟動。
三、加載Kernel(初始化)
/boot目錄下包含vmlinuz,initramfs等核心相關的檔案,Boot Loader讀取/boot目錄下所有檔案、配置檔案與環境參數資訊後,會把核心解壓加載到記憶體中,根據核心提供的功能開始檢測,加載各個裝置,此次檢測與BIOS自檢不同,執行到此,後續工作都由核心來完成(因為Boot Loader已把vmlinuz,initramfs加載到記憶體中),此時的核心還沒有加載磁盤,因為還沒有磁盤驅動程式,核心需要通過/boot目錄下的虛拟檔案系統,也就是initramfs,模拟一個rootfs(根檔案系統),然後加載啟動過程中所需要的核心子產品,加載後釋放rootfs(根檔案系統),然後進行根挂載,在挂載根檔案系統時為了避免核心中有bug或操作過程中有bug導緻根檔案系統被損壞,先隻讀挂載根檔案系統,加載完成後才讀寫挂載,完成整個挂載根檔案系統後,直接去找/sbin/init程式,即開始運作使用者空間的第一個程式。
四、啟動init程序
grub中預設指定init=/sbin/init程式,可以在grub.conf中kernel行自定義執行程式init=/bin/bash,此時可以繞過下面步驟直接進入bash界面。
(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)執行清理操作
注意:正常級别下,最後啟動一個服務S99local沒有連結至/etc/rc.d/init.d一個服務腳本,而是指向 了/etc/rc.d/rc.local腳本。
不便或不需寫為服務腳本放置于/etc/rc.d/init.d/目錄,且又想開機時自動運作的指令,可直接放置于/etc/rc.d/rc.local檔案中,/etc/rc.d/rc.local在指定運作級别腳本後運作。
(3)執行/etc/rc#.d/檔案(各種服務)
裡面定義的是各種服務的啟動腳本,可以ls檢視,S開頭代表開機啟動的服務,K開頭的是關機要執行的任務。#代表數字,一個數字代表一個運作級别,共7個運作級别,這裡就不多說了。
centos 6中服務指令:chkconfig --lidt rpcbind
注意:run level 的切換:
與run level有關的啟動是在/etc/rc.d/rc.sysinit執行完畢後。run level的不同僅是/etc/rc[0-6].d裡面啟動服務不同而已。
1,要每次啟動都執行某個預設的 run level ,則需修改/etc/inittab 内的設定選項,即是 "id:5:initdefault:裡面的數字
2,如果僅是暫時更改系統的 run level 時,則使用 inint[0-6] 來進行 run level 的更改,但下次重新開機時,依舊會是以 /etc/ininttab 的設定為準
當執行 init3 時,系統會:
1),先比較/etc/rc3.d 及 /etc/rc5.d 内的K與S開頭的檔案
2),在新的 run level 即是 /etc/rc3.d 内有多的K開頭的檔案,則給予關閉
3),在新的 run level 即是 /etc/rc3.d 内有多的S開頭的檔案,則給予開啟
(4)執行/etc/rc.d/rc.local檔案
這裡面可以自定義開機啟動的指令,是Linux留給使用者進行個性化的地方。
五、執行/bin/login程式
執行/bin/login程式,等待使用者登入。
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及登入服務
getty.target我們也眼熟,它是啟動終端的systemd對象。如果到此步驟,系統沒有被指定啟動圖形桌面,到此就可以結束了,如果要啟動圖形界面,需要在此基礎上啟動桌面程式。
7.systemd執行graphical需要的服務
介紹個chkconfig指令:
檢視服務在所有級别的啟動或關閉設定情形:
chkconfig [–list] [name]
例:檢視所有服務: chkconfig --list
例:更改服務權限: chkconfig --level 3 network off
添加:chkconfig –add name
删除:chkconfig –del name
修改指定的連結類型:chkconfig [–level levels] name
|off|reset>
–level LLLL:指定要設定的級别;省略時表示2345;
結束:結尾了,我再給大家看一張更加詳細的圖,使你們能更清楚的了解啟動流程。
本文轉自 優果馥思 51CTO部落格,原文連結:http://blog.51cto.com/youguofusi/1969360