Linux操作系統之一:簡述Linux系統開機引導和啟動過程

Linux操作系統之一:簡述Linux系統開機引導和啟動過程

操作系統的啟動分為兩個階段:

  • 引導boot
  • 啟動startup

引導階段開始於打開電源開關,結束於內核初始化完成和 systemd 進程成功運行。啟動階段接管了剩餘工作,直到操作系統進入可操作狀態。

總體來說,Linux 的開機引導和啟動過程是相當容易理解,下文將分節對於不同步驟進行詳細說明。

  • BIOS 上電自檢(POST)
  • 引導裝載程序 (GRUB2)
  • 內核初始化
  • 啟動 systemd,其是所有進程之父

注意,本文以 GRUB2 和 systemd 為載體講述操作系統的開機引導和啟動過程,是因為這二者是目前主流的 linux 發行版本所使用的引導裝載程序和初始化軟件。當然另外一些過去使用的相關軟件仍然在一些 Linux 發行版本中使用。

引導過程

引導過程能以兩種方式之一初始化。

  • 其一,如果系統處於關機狀態,那麼打開電源按鈕將開啟系統引導過程
  • 其二,如果操作系統已經運行在一個本地用戶(該用戶可以是 root 或其他非特權用戶),那麼用戶可以藉助圖形界面或命令行界面通過編程方式發起一個重啟操作,從而觸發系統引導過程。重啟包括了一個關機和重新開始的操作。

BIOS 上電自檢(POST)

上電自檢過程中其實 Linux 沒有什麼也沒做,上電自檢主要由硬件的部分來完成,這對於所有操作系統都一樣。當電腦接通電源,電腦開始執行 BIOS(基本輸入輸出系統Basic I/O System)的 POST(上電自檢Power On Self Test)過程。

BIOS 上電自檢確認硬件的基本功能正常,然後產生一個 BIOS 中斷 INT 13H,該中斷指向某個接入的可引導設備的引導扇區。它所找到的包含有效的引導記錄的第一個引導扇區將被裝載到內存中,並且控制權也將從引導扇區轉移到此段代碼。

引導扇區是引導加載器真正的第一階段。大多數 Linux 發行版本使用的引導加載器有三種:GRUB、GRUB2 和 LILO。GRUB2 是最新的,也是相對於其他老的同類程序使用最廣泛的。

GRUB2

GRUB2 全稱是 GRand Unified BootLoader,Version 2(第二版大一統引導裝載程序)。它是目前流行的大部分 Linux 發行版本的主要引導加載程序。GRUB2 是一個用於計算機尋找操作系統內核並加載其到內存的智能程序。由於 GRUB 這個單詞比 GRUB2 更易於書寫和閱讀,在下文中,除特殊指明以外,GRUB 將代指 GRUB2。

GRUB 被設計為兼容操作系統多重引導規範,它能夠用來引導不同版本的 Linux 和其他的開源操作系統;它還能鏈式加載專有操作系統的引導記錄。

GRUB 允許用戶從任何給定的 Linux 發行版本的幾個不同內核中選擇一個進行引導。這個特性使得操作系統,在因為關鍵軟件不兼容或其它某些原因升級失敗時,具備引導到先前版本的內核的能力。GRUB 能夠通過文件 /boot/grub/grub.conf 進行配置。

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名詞,但是為了討論方便,我們在本文中使用它們。

階段 1

如上文 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

如上所述,階段 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 文件系統的驅動程序,並加載相關的驅動程序。

階段 2

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系統的啟動過程可以分為5個階段:

  • 1、內核的引導。
  • 2、運行 init。
  • 3、系統初始化。
  • 4、建立終端 。
  • 5、用戶登錄系統。

內核引導

當計算機打開電源後,首先是BIOS開機自檢,按照BIOS中設置的啟動設備(通常是硬盤)來啟動。

操作系統接管硬件以後,首先讀入 /boot 目錄下的內核文件。

運行init

init 進程是系統所有進程的起點,你可以把它比擬成系統所有進程的老祖宗,沒有這個進程,系統中任何進程都不會啟動。

init 程序首先是需要讀取配置文件 /etc/inittab。

系統初始化

在init的配置文件中有這麼一行: si::sysinit:/etc/rc.d/rc.sysinit,它調用執行了/etc/rc.d/rc.sysinit,而rc.sysinit是一個bash shell的腳本,它主要是完成一些系統初始化的工作,rc.sysinit是每一個運行級別都要首先運行的重要腳本。

它主要完成的工作有:激活交換分區,檢查磁盤,加載硬件模塊以及其它一些需要優先執行任務。

建立終端

rc執行完畢後,返回init。這時基本系統環境已經設置好了,各種守護進程也已經啟動了。

init接下來會打開6個終端,以便用戶登錄系統。

用戶登錄系統

一般來說,用戶的登錄方式有三種: 命令行登錄 、ssh登錄 、圖形界面登錄

Linux操作系統之一:簡述Linux系統開機引導和啟動過程


分享到:


相關文章: