linux的基礎啓動流程

    linux的基礎啓動流程
1. 加載BIOS的硬件信息,並獲取第一個啓動設備的代號。
2. 讀取第一個啓動設備的MBR的引導加載程序(即lilogrubspfdisk等)的啓動信息。
3. 加載操作系統的核心信息,核心開始解壓,並嘗試驅動所有的硬件設備。
4. 核心執行init程序並獲得運行信息。
5. init執行/etc/rc.d/rc.sysinit文件。
6. 啓動核心的外掛模塊(/etc/modprobe.conf)。
7. init執行運行的各個批處理文件(Script
8. init執行/etc/rc.d/rc.local文件。
9. 執行/bin/login程序,等待用戶登錄。
10. 登錄之後開始以shell控制主機。

1. linux核心的引導
操作系統的核心是放在文件系統中的,要想正確加載核心就必須提前識別文件系統。系統剛啓動的時候,就需要通過引導加載程序(即lilogrubspfdisk等)來識別文件系統,引導核心。要想加載linux的核心就必須能識別linux的文件系統,要加載windows核心就必須能識別windows文件系統。而grub是同時支持linuxwindows的。但windows的加載程序並不支持linux文件系統,所以在多重啓動設置的時候,總是要先裝windows而後裝Linux

核心文件在哪裏呢?一般來說,它會放在/boot裏,並且取名爲/boot/vmlinuz

在加載核心的過程中,必須知道,系統只會載入根目錄,並且是以只讀方式載入的。有時爲了讓某些功能可以用文件的方法來讀取,有的系統在啓動的時,會建立虛擬盤(ramdisk),這就需要使用initrd以及linuxrc了。在加載核心的時候,一起加載initrd的映像文件(boot/initrd-xxxx.img),並利用linuxrc(在initrd的映像文件內)程序來加載模塊。在覈心驅動外部硬件的工作完成之後,initrd所建立的虛擬盤就會被刪除。

2. 第一個程序init的加載和runlevel設置
在覈心加載完成之後,系統就準備好了,等待程序的執行。整個linux系統中,第一個執行的程序就是/sbin/initinit程序做的工作相當多,除了利用設置文件/etc/inittab來獲取運行等級之外,還會通過運行等級的設置值啓動不同的服務項目。運行等級是指linux通過設置不同等級來規定系統用不同的服務來啓動,讓linux的使用環境不同。

"/etc/inittab"中有這麼一句"si::sysinit:/etc/rc.d/rc.sysinit",表明系統需要主動使用"rc.sysinit"這個shell腳本來設置系統環境。但這個文件的文件名在各個版本中是不一樣的,需要自行查看確認。
 

 

 

 1 [root@linux ~]#vi /etc/inittab
 2 # 設置系統啓動默認的運行等級設置項目
 3 id:3:initdefault:
 4 
 5 # 開始啓動運行等級的服務前,使用檢測與初始化系統環境的設置文件:
 6 si::sysinit:/etc/rc.d/rc.sysinit
 7 
 8 # 7個不同運行等級需要啓動的服務的腳本放置位置路徑:
 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]就重新啓動的設置項目:
18 ca::ctrlatdel:/sbin/shutdown -t3 -r now
19 
20 # 本機終端啓動的個數:
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)環境下啓動腳本設置項目
29 x:5:once:/etc/X11/prefdm -nodaemon
30  


 

3. init處理系統的初始化流程(/etc/rc.d/rc.sysinit
1)獲取網絡環境與主機類型。首先會讀取網絡環境設置文件"/etc/sysconfig/network",獲取主機名稱與默認網關等網絡環境。
2)測試與載入內存設備/procusb設備/sys。除了/proc外,系統會主動檢測是否有usb設備,並主動加載usb驅動,嘗試載入usb文件系統。
3)決定是否啓動SELinux
4)接口設備的檢測與即插即用(pnp)參數的測試。
5)用戶自定義模塊的加載。用戶可以再"/etc/sysconfig/modules/*.modules"加入自定義的模塊,此時會加載到系統中。
6)加載核心的相關設置。又一個文件"/etc/sysctl.conf",按這個文件的設置值配置功能。
7)設置系統時間(clock)。
8)設置終端的控制檯的字形。
9)設置raidLVM等硬盤功能。
10)以方式查看檢驗磁盤文件系統。
11)進行磁盤配額quota的轉換。
12)重新以讀取模式載入系統磁盤。
13)啓動quota功能。
14)啓動系統隨機數設備(產生隨機數功能)。
15)清楚啓動過程中的臨時文件。
16)將啓動信息加載到"/var/log/dmesg"文件中。
如果想知道啓動過程中發生了什麼事可以查看dmesg文件。

4. 啓動系統服務"/etc/rc.d/rc*.d"與啓動設置文件"/etc/sysconfig"
之前結束了inittab中的rc.sysinit之後,系統可以順利工作了,只是還需要啓動系統所需要的各種服務,這樣主機纔可以提供相關的網絡和主機功能。因此根據之前設置的運行等級,會啓動不同的服務項目。如果當時我們在inittab中選擇了等級3,系統則會在"/etc/rc.d/rc3.d"目錄中運行相應的服務內容,選擇等級5,就在"/etc/rc.d/rc5.d"目錄內。

該目錄下的內容全部都是以 或 開頭的鏈接文件,都鏈接到"/etc/rc.d/init.d"目錄下的各種shell腳本。S表示的是啓動時需要start的服務內容,K表示關機時需要關閉的服務內容。如果我們需要自己增加啓動的內容,可以再init.d目錄中增加相關的shell腳本,然後在rc*.d目錄中建立鏈接文件指向該shell腳本。這些shell腳本的啓動或結束順序是由SK字母后面的數字決定,例如S01sysstat表示第一個執行sysstat腳本,S99local表示排在第99位執行rc.local腳本。

5. 用戶自定義引導程序(/etc/rc.d/rc.local
一般來說,自定義的程序不需要執行上面所說的繁瑣的建立shell增加鏈接文件的步驟,只需要將命令放在rc.local裏面就可以了,這個shell腳本就是保留給用戶自定義啓動內容的。

6. 啓動終端和X-Window界面
完成了系統所有的啓動任務後,linux會啓動終端或X-Window來等待用戶登錄。
tty1,tty2,tty3...這表示在運行等級1234的時候,都會執行"/sbin/mingetty",而且執行了6個,所以linux會有6個純文本終端,mingetty就是啓動終端的命令。
除了這6個之外還會執行"/etc/X11/prefdm -nodaemon"這個主要啓動X-Window

7. 有關變換運行等級
linux已經登錄之後,有時候還希望更換運行等級,一種方法是改變"/etc/inittab"內的設置內容,將"id:3:initdefault:"中的數字改成相應等級,然後重啓即可。

如果只是想暫時地改變運行等級,下次啓動還是按原等級登錄,可以直接使用init [0-6]命令來改變運行等級。一般來說,運行等級的不同只是相關的啓動服務內容的不同而已,因此使用命令改變等級會比較兩個改變等級之間的服務內容,關閉一些新等級中不需要的服務項目,啓動新等級需要的服務,而保量新等級和原等級中共有的服務內容。查詢目前等級的命令也很簡單,只需要輸入runlevel即可。如:[root@linux ~]# runlevel  結果顯示:N 3

發佈了45 篇原創文章 · 獲贊 7 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章