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