標籤:開機 流程
CentOS的開機可分為4個主要步驟;如所示:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/72/9B/wKiom1XoKbKydLKKAAEOx6wC624888.jpg" title="映像 022.png" width="700" height="280" border="0" hspace="0" vspace="0" style="width:700px;height:280px;" alt="wKiom1XoKbKydLKKAAEOx6wC624888.jpg" />
第一步:主板加電自檢,在開機後會運行,針對電腦硬體如CPU、主板、儲存空間等進行基本的功能檢測。當POST檢測到硬體部分存在問題時,一般會通過聲訊號(主板蜂鳴器)發出獨特的指示性聲訊號(例如長鳴、二短一長等)表明故障位置,同時會在顯示器輸出故障代碼或故障文字描述。
第二步:載入MBR中的Boot Loader: 中所周知,我們的主機上有時候不只一塊硬碟,也就是說,主機上有MBR中有boot Loader的裝置可能不只一個,BIOS中的boot sequence便定義了開機時到MBR中找boot loader的次序,類似中boot項---650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/72/9B/wKiom1XoLnrhnjrKAAJVFzDbkgQ915.jpg" title="2.png" alt="wKiom1XoLnrhnjrKAAJVFzDbkgQ915.jpg" />
在這裡可以設定開機擁有boot loader(Grub)的硬體裝置的先後順序,按照此菜單中各項,從上往下尋找可引導開機的裝置,若第一次尋找到可引導開機項,即使引導程式損壞,無法開機,也不會繼續往下尋找了;BIOS找到boot loader以後載入grub菜單,讓使用者選擇要載入到記憶體啟動並執行核心;
第 三步:從第二步中的grub配置中可尋找到核心的所在位置,將其加載入至記憶體中,核心進行自解壓、展開運行後,並將硬體控制權交予核心,grub從記憶體中退出。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/72/99/wKioL1Xo9dDQx1cLAAERHjYnifk752.jpg" title="1.png" alt="wKioL1Xo9dDQx1cLAAERHjYnifk752.jpg" />
可能需要ramdisk來協助掛載根檔案系統的原因是,如果跟檔案系統在特殊的磁碟介質上,或者是檔案系統比較(例如:RAID、LVM等),核心中沒有整合該裝置的驅動程式,所以無法掛載根檔案系統,因此需要藉助於ramdisk來協助掛載。如果根檔案系統在IDE磁碟,並且預設檔案系統格式為ext2或ext3,即使沒有ramdisk協助,根檔案系統也可以掛載;ramdisk的運行機制是在記憶體中載入一個虛擬根檔案系統去識別真正的根檔案系統所需的驅動程式並載入,載入完成後,核心便可識別真正的根檔案系統並將其掛載,此時ramdisk再將根切換給真正的根檔案系統,自己退出記憶體;CentOS5上的ramdisk為initrd,CentOS6上的卻是initrmfs,之所以改進的原因是因為核心的特性之一為使用緩衝對加速資料訪問。Initrd是將自己作為磁碟裝置與核心通訊,因此,initrd本來就運行於記憶體中,而核心還需要再次將其載入一份作為緩衝,這樣大大降低了資料訪問效率。所以initrmfs是將自己作為運行在記憶體中的檔案系統與核心通訊的。
這裡所提到預設以唯讀方式掛載根檔案系統,是因為防止核心出bug,導致根檔案系統資料丟失,所以,在系統未完全啟動完成之前,只能以唯讀掛載”/”,待系統完全正常啟動,核心便以讀寫入模式重掛根檔案系統。
以上步驟完成,便開始核心便開始啟動使用者空間的第一個應用程式:init(CentOS5),即/sbin/init,以CentOS5為例,init程式的工作具體如下:650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/72/9D/wKiom1Xo87eAreTTAACUEHLgHtQ669.jpg" title="2.png" alt="wKiom1Xo87eAreTTAACUEHLgHtQ669.jpg" />
以CentOS5為例,首先init根據其設定檔/etc/inittab中的設定,來設定系統啟動的預設層級,具體的設定為:” id:3:initdefault: “ 此處的三個欄位的意義為:“id”相當於行號,保持全域唯一即可,”3”表示為系統的預設啟動層級;inintdefault表示進入定義層級後預設執行的操作,最後”:”後面的便是執行的process。此處第三欄位為initdefault意為著設定預設,所以第四欄位省略,所以這一行的意義便是設定系統預設啟動進入層級3;
系統的運行層級共有7個:0層級-6層級
0層級:關機
1層級:單一使用者模式,相當於Windows的安全模式
3層級:多使用者模式,只是不啟動圖形介面
4層級:保留層級,和3層級功能接近
5層級:多使用者圖形模式
6層級:重啟
第一個id行執行完成後,便開始執行執行第二行,格式為:
Si::sysinit:/etc/rc.d/rc.sysinit這一行代碼的意義為在所有層級執行系統初始化,而對應的process便是/etc/rc.d/rc.sysinit這個指令碼。Init程式會執行此指令碼完成設定主機名稱、讀取/proc的檔案來設定系統參數、啟用lvm及raid裝置等系統初始化操作,而後便開始執行指定層級下的服務指令碼,具體代碼為:
l1:1:wait:/etc/rc.d/rc1
l3:2:wait:/etc/rc.d/rc2
….
L3:3:wait:/etc/rc.d/rc3
每一行代表進入該運行層級後,便啟動指定層級下/etc/rc.d/rc#.d(#代表0-6)目錄下的所有以S開頭服務指令碼連結,關閉以K開頭的服務指令碼連結。
而後,執行/etc/inittab中的配置欄位:
tty1:2345:respawn:/usr/sbin/mingettytty1
tty2:2345:respawn:/usr/sbin/mingetty tty2
...
tty6:2345:respawn:/usr/sbin/mingettytty6
意為設定使用者終端,在2345層級下,每個層級都會開啟6個終端,終端設定完成後,mingety程式會調用login程式來協助使用者進行登陸驗證;
以上步驟全部完成後,便執行/etc/rc.d/rc.loacl指令碼,使用者可在該指令碼內定義想要開機後執行的命令或指令碼。
系統啟動完成。
即:CentOS開機流程圖匯總如下:650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/72/99/wKioL1Xo9gqx86MLAAIKyyKbD-0276.jpg" title="映像 005.png" width="800" height="402" border="0" hspace="0" vspace="0" style="width:800px;height:402px;" alt="wKioL1Xo9gqx86MLAAIKyyKbD-0276.jpg" />
CentOS系統啟動流程-2015090401