原文:https://opensource.com/article/17/2/linux-boot-and-startup
轉自:http://blog.jobbole.com/112277/
理解操作系統(tǒng)開機引導和啟動過程對于配置操作系統(tǒng)和解決相關啟動問題是至關重要的丛晦。該文章陳述了 GRUB2 引導裝載程開機引導裝載內(nèi)核的過程和 systemd 初始化系統(tǒng)執(zhí)行開機啟動操作系統(tǒng)的過程牍戚。
事實上覆劈,操作系統(tǒng)的啟動分為兩個階段:引導boot和啟動startup。引導階段開始于打開電源開關核畴,結束于內(nèi)核初始化完成和 systemd 進程成功運行匀伏。啟動階段接管了剩余工作,直到操作系統(tǒng)進入可操作狀態(tài)受神。
總體來說剖膳,Linux 的開機引導和啟動過程是相當容易理解魏颓,下文將分節(jié)對于不同步驟進行詳細說明。
BIOS 上電自檢(POST)
引導裝載程序 (GRUB2)
內(nèi)核初始化
啟動 systemd吱晒,其是所有進程之父甸饱。
注意,本文以 GRUB2 和 systemd 為載體講述操作系統(tǒng)的開機引導和啟動過程枕荞,是因為這二者是目前主流的 linux 發(fā)行版本所使用的引導裝載程序和初始化軟件柜候。當然另外一些過去使用的相關軟件仍然在一些 Linux 發(fā)行版本中使用。
引導過程
引導過程能以兩種方式之一初始化躏精。其一渣刷,如果系統(tǒng)處于關機狀態(tài),那么打開電源按鈕將開啟系統(tǒng)引導過程矗烛。其二辅柴,如果操作系統(tǒng)已經(jīng)運行在一個本地用戶(該用戶可以是 root 或其他非特權用戶),那么用戶可以借助圖形界面或命令行界面通過編程方式發(fā)起一個重啟操作瞭吃,從而觸發(fā)系統(tǒng)引導過程碌嘀。重啟包括了一個關機和重新開始的操作。
BIOS 上電自檢(POST)
上電自檢過程中其實 Linux 沒有什么也沒做歪架,上電自檢主要由硬件的部分來完成股冗,這對于所有操作系統(tǒng)都一樣。當電腦接通電源和蚪,電腦開始執(zhí)行 BIOS(基本輸入輸出系統(tǒng)Basic I/O System)的 POST(上電自檢Power On Self Test)過程止状。
在 1981 年,IBM 設計的第一臺個人電腦中攒霹,BIOS 被設計為用來初始化硬件組件怯疤。POST 作為 BIOS 的組成部分,用于檢驗電腦硬件基本功能是否正常催束。如果 POST 失敗集峦,那么這個電腦就不能使用,引導過程也將就此中斷抠刺。
BIOS 上電自檢確認硬件的基本功能正常塔淤,然后產(chǎn)生一個 BIOS 中斷 INT 13H,該中斷指向某個接入的可引導設備的引導扇區(qū)速妖。它所找到的包含有效的引導記錄的第一個引導扇區(qū)將被裝載到內(nèi)存中凯沪,并且控制權也將從引導扇區(qū)轉移到此段代碼。
引導扇區(qū)是引導加載器真正的第一階段买优。大多數(shù) Linux 發(fā)行版本使用的引導加載器有三種:GRUB妨马、GRUB2 和 LILO挺举。GRUB2 是最新的,也是相對于其他老的同類程序使用最廣泛的烘跺。
GRUB2
GRUB2 全稱是 GRand Unified BootLoader湘纵,Version 2(第二版大一統(tǒng)引導裝載程序)。它是目前流行的大部分 Linux 發(fā)行版本的主要引導加載程序滤淳。GRUB2 是一個用于計算機尋找操作系統(tǒng)內(nèi)核并加載其到內(nèi)存的智能程序梧喷。由于 GRUB 這個單詞比 GRUB2 更易于書寫和閱讀,在下文中脖咐,除特殊指明以外铺敌,GRUB 將代指 GRUB2。
GRUB 被設計為兼容操作系統(tǒng)多重引導規(guī)范屁擅,它能夠用來引導不同版本的 Linux 和其他的開源操作系統(tǒng)偿凭;它還能鏈式加載專有操作系統(tǒng)的引導記錄。
GRUB 允許用戶從任何給定的 Linux 發(fā)行版本的幾個不同內(nèi)核中選擇一個進行引導派歌。這個特性使得操作系統(tǒng)弯囊,在因為關鍵軟件不兼容或其它某些原因升級失敗時,具備引導到先前版本的內(nèi)核的能力胶果。GRUB 能夠通過文件 /boot/grub/grub.conf
進行配置匾嘱。(LCTT 譯注:此處指 GRUB1)
GRUB1 現(xiàn)在已經(jīng)逐步被棄用,在大多數(shù)現(xiàn)代發(fā)行版上它已經(jīng)被 GRUB2 所替換早抠,GRUB2 是在 GRUB1 的基礎上重寫完成霎烙。基于 Red Hat 的發(fā)行版大約是在 Fedora 15 和 CentOS/RHEL 7 時升級到 GRUB2 的蕊连。GRUB2 提供了與 GRUB1 同樣的引導功能吼过,但是 GRUB2 也是一個類似主框架(mainframe)系統(tǒng)上的基于命令行的前置操作系統(tǒng)(Pre-OS)環(huán)境,使得在預引導階段配置更為方便和易操作咪奖。GRUB2 通過 /boot/grub2/grub.cfg
進行配置。
兩個 GRUB 的最主要作用都是將內(nèi)核加載到內(nèi)存并運行酱床。兩個版本的 GRUB 的基本工作方式一致羊赵,其主要階段也保持相同,都可分為 3 個階段扇谣。在本文將以 GRUB2 為例進行討論其工作過程昧捷。GRUB 或 GRUB2 的配置,以及 GRUB2 的命令使用均超過本文范圍罐寨,不會在文中進行介紹靡挥。
雖然 GRUB2 并未在其三個引導階段中正式使用這些階段stage名詞,但是為了討論方便鸯绿,我們在本文中使用它們跋破。
階段 1
如上文 POST(上電自檢)階段提到的簸淀,在 POST 階段結束時,BIOS 將查找在接入的磁盤中查找引導記錄毒返,其通常位于 MBR(主引導記錄Master Boot Record)租幕,它加載它找到的第一個引導記錄中到內(nèi)存中,并開始執(zhí)行此代碼拧簸。引導代碼(及階段 1 代碼)必須非常小劲绪,因為它必須連同分區(qū)表放到硬盤的第一個 512 字節(jié)的扇區(qū)中。 在傳統(tǒng)的常規(guī) MBR 中盆赤,引導代碼實際所占用的空間大小為 446 字節(jié)贾富。這個階段 1 的 446 字節(jié)的文件通常被叫做引導鏡像(boot.img),其中不包含設備的分區(qū)信息牺六,分區(qū)是一般單獨添加到引導記錄中颤枪。
由于引導記錄必須非常的小,它不可能非常智能兔乞,且不能理解文件系統(tǒng)結構汇鞭。因此階段 1 的唯一功能就是定位并加載階段 1.5 的代碼。為了完成此任務庸追,階段 1.5 的代碼必須位于引導記錄與設備第一個分區(qū)之間的位置霍骄。在加載階段 1.5 代碼進入內(nèi)存后,控制權將由階段 1 轉移到階段 1.5淡溯。
階段 1.5
如上所述读整,階段 1.5 的代碼必須位于引導記錄與設備第一個分區(qū)之間的位置。該空間由于歷史上的技術原因而空閑咱娶。第一個分區(qū)的開始位置在扇區(qū) 63 和 MBR(扇區(qū) 0)之間遺留下 62 個 512 字節(jié)的扇區(qū)(共 31744 字節(jié))米间,該區(qū)域用于存儲階段 1.5 的代碼鏡像 core.img 文件。該文件大小為 25389 字節(jié)膘侮,故此區(qū)域有足夠大小的空間用來存儲 core.img屈糊。
因為有更大的存儲空間用于階段 1.5,且該空間足夠容納一些通用的文件系統(tǒng)驅動程序琼了,如標準的 EXT 和其它的 Linux 文件系統(tǒng)逻锐,如 FAT 和 NTFS 等。GRUB2 的 core.img 遠比更老的 GRUB1 階段 1.5 更復雜且更強大雕薪。這意味著 GRUB2 的階段 2 能夠放在標準的 EXT 文件系統(tǒng)內(nèi)昧诱,但是不能放在邏輯卷內(nèi)。故階段 2 的文件可以存放于 /boot
文件系統(tǒng)中所袁,一般在 /boot/grub2
目錄下盏档。
注意 /boot
目錄必須放在一個 GRUB 所支持的文件系統(tǒng)(并不是所有的文件系統(tǒng)均可)。階段 1.5 的功能是開始執(zhí)行存放階段 2 文件的 /boot
文件系統(tǒng)的驅動程序燥爷,并加載相關的驅動程序蜈亩。
階段 2
GRUB 階段 2 所有的文件都已存放于 /boot/grub2
目錄及其幾個子目錄之下懦窘。該階段沒有一個類似于階段 1 與階段 1.5 的鏡像文件。相應地勺拣,該階段主要需要從 /boot/grub2/i386-pc
目錄下加載一些內(nèi)核運行時模塊奶赠。
GRUB 階段 2 的主要功能是定位和加載 Linux 內(nèi)核到內(nèi)存中,并轉移控制權到內(nèi)核药有。內(nèi)核的相關文件位于 /boot
目錄下毅戈,這些內(nèi)核文件可以通過其文件名進行識別,其文件名均帶有前綴 vmlinuz愤惰。你可以列出 /boot
目錄中的內(nèi)容來查看操作系統(tǒng)中當前已經(jīng)安裝的內(nèi)核苇经。
GRUB2 跟 GRUB1 類似,支持從 Linux 內(nèi)核選擇之一引導啟動宦言。Red Hat 包管理器(DNF)支持保留多個內(nèi)核版本扇单,以防最新版本內(nèi)核發(fā)生問題而無法啟動時,可以恢復老版本的內(nèi)核奠旺。默認情況下蜘澜,GRUB 提供了一個已安裝內(nèi)核的預引導菜單,其中包括問題診斷菜單(recuse)以及恢復菜單(如果配置已經(jīng)設置恢復鏡像)响疚。
階段 2 加載選定的內(nèi)核到內(nèi)存中鄙信,并轉移控制權到內(nèi)核代碼。
內(nèi)核
內(nèi)核文件都是以一種自解壓的壓縮格式存儲以節(jié)省空間忿晕,它與一個初始化的內(nèi)存映像和存儲設備映射表都存儲于 /boot
目錄之下装诡。
在選定的內(nèi)核加載到內(nèi)存中并開始執(zhí)行后,在其進行任何工作之前践盼,內(nèi)核文件首先必須從壓縮格式解壓自身鸦采。一旦內(nèi)核自解壓完成,則加載 systemd 進程(其是老式 System V 系統(tǒng)的 init 程序的替代品)咕幻,并轉移控制權到 systemd渔伯。
這就是引導過程的結束。此刻肄程,Linux 內(nèi)核和 systemd 處于運行狀態(tài)锣吼,但是由于沒有其他任何程序在執(zhí)行,故其不能執(zhí)行任何有關用戶的功能性任務绷耍。
啟動過程
啟動過程緊隨引導過程之后,啟動過程使 Linux 系統(tǒng)進入可操作狀態(tài)鲜侥,并能夠執(zhí)行用戶功能性任務褂始。
systemd
systemd 是所有進程的父進程。它負責將 Linux 主機帶到一個用戶可操作狀態(tài)(可以執(zhí)行功能任務)描函。systemd 的一些功能遠較舊式 init 程序更豐富崎苗,可以管理運行中的 Linux 主機的許多方面狐粱,包括掛載文件系統(tǒng),以及開啟和管理 Linux 主機的系統(tǒng)服務等胆数。但是 systemd 的任何與系統(tǒng)啟動過程無關的功能均不在此文的討論范圍肌蜻。
首先,systemd 掛載在 /etc/fstab
中配置的文件系統(tǒng)必尼,包括內(nèi)存交換文件或分區(qū)蒋搜。據(jù)此,systemd 必須能夠訪問位于 /etc
目錄下的配置文件判莉,包括它自己的豆挽。systemd 借助其配置文件 /etc/systemd/system/default.target
決定 Linux 系統(tǒng)應該啟動達到哪個狀態(tài)(或目標態(tài)target)。default.target
是一個真實的 target 文件的符號鏈接券盅。對于桌面系統(tǒng)帮哈,其鏈接到 graphical.target
,該文件相當于舊式 systemV init 方式的 runlevel 5锰镀。對于一個服務器操作系統(tǒng)來說娘侍,default.target
更多是默認鏈接到 multi-user.target
, 相當于 systemV 系統(tǒng)的 runlevel 3泳炉。 emergency.target
相當于單用戶模式憾筏。
(LCTT 譯注:“target” 是 systemd 新引入的概念,目前尚未發(fā)現(xiàn)有官方的準確譯名胡桃,考慮到其作用和使用的上下文環(huán)境踩叭,我們認為翻譯為“目標態(tài)”比較貼切。以及翠胰,“unit” 是指 systemd 中服務和目標態(tài)等各個對象/文件容贝,在此依照語境譯作“單元”。)
注意之景,所有的目標態(tài)target和服務service均是 systemd 的單元unit斤富。
如下表 1 是 systemd 啟動的目標態(tài)target和老版 systemV init 啟動運行級別runlevel的對比。這個 systemd 目標態(tài)別名 是為了 systemd 向前兼容 systemV 而提供锻狗。這個目標態(tài)別名允許系統(tǒng)管理員(包括我自己)用 systemV 命令(例如 init 3
)改變運行級別满力。當然,該 systemV 命令是被轉發(fā)到 systemd 進行解釋和執(zhí)行的轻纪。
每個目標態(tài)target有一個在其配置文件中描述的依賴集油额,systemd 需要首先啟動其所需依賴,這些依賴服務是 Linux 主機運行在特定的功能級別所要求的服務刻帚。當配置文件中所有的依賴服務都加載并運行后潦嘶,即說明系統(tǒng)運行于該目標級別。
systemd 也會查看老式的 systemV init 目錄中是否存在相關啟動文件崇众,若存在掂僵,則 systemd 根據(jù)這些配置文件的內(nèi)容啟動對應的服務航厚。在 Fedora 系統(tǒng)中,過時的網(wǎng)絡服務就是通過該方式啟動的一個實例锰蓬。
如下圖 1 是直接從 bootup 的 man 頁面拷貝而來幔睬。它展示了在 systemd 啟動過程中一般的事件序列和確保成功的啟動的基本的順序要求。
sysinit.target 和 basic.target 目標態(tài)可以被視作啟動過程中的狀態(tài)檢查點芹扭。盡管 systemd 的設計初衷是并行啟動系統(tǒng)服務麻顶,但是部分服務或功能目標態(tài)是其它服務或目標態(tài)的啟動的前提。系統(tǒng)將暫停于檢查點直到其所要求的服務和目標態(tài)都滿足為止冯勉。
sysinit.target 狀態(tài)的到達是以其所依賴的所有資源模塊都正常啟動為前提的澈蚌,所有其它的單元,如文件系統(tǒng)掛載灼狰、交換文件設置宛瞄、設備管理器的啟動、隨機數(shù)生成器種子設置交胚、低級別系統(tǒng)服務初始化份汗、加解密服務啟動(如果一個或者多個文件系統(tǒng)加密的話)等都必須完成,但是在 sysinit.target 中這些服務與模塊是可以并行啟動的蝴簇。
sysinit.target 啟動所有的低級別服務和系統(tǒng)初具功能所需的單元杯活,這些都是進入下一階段 basic.target 的必要前提。
在 sysinit.target的條件滿足以后熬词,systemd 接下來啟動 basic.target
旁钧,啟動其所要求的所有單元。 basic.target
通過啟動下一目標態(tài)所需的單元而提供了更多的功能互拾,這包括各種可執(zhí)行文件的目錄路徑歪今、通信 sockets,以及定時器等颜矿。
最后寄猩,用戶級目標態(tài)(multi-user.target
或 graphical.target
) 可以初始化了,應該注意的是 multi-user.target
必須在滿足圖形化目標態(tài) graphical.target
的依賴項之前先達成骑疆。
圖 1 中田篇,以 *
開頭的目標態(tài)是通用的啟動狀態(tài)。當?shù)竭_其中的某一目標態(tài)箍铭,則說明系統(tǒng)已經(jīng)啟動完成了泊柬。如果 multi-user.target
是默認的目標態(tài),則成功啟動的系統(tǒng)將以命令行登錄界面呈現(xiàn)于用戶诈火。如果 graphical.target
是默認的目標態(tài)兽赁,則成功啟動的系統(tǒng)將以圖形登錄界面呈現(xiàn)于用戶,界面的具體樣式將根據(jù)系統(tǒng)所配置的顯示管理器而定。
故障討論
最近我需要改變一臺使用 GRUB2 的 Linux 電腦的默認引導內(nèi)核闸氮。我發(fā)現(xiàn)一些 GRUB2 的命令在我的系統(tǒng)上不能用,也可能是我使用方法不正確教沾。至今蒲跨,我仍然不知道是何原因導致,此問題需要進一步探究授翻。
grub2-set-default
命令沒能在配置文件 /etc/default/grub
中成功地設置默認內(nèi)核索引或悲,以至于期望的替代內(nèi)核并沒有被引導啟動。故在該配置文件中我手動更改 GRUB_DEFAULT=saved
為 GRUB_DEFAULT=2
堪唐,2 是我需要引導的安裝好的內(nèi)核文件的索引巡语。然后我執(zhí)行命令 grub2-mkconfig > /boot/grub2/grub.cfg
創(chuàng)建了新的 GRUB 配置文件,該方法如預期的規(guī)避了問題淮菠,并成功引導了替代的內(nèi)核男公。
結論
GRUB2、systemd 初始化系統(tǒng)是大多數(shù)現(xiàn)代 Linux 發(fā)行版引導和啟動的關鍵組件合陵。盡管在實際中枢赔,systemd 的使用還存在一些爭議,但是 GRUB2 與 systemd 可以密切地配合先加載內(nèi)核拥知,然后啟動一個業(yè)務系統(tǒng)所需要的系統(tǒng)服務踏拜。
盡管 GRUB2 和 systemd 都比其前任要更加復雜,但是它們更加容易學習和管理低剔。在 man 頁面有大量關于 systemd 的幫助說明速梗,freedesktop.org 也在線收錄了完整的此幫助說明。下面有更多相關信息鏈接襟齿。
附加資源
GNU GRUB (Wikipedia)
GNU GRUB Manual (GNU.org)
Master Boot Record (Wikipedia)
Multiboot specification (Wikipedia)
systemd (Wikipedia)
systemd bootup process (Freedesktop.org)
systemd index of man pages (Freedesktop.org)
作者簡介:
David Both 居住在美國北卡羅納州的首府羅利姻锁,是一個 Linux 開源貢獻者。他已經(jīng)從事 IT 行業(yè) 40 余年蕊唐,在 IBM 教授 OS/2 20余年屋摔。1981 年,他在 IBM 開發(fā)了第一個關于最初的 IBM 個人電腦的培訓課程替梨。他也曾在 Red Hat 教授 RHCE 課程钓试,也曾供職于 MCI worldcom,Cico 以及北卡羅納州等副瀑。他已經(jīng)為 Linux 開源社區(qū)工作近 20 年弓熏。