Linux系統啓動流程

前言


    事物總是遵循某種規律而發展演變,我們無論是在公司還是在家庭,辦一件事總是按照某種流程,某

種規則來做,如果這種規則被打破,不管是公司還是家庭都將亂成一鍋粥。對於富有哲學思想的Linux操

作系統而言,這種規律也必須遵循,今天就帶大家去一窺CentOS 6 的啓動過程。


Linux啓動流程


    Linux的啓動流程從大的方向來說可以分解爲四個階段段:首先,加載硬件信息即BIOS階段;其次便

是MBR階段,這一階段包括MBR中的statege1階段的BootLoader、MBR之後的stage1_5階段以及在之

後的stage2階段即讀取/boot/grub/grub.conf文件。第三階段是:內核開始工作,初始化相應的配置;

最後便是爲用戶登錄做準備的階段,加載各種配置文件,提供用戶登錄終端。


1 BIOS


    BIOS是基本輸入輸出系統(Basic Input Output System)的簡稱,是計算機中最基礎,最重要的程

序,存儲在主板上的Flash ROM中。

    BIOS加電自檢中會檢查內存、CPU、主板等硬件中是否存在錯誤,出現錯誤後會有兩種處理情況:對

於嚴重故障(致命性故障)則停機,此時由於各種初始化操作還沒完成,不能給出然後提示或信號;對

於非嚴重故障則給出提示或聲音警報信號,等待用戶處理。引導操作系統:BIOS會先從軟盤或硬盤的開

始扇區讀取引導記錄,如果沒有找到,則會在顯示器上顯示沒有引導設備,如果找到就把電腦的控制交

給引導記錄處理。


2 MBR


    MBR,是Master Boot Record的簡稱,即主引導記錄。對於不同的分區類型來說,相應的叫法不一樣,在MBR的分區類型中稱爲MBR,而在GPT分區中稱爲UEFI,本文主要以MBR分區類型加以說明。MBR是存儲在硬盤上的0磁道第一扇區中,其大小爲512字節;這段數據不屬於任何分區。我們可以通過

hexdump -C 來查看其數據,如下圖:

wKiom1mxOCiTUieIAACclprLbOE053.png

1)stage 1階段

    上圖中從地址0000000到000001b0標記的內容便是BootLoader所在的位置,共446字節,即stage1

階段,這一階段的任務比較簡單,就是初始化環境,爲後面的階段做準備。

    黃色線之後的位置一直到紅色方框之間的內容爲分區表信息,這段數據異常重要,如果破壞,也就宣

告你這個操作系統將不能工作,最後面紅色方框內的內容是磁盤的檢驗位,如果該數據被破壞了,系統

將認爲你這塊磁盤不可用,那麼系統也將不可使用。

2)stage1_5階段

    這一階段,是存儲在第一扇區之後的扇區中,大概有27個扇區的大小(還有待考證),共計

512X27=13824個字節。由於stage1階段並不加載文件系統的驅動,所以stage1_5的作用主要是加載

/boot所在分區文件系統類型的驅動,是系統能夠找到/boot。這些數據最後以*stage1_5這種格式的文

件存放在/boot/grub目錄下。

wKiom1mxO9zC6pS6AAAiRgeE_y4581.png

3)stage2階段

    有了stage1_5階段的引導,系統臨時以/boot爲根,此時系統將去找/boot/grub/grub.conf(針對

CentOS 7之前的系統,CentOS 7採用的grub2),這個文件在系統的啓動流程中佔據這重要的作用;在

進入系統讀秒結束後進入的菜單就是由它來定義的(正常啓動可在讀秒時按任意鍵進入該菜單)。而且

在這個文件中定義了系統的內核文件,以及虛擬根文件系統文件。

grub.conf文件:使用vim打開grub.conf文件。

[ root@localhost boot ]#cat grub/grub.conf  # 由於該系統文件是我自己修改過的,系統給的更全一些
default=0
timeout=5
hiddenmenu
title  linux
root (hd0,0)
kernel /vmlinuz root=/dev/sda2 init=/sbin/init 
initrd /initramfs-2.6.32-696.el6.x86_64.img

default=0:表示默認以哪個內核啓動啓動

timeout=N:表示默認啓動倒計時,如果你不選擇啓動項,倒計時N秒將以默認內核啓動

hiddenmenu:表示顯示菜單,如果你不寫這一項,啓動時將隱藏菜單

root (hd0,0):指定根所在的分區

kernel:指定啓動的內核文件;root所在的分區,以及初始化第一個進程等信息

initrd :指定initramfs文件,即虛擬根文件系統

注意:上述kernel和initrd的順數是不能交換的。如果順序顛倒,系統將不能啓動


3 Kernel(初始化)


    我們知道kernel是完成探索硬件及加載硬件驅動程序,並以讀寫的方式掛載根文件系統。那麼這裏就

出現一個比較詭異的問題,是什麼問題呢?我們又知道,要想訪問真正的根文件系統(rootfs)的話,就

必須加載根文件系統中的設備,這時根文件系統又沒有掛載,要掛載根文件系統又得加載根文件系統中

的驅動程序哪怎麼辦呢?這是就用到了initrd文件了。

wKioL1mxSDvRn-8wAAAs3x_SE6w734.png

initrd功能說明

    其實說白了initrd就是一個虛擬的文件系統,裏面有/、lib、bin、sbin、usr、proc、sys、var、

dev、boot等一些目錄,其實你會發現裏面的目錄有點像真的/對吧,所以我們稱之爲虛擬的根文件系

統,作用就是將kernel和真的根文件系統建立關聯關係,讓kernel去initrd中加載根文件系統所需要的驅

動程序,並以讀寫的方式掛載根文件系統,並讓執行用戶當中第一個進程init

wKiom1mxR8ryLxh2AAAooPP05pk694.png


4 init階段


    init,顧名思義即初始化,這裏的初始與kernel的初始化不同,由於用戶不能直接與內核進行交互,所

以我們必須要有一個程序或者服務來供用戶使用。init初始化相當於用戶空間的初始化過程,爲用戶的登

錄做初始化操作。

1)運行/sbin/init

    內核在引導完成之後會執行系統的第一個進程init。這時也就正式進入了sysVinit的引導環境。Init之

後的所有進程都是由init派生出來,它的PID永遠爲1。

2)讀取/etc/inittab文件

[ root@localhost / ]#vim /etc/inittab 

# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:3:initdefault:         # 定義默認啓動級別爲3

    由該文件的說明信息可知:這是一個用來定義用戶默認啓動級別的文件,如果你修改了最後一行的數

值你將進入相應的運行級別(例如:id:5:initdefault: 默認開機進入圖形化級別)。使用who -r可以查看

你當前的運行級別。

3)讀取/etc/rc.sysinit

    Init在得到運行級別之後並不會立即執行該運行級別的一組服務程序,而執行的第一個程序是/etc/rc.d

/rc.sysinit腳本程序。該程序的在centos5的inittab文件中有如下一行: si:sysinit:/etc/rc.d/rc.sysinit 這

個腳本所做的工作有很多,包括主機名,文件系統,swap,SELinux,udev,內核參數,系統鍾,Raid

和LVM等服務的開啓。爲後續服務啓動準備基礎環境。

4)加載服務/etc/rc.d/rc$.d

    根據你/etc/inittab中定義的運行級別,啓動相應的服務(其實:運行級別就是不同服務的組合)。

wKiom1mxTmKyKpDJAABQLlHZyqw542.png

執行完/etc/rc.d/rc$.d中的服務之後,系統還會讀取rc.local中的文件,此文件中定義的內容(不管是服

務,還是腳本)每次開機啓動都將執行。

5)執行/bin/login

最後系統會執行/bin/login文件,等待用戶登錄,如果用戶輸入密碼,登錄之後以shell控制主機。


wKiom1mxUNHA4fMXAAAZ_zMXY6E225.png


5 本篇小結



本篇文章主要介紹了Linux的啓動流程,重BIOS到MBR,再到內核的啓動,最後介紹的配置文件的加

載。通過上述的講解,我想大家應該能對Linux的啓動流程有所瞭解了,不過時間匆忙,有些許地方說明

的不夠詳細,還望見諒!最後謝謝大家的閱讀。在這裏給大家提供幾個大神寫的啓動流程,可以去看

看:

xiaosuaigege:http://www.pojun.tech/blog/2017/08/30/linux-basic-command-12

jeffary:https://jeffary.cn/linux%e4%b9%8b%e5%90%af%e5%8a%a8%e9%a1%b9%e8%af%a6%e8%a7%a3.html

zhyang:http://zhyang.top/articles/2017/09/01/Boot.html




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章