1. 加載BIOS的硬件信息,并獲取第一個啟動設(shè)備的代號。
2. 讀取第一個啟動設(shè)備的MBR的引導(dǎo)加載程序(即lilo、grub、spfdisk等)的啟動信息。
3. 加載操作系統(tǒng)的核心信息,核心開始解壓,并嘗試驅(qū)動所有的硬件設(shè)備。
4. 核心執(zhí)行init程序并獲得運行信息。
5. init執(zhí)行/etc/rc.d/rc.sysinit文件。
6. 啟動核心的外掛模塊(/etc/modprobe.conf)。
7. init執(zhí)行運行的各個批處理文件(Script)
8. init執(zhí)行/etc/rc.d/rc.local文件。
9. 執(zhí)行/bin/login程序,等待用戶登錄。
10. 登錄之后開始以shell控制主機(jī)。
1. linux核心的引導(dǎo)
操作系統(tǒng)的核心是放在文件系統(tǒng)中的,要想正確加載核心就必須提前識別文件系統(tǒng)。系統(tǒng)剛啟動的時候,就需要通過引導(dǎo)加載程序(即lilo、grub、spfdisk等)來識別文件系統(tǒng),引導(dǎo)核心。要想加載linux的核心就必須能識別linux的文件系統(tǒng),要加載windows核心就必須能識別windows文件系統(tǒng)。而grub是同時支持linux和windows的。但windows的加載程序并不支持linux文件系統(tǒng),所以在多重啟動設(shè)置的時候,總是要先裝windows而后裝Linux。
核心文件在哪里呢?一般來說,它會放在/boot里,并且取名為/boot/vmlinuz。
在加載核心的過程中,必須知道,系統(tǒng)只會“載入根目錄”,并且是以只讀方式載入的。有時為了讓某些功能可以用文件的方法來讀取,有的系統(tǒng)在啟動的時,會建立虛擬盤(ramdisk),這就需要使用initrd以及l(fā)inuxrc了。在加載核心的時候,一起加載initrd的映像文件(boot/initrd-xxxx.img),并利用linuxrc(在initrd的映像文件內(nèi))程序來加載模塊。在核心驅(qū)動外部硬件的工作完成之后,initrd所建立的虛擬盤就會被刪除。
2. 第一個程序init的加載和runlevel設(shè)置
在核心加載完成之后,系統(tǒng)就準(zhǔn)備好了,等待程序的執(zhí)行。整個linux系統(tǒng)中,第一個執(zhí)行的程序就是“/sbin/init”。init程序做的工作相當(dāng)多,除了利用設(shè)置文件“/etc/inittab”來獲取運行等級之外,還會通過運行等級的設(shè)置值啟動不同的服務(wù)項目。運行等級是指linux通過設(shè)置不同等級來規(guī)定系統(tǒng)用不同的服務(wù)來啟動,讓linux的使用環(huán)境不同。
"/etc/inittab"中有這么一句"si::sysinit:/etc/rc.d/rc.sysinit",表明系統(tǒng)需要主動使用"rc.sysinit"這個shell腳本來設(shè)置系統(tǒng)環(huán)境。但這個文件的文件名在各個版本中是不一樣的,需要自行查看確認(rèn)。
Code
1 [root@linux ~]#vi /etc/inittab
2 # 設(shè)置系統(tǒng)啟動默認(rèn)的運行等級設(shè)置項目
3 id:3:initdefault:
4
5 # 開始啟動運行等級的服務(wù)前,使用檢測與初始化系統(tǒng)環(huán)境的設(shè)置文件:
6 si::sysinit:/etc/rc.d/rc.sysinit
7
8 # 7個不同運行等級需要啟動的服務(wù)的腳本放置位置路徑:
9 10:0:wait:/etc/rc.d/rc 0
10 11:1:wait:/etc/rc.d/rc 1
11 12:2:wait:/etc/rc.d/rc 2
12 13:3:wait:/etc/rc.d/rc 3
13 14:4:wait:/etc/rc.d/rc 4
14 15:5:wait:/etc/rc.d/rc 5
15 16:6:wait:/etc/rc.d/rc 6
16
17 # 是否運行按下[ctrl]+[alt]+[del]就重新啟動的設(shè)置項目:
18 ca::ctrlatdel:/sbin/shutdown -t3 -r now
19
20 # 本機(jī)終端啟動的個數(shù):
21 1:2345:respawn:/sbin/mingetty tty1
22 2:2345:respawn:/sbin/mingetty tty2
23 3:2345:respawn:/sbin/mingetty tty3
24 4:2345:respawn:/sbin/mingetty tty4
25 5:2345:respawn:/sbin/mingetty tty5
26 6:2345:respawn:/sbin/mingetty tty6
27
28 # 在X Window(運行級別5)環(huán)境下啟動腳本設(shè)置項目
29 x:5:once:/etc/X11/prefdm -nodaemon
30
3. init處理系統(tǒng)的初始化流程(/etc/rc.d/rc.sysinit)
(1)獲取網(wǎng)絡(luò)環(huán)境與主機(jī)類型。首先會讀取網(wǎng)絡(luò)環(huán)境設(shè)置文件"/etc/sysconfig/network",獲取主機(jī)名稱與默認(rèn)網(wǎng)關(guān)等網(wǎng)絡(luò)環(huán)境。
(2)測試與載入內(nèi)存設(shè)備/proc及usb設(shè)備/sys。除了/proc外,系統(tǒng)會主動檢測是否有usb設(shè)備,并主動加載usb驅(qū)動,嘗試載入usb文件系統(tǒng)。
(3)決定是否啟動SELinux。
(4)接口設(shè)備的檢測與即插即用(pnp)參數(shù)的測試。
(5)用戶自定義模塊的加載。用戶可以再"/etc/sysconfig/modules/*.modules"加入自定義的模塊,此時會加載到系統(tǒng)中。
(6)加載核心的相關(guān)設(shè)置。又一個文件"/etc/sysctl.conf",按這個文件的設(shè)置值配置功能。
(7)設(shè)置系統(tǒng)時間(clock)。
(8)設(shè)置終端的控制臺的字形。
(9)設(shè)置raid及LVM等硬盤功能。
(10)以方式查看檢驗磁盤文件系統(tǒng)。
(11)進(jìn)行磁盤配額quota的轉(zhuǎn)換。
(12)重新以讀取模式載入系統(tǒng)磁盤。
(13)啟動quota功能。
(14)啟動系統(tǒng)隨機(jī)數(shù)設(shè)備(產(chǎn)生隨機(jī)數(shù)功能)。
(15)清楚啟動過程中的臨時文件。
(16)將啟動信息加載到"/var/log/dmesg"文件中。
如果想知道啟動過程中發(fā)生了什么事可以查看dmesg文件。
4. 啟動系統(tǒng)服務(wù)"/etc/rc.d/rc*.d"與啟動設(shè)置文件"/etc/sysconfig"
之前結(jié)束了inittab中的rc.sysinit之后,系統(tǒng)可以順利工作了,只是還需要啟動系統(tǒng)所需要的各種服務(wù),這樣主機(jī)才可以提供相關(guān)的網(wǎng)絡(luò)和主機(jī)功能。因此根據(jù)之前設(shè)置的運行等級,會啟動不同的服務(wù)項目。如果當(dāng)時我們在inittab中選擇了等級3,系統(tǒng)則會在"/etc/rc.d/rc3.d"目錄中運行相應(yīng)的服務(wù)內(nèi)容,選擇等級5,就在"/etc/rc.d/rc5.d"目錄內(nèi)。
該目錄下的內(nèi)容全部都是以 S 或 K 開頭的鏈接文件,都鏈接到"/etc/rc.d/init.d"目錄下的各種shell腳本。S表示的是啟動時需要start的服務(wù)內(nèi)容,K表示關(guān)機(jī)時需要關(guān)閉的服務(wù)內(nèi)容。如果我們需要自己增加啟動的內(nèi)容,可以再init.d目錄中增加相關(guān)的shell腳本,然后在rc*.d目錄中建立鏈接文件指向該shell腳本。這些shell腳本的啟動或結(jié)束順序是由S或K字母后面的數(shù)字決定,例如S01sysstat表示第一個執(zhí)行sysstat腳本,S99local表示排在第99位執(zhí)行rc.local腳本。
5. 用戶自定義引導(dǎo)程序(/etc/rc.d/rc.local)
一般來說,自定義的程序不需要執(zhí)行上面所說的繁瑣的建立shell增加鏈接文件的步驟,只需要將命令放在rc.local里面就可以了,這個shell腳本就是保留給用戶自定義啟動內(nèi)容的。
6. 啟動終端和X-Window界面
完成了系統(tǒng)所有的啟動任務(wù)后,linux會啟動終端或X-Window來等待用戶登錄。
tty1,tty2,tty3...這表示在運行等級1,2,3,4的時候,都會執(zhí)行"/sbin/mingetty",而且執(zhí)行了6個,所以linux會有6個純文本終端,mingetty就是啟動終端的命令。
除了這6個之外還會執(zhí)行"/etc/X11/prefdm -nodaemon"這個主要啟動X-Window
7. 有關(guān)變換運行等級
當(dāng)linux已經(jīng)登錄之后,有時候還希望更換運行等級,一種方法是改變"/etc/inittab"內(nèi)的設(shè)置內(nèi)容,將"id:3:initdefault:"中的數(shù)字改成相應(yīng)等級,然后重啟即可。
如果只是想暫時地改變運行等級,下次啟動還是按原等級登錄,可以直接使用init [0-6]命令來改變運行等級。一般來說,運行等級的不同只是相關(guān)的啟動服務(wù)內(nèi)容的不同而已,因此使用命令改變等級會比較兩個改變等級之間的服務(wù)內(nèi)容,關(guān)閉一些新等級中不需要的服務(wù)項目,啟動新等級需要的服務(wù),而保量新等級和原等級中共有的服務(wù)內(nèi)容。查詢目前等級的命令也很簡單,只需要輸入runlevel即可。如:[root@linux ~]# runlevel 結(jié)果顯示:N 3