跳至內容跳至頁面導覽:上一頁 [access key p]/下一頁 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文件 / 管理指南 / Linux 系統開機 / 開機程序簡介
適用範圍 SUSE Linux Enterprise Server 12 SP5

10 開機程序簡介

Linux 系統開機涉及多個元件和任務。完成韌體和硬體啟始化程序 (取決於機器的架構) 之後,系統將透過開機載入程式 GRUB 2 啟動核心。在此之後,開機程序完全由作業系統控制,並由 systemd 負責處理。systemd 會提供一組目標,用於啟動與日常使用、維護或緊急情況相關的組態。

10.1 術語

本章使用的術語可能有不同的解釋。為了理解本章中術語的用法,請閱讀以下定義︰

init

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

  • 掛接根檔案系統的 initramfs 程序

  • 從實際根檔案系統執行且用於啟動其他所有程序的作業系統程序

在這兩種情況下,systemd 程式都會處理此任務。首先會從 initramfs 執行此程序,以掛接根檔案系統。掛接成功後,從根檔案系統以初始程序的形式重新執行此程序。為了避免混淆這兩個 systemd 程序,我們將第一個程序稱為 init on initramfs,將第二個程序稱為 systemd

initrd / initramfs

initrd (初始 RAM 磁碟) 是一個影像檔案,內含核心所載入的並且做為暫存根檔案系統從 /dev/ram 掛接的根檔案系統影像。掛接此檔案系統需要使用檔案系統驅動程式。

從核心 2.6.13 開始,initramfs (初始 RAM 檔案系統) 取代了 initrd,前者無需檔案系統驅動程式即可掛接。SUSE Linux Enterprise Server 只使用 initramfs。但是,由於 initramfs 做為 /boot/initrd 儲存,因此通常將其稱為 initrd。本章只使用名稱 initramfs

10.2 Linux 開機程序

Linux 開機程序由數個階段組成,每個階段分別由不同的元件所代表︰

10.2.1 啟始化和開機載入程式階段

在啟始化階段,將設定機器硬體並準備好裝置。此程序根據硬體架構的不同有很大的差別。

SUSE Linux Enterprise Server 在所有架構中使用開機載入程式 GRUB 2。根據架構和韌體,啟動 GRUB 2 開機載入程式的程序可能包括多個步驟。開機載入程式的用途是載入核心以及初始的 RAM 式檔案系統 (initramfs)。如需 GRUB 2 的詳細資訊,請參閱第 12 章 「開機載入程式 GRUB 2

10.2.1.1 AArch64 與 Intel 64/AMD64 上的啟始化和開機載入程式階段

開啟電腦之後,BIOS 或 UEFI 會啟始化螢幕和鍵盤,並測試主記憶體。在此階段中,機器不會存取大量儲存媒體。接著,會從 CMOS 值載入目前日期、時間和最重要的周邊。辨識開機媒體及其幾何尺寸之後,系統控制權將會從 BIOS/UEFI 轉到開機載入程式。

在配備傳統 BIOS 的機器上,只能載入開機磁碟第一個實體 512 位元組資料磁區 (主開機記錄,MBR) 中的程式碼。只有極少量的 GRUB 2 程式碼能夠裝入 MBR。開機載入程式的唯一作用就是從 MBR 與第一個分割區 (MBR 分割區表) 之間的間隙處,或是從 BIOS 開機分割區 (GPT 分割區表) 載入包含檔案系統驅動程式的 GRUB 2 核心影像。此影像包含檔案系統驅動程式,因此能夠存取根檔案系統中的 /boot/boot 包含 GRUB 2 核心 (core) 的附加模組以及核心 (kernel) 和 initramfs 影像。取得此分割區的存取權之後,GRUB 2 會將核心和 initramfs 影像載入記憶體,並將控制權交接到核心。

從包含已加密分割區 /boot 的加密檔案系統將 BIOS 系統開機時,需要輸入解密密碼兩次。GRUB 2 使用第一次輸入的密碼來解密 /bootsystemd 使用第二次輸入的密碼來載入加密的磁碟區。

在配備 UEFI 的機器上,開機程序比配備傳統 BIOS 的機器要簡單得多。韌體能夠讀取包含 GPT 分割區表的磁碟的 FAT 格式化系統分割區。此 EFI 系統分割區 (在執行中的系統上載入為 /boot/efi) 可提供足夠的空間,用於代管由韌體直接載入和執行的完備 GRUB 2。

如果 BIOS/UEFI 支援網路開機,則也可以設定提供開機載入程式的開機伺服器。然後,可以透過 PXE 將系統開機。BIOS/UEFI 用做開機載入程式。它會從開機伺服器取得開機影像,然後啟動系統。這與本地硬碟完全無關。

10.2.1.2 IBM Z 上的啟始化和開機載入程式階段

在 IBM Z 上,必須透過名為 zipl (z initial program load,z 初始程式載入) 的開機載入程式來啟始化開機程序。雖然 zipl 支援讀取不同的檔案系統,但它不支援 SLE 預設檔案系統 (Btrfs) 或者從快照開機。因此,SUSE Linux Enterprise Server 使用兩階段的開機程序來確保在開機時提供完整的 Btrfs 支援:

  1. zipl 從 ext2 格式化分割區 /boot/zipl 開機。此分割區包含一個極簡的核心,以及一個載入記憶體中的 initramfs。initramfs 包含 Btrfs 驅動程式 (及其他元件) 和開機載入程式 GRUB 2。系統使用參數 initgrub (告知要啟動 GRUB 2) 來啟動核心。

  2. 核心會掛接根檔案系統,以使 /boot 可存取。現在,將從 initramfs 啟動 GRUB 2。GRUB 2 從 /boot/grub2/grub.cfg 讀取其組態,並從 /boot 載入最終的核心和 initramfs。現在,將透過 Kexec 載入新核心。

10.2.2 核心階段

開機載入程式轉交系統控制權後,所有架構中的開機程序均是相同的。開機載入程式會將核心和初始的 RAM 式檔案系統 (initramfs) 都載入記憶體中,而核心將接管控制權。

核心設定記憶體管理並偵測 CPU 類型及其功能之後,將啟始化硬體,並從記憶體中掛接使用 initramfs 載入的暫存根檔案系統。

10.2.2.1 initramfs 檔案

initramfs (初始 RAM 檔案系統) 是一個小型 cpio 歸檔,可由核心載入 RAM 磁碟。該檔案位於 /boot/initrd 中。可以使用名為 dracut 的工具建立該檔案,如需詳細資料,請參閱 man 8 dracut

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

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

10.2.2.1.1 重新產生 initramfs

由於 initramfs 包含多個驅動程式,因此,每當其中某個驅動程式有新版本推出時,都需要更新 initramfs。在安裝包含驅動程式更新的套件時可以自動完成這種更新。YaST 或 zypper 透過顯示用於產生 initramfs 的指令輸出來告知此狀態。但在某些情況下,您需要手動重新產生 initramfs

由於更換硬體而需新增驅動程式

如果需要更換硬體 (例如硬碟),並且開機時此硬體需要核心中的不同驅動程式,則您必須更新 initramfs 檔案。

開啟或建立 /etc/dracut.conf.d/10-驅動程式.conf 並新增以下行 (請注意前置空格):

force_drivers+=" DRIVER1"

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

force_drivers+=" DRIVER1 DRIVER2"

繼續執行程序 10.1 「產生 initramfs」

將系統目錄移至 RAID 或 LVM

每次您要將執行中系統上的交換檔案或系統目錄 (例如 /usr) 移至 RAID 或邏輯磁碟區時,都需要建立一個包含軟體 RAID 或 LVM 驅動程式支援的 initramfs

為此,請在 /etc/fstab 中建立相關的項目,並掛接新項目 (例如,使用 mount -a 和/或 swapon -a)。

繼續執行程序 10.1 「產生 initramfs」

將磁碟新增至包含根檔案系統的 LVM 群組或 Btrfs RAID

每當您要在包含根檔案系統的邏輯磁碟區群組或者 Btrfs RAID 中新增 (或移除) 磁碟時,都需要建立一個支援增大的磁碟區的 initramfs。請遵循程序 10.1 「產生 initramfs」中的說明操作。

繼續執行程序 10.1 「產生 initramfs」

變更核心變數

如果您在 sysctl 介面中透過編輯相關檔案 (/etc/sysctl.conf/etc/sysctl.d/*.conf) 變更了核心變數的值,系統下次重新開機時,這項變更將會遺失。即使您在執行時使用 sysctl --system 載入這些值,變更也不會儲存到 initramfs 檔案中。您需要依照程序 10.1 「產生 initramfs」中所述更新該檔案。

程序 10.1︰ 產生 initramfs

請注意,您需要以 root 使用者身分執行以下程序中的所有指令。

  1. 執行以下指令產生新的 initramfs 檔案

    dracut MY_INITRAMFS

    請以所選檔案名稱取代 MY_INITRAMFS。新的 initramfs 將會建立為 /boot/MY_INITRAMFS

    或者執行 dracut -f。這會覆寫目前使用的現有檔案。

  2. (如果在上一步中執行了 dracut -f,請跳過此步驟。)為上一步中所建立的 initramfs 檔案建立連結︰

    (cd /boot && ln -sf MY_INITRAMFS initrd)
  3. 在 IBM Z 架構中,還需額外執行 grub2-install

10.2.3 init on initramfs 階段

核心從 initramfs 掛接的暫存根檔案系統包含可執行檔案 systemd (下文稱為 init on initramfs,另請參閱第 10.1 節 「術語」)。此程式執行掛接正確根檔案系統所需的全部動作。它為所需的檔案系統提供核心功能,並為使用 udev 的大量儲存控制器提供裝置驅動程式。

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

載入核心模組

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

提供區塊特殊檔案

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

管理 RAID 和 LVM 設定

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

管理網路組態

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

如果檔案系統位於 iSCSI 或 SAN 這樣的網路區塊裝置上,initramfs 上的 init 還會設定與儲存伺服器間的連線。如果主要目標不可用,SUSE Linux Enterprise Server 支援從次要 iSCSI 目標開機。如需有關開機 iSCSI 目標的組態的更多詳細資料,請參閱第 14.3.1 節 「使用 YaST 設定 iSCSI 啟動器的組態」

注意
注意:處理掛接錯誤

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

10.2.3.1 安裝程序中的 init on initramfs 階段

若於安裝過程的啟始開機階段呼叫 init on initramfs,它執行的任務會與上述任務有所不同。請注意,安裝系統不會從 initramfs 啟動 systemdlinuxrc 負責執行這些任務。

尋找安裝媒體

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

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

第 10.2.2.1 節 「initramfs 檔案」中所述,開機程序從最少的一組驅動程式 (可在大多數硬體組態中使用) 開始。在 AArch、POWER 和 Intel 64/AMD64 機器上,linuxrc 會啟動初始硬體掃描程序,以確定適合您硬體組態的驅動程式集。在 IBM Z 上,需要提供驅動程式清單及其參數,例如,透過 linuxrc 或 parmfile 提供。

這些驅動程式用來產生系統開機所需的自訂 initramfs。如果開機不需要這些模組,但是 coldplug 需要這些模組,則可以使用 systemd 載入這些模組;如需詳細資訊,請參閱第 13.6.4 節 「載入核心模組」

載入安裝系統

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

啟動 YaST

最後,linuxrc 啟動 YaST,後者則啟動套件安裝和系統組態。

10.2.4 systemd 階段

找到實際的根檔案系統後,對其進行錯誤檢查並加以掛接。若掛接成功,系統會清理 initramfs,並執行根檔案系統上的 systemd 精靈。systemd 是 Linux 的系統和服務管理員。它是做為 PID 1 啟動的父程序,用做 init 系統來啟動和維護使用者空間服務。如需詳細資料,請參閱第 13 章 「systemd 精靈