一、linux系統的啟動流程
關於linux系統的啟動流程我們可以按步進行划分為如下:
POST加電自檢-->BIOS(Boot Sequence)-->加載對應引導上的MBR(bootloader)-->主引導設置加載其BootLoader-->Kernel初始化-->initrd—>/etc/init進程加載/etc/inittab,其進程流程圖如下:
二、剖析詳細啟動過程
⑴、
-
POST開機自檢:電腦主機打開電源的時候,隨后會聽到滴的一聲,系統啟動開始了開機自檢(POST-power on self
-
test)自檢開始),這個過程中主要是檢測計算機硬件設備比如:CPU,內存,主板,顯卡,CMOS等設備是否有故障存
-
在,如果有硬件故障的話將按兩種情況理:對於嚴重故障(致命性故障)則停機,此時由於各種初始化操作還沒完成,
-
不能給出任何提示或信號;對於非嚴重故障則給出提示或聲音報警信號,等待用戶處理),如果沒有故障,POST完整自己
-
的接力任務,將尾部工作交接給BIOS處理。
⑵、
-
BIOS:計算機加電自檢完成后第一個讀取的地方就是就是BIOS(Basic Input Output System,基礎輸入輸出系統)
-
,BIOS里面記錄了主機板的芯片集與相關設置,如CPU與接口設備的通信頻率、啟動設備的搜索順序、硬盤的大小與
-
類型、系統時間、外部總線、各種接口設備的I/O地址、已經與CPU通信的IRQ中斷信息,所以,啟動如果要順利啟動,
-
首先要讀取BIOS設置。
⑶、
-
按照BIOS所設定的系統啟動流程,如果檢測通過,則根據引導次序(Boot Sequence)開始在第一台設備上支持啟動
-
程序,我們的啟動設備主要包括硬盤、USB、SD等,我們一般用的是硬盤,然后進行讀取第一個設備就是硬盤,第一個
-
要讀去的就是該硬盤的主引導記錄MBR(Master Boot Record),然后系統可以根據啟動區安裝的
-
引導加載程序(Boot Loader)開始執行核心識別的工作。【在此插一句:MBR程序只是找到只是硬盤分區內最前面
-
的446個字節的Boot Loader】然后查找相關配置和定義。
⑷、
-
Boot Loader 加載Grub程序
-
在這個過程中主要靠Grub的引導開始的,Grub分為連個階段:
-
stage1:主要是Boot loader
-
stage 1.5:過渡
-
stage2:主要是/boot/grub
通過上面我們可以發現linux的內核VMLnuz,grub、initrd都在/boot目錄下
在/boot/grub/下面我們看到了熟悉的stage1,stage2及grub工具的配置文件 grub.conf,那么grub.conf內都定義了什么吶??
⑸、Kernel
-
根據Grub內的定義,grub讀取完畢后就把下面的工作交個內核了。kernel主要是完成系統硬件探測及硬件驅動的初始
-
化,並且以讀寫的方式掛載根文件系統(根切換),那么這里就出現了一個“先有雞還是先有蛋的文件了”,具體是什么
-
那?
-
要想訪問真正的根文件系統(rootfs)的話,就必須加載根文件系統中的設備,這時根文件系統又沒有掛載,
-
要掛載根文件系統又得加載根文件系統中的驅動程序,哪怎么辦呢?為了解決這個問題,這是就用到了initrd文件了。
-
在來說下kernel初始化所要工作的內容做下簡單總結:
-
探測硬件->加載驅動(initrd)->掛載根文件系統->rootfs(/sbin/init)
⑹、
-
到此止內核空間的相關工作已經完成,內核空間的任務開始向用戶空間轉移,內核空間通過一個間接的initrd(微型
-
linux)向用戶空間的/sbin/init過度,所以gurb開始引導內核轉向initrd。
-
initrd:一個虛擬的文件系統,里面有lib、bin、sbin、usr、proc、sys、var、dev、boot等一些目錄,
-
其實你會發現里面的目錄有點像真的/對吧,所以我們稱之為虛擬的根文件系統,作用就是將kernel和真的根文件系統
-
建立關聯關系,讓kernel去initrd中加載根文件系統所需要的驅動程序,並以讀寫的方式掛載根文件系統,並讓執行
-
用戶當中第一個進程init。
下面我們看下init腳本內的內容:
從上面的腳本內容我們可以看到init進程的主要工作:
-
掛載 :將initrd中的/proc, /sys /dev 掛載到當前的主分區中的相應目錄
-
創建目錄:/dev/mapper
-
通過mknod完成block or character special files的創建
-
相關模塊的掛載
-
創建root設備
-
掛載 /sysroot
-
最后完成根切換
⑺、init執行完畢以后會啟動系統內的/etc/inittab文件,來完成系統系統的初始化工作。下面我們來介紹一下inittab這個配置文件內的詳細內容
各個級別的定義:
默認運行級別
-
0:halt //關機
-
1: single user mode //單用戶維護模式)
-
2:multi user mode, without NFS //不支持NFS功能
-
3: multi user mode, text mode //字符界面
-
4:reserved //系統保留
-
5: multi user mode, graphic mode //圖形化界面
-
6: reboot //重啟
/etc/inittab格式及語法(:)
-
[選項]:[runlevel]:[行為]:[命令]
-
行為:
-
initdefault:代表默認運行級別
-
sysinit:代表系統初始化操作選項
-
ctrlaltdel:代表重啟的相關設置
-
wait:代表上一個命令執行結束后方可執行下面的操作
-
respawn:代表后面字段可以無限制再生(reboot)
-
命令選項
-
一些命令,不過通常都是腳本
下面說下inittab內定義的初始化腳本:rc.sysinit --/etc/rc.d/rc.sysinit
-
如上圖所示:rc.sysinit腳本內定義了一些與系統初始化的定義
-
設定主機名
-
檢測並掛載/etc/fstab中其他文件系統
-
啟動swap分區
-
/etc/sysctl.conf設定內核參數
-
裝載鍵映射-->鍵盤上每個鍵的功能
-
然后根據系統運行級別運行相關的服務腳本:/etc/rc.d/init.d/腳本和/etc/rc.d/rc#d
-
rc0-rc6目錄下腳本:
-
K* ##只要是以K開頭的文件均執行stop工作
-
S* ##只要是以S開頭的文件均執行start工作
-
0-99 (執行次序,數字越小越先被執行)
-
用戶自定義開機啟動程序(/etc/rc.d/rc.local)
-
可以根據自己的需求將一些執行命令或是腳本寫到/etc/rc.d/rc.local里,當開機時,就可以加載啦
三、總結
系統初始化的大致內容總結如下:
-
硬件的初始化,圖像界面啟動的初始化(如果設置了默認啟動基本)
-
主機RAID的設置初始化,device mapper 及相關的初始化,
-
檢測根文件系統,以只讀方式掛載
-
激活udev和selinux
-
設置內核參數 /etc/sysctl.conf
-
設置系統時鍾
-
啟用交換分區,設置主機名
-
加載鍵盤映射
-
激活RAID和LVM邏輯卷
-
掛載額外的文件系統 /etc/fstab
-
最后根據mingetty程序調用login讓用戶登錄->用戶登錄(完成系統啟動)
-
在系統啟動過程中主要的腳本和目錄有:
-
boot
-
/grub
-
/boot/grub/grub.conf
-
/boot/initrd+內核版本
-
/initrd文件中的/proc/ /sys/ /dev/ 目錄的掛載 及根的切換
-
/etc/inittab 腳本
-
/etc/rc.d/rc.sysinit 腳本 等
這些重要的腳本和目錄,還有其他重要的目錄和文件,腳本等。由此篇我們可以詳細了解linux系統的啟動和初始化過程,然后我們可以根據linux系統啟動的過程和所用到的命令自己動手DIY一個微型linux系統,關於“DIY微型linux系統”會再后兩至三天內發表博文,到時候我們在一起探討探討linux系統的組成部分等更詳細的相關
信息!!!
Linux系統開機啟動流程介紹
一、linux系統進程啟動流程圖:
二、簡單概括描述linux系統從開機到登陸界面的啟動過程
1.開機BIOS自檢
2.MBR引導
3.grub引導菜單
4.加載內核
5.啟動init進程
6.讀取inittab文件執行rc.sysinit、rc等腳本
7.啟動mingetty進入系統登錄界面
三、詳細剖析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系統啟動全部完成。














