僅供個(gè)人參考
概述
Linux 的開機(jī)引導(dǎo)和啟動(dòng)過程:
- BIOS(Basic Input / Output System) 上電自檢(POST)
- 引導(dǎo)裝載程序 (GRUB2)
- 內(nèi)核初始化
- 啟動(dòng) systemd兽肤,其是所有進(jìn)程之父励负。
BIOS上電自檢(POST)
BIOS:基本輸入輸出系統(tǒng)(Basic I/O System)
POST:上電自檢(Power On Self Test)
POST 作為 BIOS 的組成部分,用于檢驗(yàn)電腦硬件基本功能是否正常遗淳。如果 POST 失敗变泄,那么這個(gè)電腦就不能使用令哟,引導(dǎo)過程也將就此中斷。POST過程中其實(shí) Linux 沒有什么也沒做妨蛹,POST主要由硬件的部分來完成励饵,這對(duì)于所有操作系統(tǒng)都一樣。
BIOS 上電自檢確認(rèn)硬件的基本功能正常滑燃,然后產(chǎn)生一個(gè) BIOS 中斷 INT 13H,該中斷指向某個(gè)接入的可引導(dǎo)設(shè)備的引導(dǎo)扇區(qū)颓鲜。它所找到的包含有效的引導(dǎo)記錄的第一個(gè)引導(dǎo)扇區(qū)將被裝載到內(nèi)存中表窘,并且控制權(quán)也將從引導(dǎo)扇區(qū)轉(zhuǎn)移到此段代碼典予。
引導(dǎo)扇區(qū)是引導(dǎo)加載器真正的第一階段。
大多數(shù) Linux 發(fā)行版本使用的引導(dǎo)加載器有三種:GRUB乐严、GRUB2 和 LILO瘤袖。GRUB2 是最新的,也是相對(duì)于其他老的同類程序使用最廣泛的昂验。
引導(dǎo)裝載程序
GRUB2 : 第二版大一統(tǒng)引導(dǎo)裝載程序(GRand Unified BootLoader捂敌,Version 2)
GRUB2 是一個(gè)用于計(jì)算機(jī)尋找操作系統(tǒng)內(nèi)核并加載其到內(nèi)存的智能程序。
GRUB2 被設(shè)計(jì)為兼容操作系統(tǒng)多重引導(dǎo)規(guī)范既琴,它能夠用來引導(dǎo)不同版本的 Linux 和其他的開源操作系統(tǒng)占婉;它還能鏈?zhǔn)郊虞d專有操作系統(tǒng)的引導(dǎo)記錄。
GRUB 能夠通過文件 /boot/grub/grub.conf 進(jìn)行配置甫恩。
GRUB2 能夠通過文件 /boot/grub2/grub.conf 進(jìn)行配置逆济。
GRUB 現(xiàn)在已經(jīng)逐步被棄用,在大多數(shù)現(xiàn)代發(fā)行版上它已經(jīng)被 GRUB2 所替換磺箕,GRUB2 是在 GRUB 的基礎(chǔ)上重寫完成奖慌。
兩個(gè) GRUB 的最主要作用都是將內(nèi)核加載到內(nèi)存并運(yùn)行。兩個(gè)版本的 GRUB 的基本工作方式一致松靡,其主要階段也保持相同简僧,都可分為 3 個(gè)階段。在本文將以 GRUB2 為例進(jìn)行討論其工作過程雕欺。
GRUB 或 GRUB2 的配置岛马,以及 GRUB2 的命令使用均超過本文范圍,待續(xù)....
階段 1
MBR:主引導(dǎo)記錄(Master Boot Record)
如上文 POST(上電自檢)階段提到的阅茶,在 POST 階段結(jié)束時(shí)蛛枚,BIOS 將查找在接入的磁盤中查找引導(dǎo)記錄,其通常位于 MBR脸哀,它加載它找到的第一個(gè)引導(dǎo)記錄中到內(nèi)存中蹦浦,并開始執(zhí)行此代碼。
引導(dǎo)代碼(及階段 1 代碼)必須非常小撞蜂,因?yàn)樗仨氝B同分區(qū)表放到硬盤的第一個(gè) 512 字節(jié)的扇區(qū)中盲镶。在傳統(tǒng)的常規(guī) MBR 中,引導(dǎo)代碼實(shí)際所占用的空間大小為 446 字節(jié)蝌诡。這個(gè)階段 1 的 446 字節(jié)的文件通常被叫做引導(dǎo)鏡像(boot.img)溉贿,其中不包含設(shè)備的分區(qū)信息,分區(qū)是一般單獨(dú)添加到引導(dǎo)記錄中浦旱。
由于引導(dǎo)記錄必須非常的小宇色,它不可能非常智能,且不能理解文件系統(tǒng)結(jié)構(gòu)。因此階段 1 的唯一功能就是定位并加載階段 2 的代碼宣蠕。為了完成此任務(wù)例隆,階段2 的代碼必須位于引導(dǎo)記錄與設(shè)備第一個(gè)分區(qū)之間的位置。在加載階段 2 代碼進(jìn)入內(nèi)存后抢蚀,控制權(quán)將由階段 1 轉(zhuǎn)移到階段 2镀层。
階段 2
如上所述,階段 2 的代碼必須位于引導(dǎo)記錄與設(shè)備第一個(gè)分區(qū)之間的位置皿曲。該空間由于歷史上的技術(shù)原因而空閑唱逢。
第一個(gè)分區(qū)的開始位置在扇區(qū) 63 和 MBR(扇區(qū) 0)之間遺留下 62 個(gè) 512 字節(jié)的扇區(qū)(共 31744 字節(jié)),該區(qū)域用于存儲(chǔ)階段 2的代碼鏡像 core.img 文件屋休。該文件大小為 25389 字節(jié)坞古,故此區(qū)域有足夠大小的空間用來存儲(chǔ) core.img。
因?yàn)橛懈蟮拇鎯?chǔ)空間用于階段 2博投,且該空間足夠容納一些通用的文件系統(tǒng)驅(qū)動(dòng)程序绸贡,如標(biāo)準(zhǔn)的 EXT 和其它的 Linux 文件系統(tǒng),如 FAT 和 NTFS 等毅哗。GRUB2 的 core.img 遠(yuǎn)比更老的 GRUB1 階段 2 更復(fù)雜且更強(qiáng)大听怕。這意味著 GRUB2 的階段 3能夠放在標(biāo)準(zhǔn)的 EXT 文件系統(tǒng)內(nèi),但是不能放在邏輯卷內(nèi)虑绵。故階段 3的文件可以存放于 /boot 文件系統(tǒng)中尿瞭,一般在 /boot/grub2 目錄下。
注意 /boot 目錄必須放在一個(gè) GRUB 所支持的文件系統(tǒng)(并不是所有的文件系統(tǒng)均可)翅睛。階段 2 的功能是開始執(zhí)行存放階段 3文件的 /boot 文件系統(tǒng)的驅(qū)動(dòng)程序声搁,并加載相關(guān)的驅(qū)動(dòng)程序。
階段 3
GRUB 階段 3 所有的文件都已存放于 /boot/grub2 目錄及其幾個(gè)子目錄之下。該階段沒有一個(gè)類似于階段 1 與階段 2 的鏡像文件。相應(yīng)地哎壳,該階段主要需要從 /boot/grub2/i386-pc 目錄下加載一些內(nèi)核運(yùn)行時(shí)模塊。
GRUB 階段 3 的主要功能是定位和加載 Linux 內(nèi)核到內(nèi)存中檐涝,并轉(zhuǎn)移控制權(quán)到內(nèi)核。內(nèi)核的相關(guān)文件位于 /boot 目錄下法挨,這些內(nèi)核文件可以通過其文件名進(jìn)行識(shí)別谁榜,其文件名均帶有前綴 vmlinuz。你可以列出 /boot 目錄中的內(nèi)容來查看操作系統(tǒng)中當(dāng)前已經(jīng)安裝的內(nèi)核凡纳。
GRUB2 跟 GRUB1 類似窃植,支持從 Linux 內(nèi)核選擇之一引導(dǎo)啟動(dòng)。Red Hat 包管理器(DNF)支持保留多個(gè)內(nèi)核版本荐糜,以防最新版本內(nèi)核發(fā)生問題而無法啟動(dòng)時(shí)巷怜,可以恢復(fù)老版本的內(nèi)核葛超。默認(rèn)情況下,GRUB 提供了一個(gè)已安裝內(nèi)核的預(yù)引導(dǎo)菜單延塑,其中包括問題診斷菜單(recuse)以及恢復(fù)菜單(如果配置已經(jīng)設(shè)置恢復(fù)鏡像)巩掺。
階段 3 加載選定的內(nèi)核到內(nèi)存中,并轉(zhuǎn)移控制權(quán)到內(nèi)核代碼页畦。
內(nèi)核初始化
內(nèi)核文件都是以一種自解壓的壓縮格式存儲(chǔ)以節(jié)省空間,它與一個(gè)初始化的內(nèi)存映像和存儲(chǔ)設(shè)備映射表都存儲(chǔ)于 /boot
目錄之下研儒。
在選定的內(nèi)核加載到內(nèi)存中并開始執(zhí)行后豫缨,在其進(jìn)行任何工作之前,內(nèi)核文件首先必須從壓縮格式解壓自身端朵。一旦內(nèi)核自解壓完成好芭,則加載 systemd 進(jìn)程(其是老式 System V 系統(tǒng)的 init 程序的替代品),并轉(zhuǎn)移控制權(quán)到 systemd冲呢。
這就是引導(dǎo)過程的結(jié)束舍败。此刻,Linux 內(nèi)核和 systemd 處于運(yùn)行狀態(tài)敬拓,但是由于沒有其他任何程序在執(zhí)行邻薯,故其不能執(zhí)行任何有關(guān)用戶的功能性任務(wù)。
啟動(dòng)init進(jìn)程
啟動(dòng)過程緊隨引導(dǎo)過程之后乘凸,啟動(dòng)過程使 Linux 系統(tǒng)進(jìn)入可操作狀態(tài)厕诡,并能夠執(zhí)行用戶功能性任務(wù)。
有兩種啟動(dòng)方式:
- 老版本的init進(jìn)程
- 新版本的systemd進(jìn)程
init進(jìn)程啟動(dòng)方式
初始化系統(tǒng)营勤。
/sbin/init進(jìn)程是系統(tǒng)其他所有進(jìn)程的父進(jìn)程灵嫌,當(dāng)它接管了系統(tǒng)的控制權(quán)先之后,它首先會(huì)去讀取/etc/inittab文件來執(zhí)行相應(yīng)的腳本進(jìn)行系統(tǒng)初始化葛作,如設(shè)置鍵盤寿羞、字體,裝載模塊赂蠢,設(shè)置網(wǎng)絡(luò)等绪穆。主要包括以下工作:
1)、執(zhí)行系統(tǒng)初始化腳本(/etc/rc.d/rc.sysinit)客年,對(duì)系統(tǒng)進(jìn)行基本的配置霞幅,以讀寫方式掛載根文件系統(tǒng)及其它文件系統(tǒng),到此系統(tǒng)算是基本運(yùn)行起來了量瓜,后面需要進(jìn)行運(yùn)行級(jí)別的確定及相應(yīng)服務(wù)的啟動(dòng)司恳。rc.sysinit所做的事情(不同的Linux發(fā)行版,該文件可能有些差異)如下:
(1)獲取網(wǎng)絡(luò)環(huán)境與主機(jī)類型绍傲。
首先會(huì)讀取網(wǎng)絡(luò)環(huán)境設(shè)置文件"/etc/sysconfig/network"扔傅,獲取主機(jī)名稱與默認(rèn)網(wǎng)關(guān)等網(wǎng)絡(luò)環(huán)境耍共。
(2)測試與載入內(nèi)存設(shè)備/proc及usb設(shè)備/sys。
除了/proc外猎塞,系統(tǒng)會(huì)主動(dòng)檢測是否有usb設(shè)備试读,并主動(dòng)加載usb驅(qū)動(dòng),嘗試載入usb文件系統(tǒng)荠耽。
(3)決定是否啟動(dòng)SELinux钩骇。
(4)接口設(shè)備的檢測與即插即用(pnp)參數(shù)的測試。
(5)用戶自定義模塊的加載铝量。用戶可以再"/etc/sysconfig/modules/*.modules"加入自定義的模塊倘屹,此時(shí)會(huì)加載到系統(tǒng)中。
(6)加載核心的相關(guān)設(shè)置慢叨。按"/etc/sysctl.conf"這個(gè)文件的設(shè)置值配置功能纽匙。
(7)設(shè)置系統(tǒng)時(shí)間(clock)。
(8)設(shè)置終端的控制臺(tái)的字形拍谐。
(9)設(shè)置raid及LVM等硬盤功能烛缔。
(10)以方式查看檢驗(yàn)磁盤文件系統(tǒng)。
(11)進(jìn)行磁盤配額quota的轉(zhuǎn)換轩拨。
(12)重新以讀取模式載入系統(tǒng)磁盤践瓷。
(13)啟動(dòng)quota功能。
(14)啟動(dòng)系統(tǒng)隨機(jī)數(shù)設(shè)備(產(chǎn)生隨機(jī)數(shù)功能)气嫁。
(15)清楚啟動(dòng)過程中的臨時(shí)文件当窗。
(16)將啟動(dòng)信息加載到"/var/log/dmesg"文件中。
當(dāng)/etc/rc.d/rc.sysinit執(zhí)行完后寸宵,系統(tǒng)就可以順利工作了崖面,只是還需要啟動(dòng)系統(tǒng)所需要的各種服務(wù),這樣主機(jī)才可以提供相關(guān)的網(wǎng)絡(luò)和主機(jī)功能梯影,因此便會(huì)執(zhí)行下面的腳本巫员。
2)、執(zhí)行/etc/rc.d/rc腳本甲棍。該文件定義了服務(wù)啟動(dòng)的順序是先K后S简识,而具體的每個(gè)運(yùn)行級(jí)別的服務(wù)狀態(tài)是放在/etc/rc.d/rc.d(=0~6)目錄下,所有的文件均是指向/etc/init.d下相應(yīng)文件的符號(hào)鏈接感猛。rc.sysinit通過分析/etc/inittab文件來確定系統(tǒng)的啟動(dòng)級(jí)別七扰,然后才去執(zhí)行/etc/rc.d/rc*.d下的文件。
/etc/init.d-> /etc/rc.d/init.d
/etc/rc ->/etc/rc.d/rc
/etc/rc*.d ->/etc/rc.d/rc*.d
/etc/rc.local-> /etc/rc.d/rc.local
/etc/rc.sysinit-> /etc/rc.d/rc.sysinit
也就是說陪白,/etc目錄下的init.d颈走、rc、rc*.d咱士、rc.local和rc.sysinit均是指向/etc/rc.d目錄下相應(yīng)文件和文件夾的符號(hào)鏈接立由。我們以啟動(dòng)級(jí)別3為例來簡要說明一下轧钓。
/etc/rc.d/rc3.d目錄,該目錄下的內(nèi)容全部都是以 S 或 K 開頭的鏈接文件锐膜,都鏈接到"/etc/rc.d/init.d"目錄下的各種shell腳本毕箍。S表示的是啟動(dòng)時(shí)需要start的服務(wù)內(nèi)容,K表示關(guān)機(jī)時(shí)需要關(guān)閉的服務(wù)內(nèi)容道盏。/etc/rc.d/rc.d中的系統(tǒng)服務(wù)會(huì)在系統(tǒng)后臺(tái)啟動(dòng)而柑,如果要對(duì)某個(gè)運(yùn)行級(jí)別中的服務(wù)進(jìn)行更具體的定制,通過chkconfig命令來操作荷逞,或者通過setup牺堰、ntsys、system-config-services來進(jìn)行定制颅围。如果我們需要自己增加啟動(dòng)的內(nèi)容,可以在init.d目錄中增加相關(guān)的shell腳本恨搓,然后在rc.d目錄中建立鏈接文件指向該shell腳本院促。這些shell腳本的啟動(dòng)或結(jié)束順序是由S或K字母后面的數(shù)字決定,數(shù)字越小的腳本越先執(zhí)行斧抱。例如常拓,/etc/rc.d/rc3.d /S01sysstat就比/etc/rc.d/rc3.d /S99local先執(zhí)行。
3)辉浦、執(zhí)行用戶自定義引導(dǎo)程序/etc/rc.d/rc.local弄抬。其實(shí)當(dāng)執(zhí)行/etc/rc.d/rc3.d/S99local時(shí),它就是在執(zhí)行/etc/rc.d/rc.local宪郊。S99local是指向rc.local的符號(hào)鏈接掂恕。就是一般來說,自定義的程序不需要執(zhí)行上面所說的繁瑣的建立shell增加鏈接文件的步驟弛槐,只需要將命令放在rc.local里面就可以了懊亡,這個(gè)shell腳本就是保留給用戶自定義啟動(dòng)內(nèi)容的。
4)乎串、完成了系統(tǒng)所有的啟動(dòng)任務(wù)后店枣,linux會(huì)啟動(dòng)終端或X-Window來等待用戶登錄。tty1,tty2,tty3...這表示在運(yùn)行等級(jí)1叹誉,2鸯两,3,4的時(shí)候长豁,都會(huì)執(zhí)行"/sbin/mingetty"钧唐,而且執(zhí)行了6個(gè),所以linux會(huì)有6個(gè)純文本終端蕉斜,mingetty就是啟動(dòng)終端的命令逾柿。
除了這6個(gè)之外還會(huì)執(zhí)行"/etc/X11/prefdm-nodaemon"這個(gè)主要啟動(dòng)X-Window
systemd進(jìn)程啟動(dòng)方式
systemd 是所有進(jìn)程的父進(jìn)程缀棍。它負(fù)責(zé)將 Linux 主機(jī)帶到一個(gè)用戶可操作狀態(tài)(可以執(zhí)行功能任務(wù))。systemd 的一些功能遠(yuǎn)較舊式 init 程序更豐富机错,可以管理運(yùn)行中的 Linux 主機(jī)的許多方面爬范,包括掛載文件系統(tǒng),以及開啟和管理 Linux 主機(jī)的系統(tǒng)服務(wù)等弱匪。但是 systemd 的任何與系統(tǒng)啟動(dòng)過程無關(guān)的功能均不在此文的討論范圍青瀑。
首先,systemd 掛載在 /etc/fstab 中配置的文件系統(tǒng)萧诫,包括內(nèi)存交換文件或分區(qū)斥难。據(jù)此,systemd 必須能夠訪問位于 /etc 目錄下的配置文件帘饶,包括它自己的哑诊。systemd 借助其配置文件 /etc/systemd/system/default.target 決定 Linux 系統(tǒng)應(yīng)該啟動(dòng)達(dá)到哪個(gè)狀態(tài)(或目標(biāo)態(tài)target)。default.target 是一個(gè)真實(shí)的 target 文件的符號(hào)鏈接及刻。對(duì)于桌面系統(tǒng)镀裤,其鏈接到 graphical.target,該文件相當(dāng)于舊式 systemV init 方式的 runlevel 5缴饭。對(duì)于一個(gè)服務(wù)器操作系統(tǒng)來說暑劝,default.target 更多是默認(rèn)鏈接到 multi-user.target, 相當(dāng)于 systemV 系統(tǒng)的 runlevel 3颗搂。 emergency.target 相當(dāng)于單用戶模式担猛。
在
sysinit.target
的條件滿足以后,systemd 接下來啟動(dòng) basic.target
丢氢,啟動(dòng)其所要求的所有單元傅联。 basic.target
通過啟動(dòng)下一目標(biāo)態(tài)所需的單元而提供了更多的功能,這包括各種可執(zhí)行文件的目錄路徑疚察、通信 sockets纺且,以及定時(shí)器等。
最后稍浆,用戶級(jí)目標(biāo)態(tài)(multi-user.target
或 graphical.target
) 可以初始化了载碌,應(yīng)該注意的是 multi-user.target
必須在滿足圖形化目標(biāo)態(tài) graphical.target
的依賴項(xiàng)之前先達(dá)成。
圖 1 中衅枫,以 *
開頭的目標(biāo)態(tài)是通用的啟動(dòng)狀態(tài)嫁艇。當(dāng)?shù)竭_(dá)其中的某一目標(biāo)態(tài),則說明系統(tǒng)已經(jīng)啟動(dòng)完成了弦撩。如果 multi-user.target
是默認(rèn)的目標(biāo)態(tài)步咪,則成功啟動(dòng)的系統(tǒng)將以命令行登錄界面呈現(xiàn)于用戶。如果 graphical.target
是默認(rèn)的目標(biāo)態(tài)益楼,則成功啟動(dòng)的系統(tǒng)將以圖形登錄界面呈現(xiàn)于用戶猾漫,界面的具體樣式將根據(jù)系統(tǒng)所配置的顯示管理器而定点晴。
參考鏈接:
https://www.cnblogs.com/QLinux/articles/2540304.html
http://www.cnblogs.com/bluestorm/p/5981435.html
https://www.linuxidc.com/Linux/2017-08/146494.htm