1. BIOS/UEFI 階段
-
硬件自檢(POST)
- BIOS/UEFI 執行硬件檢查(內存、CPU、外設等)。
- 若硬件異常,通過蜂鳴碼或屏幕提示錯誤。
-
選擇啟動設備
- 按配置順序(硬盤、U盤、網絡等)尋找可引導設備。
- BIOS:讀取磁盤第一個扇區的 MBR(512字節)。
- UEFI:從 ESP 分區(EFI System Partition)加載
.efi
文件(如grubx64.efi
)。
2. 引導加載程序(Bootloader)
常見工具:GRUB2(GNU GRand Unified Bootloader)
GRUB2 工作流程:
-
Stage 1(MBR 或 ESP 分區)
- 加載 Stage 1.5(如
core.img
),提供基礎文件系統驅動。
- 加載 Stage 1.5(如
-
Stage 2(
/boot/grub/
)- 加載配置文件
/boot/grub/grub.cfg
,顯示啟動菜單。 - 用戶可選擇內核版本或進入救援模式。
- 加載配置文件
-
加載內核與 initramfs
- 將選定的 內核(vmlinuz) 和 initramfs 鏡像加載到內存。
關鍵文件:
grub.cfg
:由grub-mkconfig
生成(編輯/etc/default/grub
后需更新)。initramfs-*.img
:包含根文件系統掛載前的必要驅動和工具。
3. 內核初始化
-
解壓與初始化
- 內核解壓并初始化硬件(CPU、內存、設備樹等)。
- 掛載臨時根文件系統(initramfs),加載關鍵驅動(如磁盤控制器、文件系統驅動)。
-
切換至真實根文件系統
- 通過
initramfs
中的腳本(如/init
)掛載真正的根分區(/
)。 - 卸載 initramfs,釋放內存。
- 通過
-
啟動第一個用戶進程
- 內核啟動 PID=1 的進程:
- 傳統系統:
/sbin/init
(SysV init) - 現代系統:
systemd
- 傳統系統:
- 內核啟動 PID=1 的進程:
4. 用戶空間初始化
(1)SysV init 流程
- 讀取
/etc/inittab
- 確定默認運行級別(
id:3:initdefault:
)。
- 確定默認運行級別(
- 執行
/etc/rc.d/rc.sysinit
- 初始化網絡、掛載文件系統、加載內核模塊等。
- 按運行級別啟動服務
- 運行級別目錄(如
/etc/rc3.d/
),按S##Service
順序啟動服務。
- 運行級別目錄(如
(2)systemd 流程
- 加載默認 Target
- 默認目標:
graphical.target
(圖形界面)或multi-user.target
(命令行)。
- 默認目標:
- 并行啟動服務
- 根據單元(Unit)依賴關系并發啟動服務,加速啟動。
- 關鍵命令:
systemctl get-default # 查看默認 Target systemctl set-default TARGET# 修改默認 Target
5. 運行級別(Runlevel)與 Target 對照
SysV 運行級別 | systemd Target | 描述 |
---|---|---|
0 | poweroff.target | 關機 |
1 | rescue.target | 單用戶模式(救援) |
3 | multi-user.target | 多用戶命令行模式 |
5 | graphical.target | 圖形界面模式 |
6 | reboot.target | 重啟 |
6. 用戶登錄
- 顯示管理器(Display Manager)
- 圖形登錄:GDM(GNOME)、LightDM 等。
- 終端登錄
- 啟動
getty
進程,提供 TTY 登錄界面。
- 啟動
- 登錄后加載 Shell
- 執行用戶配置(
/etc/profile
、~/.bash_profile
等)。
- 執行用戶配置(
常見故障排查
-
GRUB 損壞
- 使用 Live CD 修復或重裝 GRUB:
grub-install /dev/sda update-grub
- 使用 Live CD 修復或重裝 GRUB:
-
內核啟動失敗
- 在 GRUB 菜單中選擇舊版本內核啟動。
- 檢查
/var/log/boot.log
或journalctl -b
(systemd 日志)。
-
根文件系統掛載失敗
- 在啟動參數中添加
init=/bin/bash
進入救援 Shell。 - 檢查
/etc/fstab
或手動掛載根分區。
- 在啟動參數中添加
四、流程圖
BIOS/UEFI → Bootloader → Kernel → Init Process → Target/Runlevel → Login
附錄
- 查看啟動時間:
systemd-analyze
- 重建 initramfs:
mkinitramfs -o /boot/initrd.img-$(uname -r)
- 修改內核參數:編輯
/etc/default/grub
→GRUB_CMDLINE_LINUX
→ 運行update-grub
通過理解啟動流程,可更高效地診斷系統問題或優化啟動速度。