章 8. 啟動及設定 Linux 系統

內容目錄

8.1. Linux 開機程序
8.2. init 程序
8.3. 透過 /etc/sysconfig 設定系統

摘要

啟動 Linux 系統需要各種不同的元件。本章將概略說明一些基本原則,並特別介紹與啟動相關的元件。本章也將說明 runlevel 的觀念以及使用 sysconfig 進行 SUSE 系統組態。


8.1. Linux 開機程序

Linux 開機程序由數個階段所組成,每個階段分別由元件所代表。以下清單簡短概述開機程序,以及所有相關主要元件的功能。

  1. BIOS.  啟動電腦之後,BIOS 會啟始螢幕和鍵盤並測試主記憶體。在此階段中,機器不會存取大量儲存媒體。接著,會從 CMOS 值載入目前日期、時間和最重要的周邊。識別第一個硬碟及其幾何之後,系統控制將會從 BIOS 轉到開機載入器。

  2. 開機載入器.  第一顆硬碟的第一個實體 512 位元組資料磁區,會載入主要記憶體。接著,在此磁區開頭的開機載入器會接管開機程序。開機載入器執行的指令,決定其他部份的開機程序。因此,第一個硬碟的前 512 個位元組是主開機紀錄 (MBR)。然後,開機載入器會將控制傳送到實際作業系統,在這裡是指 Linux 核心。如需更多關於 GRUB (也就是 Linux 開機載入器) 的詳細資訊,請參閱章 9, 開機載入器

  3. 核心和初始 RAM 檔案系統.  為了送出系統控制,開機載入器會將核心和初始 RAM 檔案系統 (initramfs, initial RAM-based file system) 兩者都載入記憶體。另外,核心可以直接使用 initramfs 的內容。init ramfs 包含一個名為 init 的小執行檔,它可以處理實體根目錄檔案系統的裝載。舊版的 SUSE Linux 中,這些工作分別是由 initrd 和 linuxrc 處理。如需有關 initramfs 的詳細資訊,請參閱節 8.1.1, "initramfs"

  4. initramfs 上的 init.  本程式將執行裝載適當根目錄檔案系統所需的全部動作,例如提供必要檔案的系統核心功能,並且提供包含 udev 之大量儲存控制器的設備驅動程式。找到根目錄檔案系統後,將會檢查是否有錯誤並進行裝載。若裝載成功,將會清除 initramfs 並執行根目錄檔案系統上的 init 程式。如需有關 init 的詳細資訊,請參閱節 8.1.2, "initramfs 上的 init"。如需更多有關 udev 的詳細資訊,請參閱章 12, 使用 udev 的動態核心裝置管理

  5. init.  init 透過提供的不同功能來負責系統實際開機的不同層級,如需有關 init 的資訊,請參閱節 8.2, "init 程序"

8.1.1. initramfs

initramfs 是一個小型 cpio 歸檔,其可由核心載入 RAM 磁碟。在實際根目錄檔案系統裝載之前,它提供可讓程式執行的最小 Linux 環境。BIOS 常式會將這個最小的 Linux 環境載入記憶體,且除了記憶體要求外沒有其他特定硬體需求。此外,initramfs 還必須提供一個名為 init 的執行檔,這個執行檔會在處理開機程序的根目錄檔案系統上執行實際的 init 程式。

在實際根目錄檔案系統能夠裝載以及實際作業系統可以啟動之前,核心需要相應的驅動程式來存取根目錄檔案系統所在的設備。這些驅動程式可能包含特定類型硬碟的特殊驅動程式,或者甚至包含存取網路檔案系統的網路驅動程式。initramfs 上的 init 還會載入根目錄檔案系統所需的模組。當模組載入完成之後,udev 便會提供 initramfs 所需要的設備。所以在整個開機過程中,initramfs 仍可使用。如此一來,它才可以處理所有在開機期間產生的設備事件。

如果您要在已完成安裝的系統上變更硬體 (硬碟),且必須在核心中安裝開機時此硬體所需的驅動程式,那麼您就必須更新 initramfs。更新 initramfs 會採用與更新 initrd (initramfs 的前身) 一樣的更新方式,即是呼叫 mkinitrd。不使用任何引數來呼叫 mkinitrd 將會建立一個 initramfs。呼叫 mkinitrd -R 則會建立一個 initrd。在 SUSE Linux 中,/etc/sysconfig/kernel 中的 INITRD_MODULES 變數可以指定要載入的模組。 安裝後,此變數會自動設成正確的值。模組會確實依據它們在 INITRD_MODULES 中出現的順序來載入。如果使用到多個 SCSI 驅動程式時,這點尤其重要,因為不這麼做,硬碟名稱會有所變更。嚴格來說,載入那些存取根目錄檔案系統所需的驅動程式便足夠了。然而,因為後續載入可能會有問題,所以所有安裝所需的 SCSI 驅動程式都將透過 initramfs 或 initrd 載入。 

[Important]更新 initramfs 或 initrd

開機載入器將採用與核心相同的方式載入 initramfs 或 initrd。更新 initramfs 或 initrd 之後不需要重新安裝 GRUB,因為開機時 GRUB 會在目錄搜尋正確的檔案。

8.1.2. initramfs 上的 init

Initramfs 上的 init 其主要目的是準備裝載實際根目錄檔案系統,以及存取實際根目錄檔案系統。根據您實際系統組態,init 負責下列工作。

載入核心模組

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

提供特殊區塊檔案

核心會為每個載入的模組產生設備事件。udev 會處理這些事件,並且會在 RAM 檔案系統的 /dev 中產生所需要的設備特殊檔案。如果沒有這些特殊檔案,檔案系統就無法進行存取。

管理 RAID 和 LVM 設定

如果您將系統設定為 RAID 或 LVM 之下的根目錄檔案系統,init 會設定 LVM 或 RAID,以便之後能夠存取檔案根目錄系統。如需有關 RAID 的詳細資訊,請參閱節 2.2, "軟體 RAID 組態"。如需有關 LVM 的詳細資訊,請參閱節 2.1, "LVM 組態"

管理網路組態

如果您將系統設為使用網路裝載的根目錄檔案系統 (透過 NFS 裝載),那麼 init 必須確認是否已載入適當的網路驅動程式,還有是否設定為允許存取根目錄檔案系統。

在初始開機過程中呼叫 init 執行安裝工作一部份時,這項工作不同於先前所介紹的工作:

尋找安裝媒體

啟動安裝程序時,您的機器會從安裝媒體使用 YaST 安裝程式,來載入一個安裝核心以及一個特殊 initrd。 在 RAM 檔案系統中執行的 YaST 安裝程式,必須具備安裝媒體的實際位置相關資訊,以便存取該程式和安裝作業系統。

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

如同在節 8.1.1, "initramfs"所述,開機程序會以最少驅動程式啟動,供大部份的硬體組態使用。init 將啟動一個硬體掃描程序,該程序會判斷驅動程式是否適用您的硬體組態。這些值稍後會寫入 /etc/sysconfig/kernel 中的 INITRD_MODULES,讓後續任何開機程序能夠使用自訂的 initrd;而當開機程序不需要用到該設備時,這些值就會寫入 /etc/sysconfig/hardware/hwconfig-* 檔案。安裝程序進行期間,init 會載入此模組。

載入安裝系統或救援系統

在硬體妥善識別、適當驅動程式完成,以及 udev 已建立設備特殊檔案之後,init 就會啟動安裝系統,其中包含實際 YaST 安裝程式或救援系統。

啟動 YaST

最後,init 將會啟動 YaST,而 YaST 會啟動套件安裝和系統組態。