嘔心瀝血!CentOS系統(tǒng)啟動(dòng)流程詳解!
系統(tǒng)啟動(dòng)流程是Linux一個(gè)重要的內(nèi)容,深入了解啟動(dòng)流程會(huì)對(duì)我們學(xué)習(xí)Linux起到一個(gè)順?biāo)浦鄣淖饔?。因?yàn)镃entOS 7改動(dòng)較大,所以下面的內(nèi)容只是針對(duì)CentOS 5和6來(lái)說(shuō)的。下面進(jìn)入正題。
啟動(dòng)流程:
***步:POST加電自檢
此過(guò)程的就是為了檢測(cè)一下外界的硬件設(shè)備是否能夠正常運(yùn)行,如CPU,內(nèi)存設(shè)備,硬盤(pán)等等這些硬件設(shè)備是否可以正常工作。
第二步:BIOS選擇啟動(dòng)方式
BIOS對(duì)于經(jīng)?;A(chǔ)計(jì)算機(jī)的人應(yīng)該不會(huì)陌生,特別是那些經(jīng)常裝系統(tǒng)的人,它就是列出幾個(gè)選項(xiàng),讓你選擇以什么方式來(lái)啟動(dòng)系統(tǒng),常見(jiàn)的有硬盤(pán)啟動(dòng),光盤(pán),以及網(wǎng)絡(luò)方式啟動(dòng)。
第三步:BootLoader
這個(gè)步驟略有復(fù)雜,但是其實(shí)現(xiàn)的功能就是,引導(dǎo)加載系統(tǒng)中的核心文件,并提交到內(nèi)存運(yùn)行,它會(huì)列出一個(gè)grub菜單,其中的選項(xiàng)是我們操作系統(tǒng)的內(nèi)核,你選擇的內(nèi)核文件會(huì)被加載至內(nèi)存中運(yùn)行。
引導(dǎo)加載器grub:找到內(nèi)核文件,提供grub菜單
代碼分析:
- [root@localhost testdir]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img . //將/boot下的ramfs文件拷貝至當(dāng)前目錄
- [root@localhost testdir]# zcat initramfs-2.6.32-642.el6.x86_64.img |cpio -id //將其解壓縮
- 140023 blocks
- [root@localhost testdir]# ls //其包含的內(nèi)如如下,因?yàn)槭桥R時(shí)的根文件,所以目錄結(jié)構(gòu)也類似于我們的rootfs,其中包含rootfs所需要的文件系統(tǒng)的驅(qū)動(dòng)
- bin dracut-004-409.el6 init initqueue-settled lib netroot pre-trigger sbin tmp
- cmdline emergency initqueue initqueue-timeout lib64 pre-mount pre-udev sys usr
- dev etc initqueue-finished initramfs-2.6.32-642.el6.x86_64.img mount pre-pivot proc sysroot var
- [root@localhost testdir]#
第四步:加載內(nèi)核文件
通過(guò)上面所選擇的內(nèi)核文件,來(lái)將其加載至內(nèi)存中解壓縮,分為以下四個(gè)步驟
1)探測(cè)可識(shí)別到的所有硬件設(shè)備。
2)加載硬件驅(qū)動(dòng)程序(可能借助于ramdisk/ramfs加載驅(qū)動(dòng))
3)以只讀方式掛載根文件系統(tǒng)
4)運(yùn)行用戶空間的***個(gè)應(yīng)用程序:/sbin/init
注意:其中Ramdisk/ramfs即stage2所在分區(qū)的rootfs文件系統(tǒng)驅(qū)動(dòng)的文件,有了內(nèi)核文件及所需要的rootfs的文件系統(tǒng)驅(qū)動(dòng),為避免內(nèi)核文件有bug或者人為操作問(wèn)題,先以只讀方式掛載rootfs
代碼分析:
Init程序初始化
1)根據(jù)init的配置文件獲取到運(yùn)行級(jí)別信息,并獲取系統(tǒng)初始化腳本的文件路徑。(CentOS 5的init文件為/etc/inittab,CentOS6將/etc/inittab文件拆分為多個(gè)文件)
2)讀取系統(tǒng)初始化腳本/etc/rc.d/rc.sysinit,并按照腳本內(nèi)容執(zhí)行,作用如下: (1)設(shè)置主機(jī)名(2)設(shè)置歡迎信息(3)激活udev和selinux(4)掛載/etc/fstab文件中定義的文件系統(tǒng)(5)檢測(cè)根文件系統(tǒng),并以讀寫(xiě)方式重新掛載根文件系統(tǒng)(6)設(shè)置系統(tǒng)時(shí)鐘(7)激活swap設(shè)備(8)根據(jù)/etc/sysctl.conf文件設(shè)置內(nèi)核參數(shù)(9)激活lvm及software raid設(shè)備(10)加載額外設(shè)備的驅(qū)動(dòng)程序(11)清理操作 3)根據(jù)前面獲取的運(yùn)行級(jí)別,運(yùn)行/etc/rc.d/rc腳本文件
/etc/rc.d/目錄下有幾個(gè)rc#.d(#號(hào)數(shù)字,也就是代表運(yùn)行級(jí)別),其目錄下文件為鏈接文件,其指向/etc/init.d/下的服務(wù)腳本文家,根據(jù)在/etc/inittab獲取的默認(rèn)運(yùn)行級(jí)別和/etc/rc#.d下的鏈接文件,來(lái)啟動(dòng)和關(guān)閉系統(tǒng)的服務(wù),想必現(xiàn)在也能聯(lián)想到了為什么不同級(jí)別下啟動(dòng)的服務(wù)不相同,為什么有的服務(wù)開(kāi)機(jī)啟動(dòng),有的卻關(guān)閉 /etc/rc#.d/下的鏈接文件以K或者S開(kāi)頭,K表示開(kāi)機(jī)要被停止的服務(wù),S表示開(kāi)機(jī)要被啟動(dòng)的服務(wù),而且服務(wù)腳本都會(huì)有一個(gè)優(yōu)先級(jí),
- K*:K##*:##運(yùn)行次序;數(shù)字越小,越先運(yùn)行;數(shù)字越小的服務(wù),通常為依賴到別的服務(wù)
- S*:S##*:##運(yùn)行次序;數(shù)字越小,越先運(yùn)行;數(shù)字越小的服務(wù),通常為被依賴到的服務(wù)
注意:在2345級(jí)別的/etc/rc#.d目錄下都會(huì)有一個(gè)rc.local,它其實(shí)也是一個(gè)鏈接文件,鏈接到/etc/rc.d/rc.local,它并不是啟動(dòng)文件,而是一個(gè)普通的文件,不過(guò)它的優(yōu)先級(jí)最小,所以***啟動(dòng),如果你想要開(kāi)機(jī)做一些什么操作,可以寫(xiě)到這個(gè)腳本里面。
代碼分析:以下為CentOS 5中的/etc/inittab文件
下圖為系統(tǒng)啟動(dòng)時(shí)服務(wù)開(kāi)啟的界面
第六步:?jiǎn)?dòng)終端
根據(jù)前面獲取的默認(rèn)運(yùn)行級(jí)別來(lái)啟動(dòng)終端,如果運(yùn)行級(jí)別為5,則啟動(dòng)圖形界面
第七步:用戶登錄
系統(tǒng)啟動(dòng)流程結(jié)束!
問(wèn)題總結(jié):
在此之前,一直有幾點(diǎn)問(wèn)題困惑著我,我對(duì)它們做了一下總結(jié)
1)內(nèi)核文件在磁盤(pán)上,系統(tǒng)還沒(méi)有啟動(dòng),系統(tǒng)還沒(méi)有啟動(dòng),/目錄也沒(méi)有掛載,前面說(shuō)先找到boot分區(qū),但是boot分區(qū)也是在/的目錄下,/還沒(méi)有,去哪找boot!?
問(wèn)題解答:注意,此時(shí)系統(tǒng)去尋找boot分區(qū)下的grub菜單、內(nèi)核文件及rootfs的驅(qū)動(dòng)并不是通過(guò)/目錄來(lái)尋找,因?yàn)榇藭r(shí)的/還沒(méi)有掛載,無(wú)法找到/下面的boot目錄,而是直接去boot的那個(gè)磁盤(pán)分區(qū)去尋找所需要的文件,具體看一下代碼:
2)上面問(wèn)題的繼續(xù),即使你先加載boot分區(qū),boot分區(qū)系統(tǒng)的系統(tǒng)驅(qū)動(dòng)在哪里呢
問(wèn)題解答:從以下代碼得知,分區(qū)信息是從1柱面開(kāi)始的,那么0柱面被狗吃了么?答案是沒(méi)有被狗吃,MBR存放在了0柱面,0磁道的***個(gè)扇區(qū)內(nèi),但是它只占據(jù)了512個(gè)字節(jié),因?yàn)?柱面包括了好多扇區(qū),后面的扇區(qū)就是為了存放/boot分區(qū)的文件系統(tǒng)驅(qū)動(dòng)的。stage1->stage1.5->stage2這個(gè)過(guò)程就是為了掛載/boot分區(qū),而其中的stage1.5就是尋找/boot分區(qū)的文件系統(tǒng)驅(qū)動(dòng)的。
3)加載內(nèi)核后,為避免bug或者人為操作失誤,rootfs先以只讀方式掛載,只讀方式掛載怎么寫(xiě)數(shù)據(jù)呢?
問(wèn)題解答:內(nèi)核在讀取到init程序后,其中有一個(gè)系統(tǒng)初始化腳本,即/etc/rc.d/rc.sysinit腳本,其中有一段代碼如下,在這rootfs會(huì)被重新以讀寫(xiě)方式掛載。
流程圖:
俗話說(shuō)的好,一圖抵千言,我將上面所述的啟動(dòng)流程又畫(huà)了一幅圖,希望以更加清晰地描述CentOS的啟動(dòng)流程。