1、linux系統進程啓動流程圖:linux
2、簡單歸納描述linux系統從開機到登錄界面的啓動過程網絡
1.開機BIOS自檢ide
2.MBR引導函數
3.grub引導菜單spa
4.加載內核操作系統
5.啓動init進程線程
6.讀取inittab文件執行rc.sysinit、rc等腳本blog
7.啓動mingetty進入系統登陸界面接口
3、詳細剖析linux系統啓動過程進程
1.POST開機自檢
電腦主機打開電源的時候隨後會聽到滴的一聲響系統啓動開始了開機自檢POST-power on self
Test自檢開始這個過程當中主要是檢測計算機硬件設備好比CPU內存主板顯卡等設備是否有故障存在。若是有硬件故障的話將按兩種狀況理對於嚴重故障(致命性故障)則停機此時因爲各類初始化操做還沒完成不能給出任何提示或信號對於非嚴重故障則給出提示或聲音報警信號等待用戶處理若是沒有故障POST完成本身的接力任務將尾部工做交接給BIOS處理。
2.加載BIOS並讀取設置
計算機加電自檢完成後第一個讀取的地方就是就是BIOSBasic Input Output System基礎輸入輸出系統BIOS裏面記錄了主機板的芯片集與相關設置如CPU與接口設備的通訊頻率、啓動設備的搜索順序、硬盤的大小與類型、系統時間、外部總線、各類接口設備的I/O地址、已經與CPU通訊的IRQ中斷信息因此啓動若是要順利啓動首先要讀取BIOS設置。
3.讀取MRB:
按BIOS設定的系統啓動流程檢測經過則根據引導次序(Boot Sequence)開始在第一臺設備上支持啓動程序咱們的啓動設備主要包括硬盤、usb、sd等咱們通常用的是硬盤而後進行讀取第一個設備就是硬盤第一個要讀去的就是該硬盤的主引導記錄MBRMaster Boot Record而後系統能夠根據啓動區安裝的引導加載程序Boot Loader開始執行核心識別的工做。
硬盤上第0柱面0磁道1扇區被稱爲MBR,也就是Master Boot Record,即主引導記錄它的大小是512字節裏面存放了預啓動信息、分區表信息及分區標誌等。分爲兩部分第一部分爲(PRE-BOOT)引導區,佔了446個字節第二部分爲分區表(PARTITION PABLE),共66個字節記錄硬盤的分區信息(其中前64字節是分區表信息後2個字節是分區結束的標誌)。
預引導區的做用之一是找到標記爲活動(ACTIVE)的分區並將活動分區的引導區讀入內存。
系統找到BIOS所指定的硬盤的MBR後就會將其複製到0x7c00地址所在的物理內存中。其實被複制到物理內存的內容就是Boot Loader,而具體到Linux系統那就是grub了。
4.Boot Loader加載Grub程序。
Boot Loader就是在操做系統內核運行以前運行的一小段程序。經過這小段程序咱們能夠初始化硬件設備、簡歷內存空間的映射圖從而將系統的軟硬件環境帶到一個合適的狀態以便爲最終調用操做系統內核作好一切準備。一般Boot Loader是嚴重地依賴於硬件實現的不一樣體系結構的系統存在着不一樣的BootLoader。
在這個過程當中主要靠Grub的引導開始的Grub分爲兩個階段
stage1主要是Boot loader
stage1.5:過渡
stage2:主要是/boot/grub
5.內核初始化
根據Grub內的定義grub讀取完畢後就把下面的工做交給內核了。kernel主要是完成系統硬件探測及硬件驅動的初始化而且以讀寫的方式掛載根文件系統根切換那麼這裏就出現了一個「先有雞仍是先有蛋的文件了」具體是什麼呢要想訪問真正的根文件系統rootfs的話就必須加載根文件系統中的設備這時根文件系統又沒有掛載要掛載根文件系統又得加載根文件系統中的驅動程序哪怎麼辦呢爲了解決這個問題這是就用到了initrd文件了。
再來講下kernel初始化所要工做的內容作下簡單總結
探測硬件->加載驅動initrd)->掛載根文件系統->rootfs(/sbin/init)
6.init進程依據inittab文件來設定運行級別
內核被加載後內核空間的任務開始向用戶空間轉移內核空間經過一個間接的initrd(微型linux)向用戶空間的/sbin/init過分因此gurb開始引導內核轉向initrd。
initrd一個虛擬的文件系統裏面有lib、bin、sbin、usr、proc、sys、var、dev、boot等一些目錄其實你會發現裏面的目錄有點像真的/對吧因此咱們稱之爲虛擬的根文件系統做用就是將kernel和真的根文件系統創建關聯關係讓kernel去initrd中加載根文件系統所須要的驅動程序並以讀寫的方式掛載根文件系統內核被加載後第一個運行的程序是/sbin/init在引導linux系統的過程當中」/sbin/init」是內核第一個加載的程序所以init進程對應的PID號永遠爲「1「。
此時該文件會讀取/etc/inittab文件並依據此文件來進行初始化工做。其實/etc/inittab文件最主要的做用就是設定Linux的運行等級其設定形式是」:id:3:initdefault:」,這就代表linux須要運行在等級3上。Linux的運行等級設定以下
默認運行級別
0halt //關機
1:single user mode //單用戶維護模式)
2multi user mode, without NFS //不支持NFS功能
3:multi user mode, text mode //字符界面
4reserved //系統保留
5:multi user mode, graphic mode //圖形化界面
6:reboot //重啓
/etc/inittab格式及語法(:)
[選項]:[runlevel]:[行爲]:[命令]
行爲
initdefault表明默認運行級別
sysinit表明系統初始化操做選項
ctrlaltdel表明重啓的相關設置
wait表明上一個命令執行結束後方可執行下面的操做
respawn表明後面字段能夠無限制再生(reboot)
命令選項
一些命令不過一般都是腳本
7.init進程執行rc.sysinit
在設定了運行等級後linux系統執行的第一個用戶層文件就是/etc/rc.d/rc.sysinit腳本程序它作的工做很是多包括設定PATH、設定網絡配置(/etc/sysconfig/network)、啓動swap分區、設定/proc等等。線程init的最終完成狀態是可以使得通常的用戶程序能夠正常地被執行從而真正完成可供應用程序運行的系統環境。它主要進行的操做有
1. 執行函數do_basic_setup(),它會對外部設備進行全面地初始化。
2. 構建系統的虛擬文件系統目錄樹掛載系統中做爲根目錄的設備。
3. 打開設備/dev/console,並經過函數sys_dup()打開的鏈接複製兩次是的文件號0,1,2所有指向控制檯。這三個文件鏈接就是一般所說的「標準輸入「stdin,」標準輸出」stdout和」標準出錯信息「stderr這三個標準I/0通道。
4. 準備好以上一切以後系統開始進入用戶層的初始化階段。內核經過系統調用execve()加載執行相應的用戶層初始化程序一次嘗試加載程序」/sbin/initl」,」/sbin/init」和「/bin/sh」。
只要其中有一個程序加載得到成功那麼系統就將開始用戶層的初始化而不會再回到init()函數段中。至此init()函數結束Linux內核的引導部分也到此結束。
8.啓動內核模塊
具體是依據/etc/modules.conf或/etc/modules.d目錄下的文件來裝載內核模塊。
9.執行不一樣運行級別的腳本程序
根據運行級別的不一樣系統會運行rc0.d到rc6.d中的相應的腳本程序來完成相應的初始化工做和啓動相應的服務。
10.執行/bin/login程序啓動mingetty,進入登陸狀態
系統已經進入到了等待用戶輸入username和password的時候了已經能夠用本身的帳號登入系統了到此爲止linux系統啓動所有完成。