Linux 系统的“开机自检”过程其实是一个多阶段的过程,它并不像早期 DOS 或 Windows 那样由操作系统本身直接执行所有的硬件检测,而是由固件(BIOS/UEFI)和内核共同完成的。
以下是 Linux 开机自检的完整流程详解:
第一阶段:固件自检 (POST – Power-On Self-Test)
这是你按下电源键后首先发生的过程,由主板上的 BIOS 或 UEFI 固件执行,而不是 Linux 内核。
- 硬件初始化:CPU、内存、显卡、键盘等基础硬件初始化。
- POST 检查:
- 检查内存是否正常工作(RAM 测试)。
- 检测关键硬件是否存在(如 CPU、显卡、硬盘控制器)。
- 检查键盘是否连接(传统 BIOS 会等待键盘输入,UEFI 通常跳过)。
- 引导设备查找:固件根据 BIOS/UEFI 设置,查找可启动的设备(如 SATA 硬盘、NVMe SSD、USB 设备、网络 PXE 等)。
- 加载引导加载程序:找到第一个扇区(MBR 或 EFI 分区)中的引导加载程序(如 GRUB2、systemd-boot),并将其加载到内存中执行。
✅ 注意:如果你听到“滴”的一声,或者看到主板上的 Debug 灯/蜂鸣器报警,这些都属于 POST 阶段的问题,与 Linux 内核无关。
第二阶段:引导加载程序阶段 (Bootloader)
以最常见的 GRUB2 为例:
- 显示启动菜单(如果设置了超时或手动选择)。
- 加载 Linux 内核镜像(
)和初始内存盘(vmlinuz
initramfs或initrd)。 - 将控制权传递给 Linux 内核。
第三阶段:Linux 内核启动与自检 (Kernel Boot)
这是真正意义上“Linux 操作系统”开始工作的阶段,内核会进行一系列硬件检测和初始化。
1 内核初始化
- 解压并运行内核代码。
- 挂载
initramfs(一个临时的根文件系统),用于加载必要的驱动(如 RAID、LVM、加密磁盘驱动),以便访问真正的根文件系统。
2 硬件探测与驱动加载
内核会自动探测并加载硬件驱动:
- CPU:识别型号、核心数、频率、特性。
- 内存:检测可用内存大小,标记坏块。
- PCI/PCIe 设备:枚举所有 PCIe 设备(网卡、显卡、USB 控制器等)。
- 存储设备:扫描 SATA、NVMe、SCSI 设备,识别分区表。
- USB 设备:初始化 USB 控制器和连接的设备。
- 网络接口:检测网卡并初始化。
3 挂载根文件系统
- 内核根据内核命令行参数(如
root=/dev/sda1)找到真正的根文件系统。 - 卸载
initramfs,切换到真正的根文件系统。
第四阶段:系统初始化 (Init System)
现代 Linux 发行版大多使用 systemd 作为初始化系统(PID 1)。
- 启动 systemd:内核启动
,它实际上是 systemd。/sbin/init
- 执行启动目标(Target):
- 默认通常是
multi-user.target(命令行模式)或graphical.target(图形界面模式)。
- 默认通常是
- 并行启动服务:
- 启动系统日志(journald)。
- 启动网络管理器(NetworkManager/systemd-networkd)。
- 启动磁盘挂载服务(mount 所有
/etc/fstab中定义的分区)。 - 启动用户会话、SSH 服务、数据库服务等。
- 显示登录提示符或图形界面:
- 命令行:显示
login:提示。 - 图形界面:启动 Display Manager(如 GDM、SDDM),进入桌面环境。
- 命令行:显示
如何查看 Linux 开机自检和启动日志?
查看内核启动信息(硬件检测、驱动加载等)
# 查看内核环形缓冲区中的启动信息dmesg | less# 更详细地查看启动过程中的硬件检测dmesg | grep -i "error|fail|init|probe"
查看 systemd 启动过程和服务状态
# 查看系统启动花了多少时间,哪些服务启动慢systemd-analyze# 查看每个服务启动耗时systemd-analyze blame# 查看启动过程的可视化时间线systemd-analyze critical-chain
查看完整的启动日志
# 查看 journal 中的启动日志journalctl -b# 查看上一次启动的日志(如果当前启动失败)journalctl -b -1
查看传统 syslog 日志(如果启用)
# 查看 /var/log/boot.log 或 /var/log/syslog cat /var/log/boot.log grep "start|stop|error" /var/log/syslog
常见问题排查
| 问题现象 | 可能原因 | 排查方法 |
|---|---|---|
| 黑屏,无输出 | 显卡驱动问题、内核参数错误 | 尝试添加 nomodeset 内核参数 |
| 卡在 “Loading initial ramdisk…” | 硬盘驱动未加载、文件系统损坏 | 检查 dmesg 和 initramfs 是否完整 |
| 卡在 “Reached target Graphical Interface” | 图形界面服务(GDM/SDDM)失败 | 检查 systemctl status gdm 或 sddm |
| 启动非常慢 | 某个服务超时、网络等待 | 使用 systemd-analyze blame 找出慢服务 |
| 无法识别硬盘 | 驱动缺失、BIOS 设置错误 | 检查 lsblk 和 dmesg | grep sd |
Linux 的“开机自检”是分层的:
- 硬件层:由 BIOS/UEFI 完成 POST 测试。
- 内核层:由 Linux 内核完成硬件探测、驱动加载和文件系统挂载。
- 系统层:由 systemd 完成服务启动和用户环境初始化。
如果你遇到启动问题,建议优先使用 dmesg 和 journalctl -b 来定位是哪个阶段出了问题。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/476570.html



