緯育 2026-0414
出自頂極製作所
本系列講座詳細解析了Linux系統從按下電源到出現登入畫面的完整開機流程,並深入探討了啟動載入器GRUB (Grand Unified Bootloader) 的運作原理、歷史與設定方式。講座將開機過程劃分為啟動載入器 (Boot Loader)、核心 (Kernel) 載入與初始化,以及作業系統初始化等三個主要階段,闡述了每個階段的任務、可能的故障點及其對應的螢幕現象,幫助聽眾根據顯示訊息診斷問題。
講座重點講解了目前主流使用的GRUB2,內容涵蓋其歷史背景、模組化設計、多階段啟動機制(Stage 1與Stage 2)、目錄結構、設定檔的產生方式,並比較了GRUB2與舊版GRUB Legacy在硬碟命名、設定檔管理等方面的差異。講師強調GRUB2的設定檔應透過update-grub等指令自動產生,不建議手動編輯。此外,講座也實際操作示範了如何修改設定檔以客製化開機選單(如顯示隱藏選單、設定倒數計時),旨在讓聽眾全面理解電腦開機的複雜性以及GRUB在其中扮演的關鍵角色。
知識點
Linux開機啟動過程
- 開機過程概述
- 講座範圍:從按下電源開關,到可以輸入密碼之前的過程。
- 目的:讓聽眾瞭解開機啟動過程與細節,以便在電腦無法正常開機時,能根據過程中的資訊判斷問題點。
- 開機過程是分層啟動與分層轉交的:硬體自檢(BIOS/UEFI) -> 轉交給硬碟的開機磁區(MBR/GPT) -> 啟動載入器(Boot Loader) -> 載入並執行核心(Kernel) -> 核心初始化並轉交給作業系統 -> 作業系統初始化。
- 開機的三個主要階段
- 第一階段:啟動載入器 (Boot Loader):對應開機選單。如果連開機選單都看不到,問題就出在第一階段。
- 第二階段:核心 (Kernel) 載入:在開機選單選擇後,會有一段時間螢幕上跳動黑白字元,這就是核心在載入與初始化。
- 第三階段:作業系統初始化 (System Initialization):當看到彩色的字元開始跳動時,代表進入了作業系統初始化階段。
- 開機失敗的診斷方法
- 看不到開機選單:問題在第一階段,與啟動載入器有關。
- 看到開機選單,但選擇後停在黑白字元畫面:問題在第二階段,可能是核心(Kernel)出錯,或核心找不到作業系統無法讀取。
- 看到彩色字元,但無法進入登入畫面:問題在第三階段,作業系統初始化失敗。畫面最後留下的訊息通常是錯誤提示。
- 各階段的權責轉交
- BIOS/UEFI:完成硬體檢測後,根據設定的開機順序,尋找硬碟的 MBR 或 GPT,並將主控權轉交給它。
- 啟動載入器 (Boot Loader):從 MBR 啟動後,顯示開機選單。使用者選擇後,它會找到對應的核心檔案,載入到記憶體中,然後將主控權轉交給核心。
- 核心 (Kernel):接管主控權後開始啟動,主要任務是識別電腦的所有硬體(CPU、記憶體等)並載入相應的驅動程式。識別完成後,將主控權轉交給作業系統的初始化程序。
- 作業系統 (System):接管主控權後,開始啟動大量系統服務(如電源管理、安全服務等),螢幕上會顯示一連串的 "OK"。服務啟動完畢後,顯示登入畫面。
啟動載入器 (Boot Loader) 概論
- 啟動載入器的作用與限制
- MBR 結構:包含Bootloader (446 bytes)、分割區表 (64 bytes) 和結束標記 (55 AA)。
- 主要任務:位於MBR中的第一階段啟動載入器(Stage 1),其目標是尋找並啟動第二階段的啟動載入器(Stage 2)。
- 空間限制:由於 MBR 中的 Bootloader 區域只有 446 bytes,空間極小,難以塞入現代開機所需的所有複雜功能。
- 現代啟動載入器所需具備的功能
- 管理指令、模組化功能、版本更新、擴充功能(支援新檔案系統/解析度)。
- 能識別不同類型的儲存設備(IDE, SATA, NVMe M.2, USB)、正確定址設備容量、辨識各種檔案系統(NTFS, FAT32, EXT4, XFS)。
- 常見的啟動載入器類型
- LILO (Linux Loader):早期啟動載入器,已不再使用。
- Syslinux:輕量級啟動介面,常用於製作可開機隨身碟(如 Rufus)。
- Loadlin:用於在同一分割區實現 DOS 與 Linux 雙系統啟動。
- U-Boot (Das U-Boot):常見於嵌入式系統。
- GRUB (GRand Unified Bootloader):目前PC上最主流的啟動載入器。
- GRUB Legacy:舊版本,現在只修正安全性問題。
- GRUB2:目前所有新安裝系統使用的版本,是課程講解的重點。
GRUB (Grand Unified Bootloader) 詳解
- 簡介與歷史
- 角色:在 BIOS 完成啟動程序後,負責載入並啟動作業系統核心。
- 歷史淵源:最初為啟動 GNU Hurd 核心而開發,後來被 Minix 和 Linux 等作業系統採用,具備多重開機能力。
- GRUB 的介面與特性
- 開機選單:某些發行版(如 Ubuntu)預設隱藏,可透過修改設定或開機時按住 Shift 鍵使其顯示。
- 圖形化支援:支援彩色介面、圖形化背景(如PNG)、甚至簡單動畫。
- 設備識別能力:能識別多種檔案系統、設備(含USB)及其UUID。
- GRUB 2 與 GRUB 1 的比較
- 硬碟分割區命名:
- GRUB 2: hd0,1 表示第一顆硬碟的第一個分割區,較直觀。
- GRUB 1: hd0,0 表示第一顆硬碟的第一個分割區,易混淆。
- 設定檔 (Configuration File):
- GRUB 2: 主要設定檔位於 /boot/grub/grub.cfg,應由程式(如 grub2-mkconfig)自動產生,不建議手動修改。
- GRUB 1: 設定檔 (menu.lst) 需使用者手動編輯。
- 功能與指令:GRUB 2 支援腳本功能,但取消了在作業系統內執行 grub-shell 的功能,相關指令需在開機選單的指令模式下執行。
- GRUB 啟動概念與流程
- 兩種引導模式:
- 直接引導 (Direct Guidance):直接啟動本機作業系統。
- 鏈接引導 (Chained Guidance):從一個硬碟的選單轉接到另一顆硬碟的選單,適用於多系統環境。
- 兩階段啟動 (Two-Stage Boot):
- 第一階段 (Stage 1):位於 MBR (446 bytes),唯一功能是尋找並載入 Stage 2。
- 第二階段 (Stage 2):通常位於 MBR 之後、第一個分割區之前的空間,是 core.img 的實體。它包含GRUB所有核心功能,負責載入模組、讀取設定檔、顯示選單,並最終將主控權交給作業系統核心。
- 開機失敗情境分析:
- 畫面全黑,僅游標閃爍:Stage 1 找不到 Stage 2。
- 成功顯示選單,但選擇後無反應:Stage 2 載入成功,但選單設定錯誤,找不到開機目標。
- GRUB 的檔案結構與設定
- 主要目錄與設定檔:
- /etc/default/grub:控制 GRUB 選單的顯示行為(如逾時、樣式)。
- /etc/grub.d/:存放產生開機選單內容的腳本,檔名數字決定執行順序。
- /usr/lib/grub/:存放 GRUB 的所有原始檔案,包含各種模組 .mod 和映像檔 .img。
- /boot/grub/ (或 /boot/grub2/):存放開機時真正會用到的檔案,是從原始檔目錄複製而來的子集。
- 核心映像檔與模組:
- core.img:Stage 2 的備份檔,內含讀取檔案系統所需的基本模組。
- .mod 檔案:讓 GRUB 能夠識別不同檔案系統(如 ext2.mod)、硬體(如 vga.mod)的模組。
- boot.img:一個混合檔案,前半部是可用於修復 MBR 的 Stage 1 程式碼。
- 更新 GRUB 設定:
- 修改 /etc/default/grub 或 /etc/grub.d/ 後,必須執行指令重新產生主態檔 /boot/grub/grub.cfg。
- 常用指令:update-grub (推薦) 或 grub-mkconfig > /boot/grub/grub.cfg。
- 在開機選單中按 e 可臨時編輯當次開機指令,按 F10 或 Ctrl+X 繼續開機。
核心版本與硬體相容性
- 新核心通常支援較新硬體與功能;過舊硬體可能被新版本移除支援(如 486)。
- 發行版未必隨系統更新快速升級核心,需自行關注版本與相容性。
- 建議自行編譯核心,只啟用所需架構與功能,使核心更小更快;內建功能需透過重新編譯才能變更。
Linux 兩階段啟動與核心映像
- 由 MBR/GRUB 等 bootloader 啟動核心,核心常駐管理資源與系統呼叫。
- 啟動初期以 initrd/initramfs 解壓於記憶體形成暫時根,載入必要模組並偵測硬體後,切換到磁碟上的正式根檔案系統再進入登入流程。
- vmlinuz/vmlinux 為核心映像;initrd/initramfs 提供最小啟動環境與模組集合。
核心選項與模組管理
- 編譯選項分為:編入核心(速度快)、編成模組(可按需動態載入)、關閉(不提供該功能)。
- 已編譯模組位於 /lib/modules/$(uname -r)/,依子系統分類(檔案系統、網路、音效、arch 等)。
- 工具與用法:
- lsmod:列出已載入模組與相依關係。
- modinfo <模組名>:顯示位置、授權、簡介、相依等。
- insmod/rmmod:低階載入/移除,需要完整路徑與自行處理相依。
- modprobe/modprobe -r:高階載入/移除,自動解析相依,較常用。
- 範例:以 modprobe -r e1000 移除網卡模組網路中斷;再 modprobe e1000 載入網路恢復,驗證模組對功能的影響。
開機自動載入與持久化
- 臨時載入重開機不保留;需將模組名寫入 /etc/modules 或 /etc/modules-load.d/ 以開機自動載入(建議使用 modules-load.d/ 結構化管理)。
- 若重啟後裝置狀態不保,需強化持久化設定(將驅動模組加入自動載入、正確綁定)。
/boot 目錄與升級參考
- 必要檔案:vmlinuz(核心映像)、initrd/initramfs(暫時根)。
- 其他重要檔案:
- config-:編譯設定檔,升級至新版本(如 7.0/7.1)時載入舊版 config 為基礎,針對新增選項決策以維持相容與穩定。
- System.map:核心符號對應表,除錯用途。
- 清理時務必保留目前使用中的核心映像與對應的 initrd/initramfs,以免無法開機。
核心編譯與設定複雜度
- 目標:核心越小越穩定,只留必要內容以提升效能與啟動速度。
- 以既有 config 為基礎做增量調整;核心設定項目上千至上萬,閱讀理解門檻高。
- 編譯通常產生核心映像與相應的 initrd/initramfs,配合完整啟動流程。
原始碼位置與取得
- 常見路徑:/usr/src(核心原始碼)、/lib/modules//(模組與建置資訊)。
- 可透過發行版套件或官方來源取得原始碼;必要時補齊工具鏈與開發環境。
驅動安裝與排錯流程(顯示卡/網卡/音效卡等)
- 來源:從官方或廠商取得驅動原始碼或套件;有時提供自動化腳本(如 AutoRun.sh、autoroll)協助編譯安裝。
- 基本步驟:下載→解壓→補齊相依→編譯/安裝→載入模組→驗證裝置→設定持久化→重啟確認。
- 相依套件:安裝失敗常因依賴缺失,依提示補齊後重試。
- 驗證方法:以指令工具確認模組載入;在「硬體管理員」風格介面由問號轉為卡片表示驅動生效;重啟後狀態仍在表示持久化設定正確。
- 環境差異:不同發行版或虛擬化設定可能採用不同驅動;透過 lsmod/modinfo 推測實際使用裝置與驅動。
- 備援策略:若核心版本不支援某新卡,升級核心或以外部模組補強;在無網路環境以 SCP 傳遞驅動包。
Linux啟動流程與程序管理
- 核心啟動與控制權轉交
- 當Linux核心(Kernel)完成啟動後,會透過chroot將根目錄從記憶體切換至硬碟,並將控制權轉交給使用者空間的第一個程序/sbin/init。
- init是作業系統啟動的第一支程式,其程序ID(Process ID, PID)永遠是1。
- 現代化的Init系統:Systemd
- 現代Linux發行版中,init的角色已由Systemd接管,它成為控制整台電腦程序的總管。
- 使用者下達的指令,實際上是透過Systemd與核心溝通來進行程序管理。
- ps -ef --forest指令的樹状圖可清晰顯示,PID為1的systemd是系統中所有程序的父程序,證明其對整個系統的主控權。
- Systemd的角色與功能
- 所有程序的總管理者:所有服務和程式都由Systemd管理。使用者啟動服務時,是向Systemd發出請求,由其決定是否執行。
- 守護程序(Daemon):Systemd作為一個守護程序,在系統背景中持續運行,負責監控和控制所有程序。
初始化系統的演進與Systemd特性
- 傳統初始化系統的演進
- SysV init (傳統):採用循序啟動機制,服務依賴性強。單一服務啟動失敗會導致後續依賴的服務長時間等待或失敗,嚴重影響開機效率。
- Upstart (過渡):透過分析依賴關係,並行啟動無依賴的服務,提升了效率。但仍未根本解決服務失敗導致的阻塞問題。
- Systemd (現代主流) 啟動機制與特性
- 並行啟動機制:無論服務間是否存在依賴,開機時「一次性」將所有服務同時啟動,極大縮短開機時間。Systemd會週期性地檢查並嘗試重啟失敗的服務。
- 服務啟動的「假性成功」現象:systemctl start指令執行成功僅代表啟動命令已下達,不保證服務會持續運行。服務可能因設定錯誤而稍後停止,管理者必須主動使用systemctl status檢查服務的真實狀態。
- 全面的系統管理套件:Systemd不僅是init系統,還整合了日誌(journald)、網路(networkd)、時間(timedated, timesyncd)、登入(logind)及DNS解析(resolved)等多種管理功能,成為一個全面的系統管理平台。
Systemd服務管理 (systemctl)
- Systemd 單元 (Unit) 概念
- Systemd將系統資源統一管理為「單元」(Unit),常見類型有.service、.socket、.target等。
- .service: 指一個持續運行的服務程式,會佔用記憶體資源。
- .socket: 僅監聽特定連接埠,本身佔用資源極少。當有連線請求時,才喚醒對應的.service來處理,實現按需啟動,節省系統資源。
- 服務管理指令 (systemctl)
- 這是Systemd環境下推薦使用的標準服務管理指令,取代了傳統的service指令。
- 管理服務運行狀態:
- 啟動服務:systemctl start [服務.service]
- 停止服務:systemctl stop [服務.service]
- 重啟服務:systemctl restart [服務.service] (先停後啟)
- 重載設定:systemctl reload [服務.service] (不中斷服務,僅讓新連線採用新設定,建議優先使用)
- 檢查服務狀態:
- systemctl status [服務.service]:顯示服務是否運行、PID、日誌等詳細資訊。
- 管理開機啟動設定:
- 設定開機自啟:systemctl enable [服務.service]
- 禁止開機自啟:systemctl disable [服務.service]
- 檢查是否開機自啟:systemctl is-enabled [服務.service]
- 列出系統單元:
- systemctl list-units:列出當前系統中所有已載入的單元及其狀態。
- 主要目錄結構
- /usr/lib/systemd/system: 存放所有服務單元的「原始設定檔」。
- /etc/systemd/system: 存放系統級的組態檔和服務啟用的符號連結,管理者通常透過systemctl enable/disable間接操作此目錄。
- /etc/systemd/: 存放journald.conf, networkd.conf等Systemd子服務的主要組態檔。
實例分析與標準工作流程
- 實例1:DNS解析服務 (systemd-resolved)
- 在Ubuntu系統上,/etc/resolv.conf通常指向本地回環地址(127.0.0.53),DNS查詢由systemd-resolved.service服務處理。
- 當使用systemctl stop systemd-resolved.service停止該服務後,系統將無法解析域名,證明了服務對系統功能的關鍵作用。
- 實例2:設定SSH服務允許root登入
- 預設情況下,多數Linux發行版出於安全考量,不允許root直接透過SSH遠端登入。
- 設定步驟:
1. 編輯SSH服務端設定檔:vi /etc/ssh/sshd_config。 2. 找到PermitRootLogin選項,將其值修改為yes。 3. 存檔後,執行systemctl reload ssh.service使新設定生效。
- IT服務部署的標準工作流程
1. 尋找:上網搜尋所需的功能或服務。 2. 安裝:使用套件管理器(如apt或yum)安裝軟體。 3. 修改:閱讀文件並編輯設定檔以符合需求。 4. 重啟/重載:使用systemctl指令套用設定。 5. 交付:告知客戶服務已設定完成。