套用至 SUSE Linux Enterprise Desktop 12

10 Linux 系統開機

Linux 系統開機涉及多個元件和任務。硬體自身是由 BIOS 或 UEFI 啟動的。BIOS 或 UEFI 會藉由開機載入程式啟動核心。在此之後,開機程序完全由作業系統控制,並由 systemd 負責處理。systemd 會提供一組目標,用於啟動與日常使用、維護或緊急情況相關的設定。

10.1 Linux 開機程序

Linux 開機程序由數個階段所組成,每個階段分別由不同的元件所代表。下面的清單簡要概述了開機程序,並描述了涉及的所有主要元件:

  1. BIOS/UEFI.  開啟電腦之後,BIOS 或 UEFI 會啟始化螢幕和鍵盤,並測試主記憶體。在此階段中,機器不會存取大量儲存媒體。接著,會從 CMOS 值載入目前日期、時間和最重要的周邊。識別第一個硬碟及其規格之後,系統控制將會從 BIOS 轉到開機載入程式。如果 BIOS 支援網路開機,則也可以設定提供開機載入程式的開機伺服器。在 x86_64 系統上,需要 PXE 開機。其他架構通常使用 BOOTP 通訊協定來取得開機載入程式。

  2. 開機載入程式.  第一顆硬碟的第一個實體 512 位元組資料磁區,會載入主要記憶體。接著,在此磁區開頭的開機載入程式會接管開機程序。開機載入程式執行的指令,決定其他部份的開機程序。因此,第一個硬碟的前 512 位元組是主開機紀錄 (MBR)。然後,開機載入程式會將控制權交給實際的作業系統,在這裡是指 Linux 核心。如需關於 Linux 開機載入程式 GRUB 2 的詳細資訊,請參閱第 13 章「開機載入程式 GRUB 2。進行網路開機時,BIOS 會充當開機載入程式。它會從開機伺服器取得開機影像,然後啟動系統。這與本地硬碟完全無關。

  3. 核心和 initramfs 為了轉交系統控制權,開機載入程式會將核心和初始 RAM 式檔案系統 (initramfs) 兩者都載入記憶體。核心可以直接使用 initramfs 的內容。initramfs 包含一個名為 init 的小執行檔,該執行檔可以處理實際根目錄檔案系統的掛接。若需要特殊的硬體驅動程式才能存取大量儲存,那一定就是 initramfs 了。如需 initramfs 的詳細資訊,請參閱第 10.2 節「initramfs。如果系統沒有本地硬碟,initramfs 必須為核心提供根檔案系統。這可以藉由 iSCSI 或 SAN 這類網路區塊裝置來完成,但也可以使用 NFS 做為根裝置。

    注意
    注意:init 程序命名

    有兩個不同的程式通常會命名為init

    1. 掛接根檔案系統的 initramfs 程序

    2. 設定系統的作業系統程序

    在本章中,我們分別將它們稱為initramfs 上的 initsystemd

  4. initramfs 上的 init 此程式執行掛接正確根檔案系統所需的全部動作。它為所需的檔案系統提供核心功能,並為使用 udev 的大量儲存裝置控制器提供裝置驅動程式。找到根目錄檔案系統後,將會檢查是否有錯誤並進行掛接。若掛接成功,系統會清理 initramfs,並執行根檔案系統上的 systemd 精靈。如需關於 initramfsinit 的詳細資訊,請參閱第 10.3 節「initramfs 上的 init」。如需有關 udev 的詳細資訊,請參閱第 17 章「使用 udev 進行動態核心裝置管理

  5. systemd systemd 透過啟動服務並掛接檔案系統來處理實際的系統開機。第 11 章「systemd 精靈中介紹了 systemd

10.2 initramfs

initramfs 是一個小型 cpio 歸檔,可由核心載入 RAM 磁碟。在實際根目錄檔案系統掛接之前,它提供可讓程式執行的最小 Linux 環境。BIOS 或 UEFI 常式會將最精簡的 Linux 環境載入記憶體,該環境只需要有足夠的記憶體,除此之外,沒有特定硬體需求。initramfs 歸檔必須始終提供一個名為 init 的可執行檔,該檔案會執行根檔案系統上的 systemd 精靈,使開機程序得以繼續。

在根目錄檔案系統能夠掛接以及作業系統可以啟動之前,核心需要相應的驅動程式才能存取根目錄檔案系統所在的裝置。這些驅動程式可能包含特定類型硬碟的特殊驅動程式,或者甚至包含存取網路檔案系統的網路驅動程式。initramfs 上的 init 可以載入根目錄檔案系統所需的模組。當模組載入之後,udev 便會為 initramfs 提供所需的裝置。在後來的開機程序中,變更根目錄檔案系統後,必須重新產生這些裝置。將 systemd 單元 udev.service 與指令 udevtrigger 結合使用可以實現此目的。

如果您要變更已安裝系統上的硬體 (例如硬碟),而此硬體開機時需要核心中存在不同的驅動程式,那麼您就必須更新 initramfs 檔案。可透過呼叫 dracut -f (選項 -f 會覆寫現有 initramfs 檔案) 實現此目的。若要新增新硬體的驅動程式,請編輯 /etc/dracut.conf.d/01-dist.conf,新增下面一行。

force_drivers+="driver1"

使用驅動程式的模組名稱取代 driver1。如果需要新增多個驅動程式,請逐一列出並以空格分隔 (driver1 driver2)。

重要
重要: 更新 initramfsinit

開機載入程式將採用與核心相同的方式載入 initramfsinit。更新 initramfsinit 之後不需要重新安裝 GRUB 2,因為開機時 GRUB 2 會在該目錄中搜尋適當的檔案。

10.3 initramfs 上的 init

initramfs 上的 init 主要用途是為掛接以及存取實際根目錄檔案系統做好準備。根據您的系統組態,initramfs 上的 init 負責下列任務。

載入核心模組

根據硬體組態,存取您電腦的硬體元件可能需要特殊的驅動程式 (最重要的元件是硬碟)。若要存取最終的根目錄檔案系統,核心需載入適當的檔案系統驅動程式。

提供區塊特殊檔案

對於每個載入的模組,核心均會產生裝置事件。udev 會處理這些事件,並在 /dev 內的 RAM 檔案系統中產生所需的特殊區塊檔案。如果沒有這些專用檔案,便無法存取檔案系統和其他裝置。

管理 RAID 和 LVM 設定

如果您之前將系統設定為在 RAID 或 LVM 下存放根檔案系統,initramfs 上的 init 此時會設定 LVM 或 RAID,以便之後能夠存取根檔案系統。如需有關 RAID 與 LVM 的資訊,請參閱Chapter 12, Advanced Disk Setup, Deployment Guide

管理網路組態

如果您之前將系統設定為使用網路掛接的根檔案系統 (透過 NFS 掛接),那麼 initramfs 上的 init 此時必須確定是否已載入適當的網路驅動程式,並且這些驅動程式是否設定為允許存取根檔案系統。

如果檔案系統位於 iSCSI 或 SAN 這樣的網路區塊裝置上,initramfs 上的 init 還會設定與儲存伺服器間的連線。

若於安裝過程的啟始開機階段呼叫 initramfs 上的 init,它執行的任務會與上述任務有所不同:

尋找安裝媒體

當您啟動安裝程序時,您的機器會載入一個安裝核心以及一個包含 YaST 安裝程式的特殊 init。YaST 安裝程式在 RAM 檔案系統中執行,它必須知道安裝媒體的位置,才能存取該媒體來安裝作業系統。

啟始硬體辨識並載入適當核心模組

第 10.2 節「initramfs 中所述,開機程序會以最少量的驅動程式啟動,供大部分的硬體組態使用。init 會啟動一個啟始硬體掃描程序,以確定這組驅動程式是否適合您的硬體組態。這些驅動程式用來產生系統開機所需的自定 initramfs。如果開機不需要這些模組,但是 coldplug 需要這些模組,則可以使用 systemd 載入這些模組;如需詳細資訊,請參閱第 11.6.3 節「載入核心模組」

載入安裝系統

系統在正確識別硬體後,會立即載入相應的驅動程式。udev 程式會建立特殊的裝置檔案,init 將使用 YaST 安裝程式啟動安裝系統。

啟動 YaST

最後,init 會啟動 YaST,後者會啟動套件安裝和系統組態程序。

列印此頁面