
Linux 系統開機涉及多個元件和任務。硬體自身是由 BIOS 或 UEFI 啟動的。BIOS 或 UEFI 會藉由開機載入程式啟動核心。在此之後,開機程序完全由作業系統控制,並由 systemd 負責處理。systemd 會提供一組「目標」,用於啟動與日常使用、維護或緊急情況相關的設定。
Linux 開機程序由數個階段所組成,每個階段分別由不同的元件所代表。下面的清單簡要概述了開機程序,並描述了涉及的所有主要元件:
BIOS/UEFI: 開啟電腦之後,BIOS 或 UEFI 會啟始化螢幕和鍵盤,並測試主記憶體。在此階段中,機器不會存取大量儲存媒體。接著,會從 CMOS 值載入目前日期、時間和最重要的周邊。識別第一個硬碟及其規格之後,系統控制將會從 BIOS 轉到開機載入程式。如果 BIOS 支援網路開機,則也可以設定提供開機載入程式的開機伺服器。在 AMD64/Intel 64 系統上,需要進行 PXE 開機。其他架構通常使用 BOOTP 通訊協定來取得開機載入程式。
開機載入程式: 第一顆硬碟的第一個實體 512 位元組資料磁區,會載入主要記憶體。接著,在此磁區開頭的開機載入程式會接管開機程序。開機載入程式執行的指令,決定其他部份的開機程序。因此,第一顆硬碟的前 512 個位元組被稱為主開機紀錄 (MBR)。然後,開機載入程式會將控制權交給實際的作業系統,在這裡是指 Linux 核心。如需關於 Linux 開機載入程式 GRUB 2 的詳細資訊,請參閱第 12 章 「開機載入程式 GRUB 2」。進行網路開機時,BIOS 會充當開機載入程式。它會從開機伺服器取得開機影像,然後啟動系統。這與本地硬碟完全無關。
如果開機檔案系統無法在開機環境中掛接,則必須對該系統進行檢查與修復,然後才能繼續開機。對於 Ext3 與 Ext4 檔案系統,檔案系統檢查程式會自動啟動。對於 XFS 與 Btrfs 檔案系統,修復程序不會自動啟動,但會向使用者提供有關可用於修復該檔案系統的選項資訊。檔案系統修復成功後,現有的開機環境將導致系統重新嘗試掛接根檔案系統,並且如果掛接成功,將繼續正常開機。
核心和 initramfs:
為了轉交系統控制權,開機載入程式會將核心和初始 RAM 式檔案系統 (initramfs) 兩者都載入記憶體。核心可以直接使用 initramfs 的內容。initramfs 包含一個名為 init 的小執行檔,該執行檔可以處理實際根檔案系統的掛接。若需要特殊的硬體驅動程式才能存取大量儲存,那一定就是 initramfs 了。如需 initramfs 的詳細資訊,請參閱第 11.2 節 「initramfs」。如果系統沒有本地硬碟,initramfs 必須為核心提供根檔案系統。這可以藉由 iSCSI 或 SAN 這類網路區塊裝置來完成,但也可以使用 NFS 做為根裝置。
init 程序命名有兩個不同的程式通常會命名為「init」:
掛接根檔案系統的 initramfs 程序
設定系統的作業系統程序
在本章中,我們分別將它們稱為「initramfs 上的 init」和 「systemd」。
initramfs 上的 init:
此程式執行掛接正確根檔案系統所需的全部動作。它為所需的檔案系統提供核心功能,並為使用 udev 的大量儲存裝置控制器提供裝置驅動程式。找到根目錄檔案系統後,將會檢查是否有錯誤並進行掛接。若掛接成功,系統會清理 initramfs,並執行根檔案系統上的 systemd 精靈。如需關於 initramfs 上 init 的詳細資訊,請參閱第 11.3 節 「initramfs 上的 Init」。如需有關 udev 的詳細資訊,請參閱第 20 章 「使用 udev 進行動態核心裝置管理」。
systemd:
systemd 透過啟動服務並掛接檔案系統來處理實際的系統開機。第 14 章 「systemd 精靈」中介紹了 systemd。
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)。
initramfs 或 init
開機載入程式將採用與核心相同的方式載入 initramfs 或 init。更新 initramfs 或 init 之後不需要重新安裝 GRUB 2,因為開機時 GRUB 2 會在該目錄中搜尋適當的檔案。
如果您在 sysctl 介面中透過編輯相關檔案 (/etc/sysctl.conf 或 /etc/sysctl.d/*.conf) 變更了某些核心變數的值,下一次將系統重新開機時,這項變更將會遺失。即使您在執行時使用 sysctl --system 載入這些值,變更也不會儲存到 initramfs 檔案中。您需要透過呼叫 dracut -f (選項 -f 會覆寫現有 initramfs 檔案) 來更新該檔案。
initramfs 上的 Init #
initramfs 上的 init 主要用途是為掛接以及存取實際根檔案系統做好準備。根據您的系統組態,initramfs 上的 init 負責下列任務。
根據硬體組態,存取您電腦的硬體元件可能需要特殊的驅動程式 (最重要的元件是硬碟)。若要存取最終的根檔案系統,核心需載入適當的檔案系統驅動程式。
對於每個載入的模組,核心均會產生裝置事件。udev 會處理這些事件,並在 /dev 內的 RAM 檔案系統中產生所需的特殊區塊檔案。如果沒有這些專用檔案,便無法存取檔案系統和其他裝置。
如果您之前將系統設定為在 RAID 或 LVM 下存放根檔案系統,initramfs 上的 init 此時會設定 LVM 或 RAID,以便之後能夠存取根檔案系統。
如果要在 YaST 未提供協助的情況下直接變更 /usr 或 swap 分割區,則需要執行其他動作。如果您忘記這些步驟,則系統將在緊急模式下啟動。要避免系統在緊急模式下啟動,請執行以下步驟︰
編輯 /etc/fstab 中的相應項目,然後使用邏輯磁碟區取代先前的分割區。
執行以下指令:
root #mount-aroot #swapon-a
使用 mkinitrd 或 dracut 重新產生起始 RAM 磁碟 (initramfs)。
對於 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 安裝程式啟動安裝系統。
最後,init 會啟動 YaST,後者會啟動套件安裝和系統組態程序。