首先此篇先大體介紹下整個系統(tǒng)的開機流程,再來對其一一展開進行詳細的說明
第一步:首先進行開機自檢POST,確認硬件正常后進入下一步
第二步:BIOS initialization(BOOT SEQ)BIOS初始化,并按照BIOS中設(shè)定的開機啟動加載設(shè)備進行依次的檢測
第三步:MBR(bootloader)在BIOS檢測到某一設(shè)備可以啟動后,開始加載MBR上的引導(dǎo)程序,在linux中,引導(dǎo)分為2個階段,首先加載在MBR上的一段極其精簡的啟動程序,由此啟動程序引導(dǎo)boot目錄中的grub,再由grub進行具體系統(tǒng)的引導(dǎo)啟動(grub是一個很強大的系統(tǒng)啟動引導(dǎo)管理軟件,也可以引導(dǎo)window)
第三步:Kernel initialization 在由grub引導(dǎo)linux內(nèi)核后,啟動內(nèi)核,由內(nèi)核檢測基本硬件設(shè)備裝載對應(yīng)驅(qū)動,并裝載rootfs和啟動init(/etc/inittab)
第四步:系統(tǒng)啟動和初始化,在啟動init后,才開始真正的系統(tǒng)啟動,內(nèi)核退居到后臺,由init來接管整個系統(tǒng)的加載和啟動,init會根據(jù)設(shè)定進行系統(tǒng)進一步的初始化,下面是init啟動后進行的一系列操作
1.完成系統(tǒng)整體初始化:/etc/rc.d/rc.sysinit (此腳本可以細細研讀)
2.啟動對應(yīng)級別的各個服務(wù):/etc/rc.d/rc 利用/etc/rc.d/ec[0-6].d/目錄下的所有腳本啟動或者停止服務(wù)
/etc/rc.d/ec[0-6].d/下都是鏈接文件,鏈接到/etc/rc.d/init.d/下的各個腳本
3./etc/rc.local (鏈接到/etc/rc.d/rc.local)給用戶定義的額外開機操作項
4.啟動虛擬終端,驗證用戶登錄(圖形界面則調(diào)用其他如XDM來驗證用戶登錄)
至此 系統(tǒng)啟動完整,可以說,整個系統(tǒng)的啟動都是靠一堆腳本來完成的
第一二步驟涉及到硬件的POST和BIOS階段就不再細說了,從bootloader開始說起
bootloader
這是一段放置在MBR錢446字節(jié)中的一段精簡的引導(dǎo)程序(MBR一共有512字節(jié),后64字節(jié)既是分區(qū)表,還有最后2個字節(jié)的填充)
常見的bootloader程序有
LILO:LInux LOader 可以引導(dǎo)多個操作系統(tǒng),但不支持大硬盤
GRUB:GRand Unified Bootloader 目前比較常見的引導(dǎo)加載器,這是一個分段的引導(dǎo)加載器,在Ubunt上用的是GRUB1.9x。
時隔10年,最新的GRUB2在昨天正式發(fā)布了,有興趣的童鞋可以去關(guān)注下
可以在開機時進入GRUB的交互模式,直接輸入?yún)?shù)啟動系統(tǒng),在這里可以輸入單用戶啟動參數(shù)直接進入單用戶模式進行密碼修改等操作
之前說這是一個分段的引導(dǎo)程序這里來說說具體是怎么分段的
第一段:MBR
用來引導(dǎo)進入第二段,在完成第一段后,初始化GRUB自我初始化后,并正常啟動第二段
第二段:/boot/grub
由于MBR上的引導(dǎo)程序只有446字節(jié),所以能放置的內(nèi)容很少,功能很弱,所以通過引導(dǎo)啟動第二段放置在磁盤中/boot/grub目錄下強大的GRUB程序,來擴展其更為強大的引導(dǎo)功能
此目錄下的配置文件
/boot/grub/grub.conf
搬照我的配置文件來詳細說明
Kernel initialization
1、硬件探測
2、硬件驅(qū)動初始化(initrd)
3、掛載根文件系統(tǒng)(為了避免額外進程寫操作破壞文件系統(tǒng),所以在這里是使用只讀掛載)
4、啟動/sbin/init (PID:1)
在Kernel階段,需要掛在根目錄,而linux單內(nèi)核系統(tǒng),但它也吸收了微內(nèi)核的特性,所以它包括了內(nèi)核模塊。
內(nèi)核:/boot/vmlinuz-version 模塊:/libmodules/version/
把模塊集成進內(nèi)核能提高效率,但也增大了內(nèi)核體積,所以使用加載模塊的方式提高了可管理性
這里就造就了一個問題,由于內(nèi)核比較精簡,所以不可能集成進很多的驅(qū)動進去,由內(nèi)核初始化后是必須要加載根文件系統(tǒng)的,一旦根文件系統(tǒng)放在RAID或LVM設(shè)備上,由于內(nèi)核缺少這些高級文件系統(tǒng)的驅(qū)動,會導(dǎo)致無法加載。于是就在這里加了一層中間層,就是這里的initrd了。initrd是一個微型的根文件系統(tǒng),內(nèi)置額外內(nèi)核中沒有的驅(qū)動模塊
首先內(nèi)核借助initrd加載根文件系統(tǒng),然后加載真實根文件系統(tǒng)驅(qū)動和其它必須驅(qū)動后,切換到真正的根文件系統(tǒng)。所以initrd只是起到一個過渡的作用
內(nèi)核初始化產(chǎn)生的所有信息保存在/var/log/dmesg 二進制文件,使用dmesg命令查看
init 系統(tǒng)初始化
加載完成內(nèi)核后,啟動整個系統(tǒng)的父進程,PID為1 的init
init接管系統(tǒng)后,結(jié)合/etc/initab的配置,加載各種需要的庫文件,啟動各個進程,比如bash,用戶登錄驗證等。。。
此篇寫述說原理,具體打造過程請期待下一篇。 見 http://www.linuxidc.com/Linux/2012-07/64754.htm