2. 启动流程与日志生成:Linux 系统启动流程

Linux 系统从按下电源键到出现登录提示符,这中间到底发生了什么?

我经常跟团队里的新人说,搞懂启动流程,你才算真正入了运维的门。因为日志分析的核心,就是追踪系统在每一个阶段干了什么、卡在了哪里。

整个启动过程,说白了就是一条流水线:BIOS → Bootloader → Kernel → Init。每个环节都有自己的日志输出位置。下面我带你逐个拆解。

2.1 第一阶段:BIOS / UEFI 固件阶段

按下电源键,CPU 首先执行的是主板固件里的代码。老机器是 BIOS,新机器基本都是 UEFI 了。

这个阶段的主要任务是:硬件自检(POST) 和 选择启动设备。

日志输出位置:

  • 屏幕直接显示(POST 卡住时你会看到错误码或蜂鸣声)
  • 部分服务器会写入 IPMI SEL(系统事件日志)
  • UEFI 固件可能记录到 EFI 变量 或专用日志分区

我的经验: 有一次服务器死活起不来,屏幕黑着但风扇在转。我一开始怀疑内核挂了,折腾半天才发现是内存条松了。BIOS 阶段卡住,日志根本进不了系统。所以排查启动问题,第一步先看硬件自检过了没。

2.2 第二阶段:Bootloader 引导加载器

BIOS 找到启动设备后,把控制权交给 Bootloader。Linux 世界最常见的是 GRUB2(现在新版叫 GRUB)。

GRUB 负责加载内核镜像和 initramfs(初始内存文件系统)。

注意: GRUB 阶段的日志默认不会持久化到文件系统。因为此时文件系统还没挂载。你只能通过屏幕输出或串口控制台看到它。

如果你需要捕获 GRUB 阶段的日志,我建议你配置串口重定向:

# 在 /etc/default/grub 中启用串口输出
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

# 更新配置
grub2-mkconfig -o /boot/grub2/grub.cfg

避坑指南: 我曾经在调试一个嵌入式设备时,GRUB 菜单死活不显示。后来发现是 GRUB_TIMEOUT 设成了 0。嗯,这个参数决定了你按 Shift 或 Esc 进入菜单的窗口期。建议调试阶段设成 5 秒以上。

2.3 第三阶段:Kernel 内核初始化

GRUB 把内核和 initramfs 加载到内存后,内核开始接管。这个阶段做的事情非常多:

  • 解压缩自身
  • 初始化 CPU、内存管理、中断控制器
  • 加载驱动(从 initramfs 中)
  • 挂载真正的根文件系统

内核日志的输出位置,取决于你配置的控制台参数:

输出目标 配置方式 典型用途
屏幕(VGA/HDMI) console=tty0 本地调试
串口 console=ttyS0,115200 无头服务器、嵌入式
内核环形缓冲区 默认启用 通过 dmesg 查看
持久化日志 systemd-journald 或 rsyslog 事后分析

核心命令: dmesg 是查看内核日志的利器。启动后第一时间执行 dmesg | less,你能看到从内核启动到现在的所有消息。

我个人习惯在排查启动问题时,先跑这条命令:

# 查看内核日志中是否有硬件错误或驱动加载失败
dmesg | grep -iE "error|fail|warn|bug"

2.4 第四阶段:Init 初始化进程

内核挂载根文件系统后,启动第一个用户空间进程——init。现代 Linux 发行版基本都用 systemd 了。

systemd 负责启动所有其他服务:网络、SSH、数据库、容器等等。这个阶段的日志量最大,也最值得分析。

日志输出位置:

  • systemd-journald:默认日志存储于 /var/log/journal/,使用 journalctl 查看
  • 传统 syslog:部分服务仍会写 /var/log/messages 或 /var/log/syslog
  • 服务专属日志:如 /var/log/nginx/access.log

我的习惯: 启动慢?先跑 systemd-analyze blame,它会告诉你每个服务花了多少秒启动。我曾经用这个命令发现一个 NFS 挂载服务因为网络超时,硬生生拖慢了系统 90 秒。

# 查看启动耗时排名
systemd-analyze blame

# 查看完整启动时间线
systemd-analyze critical-chain

2.5 整体流程与日志位置一览

下面这张图,是我自己总结的启动流程与日志对应关系。你把它存下来,排查问题时对照着看,思路会清晰很多。

Linux 启动流程与日志输出位置 BIOS / UEFI 硬件自检 (POST) Bootloader GRUB2 加载内核 Kernel 内核初始化 Init (systemd) 启动用户空间服务 各阶段日志输出位置 BIOS 阶段 屏幕 / IPMI SEL Bootloader 阶段 屏幕 / 串口 Kernel 阶段 dmesg / 环形缓冲区 Init 阶段 journalctl / syslog 排查启动问题:先看卡在哪个阶段,再找对应日志 BIOS 卡住 → 检查硬件;GRUB 卡住 → 检查内核参数 Kernel 卡住 → dmesg 查驱动;Init 卡住 → journalctl 查服务

2.6 实战:快速定位启动故障

你想想看,如果一台服务器启动后 SSH 连不上,你会怎么查?

  1. 看屏幕或 IPMI:确认 BIOS 阶段是否通过。如果卡在 POST,直接去机房或远程管理卡。
  2. 看 GRUB 菜单:重启时按 Shift(传统 BIOS)或 Esc(UEFI),进入 GRUB 编辑模式,检查内核参数是否正确。
  3. 看内核日志:如果能进系统但网络不通,跑 dmesg | grep -i eth 或 dmesg | grep -i net,看网卡驱动是否加载成功。
  4. 看 systemd 服务:systemctl status sshd 查看 SSH 服务状态,journalctl -u sshd 看详细日志。

重要提醒: 如果系统连内核都进不去(比如 kernel panic),你只能通过串口或 KVM 捕获屏幕输出。所以生产环境的服务器,我强烈建议你提前配好串口重定向。别等到出事了再后悔。

嗯,启动流程和日志位置就讲到这里。记住这张图,后面我们分析具体日志案例时,你会反复用到它。