摘要
啟動 Linux 系統需要各種不同的元件。硬體自身是由 BIOS 啟動的。BIOS 會藉由開機載入程式啟動核心。此後,關於 init 和 runlevel 的開機程序完全由作業系統控制。憑藉 runlevel 的概念,您可以保持日常使用的設定,以及對系統執行維護任務。
Linux 開機程序由數個階段所組成,每個階段分別由元件所代表。以下清單簡短概述開機程序,以及所有相關主要元件的功能。
BIOS. 啟動電腦之後,BIOS 會啟始螢幕和鍵盤並測試主記憶體。在此階段中,機器不會存取大量儲存媒體。接著,會從 CMOS 值載入目前日期、時間和最重要的周邊。識別第一個硬碟及其規格之後,系統控制將會從 BIOS 轉到開機載入程式。如果 BIOS 支援網路開機,則也可以設定提供開機載入程式的開機伺服器。在 x86 系統上,需要 PXE 開機。其他架構通常使用 BOOTP 通訊協定來取得開機載入程式。
開機載入程式. 第一顆硬碟的第一個實體 512 位元組資料磁區,會載入主要記憶體。接著,在此磁區開頭的開機載入程式會接管開機程序。開機載入程式執行的指令,決定其他部份的開機程序。因此,第一個硬碟的前 512 位元組是主開機紀錄 (MBR)。然後,開機載入程式會將控制傳送到實際作業系統,在這裡是指 Linux 核心。如需 GRUB (即 Linux 開機載入程式) 的詳細資訊,請參閱 第 21 章「開機載入程式」。進行網路開機時,BIOS 會充當開機載入程式。它會從開機伺服器取得要啟動的影像,然後啟動系統。這與本地硬碟完全無關。
核心和初始 RAM 檔案系統. 為了送出系統控制,開機載入程式會將核心和初始 RAM 式檔案系統 (initramfs) 兩者都載入記憶體。核心可以直接使用 initramfs 的內容。initramfs 包含一個名為 init 的小執行檔,它可以處理實體根目錄檔案系統的裝載。若存取大量儲存之前需要什麼特殊硬體驅動程式的話,那一定就是 initramfs 了。如需 initramfs 的詳細資訊,請參閱 第 20.1.1 節「initramfs」。如果系統沒有本機硬碟,則 initramfs 必須提供根檔案系統給核心。這可以藉由 iSCSI 或 SAN 這類網路區塊設備來完成,但也可以使用 NFS 做為根設備。
initramfs 上的 init. 本程式將執行裝載適當根目錄檔案系統所需的全部動作,例如提供必要檔案的系統核心功能,並且提供包含 udev 之大量儲存控制器的設備驅動程式。找到根目錄檔案系統後,將會檢查是否有錯誤並進行裝載。若裝載成功,將會清除 initramfs 並執行根目錄檔案系統上的 init 程式。如需有關 init 的詳細資訊,請參閱第 20.1.2 節「initramfs 上的 init」。如需更多有關 udev 的詳細資訊,請參閱第 24 章「使用 udev 進行動態核心設備管理」。
init. init 會透過提供數個不同層級所提供的不同功能來負責系統實際開機作業。第 20.2 節「init 程序」 中會描述 init。
initramfs 是一個小型 cpio 歸檔,其可由核心載入 RAM 磁碟。在實際根目錄檔案系統裝載之前,它提供可讓程式執行的最小 Linux 環境。BIOS 常式會將這個最小的 Linux 環境載入記憶體,且除了記憶體要求外沒有其他特定硬體需求。此外,initramfs 還必須提供一個名為 init 的執行檔,這個執行檔會在處理開機程序的根目錄檔案系統上執行實際的 init 程式。
在根目錄檔案系統能夠裝載以及作業系統可以啟動之前,核心需要相應的驅動程式來存取根目錄檔案系統所在的設備。這些驅動程式可能包含特定類型硬碟的特殊驅動程式,或者甚至包含存取網路檔案系統的網路驅動程式。initramfs 上的 init 還會載入根目錄檔案系統所需的模組。當模組載入完成之後,udev 便會為 initramfs 提供所需的設備。在後來的開機程序中,變更根目錄檔案系統後,必須重新產生這些設備。結合使用 boot.udev
和指令 udevtrigger 可以實現此目的。
如果您要在已安裝的系統上變更硬體 (如硬碟),且此硬體要求開機時核心中必須存在不同的驅動程式,則您必須更新 initramfs
檔案。更新 initramfs 與更新其前身 initrd 是採用一樣的更新方式,即是呼叫 mkinitrd。不使用任何引數來呼叫 mkinitrd 將會建立一個 initramfs。呼叫 mkinitrd -R
則會建立一個 initrd。在 SUSE Linux EnterpriseŽ 中, /etc/sysconfig/kernel
內的變數 INITRD_MODULES
會指定要載入的模組。 安裝之後,此變數會自動設定為正確值。模組會確實依據它們在 INITRD_MODULES
中出現的順序來載入。如果您不依賴於 /dev/sd?
設備檔案的正確設定,這一點將無關緊要。不過,在目前系統中,您也可以使用 /dev/disk/
下以幾個不同子目錄分類的設備檔案,這些子目錄的名稱為 by-id
、by-path
和 by-uuid
,這些目錄總是代表相同磁碟。在安裝時也可以透過指定相應的裝載選項來實現此目的。
![]() | 更新 initramfs 或 initrd |
---|---|
開機載入程式將採用與核心相同的方式載入 initramfs 或 initrd。更新 initramfs 或 initrd 之後不需要重新安裝 GRUB,因為開機時 GRUB 會在目錄搜尋正確的檔案。 |
Initramfs 上的 init 其主要目的是準備裝載實際根目錄檔案系統,以及存取實際根目錄檔案系統。根據您的系統組態,init 負責下列任務。
根據硬體組態,存取您電腦的硬體元件可能需要特殊的驅動程式 (特別是您的硬碟)。若要存取根目錄檔案系統,核心需載入適當的檔案系統驅動程式。
對於每個載入的模組,核心均會產生設備事件。udev 會處理這些事件,並在 RAM 檔案系統的 /dev
中產生所需的區塊專用檔案。如果沒有這些專用檔案,便無法存取檔案系統和其他設備。
如果您將系統設定為 RAID 或 LVM 之下的根目錄檔案系統,init 會設定 LVM 或 RAID,以便之後能夠存取檔案根目錄系統。如需有關 RAID 的資訊,請參閱第 7.2 節「軟體 RAID 組態」。如需更多關於 LVM 的詳細資訊,請參閱第 7.1 節「LVM 組態」。如需更多 EVMS 與特殊儲存設定的相關資訊,請參閱《儲存管理指南》。
如果您將系統設為使用網路裝載的根目錄檔案系統 (透過 NFS 裝載),那麼 init 必須確認是否已載入適當的網路驅動程式,還有是否設定為允許存取根目錄檔案系統。
如果檔案系統位在 iSCSI 或 SAN 一類網路區塊設備上,initramfs 也會設定與儲存伺服器的連線。
安裝程序中,當 init 在初始開機時被呼叫,它的任務會與之前討論的不同:
啟動安裝程序時,您的機器會從安裝媒體使用 YaST 安裝程式,來載入一個安裝核心,以及一個特殊 initrd。在 RAM 檔案系統中執行的 YaST 安裝程式,必需具備安裝媒體的實際位置相關資訊,以便存取該程式和安裝作業系統。
如同在第 20.1.1 節「initramfs」所述,開機程序會以最少驅動程式啟動,供大部份的硬體組態使用。init 將啟動一個硬體掃描程序,該程序會判斷驅動程式是否適用您的硬體組態。開機程序所需的模組名稱會寫入 /etc/sysconfig/kernel
的 INITRD_MODULES
中。這些名稱是用來產生系統開機所需的自定 initramfs。如果模組不是開機所需,而是供 coldplug 使用,則模組會寫入 /etc/sysconfig/hardware/hwconfig-*
。用此目錄中的組態檔案描述的所有設備都會在開機程序中啟始化。
在硬體妥善識別、適當驅動程式完成,以及 udev 已建立設備特殊檔案之後,init 就會啟動安裝系統,其中包含實際 YaST 安裝程式或救援系統。
最後,init 將會啟動 YaST,而 YaST 會啟動套件安裝和系統組態。