《LINUX實戰:Linux 開機引導和啟動過程詳解》要點:
本文介紹了LINUX實戰:Linux 開機引導和啟動過程詳解,希望對您有用。如果有疑問,可以聯系我們。
你是否曾經對操作系統為何能夠執行應用法式而感到疑惑?那么本文將為你揭開操作系統引導與啟動的面紗.
理解操作系統開機引導和啟動過程對于配置操作系統和辦理相關啟動問題是至關重要的.該文章陳述了 GRUB2 引導裝載程序開機引導裝載內核的過程和 systemd 初始化系統執行開機啟動操作系統的過程.
事實上,操作系統的啟動分為兩個階段:引導boot和啟動startup.引導階段開始于打開電源開關,結束于內核初始化完成和 systemd 進程勝利運行.啟動階段接管了剩余工作,直到操作系統進入可操作狀態.
總體來說,Linux 的開機引導和啟動過程是相當容易理解,下文將分節對于分歧步驟進行詳細說明.
注意,本文以 GRUB2 和 systemd 為載體講述操作系統的開機引導和啟動過程,是因為這二者是目前主流的 linux 發行版本所使用的引導裝載法式和初始化軟件.當然另外一些過去使用的相關軟件仍然在一些 Linux 發行版本中使用.
?
引導過程能以兩種方式之一初始化.其一,如果系統處于關機狀態,那么打開電源按鈕將開啟系統引導過程.其二,如果操作系統已經運行在一個本地用戶(該用戶可以是 root 或其他非特權用戶),那么用戶可以借助圖形界面或命令行界面通過編程方式發起一個重啟操作,從而觸發系統引導過程.重啟包含了一個關機和重新開始的操作.
?
上電自檢過程中其實 Linux 沒有什么也沒做,上電自檢主要由硬件的部門來完成,這對于所有操作系統都一樣.當電腦接通電源,電腦開始執行 BIOS(基本輸入輸出系統Basic I/O System)的 POST(上電自檢Power On Self Test)過程.
在 1981 年,IBM 設計的第一臺個人電腦中,BIOS 被設計為用來初始化硬件組件.POST 作為 BIOS 的組成部分,用于檢驗電腦硬件基本功能是否正常.如果 POST 失敗,那么這個電腦就不克不及使用,引導過程也將就此中斷.
BIOS 上電自檢確認硬件的基本功能正常,然后產生一個 BIOS 中斷 INT 13H,該中斷指向某個接入的可引導設備的引導扇區.它所找到的包括有效的引導記錄的第一個引導扇區將被裝載到內存中,并且控制權也將從引導扇區轉移到此段代碼.
引導扇區是引導加載器真正的第一階段.大多數 Linux 發行版本使用的引導加載器有三種:GRUB、GRUB2 和 LILO.GRUB2 是最新的,也是相對于其他老的同類法式使用最廣泛的.
?
GRUB2 全稱是 GRand Unified BootLoader,Version 2(第二版大一統引導裝載程序).它是目前流行的大部門 Linux 發行版本的主要引導加載程序.GRUB2 是一個用于計算機尋找操作系統內核并加載其到內存的智能程序.由于 GRUB 這個單詞比 GRUB2 更易于書寫和閱讀,在下文中,除特殊指明以外,GRUB 將代指 GRUB2.
GRUB 被設計為兼容操作系統多重引導規范,它能夠用來引導分歧版本的 Linux 和其他的開源操作系統;它還能鏈式加載專有操作系統的引導記錄.
GRUB 允許用戶從任何給定的 Linux 發行版本的幾個分歧內核中選擇一個進行引導.這個特性使得操作系統,在因為關鍵軟件不兼容或其它某些原因升級失敗時,具備引導到先前版本的內核的能力.GRUB 能夠通過文件 /boot/grub/grub.conf
進行配置.(LCTT 譯注:此處指 GRUB1)
GRUB1 現在已經逐步被棄用,在大多數現代發行版上它已經被 GRUB2 所替換,GRUB2 是在 GRUB1 的基礎上重寫完成.基于 Red Hat 的發行版大約是在 Fedora 15 和 CentOS/RHEL 7 時升級到 GRUB2 的.GRUB2 提供了與 GRUB1 同樣的引導功能,但是 GRUB2 也是一個類似主框架(mainframe)系統上的基于命令行的前置操作系統(Pre-OS)環境,使得在預引導階段配置更為便利和易操作.GRUB2 通過 /boot/grub2/grub.cfg
進行配置.
兩個 GRUB 的最主要作用都是將內核加載到內存并運行.兩個版本的 GRUB 的基本工作方式一致,其主要階段也堅持相同,都可分為 3 個階段.在本文將以 GRUB2 為例進行討論其工作過程.GRUB 或 GRUB2 的配置,以及 GRUB2 的命令使用均超過本文范圍,不會在文中進行介紹.
雖然 GRUB2 并未在其三個引導階段中正式使用這些階段stage名詞,但是為了討論便利,我們在本文中使用它們.
?
如上文 POST(上電自檢)階段提到的,在 POST 階段結束時,BIOS 將查找在接入的磁盤中查找引導記錄,其通常位于 MBR(主引導記錄Master Boot Record),它加載它找到的第一個引導記錄中到內存中,并開始執行此代碼.引導代碼(及階段 1 代碼)必須非常小,因為它必須連同分區表放到硬盤的第一個 512 字節的扇區中. 在傳統的常規 MBR 中,引導代碼實際所占用的空間大小為 446 字節.這個階段 1 的 446 字節的文件通常被叫做引導鏡像(boot.img),其中不包括設備的分區信息,分區是一般單獨添加到引導記錄中.
由于引導記錄必需非常的小,它不可能非常智能,且不能理解文件系統結構.因此階段 1 的唯一功能就是定位并加載階段 1.5 的代碼.為了完成此任務,階段 1.5 的代碼必需位于引導記錄與設備第一個分區之間的位置.在加載階段 1.5 代碼進入內存后,控制權將由階段 1 轉移到階段 1.5.
?
如上所述,階段 1.5 的代碼必需位于引導記錄與設備第一個分區之間的位置.該空間由于歷史上的技術原因而空閑.第一個分區的開始位置在扇區 63 和 MBR(扇區 0)之間遺留下 62 個 512 字節的扇區(共 31744 字節),該區域用于存儲階段 1.5 的代碼鏡像 core.img 文件.該文件大小為 25389 字節,故此區域有足夠大小的空間用來存儲 core.img.
因為有更大的存儲空間用于階段 1.5,且該空間足夠容納一些通用的文件系統驅動程序,如尺度的 EXT 和其它的 Linux 文件系統,如 FAT 和 NTFS 等.GRUB2 的 core.img 遠比更老的 GRUB1 階段 1.5 更復雜且更強大.這意味著 GRUB2 的階段 2 能夠放在尺度的 EXT 文件系統內,但是不能放在邏輯卷內.故階段 2 的文件可以存放于 /boot
文件系統中,一般在 /boot/grub2
目錄下.
注意 /boot
目錄必需放在一個 GRUB 所支持的文件系統(并不是所有的文件系統均可).階段 1.5 的功能是開始執行存放階段 2 文件的 /boot
文件系統的驅動程序,并加載相關的驅動程序.
?
GRUB 階段 2 所有的文件都已存放于 /boot/grub2
目錄及其幾個子目錄之下.該階段沒有一個類似于階段 1 與階段 1.5 的鏡像文件.相應地,該階段主要必要從 /boot/grub2/i386-pc
目錄下加載一些內核運行時模塊.
GRUB 階段 2 的主要功能是定位和加載 Linux 內核到內存中,并轉移控制權到內核.內核的相關文件位于 /boot
目錄下,這些內核文件可以通過其文件名進行辨認,其文件名均帶有前綴 vmlinuz.你可以列出 /boot
目錄中的內容來查看操作系統中當前已經安裝的內核.
GRUB2 跟 GRUB1 類似,支持從 Linux 內核選擇之一引導啟動.Red Hat 擔保理器(DNF)支持保留多個內核版本,以防最新版本內核發生問題而無法啟動時,可以恢復老版本的內核.默認情況下,GRUB 提供了一個已安裝內核的預引導菜單,其中包括問題診斷菜單(recuse)以及恢復菜單(如果配置已經設置恢復鏡像).
階段 2 加載選定的內核到內存中,并轉移節制權到內核代碼.
?
內核文件都是以一種自解壓的壓縮格局存儲以節省空間,它與一個初始化的內存映像和存儲設備映射表都存儲于 /boot
目錄之下.
在選定的內核加載到內存中并開始執行后,在其進行任何工作之前,內核文件首先必需從壓縮格式解壓自身.一旦內核自解壓完成,則加載 systemd 進程(其是老式 System V 系統的 init 程序的替代品),并轉移控制權到 systemd.
這便是引導過程的結束.此刻,Linux 內核和 systemd 處于運行狀態,但是由于沒有其他任何程序在執行,故其不能執行任何有關用戶的功能性任務.
?
啟動過程緊隨引導過程之后,啟動過程使 Linux 系統進入可操作狀態,并能夠執行用戶功效性任務.
?
systemd 是所有進程的父進程.它負責將 Linux 主機帶到一個用戶可操作狀態(可以執行功能任務).systemd 的一些功能遠較舊式 init 程序更豐富,可以管理運行中的 Linux 主機的許多方面,包含掛載文件系統,以及開啟和管理 Linux 主機的系統服務等.但是 systemd 的任何與系統啟動過程無關的功能均不在此文的討論范圍.
首先,systemd 掛載在 /etc/fstab
中配置的文件系統,包括內存交換文件或分區.據此,systemd 必須能夠拜訪位于 /etc
目錄下的配置文件,包括它自己的.systemd 借助其配置文件 /etc/systemd/system/default.target
決??? Linux 系統應該啟動達到哪個狀態(或目標態target).default.target
是一個真實的 target 文件的符號鏈接.對于桌面系統,其鏈接到 graphical.target
,該文件相當于舊式 systemV init 方式的 runlevel 5.對于一個服務器操作系統來說,default.target
更多是默認鏈接到 multi-user.target
, 相當于 systemV 系統的 runlevel 3. emergency.target
相當于單用戶模式.
(LCTT 譯注:“target” 是 systemd 新引入的概念,目前尚未發現有官方的準確譯名,考慮到其作用和使用的上下文環境,我們認為翻譯為“目標態”比較貼切.以及,“unit” 是指 systemd 中服務和目標態等各個對象/文件,在此按照語境譯作“單元”.)
注意,所有的目標態target和服務service均是 systemd 的單位unit.
如下表 1 是 systemd 啟動的目標態target和老版 systemV init 啟動運行級別runlevel的對比.這個 systemd 目標態別名 是為了 systemd 向前兼容 systemV 而提供.這個目標態別名允許系統管理員(包含我自己)用 systemV 命令(例如 init 3
)改變運行級別.當然,該 systemV 命令是被轉發到 systemd 進行解釋和執行的.
SystemV 運行級別 | systemd 目標態 | systemd 目標態別名 | 描述 |
---|---|---|---|
? | halt.target |
? | 停止系統運行但不切斷電源. |
0 | poweroff.target |
runlevel0.target |
停止系統運行并切斷電源. |
S | emergency.target |
? | 單用戶模式,沒有服務進程運行,文件系統也沒掛載.這是一個最基本的運行級別,僅在主控制臺上提供一個 shell 用于用戶與系統進行交互. |
1 | rescue.target |
runlevel1.target |
掛載了文件系統,僅運行了最基本的服務進程的基本系統,并在主控制臺啟動了一個 shell 拜訪入口用于診斷. |
2 | ? | runlevel2.target |
多用戶,沒有掛載 NFS 文件系統,但是所有的非圖形界面的服務進程已經運行. |
3 | multi-user.target |
runlevel3.target |
所有服務都已運行,但只支持命令行接口拜訪. |
4 | ? | runlevel4.target |
未使用. |
5 | graphical.target |
runlevel5.target |
多用戶,且支持圖形界面接口. |
6 | reboot.target |
runlevel6.target |
重啟. |
? | default.target |
? | 這個目標態target是總是 multi-user.target 或 graphical.target 的一個符號鏈接的別名.systemd 總是通過 default.target 啟動系統.default.target 絕不應該指向 halt.target 、 poweroff.target 或 reboot.target . |
表 1 老版本 systemV 的 運行級別與 systemd 與目標態target或目標態別名的比較
每個目標態target有一個在其配置文件中描述的依賴集,systemd 必要首先啟動其所需依賴,這些依賴服務是 Linux 主機運行在特定的功能級別所要求的服務.當配置文件中所有的依賴服務都加載并運行后,即說明系統運行于該目標級別.
systemd 也會查看老式的 systemV init 目錄中是否存在相關啟動文件,若存在,則 systemd 根據這些配置文件的內容啟動對應的服務.在 Fedora 系統中,過時的網絡服務便是通過該方式啟動的一個實例.
如下圖 1 是直接從 bootup 的 man 頁面拷貝而來.它展示了在 systemd 啟動過程中一般的變亂序列和確保成功的啟動的基本的順序要求.
sysinit.target
和 basic.target
目標態可以被視作啟動過程中的狀態檢查點.盡管 systemd 的設計初衷是并行啟動系統服務,但是部門服務或功能目標態是其它服務或目標態的啟動的前提.系統將暫停于檢查點直到其所要求的服務和目標態都滿足為止.
sysinit.target
狀態的到達是以其所依賴的所有資源模塊都正常啟動為前提的,所有其它的單元,如文件系統掛載、交換文件設置、設備管理器的啟動、隨機數生成器種子設置、低級別系統服務初始化、加解密服務啟動(如果一個或者多個文件系統加密的話)等都必需完成,但是在 sysinit.target 中這些服務與模塊是可以并行啟動的.
sysinit.target
啟動所有的低級別服務和系統初具功能所需的單元,這些都是進入下一階段 basic.target 的需要前提.
圖 1:systemd 的啟動流程
在 sysinit.target
的條件滿足以后,systemd 接下來啟動 basic.target
,啟動其所要求的所有單元. basic.target
通過啟動下一目標態所需的單元而提供了更多的功能,這包含各種可執行文件的目錄路徑、通信 sockets,以及定時器等.
最后,用戶級目標態(multi-user.target
或 graphical.target
) 可以初始化了,應該注意的是 multi-user.target
必需在滿足圖形化目標態 graphical.target
的依賴項之前先達成.
圖 1 中,以 *
開頭的目標態是通用的啟動狀態.當到達其中的某一目標態,則闡明系統已經啟動完成了.如果 multi-user.target
是默認的目標態,則成功啟動的系統將以命令行登錄界面呈現于用戶.如果 graphical.target
是默認的目標態,則成功啟動的系統將以圖形登錄界面呈現于用戶,界面的具體樣式將根據系統所配置的顯示管理器而定.
?
最近我需要改變一臺使用 GRUB2 的 Linux 電腦的默認引導內核.我發現一些 GRUB2 的命令在我的系統上不能用,也可能是我使用辦法不正確.至今,我仍然不知道是何原因導致,此問題需要進一步探究.
grub2-set-default
命令沒能在配置文件 /etc/default/grub
中成功地設置默認內核索引,以至于期望的替代內核并沒有被引導啟動.故在該配置文件中我手動更改 GRUB_DEFAULT=saved
為 GRUB_DEFAULT=2
,2 是我需要引導的安裝好的內核文件的索引.然后我執行命令 grub2-mkconfig > /boot/grub2/grub.cfg
創建了新的 GRUB 配置文件,該辦法如預期的規避了問題,并成功引導了替代的內核.
?
GRUB2、systemd 初始化系統是大多數現代 Linux 發行版引導和啟動的關鍵組件.盡管在實際中,systemd 的使用還存在一些爭議,但是 GRUB2 與 systemd 可以密切地配合先加載內核,然后啟動一個業務系統所必要的系統服務.
盡管 GRUB2 和 systemd 都比其前任要更加復雜,但是它們更加容易學習和管理.在 man 頁面有大量關于 systemd 的贊助說明,freedesktop.org 也在線收錄了完整的此贊助說明.下面有更多相關信息鏈接.
?
作者簡介:
David Both 居住在美國北卡羅納州的首府羅利,是一個 Linux 開源貢獻者.他已經從事 IT 行業 40 余年,在 IBM 傳授 OS/2 20余年.1981 年,他在 IBM 開發了第一個關于最初的 IBM 個人電腦的培訓課程.他也曾在 Red Hat 傳授 RHCE 課程,也曾供職于 MCI worldcom,Cico 以及北卡羅納州等.他已經為 Linux 開源社區工作近 20 年.
via: https://opensource.com/article/17/2/linux-boot-and-startup
作者:David Both 譯者: penghuster 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
本文永遠更新鏈接地址:
《LINUX實戰:Linux 開機引導和啟動過程詳解》是否對您有啟發,歡迎查看更多與《LINUX實戰:Linux 開機引導和啟動過程詳解》相關教程,學精學透。維易PHP學院為您提供精彩教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/8882.html