??操作系統(tǒng)(OS)也是一個(gè)程序,如果在硬件通電后讓這個(gè)特殊的程序運(yùn)行起來,以及這個(gè)特殊的程序在啟動(dòng)過程中做了什么,如下圖:
創(chuàng)新互聯(lián)專注于平定企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城建設(shè)。平定網(wǎng)站建設(shè)公司,為平定等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
??從圖中可知,系統(tǒng)啟動(dòng)(不僅僅是Linux系統(tǒng))大致可分為幾個(gè)主要過程:硬件初始化-->找到并加載操作系統(tǒng)的內(nèi)核-->內(nèi)核初始化-->操作系統(tǒng)運(yùn)行環(huán)境初始化-->登錄初始化-->登錄成功后的用戶初始化(包含圖形界面初始化或shell的初始化)-->最終用戶成功進(jìn)入
操作系統(tǒng)并開始使用操作系統(tǒng)。
下面以CentOS6系統(tǒng)進(jìn)入命令行為例簡(jiǎn)單描述一下上面的幾個(gè)主要過程。
1.按下電源通電。主板通電后,CPU開始工作,它執(zhí)行固定地址處的一段非常小的硬編碼程序:BIOS,于是BIOS掌握了CPU控制權(quán)。
2.BIOS程序會(huì)進(jìn)行硬件的上電自檢(Power-On Self-Test,POST)以確認(rèn)有哪些硬件以及這些硬件是否故障。對(duì)于我們要探索的操作系統(tǒng)啟動(dòng)流程來說,最重要的是會(huì)根據(jù)檢測(cè)到磁盤順序(除了磁盤,也可以是其它硬件設(shè)備,比如U盤、光盤、網(wǎng)卡等),按順序找到這些磁盤上正確的MBR,于是MBR開始掌握CPU控制權(quán)。
3.MBR是引導(dǎo)系統(tǒng)內(nèi)核啟動(dòng)的第一段代碼,它的位置固定處于磁盤的第一個(gè)扇區(qū)位置處(如果不固定,就不知道怎么找到MBR)。引導(dǎo)內(nèi)核啟動(dòng)的代碼段稱為Boot Loader,除MBR外,還需要通過其它引導(dǎo)系統(tǒng)的代碼段來一步步引導(dǎo)啟動(dòng)內(nèi)核,所以要引導(dǎo)一個(gè)內(nèi)核的啟動(dòng),需要跳轉(zhuǎn)并執(zhí)行多段BootLoader。根據(jù)使用的啟動(dòng)管理工具(如LILIO、GRUB、GRUB2等)不同,這一段段的引導(dǎo)代碼段稱呼和存放位置都不一樣,但第一個(gè)引導(dǎo)內(nèi)核啟動(dòng)的代碼段一定稱為MBR,也一定處于磁盤的第一個(gè)扇區(qū)位置,所以MBR才稱為主引導(dǎo)記錄(Master Boot Record)。
4.當(dāng)找到內(nèi)核映像后,將內(nèi)核映像裝載到內(nèi)存中并解壓(如果被壓縮的話),內(nèi)核開始掌握CPU控制權(quán)并運(yùn)行起來,期間內(nèi)核會(huì)做很多工作,包括內(nèi)核的初始化、掛載真正的根目錄并從臨時(shí)根目錄切換到真正的根目錄、啟動(dòng)一些重要的進(jìn)程,例如idle、進(jìn)程調(diào)度器、init進(jìn)程等。然后開始執(zhí)行用戶空間的第一個(gè)進(jìn)程:init進(jìn)程,于是init進(jìn)程掌握了CPU的控制權(quán),也從此開始進(jìn)入用戶空間。
5.init進(jìn)程開始運(yùn)行后就表示操作系統(tǒng)真正已經(jīng)啟動(dòng)成功了,但它仍然需要做系統(tǒng)級(jí)別的初始化,比如設(shè)置主機(jī)名、設(shè)置硬件參數(shù)、加載硬件驅(qū)動(dòng)、掛載/etc/fstab中的一些文件系統(tǒng)等等。系統(tǒng)級(jí)別的運(yùn)行環(huán)境一切初始化完成后,于是提供用戶登錄的界面,即init啟動(dòng)getty類的進(jìn)程。
6.getty類的進(jìn)程啟動(dòng)后,將打開一個(gè)終端,并提示用戶輸入用戶名,然后啟動(dòng)一個(gè)login進(jìn)程讓用戶輸入密碼并驗(yàn)證密碼,密碼驗(yàn)證通過后再審核用戶是否有權(quán)登錄,如果允許登錄,將根據(jù)/etc/passwd中的配置啟動(dòng)該用戶對(duì)應(yīng)的shell進(jìn)程,例如bash進(jìn)程。
7.shell進(jìn)程啟動(dòng)后讀取該shell對(duì)應(yīng)的配置文件,并按照登錄式、交互式的shell運(yùn)行模式進(jìn)行初始化,初始化完成后將進(jìn)入登錄式、交互式的shell,也就是命令行下。
8.至此,用戶可以通過shell命令行來使用操作系統(tǒng)。
CentOS7的啟動(dòng)與CentOS6啟動(dòng)不同之處有兩大點(diǎn):
1)內(nèi)核引導(dǎo)階段,CentOS7默認(rèn)使用grub2引導(dǎo),而CentOS6默認(rèn)使用傳統(tǒng)的grub引導(dǎo)。
2)系統(tǒng)環(huán)境初始化和后面的過程。內(nèi)核初始化完成后,啟動(dòng)PID=1的過程,而CentOS7中這個(gè)進(jìn)程是systemd,它和CentOS6中的init進(jìn)程的初始化方式大不相同。
systemd特性:
1)系統(tǒng)初始化時(shí)實(shí)現(xiàn)服務(wù)并行啟動(dòng);
2)按需啟動(dòng)守護(hù)進(jìn)程;
3)自動(dòng)化的服務(wù)依賴關(guān)系管理;
4)同時(shí)采用socket式與D-Bus總線式激活服務(wù);
5)系統(tǒng)狀態(tài)快照。
以下簡(jiǎn)述CentOS7的啟動(dòng)流程,詳細(xì)內(nèi)容參考:man bootup幫助手冊(cè)。
1)UEFI或BIOS初始化,運(yùn)行POST開機(jī)自檢;
2)選擇啟動(dòng)設(shè)備;
3)引導(dǎo)內(nèi)核,做部分內(nèi)核初始化工作,加載initramfs;
4)啟動(dòng)systemd進(jìn)程,systemd進(jìn)程此時(shí)工作在initramfs環(huán)境下;
5)systemd執(zhí)行initrd.target所有單元,包括掛載/etc/fstab、從ramdisk的虛根文件系統(tǒng)切換到真正的根文件系統(tǒng);
6)systemd執(zhí)行默認(rèn)target配置,其配置文件為/etc/systemd/system/default.target;
7)systemd執(zhí)行sysinit.target初始化系統(tǒng)及basic.target準(zhǔn)備操作系統(tǒng);
8)systemd啟動(dòng)multi-user.target下的本機(jī)與服務(wù)器服務(wù);
9)systemd執(zhí)行multi-user.target下的/etc/rc.d/rc.local;
10)systemd執(zhí)行multi-user.target下的getty.target讓用戶登錄;
11)啟動(dòng)shell進(jìn)程并初始化,最終進(jìn)入命令行;
??上面的過程中最需要關(guān)注的便是大大提前了systemd的工作:在內(nèi)核初始化階段就參與了剩下的工作。等到systemd完成了根文件系統(tǒng)的切換后,將正式進(jìn)入操作系統(tǒng)的初始化過程,這時(shí)將進(jìn)入步驟6),即根據(jù)默認(rèn)target配置文件default.targe選擇默認(rèn)的“運(yùn)行級(jí)別”。