前言
事物總是遵循某種規律而發展演變,我們無論是在公司還是在家庭,辦一件事總是按照某種流程,某
種規則來做,如果這種規則被打破,不管是公司還是家庭都將亂成一鍋粥。對於富有哲學思想的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 來查看其數據,如下圖:
1)stage 1階段
上圖中從地址0000000到000001b0標記的內容便是BootLoader所在的位置,共446字節,即stage1
階段,這一階段的任務比較簡單,就是初始化環境,爲後面的階段做準備。
黃色線之後的位置一直到紅色方框之間的內容爲分區表信息,這段數據異常重要,如果破壞,也就宣
告你這個操作系統將不能工作,最後面紅色方框內的內容是磁盤的檢驗位,如果該數據被破壞了,系統
將認爲你這塊磁盤不可用,那麼系統也將不可使用。
2)stage1_5階段
這一階段,是存儲在第一扇區之後的扇區中,大概有27個扇區的大小(還有待考證),共計
512X27=13824個字節。由於stage1階段並不加載文件系統的驅動,所以stage1_5的作用主要是加載
/boot所在分區文件系統類型的驅動,是系統能夠找到/boot。這些數據最後以*stage1_5這種格式的文
件存放在/boot/grub目錄下。
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文件了。
initrd功能說明
其實說白了initrd就是一個虛擬的文件系統,裏面有/、lib、bin、sbin、usr、proc、sys、var、
dev、boot等一些目錄,其實你會發現裏面的目錄有點像真的/對吧,所以我們稱之爲虛擬的根文件系
統,作用就是將kernel和真的根文件系統建立關聯關係,讓kernel去initrd中加載根文件系統所需要的驅
動程序,並以讀寫的方式掛載根文件系統,並讓執行用戶當中第一個進程init
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中定義的運行級別,啓動相應的服務(其實:運行級別就是不同服務的組合)。
執行完/etc/rc.d/rc$.d中的服務之後,系統還會讀取rc.local中的文件,此文件中定義的內容(不管是服
務,還是腳本)每次開機啓動都將執行。
5)執行/bin/login
最後系統會執行/bin/login文件,等待用戶登錄,如果用戶輸入密碼,登錄之後以shell控制主機。
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