套用至 SUSE Linux Enterprise Desktop 12 SP2

11 Linux 系統開機

摘要

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

11.1 Linux 開機程序

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

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

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

    如果開機檔案系統無法在開機環境中掛接,則必須對該系統進行檢查與修復,然後才能繼續開機。對於 Ext3 與 Ext4 檔案系統,檔案系統檢查程式會自動啟動。對於 XFS 與 Btrfs 檔案系統,修復程序不會自動啟動,但會向使用者提供有關可用於修復該檔案系統的選項資訊。檔案系統修復成功後,現有的開機環境將導致系統重新嘗試掛接根檔案系統,並且如果掛接成功,將繼續正常開機。

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

    注意
    注意:init 程序命名

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

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

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

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

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

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

11.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 會在該目錄中搜尋適當的檔案。

提示
提示:變更核心變數

如果您在 sysctl 介面中透過編輯相關檔案 (/etc/sysctl.conf/etc/sysctl.d/*.conf) 變更了某些核心變數的值,下一次將系統重新開機時,這項變更將會遺失。即使您在執行時使用 sysctl --system 載入這些值,變更也不會儲存到 initramfs 檔案中。您需要透過呼叫 dracut -f (選項 -f 會覆寫現有 initramfs 檔案) 來更新該檔案。

11.3 initramfs 上的 Init

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

載入核心模組

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

提供區塊特殊檔案

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

管理 RAID 和 LVM 設定

如果您之前將系統設定為在 RAID 或 LVM 下存放根檔案系統,initramfs 上的 init 此時會設定 LVM 或 RAID,以便之後能夠存取根檔案系統。

如果要在 YaST 未提供協助的情況下直接變更 /usrswap 分割區,則需要執行其他動作。如果您忘記這些步驟,則系統將在緊急模式下啟動。要避免系統在緊急模式下啟動,請執行以下步驟︰

程序 11.1 切換至邏輯磁碟區時更新 Init RAM 磁碟
  1. 編輯 /etc/fstab 中的相應項目,然後使用邏輯磁碟區取代先前的分割區。

  2. 執行以下指令:

    root # mount -a
    root # swapon -a
  3. 使用 mkinitrddracut 重新產生起始 RAM 磁碟 (initramfs)。

  4. 對於 z Systems,額外執行 grub2-install

如需有關 RAID 與 LVM 的詳細資訊,請參閱Chapter 7, Advanced Disk Setup

管理網路組態

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

如果檔案系統位於 iSCSI 或 SAN 這樣的網路區塊裝置上,initramfs 上的 init 還會設定與儲存伺服器間的連線。如果主要目標不可用,SUSE Linux Enterprise Desktop 支援從次要 iSCSI 目標開機。

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

尋找安裝媒體

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

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

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

載入安裝系統

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

啟動 YaST

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

列印此頁面