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 整体流程与日志位置一览
下面这张图,是我自己总结的启动流程与日志对应关系。你把它存下来,排查问题时对照着看,思路会清晰很多。
2.6 实战:快速定位启动故障
你想想看,如果一台服务器启动后 SSH 连不上,你会怎么查?
- 看屏幕或 IPMI:确认 BIOS 阶段是否通过。如果卡在 POST,直接去机房或远程管理卡。
- 看 GRUB 菜单:重启时按 Shift(传统 BIOS)或 Esc(UEFI),进入 GRUB 编辑模式,检查内核参数是否正确。
- 看内核日志:如果能进系统但网络不通,跑
dmesg | grep -i eth或dmesg | grep -i net,看网卡驱动是否加载成功。 - 看 systemd 服务:
systemctl status sshd查看 SSH 服务状态,journalctl -u sshd看详细日志。
重要提醒: 如果系统连内核都进不去(比如 kernel panic),你只能通过串口或 KVM 捕获屏幕输出。所以生产环境的服务器,我强烈建议你提前配好串口重定向。别等到出事了再后悔。
嗯,启动流程和日志位置就讲到这里。记住这张图,后面我们分析具体日志案例时,你会反复用到它。