Linux系统开机启动流程介绍
一、linux系統(tǒng)進程啟動流程圖:
二、簡單概括描述linux系統(tǒng)從開機到登陸界面的啟動過程
1.開機BIOS自檢
2.MBR引導(dǎo)
3.grub引導(dǎo)菜單
4.加載內(nèi)核
5.啟動init進程
6.讀取inittab文件執(zhí)行rc.sysinit、rc等腳本
7.啟動mingetty進入系統(tǒng)登錄界面
三、詳細剖析linux系統(tǒng)啟動過程
1.POST開機自檢
???? 電腦主機打開電源的時候隨后會聽到滴的一聲響系統(tǒng)啟動開始了開機自檢POST-power on self
Test自檢開始這個過程中主要是檢測計算機硬件設(shè)備比如CPU內(nèi)存主板顯卡等設(shè)備是否有故障存在。如果有硬件故障的話將按兩種情況理對于嚴重故障(致命性故障)則停機此時由于各種初始化操作還沒完成不能給出任何提示或信號對于非嚴重故障則給出提示或聲音報警信號等待用戶處理如果沒有故障POST完成自己的接力任務(wù)將尾部工作交接給BIOS處理。
2.加載BIOS并讀取設(shè)置
???? 計算機加電自檢完成后第一個讀取的地方就是就是BIOSBasic Input Output System基礎(chǔ)輸入輸出系統(tǒng)BIOS里面記錄了主機板的芯片集與相關(guān)設(shè)置如CPU與接口設(shè)備的通信頻率、啟動設(shè)備的搜索順序、硬盤的大小與類型、系統(tǒng)時間、外部總線、各種接口設(shè)備的I/O地址、已經(jīng)與CPU通信的IRQ中斷信息所以啟動如果要順利啟動首先要讀取BIOS設(shè)置。
3.讀取MRB:
???? 按BIOS設(shè)定的系統(tǒng)啟動流程檢測通過則根據(jù)引導(dǎo)次序(Boot Sequence)開始在第一臺設(shè)備上支持啟動程序我們的啟動設(shè)備主要包括硬盤、usb、sd等我們一般用的是硬盤然后進行讀取第一個設(shè)備就是硬盤第一個要讀去的就是該硬盤的主引導(dǎo)記錄MBRMaster Boot Record然后系統(tǒng)可以根據(jù)啟動區(qū)安裝的引導(dǎo)加載程序Boot Loader開始執(zhí)行核心識別的工作。
???? 硬盤上第0柱面0磁道1扇區(qū)被稱為MBR,也就是Master Boot Record,即主引導(dǎo)記錄它的大小是512字節(jié)里面存放了預(yù)啟動信息、分區(qū)表信息及分區(qū)標志等。分為兩部分第一部分為(PRE-BOOT)引導(dǎo)區(qū),占了446個字節(jié)第二部分為分區(qū)表(PARTITION PABLE),共66個字節(jié)記錄硬盤的分區(qū)信息(其中前64字節(jié)是分區(qū)表信息后2個字節(jié)是分區(qū)結(jié)束的標志)。
? ??預(yù)引導(dǎo)區(qū)的作用之一是找到標記為活動(ACTIVE)的分區(qū)并將活動分區(qū)的引導(dǎo)區(qū)讀入內(nèi)存。
? ??系統(tǒng)找到BIOS所指定的硬盤的MBR后就會將其復(fù)制到0x7c00地址所在的物理內(nèi)存中。其實被復(fù)制到物理內(nèi)存的內(nèi)容就是Boot Loader,而具體到Linux系統(tǒng)那就是grub了。
4.Boot Loader加載Grub程序。
???? Boot Loader就是在操作系統(tǒng)內(nèi)核運行之前運行的一小段程序。通過這小段程序我們可以初始化硬件設(shè)備、簡歷內(nèi)存空間的映射圖從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài)以便為最終調(diào)用操作系統(tǒng)內(nèi)核做好一切準備。通常Boot Loader是嚴重地依賴于硬件實現(xiàn)的不同體系結(jié)構(gòu)的系統(tǒng)存在著不同的BootLoader。
???? ? 在這個過程中主要靠Grub的引導(dǎo)開始的Grub分為兩個階段
????? ?? stage1主要是Boot loader
????? ?? stage1.5:過渡
???? ??? stage2:主要是/boot/grub
5.內(nèi)核初始化
???? 根據(jù)Grub內(nèi)的定義grub讀取完畢后就把下面的工作交給內(nèi)核了。kernel主要是完成系統(tǒng)硬件探測及硬件驅(qū)動的初始化并且以讀寫的方式掛載根文件系統(tǒng)根切換那么這里就出現(xiàn)了一個“先有雞還是先有蛋的文件了”具體是什么呢要想訪問真正的根文件系統(tǒng)rootfs的話就必須加載根文件系統(tǒng)中的設(shè)備這時根文件系統(tǒng)又沒有掛載要掛載根文件系統(tǒng)又得加載根文件系統(tǒng)中的驅(qū)動程序哪怎么辦呢為了解決這個問題這是就用到了initrd文件了。?
再來說下kernel初始化所要工作的內(nèi)容做下簡單總結(jié)?
?? ????探測硬件->加載驅(qū)動initrd)->掛載根文件系統(tǒng)->rootfs(/sbin/init)
6.init進程依據(jù)inittab文件來設(shè)定運行級別
內(nèi)核被加載后內(nèi)核空間的任務(wù)開始向用戶空間轉(zhuǎn)移內(nèi)核空間通過一個間接的initrd(微型linux)向用戶空間的/sbin/init過度所以gurb開始引導(dǎo)內(nèi)核轉(zhuǎn)向initrd。
???? initrd一個虛擬的文件系統(tǒng)里面有l(wèi)ib、bin、sbin、usr、proc、sys、var、dev、boot等一些目錄其實你會發(fā)現(xiàn)里面的目錄有點像真的/對吧所以我們稱之為虛擬的根文件系統(tǒng)作用就是將kernel和真的根文件系統(tǒng)建立關(guān)聯(lián)關(guān)系讓kernel去initrd中加載根文件系統(tǒng)所需要的驅(qū)動程序并以讀寫的方式掛載根文件系統(tǒng)內(nèi)核被加載后第一個運行的程序是/sbin/init在引導(dǎo)linux系統(tǒng)的過程中”/sbin/init”是內(nèi)核第一個加載的程序因此init進程對應(yīng)的PID號永遠為“1“。
???? 此時該文件會讀取/etc/inittab文件并依據(jù)此文件來進行初始化工作。其實/etc/inittab文件最主要的作用就是設(shè)定Linux的運行等級其設(shè)定形式是”:id:3:initdefault:”,這就表明linux需要運行在等級3上。Linux的運行等級設(shè)定如下
默認運行級別?????
0halt????????????????????? //關(guān)機?
1:single user mode??? //單用戶維護模式)?
2multi user mode, without NFS?//不支持NFS功能?
3:multi user mode, text mode???? //字符界面?
4reserved?? //系統(tǒng)保留?
5:multi user mode, graphic mode?? //圖形化界面?
6:reboot?? //重啟
/etc/inittab格式及語法(:)
[選項]:[runlevel]:[行為]:[命令]
行為?
?????????????????? initdefault代表默認運行級別?
?????????????????? sysinit代表系統(tǒng)初始化操作選項?
?????????????????? ctrlaltdel代表重啟的相關(guān)設(shè)置?
?????????????????? wait代表上一個命令執(zhí)行結(jié)束后方可執(zhí)行下面的操作?
?????????????????? respawn代表后面字段可以無限制再生(reboot)
命令選項?
?????????????? 一些命令不過通常都是腳本
7.init進程執(zhí)行rc.sysinit
???? 在設(shè)定了運行等級后linux系統(tǒng)執(zhí)行的第一個用戶層文件就是/etc/rc.d/rc.sysinit腳本程序它做的工作非常多包括設(shè)定PATH、設(shè)定網(wǎng)絡(luò)配置(/etc/sysconfig/network)、啟動swap分區(qū)、設(shè)定/proc等等。線程init的最終完成狀態(tài)是能夠使得一般的用戶程序可以正常地被執(zhí)行從而真正完成可供應(yīng)用程序運行的系統(tǒng)環(huán)境。它主要進行的操作有
1.??執(zhí)行函數(shù)do_basic_setup(),它會對外部設(shè)備進行全面地初始化。
2.??構(gòu)建系統(tǒng)的虛擬文件系統(tǒng)目錄樹掛載系統(tǒng)中作為根目錄的設(shè)備。
3.??打開設(shè)備/dev/console,并通過函數(shù)sys_dup()打開的連接復(fù)制兩次是的文件號0,1,2全部指向控制臺。這三個文件連接就是通常所說的“標準輸入“stdin,”標準輸出”stdout和”標準出錯信息“stderr這三個標準I/0通道。
4.??準備好以上一切之后系統(tǒng)開始進入用戶層的初始化階段。內(nèi)核通過系統(tǒng)調(diào)用execve()加載執(zhí)行相應(yīng)的用戶層初始化程序一次嘗試加載程序”/sbin/initl”,”/sbin/init”和“/bin/sh”。
只要其中有一個程序加載獲得成功那么系統(tǒng)就將開始用戶層的初始化而不會再回到init()函數(shù)段中。至此init()函數(shù)結(jié)束Linux內(nèi)核的引導(dǎo)部分也到此結(jié)束。
8.啟動內(nèi)核模塊
???? 具體是依據(jù)/etc/modules.conf或/etc/modules.d目錄下的文件來裝載內(nèi)核模塊。
9.執(zhí)行不同運行級別的腳本程序
???? 根據(jù)運行級別的不同系統(tǒng)會運行rc0.d到rc6.d中的相應(yīng)的腳本程序來完成相應(yīng)的初始化工作和啟動相應(yīng)的服務(wù)。
10.執(zhí)行/bin/login程序啟動mingetty,進入登錄狀態(tài)
???? 系統(tǒng)已經(jīng)進入到了等待用戶輸入username和password的時候了已經(jīng)可以用自己的賬號登入系統(tǒng)了到此為止linux系統(tǒng)啟動全部完成。
轉(zhuǎn)載于:https://blog.51cto.com/taokey/1833169
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Linux系统开机启动流程介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python的交互式界面 编写 .
- 下一篇: 初学Linux之程序安装