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