引導(dǎo)流程解析共分成三個(gè)部分,分別是linux引導(dǎo)流程、linux運(yùn)行級(jí)別、linux啟動(dòng)服務(wù)管理。下面一個(gè)一個(gè)來(lái):
上
上圖就是系統(tǒng)引導(dǎo)流程的流程圖,我們一個(gè)部分一個(gè)部分來(lái)分別介紹:
一、固件:電腦按下電源以后,首先都是加載固件,叫做firmwall,PC上面應(yīng)用最多的就是CMOS/BIOS(CMOS是固化在硬件上的那段程序,BIOS是基于這個(gè)程序的圖形化管理界面),它既不是硬件也不是軟件,它主要的功能是在硬件層面進(jìn)行加電自檢(通常是檢查線連上沒(méi),硬件可以識(shí)別沒(méi))。在SUN的系統(tǒng)里不叫cmos而叫prom,也不叫bios而叫openbooter,所以名字雖然不同但是原理是差不多的,要學(xué)習(xí)這些固件,在購(gòu)買(mǎi)服務(wù)器的時(shí)候,會(huì)有操作手冊(cè),上面會(huì)有各種命令的解釋。固件設(shè)置里面只講一點(diǎn)就是硬件時(shí)鐘和軟件時(shí)鐘的設(shè)置(hwclock與date)。
二、自居程序:在進(jìn)行完加電自檢,電腦會(huì)開(kāi)始讀硬盤(pán),首先讀的是MBR(master boot recorder)主引導(dǎo)記錄,主引導(dǎo)記錄在0柱面0磁頭1扇區(qū)的位置。主引導(dǎo)記錄分3個(gè)部分:自居程序bootloader,磁盤(pán)分區(qū)表Partition table,結(jié)束標(biāo)志字magic number。
自居程序在所有的操作系統(tǒng)里面都有,在linux自居程序中廣泛應(yīng)用的是grub(windows的自居程序在C盤(pán)可以查看到,NTloader)。那自居程序grub有什么用呢?它最重要的作用就是載入內(nèi)核。其實(shí)內(nèi)核在/boot文件夾是可以查看到的,內(nèi)核其實(shí)是一個(gè)可執(zhí)行文件而不是一堆文件。一堆文件的那個(gè)是內(nèi)核的源代碼文件而不是可以使用的內(nèi)核程序。內(nèi)核的版本號(hào)和名字等配置信息可以在/etc/grab.conf配置文件查看,該配置文件具體的內(nèi)容將在后續(xù)中詳細(xì)剖析。
三、載入內(nèi)核:在載入內(nèi)核以后,工作就交給了內(nèi)核。內(nèi)核在引導(dǎo)期間,其實(shí)最主要只做兩個(gè)事情:1.首先是驅(qū)動(dòng)硬件,所謂驅(qū)動(dòng)就是使系統(tǒng)認(rèn)識(shí)硬件,并調(diào)用硬件。一個(gè)系統(tǒng)最龐大的部分就是驅(qū)動(dòng),通常根據(jù)需要對(duì)驅(qū)動(dòng)進(jìn)行裁剪,就成了裁決系統(tǒng)。2然后就是啟動(dòng)一個(gè)進(jìn)程,叫做init進(jìn)程。它應(yīng)該是系統(tǒng)存在的第一個(gè)進(jìn)程。
四、啟動(dòng)進(jìn)程init:該進(jìn)程的的PID(進(jìn)程ID)恒為1,一般情況下PID是隨即分配的,但是init進(jìn)程是固定的。PPID稱為父進(jìn)程ID,可以看出init進(jìn)程的父進(jìn)程的PID為0,其實(shí)PID為0的進(jìn)程是內(nèi)核調(diào)度器(kernel scheduler)它負(fù)責(zé)對(duì)進(jìn)程進(jìn)行調(diào)度,即CPU時(shí)間片的分配。

在父子進(jìn)程關(guān)系中,按道理父進(jìn)程死了,子進(jìn)程必須死。但是有時(shí)候父進(jìn)程死了,但是子進(jìn)程因?yàn)槟撤N特殊情況并沒(méi)有死,這樣子進(jìn)程就成了孤兒進(jìn)程,linux檢查到孤兒進(jìn)程,會(huì)把該孤兒進(jìn)程的PPID變成1。另外一種情況,就是子進(jìn)程死了,父進(jìn)程不知道,導(dǎo)致子進(jìn)程變成僵尸進(jìn)程。
五、讀取配置文件inittab:在啟動(dòng)進(jìn)程init以后,就會(huì)讀取/etc/inittab配置文件。使用more /etc/inittab打開(kāi)inittab文件,首先看到的是關(guān)于系統(tǒng)運(yùn)行級(jí)別的信息。
Linux運(yùn)行級(jí)別(runlevel)一共有7種:
0halt(關(guān)機(jī))
1.Singgle user mode(但用戶,類似windows的安全模式)
2.Multiuser(沒(méi)有NFS網(wǎng)絡(luò)文件共享服務(wù)的多用戶模式,命令行)
3.Full multiuer mode(和3一樣,多加了NFS)
4.Unuerd(還未使用)
5.X11(默認(rèn)使用,圖形界面)
6.Reboot(重啟)
如上所述默認(rèn)的一般是5.通過(guò)命令runlevel可以查看當(dāng)前運(yùn)行級(jí)別。通過(guò)init num或者telinit num可以動(dòng)態(tài)切換運(yùn)行界別。(其實(shí)通過(guò)ls -l 'which telinit'可以得知telinit是init的一個(gè)軟鏈接)。
接著繼續(xù)學(xué)習(xí)inittab配置文件,使用grep -v '^#' /etc/inittab | more 得到?jīng)]有注釋的配置文件。通過(guò)man init可以得知,所有init配置文件里面的每行都是通過(guò)格式
id : runlevels : action : process
id:標(biāo)識(shí)符,標(biāo)記條目的唯一性,一般為兩位字母或者數(shù)字
runlevels:指定運(yùn)行級(jí)別,如果為空,表示所有運(yùn)行級(jí)別都可以。
action:指定腳本或者命令的運(yùn)行狀態(tài)
process:指定要運(yùn)行的腳本或者命令
下面對(duì)action的取值進(jìn)行介紹:
1.initdefault:指定系統(tǒng)缺省啟動(dòng)的運(yùn)行級(jí)別
2.sysinit:系統(tǒng)啟動(dòng)時(shí),執(zhí)行process指定的腳本或命令

3.wait:執(zhí)行process指定的命令或者腳本,并在執(zhí)行完成以后才運(yùn)行其他的條目.
4.once:執(zhí)行process命令或者腳本,但不等待其結(jié)束。
5.Ctrlaltdel:按下ctrl+alt+del鍵,執(zhí)行process
6.Respawn:一旦該process終止,則重新運(yùn)行該process指定的命令或。
7.Powerfail:電源出錯(cuò)執(zhí)行process
8.Powerokwait:電源恢復(fù)執(zhí)行的process
上述第三個(gè)action值wait的例子中,其實(shí)通過(guò)ls -l /etc/rc.d/rc可以得知,rc其實(shí)是一個(gè)可執(zhí)行文件(其實(shí)也是腳本)。在rc.d這個(gè)目錄下其實(shí)并不只有rc這一個(gè)文件,還有許多文件或者目錄。
可以看到有從rc0.d到rc6.d共7個(gè)目錄。他們是相應(yīng)運(yùn)行級(jí)別需要啟動(dòng)的服務(wù)目錄文件。系統(tǒng)是通過(guò)action:initdefault的運(yùn)行級(jí)別來(lái)匹配這里的服務(wù)目錄的。現(xiàn)在以rc3.d為例:
可以看到rc3.d目錄下有很多服務(wù)程序,從他們的名稱中,我可以可以得知它們的作用,名稱都是有3個(gè)部分組成:
第一個(gè)大寫(xiě)字母+數(shù)字+名字
第一個(gè)大寫(xiě)字母S(start)表示啟動(dòng)服務(wù),K(kill)表示殺死服務(wù)
數(shù)字表示啟動(dòng)順序,數(shù)字越小越先啟動(dòng),數(shù)字相同,按照創(chuàng)建時(shí)間啟動(dòng),名字根據(jù)作用而定。
所以在這里我們可以根據(jù)自己應(yīng)用的需要,把有用的進(jìn)程開(kāi)啟,無(wú)用的關(guān)閉,比如如果無(wú)用的不想開(kāi)啟,可以把S改成s,就不會(huì)啟動(dòng)了。
此處加一個(gè)專題,就是我們?nèi)绾卧谙到y(tǒng)啟動(dòng)好以后來(lái)動(dòng)態(tài)開(kāi)啟和關(guān)閉服務(wù)呢?
首先我們要知道,系統(tǒng)所有的服務(wù)都是在/etc/rc.d/init.d目錄下。我們可以通過(guò)start、stop、restart、status來(lái)啟動(dòng)、終止、重新啟動(dòng)、查看狀態(tài)來(lái)操作服務(wù)。例如:用sshd服務(wù)為例:
現(xiàn)在我們?nèi)绻岩粋€(gè)服務(wù)變成開(kāi)機(jī)啟動(dòng)有3種方法:
(1)第一個(gè)就是在/etc/rc.d/rcn.d的服務(wù)目錄中創(chuàng)建一個(gè)名為SXXX的軟鏈接,指向一個(gè)腳本就可以了。

(2)使用chkconfig命令設(shè)置進(jìn)程是否啟動(dòng)

(3)使用ntsysv進(jìn)入圖形化設(shè)置進(jìn)程是否啟動(dòng)