linux的基礎(chǔ)啟動流程 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控制主機。 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í)行。整個linux系統(tǒng)中,第一個執(zhí)行的程序就是“/sbin/init”。init程序做的工作相當多,除了利用設(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)境。但這個文件的文件名在各個版本中是不一樣的,需要自行查看確認。 ![]() ![]() 1 [root@linux ~]#vi /etc/inittab 2 # 設(shè)置系統(tǒng)啟動默認的運行等級設(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 # 本機終端啟動的個數(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)境與主機類型。首先會讀取網(wǎng)絡(luò)環(huán)境設(shè)置文件"/etc/sysconfig/network",獲取主機名稱與默認網(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)進行磁盤配額quota的轉(zhuǎn)換。 (12)重新以讀取模式載入系統(tǒng)磁盤。 (13)啟動quota功能。 (14)啟動系統(tǒng)隨機數(shù)設(shè)備(產(chǎn)生隨機數(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ù),這樣主機才可以提供相關(guān)的網(wǎng)絡(luò)和主機功能。因此根據(jù)之前設(shè)置的運行等級,會啟動不同的服務(wù)項目。如果當時我們在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)機時需要關(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)變換運行等級 當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 |
|