Linux 启动排错实战:引导失败、救援模式与内核崩溃诊断

Linux 启动排错全流程:启动卡住的定位框架、启动日志(journalctl -b/console)、GRUB 引导修复、initramfs 重建、内核启动参数与单用户模式、文件系统挂载失败、systemd 救援目标、Live 救援与内核 panic/kdump。

引言

开机黑屏/卡住/报错,是最让人慌的场景——但启动失败有清晰的定位路径。Linux 启动是一条接力链:固件 → GRUB → 内核 + initramfs → systemd。排错就是「定位卡在哪一段」。本文给一套框架:从启动日志(journalctl -b / console)、GRUB 故障修复、initramfs 重建、内核参数与单用户模式、文件系统挂载失败、systemd 救援目标,到 Live 系统救援与内核 panic/kdump 诊断。

前置:/linux-kernel-boot-process/(启动流程详解)、/linux-journald-logging/(日志)、/linux-systemd-services/(systemd 目标与单元)。


目录


1. 启动排错的定位框架

启动是接力链,排错先判断「断在哪一段」:

固件(BIOS/UEFI)→ GRUB → 内核+initramfs → systemd → 登录

现象到段位的判断:

现象卡在哪段
黑屏无 BIOS/厂商 logo硬件/固件
BIOS 过了,GRUB 菜单不出GRUB 引导
GRUB 出菜单,选内核后卡住内核/initramfs
看到 systemd 日志卡住systemd/服务
到登录界面但起不来服务服务/挂载

排错三问:

① 最后一次成功启动改了什么?(软件/硬件)
② 有报错输出吗?(屏幕上能读到什么)
③ 能进救援环境吗?(单用户/Live)

铁律:启动前先做「最小回退」——GRUB 里选旧内核/旧配置,很多问题就定位了。

记忆:启动接力四段(固件→GRUB→内核/initramfs→systemd),按现象判段;排错三问——最近改了啥、屏幕有啥、能进救援吗;先试旧内核最小回退。


2. 看启动日志:journalctl -b 与 console

日志是启动排错的第一现场。

能进系统的(重启后):

journalctl -b                 # 本次启动全部日志
journalctl -b -1              # 上一次启动
journalctl -b -p err          # 只看错误级
journalctl -b -u sshd         # 某服务

启动耗时与失败:

systemd-analyze               # 启动总耗时
systemd-analyze blame         # 各单元耗时
systemctl list-units --failed # 失败单元

屏幕上看日志(启动时编辑内核参数):

内核参数加:
- console=tty0(当前终端)
- 或 rd.debug / systemd.log_level=debug
这样开机时日志直接打到屏幕

看不到日志(黑屏)→ 用第 8 节的 Live 救援环境挂载看 /var/log/journal。

记忆:看启动日志——journalctl -b 本次、-b -1 上次、-p err 只看错、systemd-analyze blame 看慢单元、list-units –failed 看失败;黑屏就加 console=tty0 或 Live 里读日志。


3. GRUB 故障:引导丢失与修复

GRUB 故障常见现象:

- 开机直接进 grub rescue> 提示符
- GRUB 菜单报 "error: no such partition"
- 找不到 /boot、找不到内核

修复(在 Live 或救援环境 chroot):

# chroot 进系统后
grub-install /dev/sda        # 重装引导到 MBR
update-grub                  # 重新生成菜单(Debian/Ubuntu)
grub2-mkconfig -o /boot/grub2/grub.cfg   # RHEL 系

grub rescue 手工引导(临时代入):

set root=(hd0,msdos1)
linux /vmlinuz-xxx root=/dev/sda1
initrd /initrd.img-xxx
boot

常见 GRUB 坑:

- 双系统/磁盘顺序变 → update-grub 重新识别
- UEFI 与 BIOS 模式混淆 → 用对应安装方式
- /boot 被占满/损坏 → 释放空间或重装

记忆:GRUB 修复三步——chroot 后 grub-install 重装引导、update-grub 重建菜单;rescue 模式手工 linux/initrd/boot 临时引导;磁盘顺序变就 update-grub 重识别。


4. initramfs 问题与重建

initramfs(initrd)是「先遣队」:挂载根文件系统之前的环境。坏了系统卡在内核加载后。

现象:

- 卡在 "loading initial ramdisk"
- 报 "ALERT! UUID=xxx does not exist"
- 找不到 /dev/mapper/... 根设备

重建 initramfs(chroot 后):

# Debian/Ubuntu
update-initramfs -u -k all
# RHEL 系
dracut --regenerate-all --force

UUID 不存在的排查:

- 磁盘变动(换盘/分区)→ 更新 fstab 或重新生成 initramfs
- LVM 卷没激活 → 加 lvm 相关钩子/模块
- 加密根盘 → 确认 luks 模块在 initramfs 里

预防:升级内核后及时重建 initramfs、备份一份可启动内核。

记忆:initramfs 坏了重建——Debian/Ubuntu 用 update-initramfs -u、RHEL 用 dracut –regenerate-all;UUID 不存在多半磁盘变动/LVM 未激活,update-grub + 重建 initramfs 一起做。


5. 内核启动参数:单用户与 root 修复

GRUB 菜单按 e 编辑内核参数是救命的入口。

常用修复参数:

single         → 进入单用户模式(不启多用户服务)
init=/bin/bash → 直接进 shell(绕过 systemd)
rescue         → systemd 救援目标
systemd.unit=emergency → 应急目标
root=/dev/sda1 → 强制指定根设备
rw             → 根以读写挂载

单用户/应急 shell 里做什么:

# 根只读时重挂读写
mount -o remount,rw /
# 修 fstab/密码/恢复被禁用服务
passwd root

进单用户修密码(经典场景):

GRUB 编辑加 single → 进 shell → mount -o remount,rw / → passwd root

记忆:GRUB 按 e 加内核参数救场——single 单用户、init=/bin/bash 直接 shell、rescue/emergency 目标;进去先 mount -o remount,rw / 再修密码/服务。


6. 文件系统挂载失败

现象:

- 启动卡在 "A start job is running for ... /data"
- 报 mount 失败 / fsck 失败
- 根挂载超时进入 emergency

排查与修复(救援环境):

# 检查 fstab 是否写错
cat /etc/fstab
# 卸载后 fsck
umount /dev/sdb1
fsck -y /dev/sdb1        # XFS 用 xfs_repair

# 临时跳过错挂载
# 启动参数加 fstab 里坏项的 0 或注释掉

fstab 常见坑:

- UUID 写错(换盘后)→ 用 blkid 查真实 UUID 更新
- 挂载点在系统前依赖没起来 → 加 nofail 或调整依赖
- LVM/加密设备未先激活 → 顺序与钩子问题

卡在 “a start job is running”:多半等挂载超时,检查 fstab 与设备。

记忆:挂载失败四步——cat /etc/fstab 查错、blkid 核对 UUID、救援里 fsck/xfs_repair 修盘、坏项临时 nofail 或注释跳过;卡 “start job running” 就是等 fstab 超时。


7. systemd 服务失败与救援目标

systemd 段失败:服务起不来,但系统还能进。

诊断:

systemctl list-units --failed      # 看失败服务
systemctl status myservice         # 看状态与错误
journalctl -u myservice -b -p err  # 服务日志

救援目标:

systemd.unit=rescue.target   → 单用户救援
systemd.unit=emergency.target → 最小环境(root 只读)

常见 systemd 失败:

- 依赖没满足(After/Wants 缺)
- 服务脚本/二进制缺失
- 挂载依赖没起(见第 6 节)
- 权限/AppArmor/SELinux 拦截

修复手段:改单元文件 → systemctl daemon-reload → systemctl restart。

记忆:systemd 失败看 list-units –failed + journalctl -u 服务 -p err;救援目标 systemd.unit=rescue/emergency;依赖缺失、脚本缺失、SELinux 拦截是常见三类;改完 daemon-reload。


8. Live 系统救援与数据挽救

系统彻底起不来时,用 Live 系统救援(U 盘 Live ISO / 另一台机挂盘)。

步骤:

① 从 Live USB/ISO 启动
② 找到原系统盘:lsblk / fdisk -l
③ 挂载根盘(含 /boot、如需 chroot 也挂 /proc /sys /dev)
④ 修复(grub-install / update-initramfs / fsck)
⑤ 或只做数据挽救
lsblk
mount /dev/sda2 /mnt
mount /dev/sda1 /mnt/boot          # 有独立 boot
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt /bin/bash              # 进原系统修复

数据挽救:

ddrescue /dev/sda1 /mnt/backup.img # 坏盘先镜像
testdisk / photorec                # 分区/文件恢复

记忆:Live 救援流程——启动 Live → lsblk 找盘 → 挂根+boot+proc/sys/dev → chroot 进原系统修复;数据挽救先 ddrescue 镜像坏盘再 testdisk/photorec 恢复。


9. 内核崩溃:Panic 与 kdump 诊断

内核崩溃(Panic):内核级致命错误,系统直接停摆。

现象:

- 屏幕 kernel panic 大括号
- 报 "Kernel panic - not syncing"
- 循环重启(panic 后重启)

kdump 机制:崩溃时用保留内存跑一个小内核,转储 vmcore 供分析:

# 启用 kdump
yum install kexec-tools   # / 或 apt install kdump-tools
# 配置 crashkernel=256M 内核参数
grubby --update-kernel=/boot/vmlinuz-$(uname -r) \
       --args="crashkernel=256M"
systemctl enable --now kdump

分析 vmcore:

# vmcore 在 /var/crash/
crash /usr/lib/debug/boot/vmlinuz-xxx vmcore   # crash 工具

常见 panic 原因:

- 硬件故障(内存/磁盘)
- 驱动 bug(更新后出现)
- 内核参数冲突
- OOM 极端(panic_on_oom)

定位思路:panic 前的日志行 + dmesg;先回退内核/参数验证硬件。

记忆:内核 panic 用 kdump 转储——crashkernel=256M 留内存、崩溃自动存 vmcore、crash 工具分析;常见因硬件/驱动/参数/OOM;先回退内核与参数,再看 panic 前日志。


10. 速查表与一句话记忆

故障段关键手段
定位段位现象→固件/GRUB/内核/服务
看日志journalctl -b、-p err、-b -1
GRUB 坏chroot 后 grub-install + update-grub
initramfs 坏update-initramfs -u / dracut –regenerate-all
进修复GRUB e 加 single / init=/bin/bash
挂载失败blkid 核 UUID、fsck、nofail
服务失败list-units –failed、journalctl -u
彻底起不来Live chroot / ddrescue
内核崩溃kdump + vmcore 分析

一句话记忆:Linux 启动排错 = 定位段位(固件/GRUB/内核+initramfs/systemd,按现象判)→ 看日志(journalctl -b / -p err / -b -1,黑屏加 console)→ 对症修:GRUB 坏 chroot 重装引导、initramfs 坏 update-initramfs/dracut 重建、fstab 挂载错 blkid 核 UUID + fsck、服务失败看 failed 列表;进不了系统用 GRUB 加 single/init=/bin/bash 进救援 shell,彻底起不来用 Live chroot;内核 panic 靠 kdump 转储 vmcore 分析、先回退内核验证硬件——记住接力链和「最近改了什么」,启动问题就不再玄学,而是可定位、可修复的流程。


延伸阅读

  • /linux-kernel-boot-process/ — 启动流程详解
  • /linux-journald-logging/ — journalctl 日志查询
  • /linux-systemd-services/ — 单元与目标管理
  • /linux-filesystem-disk/ — 文件系统与挂载
  • /linux-backup-disaster-recovery/ — 灾难恢复与演练
  • [[os]] — 操作系统原理
  • [[infra]] — 服务器运维与排障

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「linux」更多文章

  1. Linux 高级文件系统:XFS、Btrfs、ZFS 与存储进阶
  2. Linux 高可用与负载均衡:HAProxy、Keepalived 与集群方案
  3. Linux 防火墙与 nftables:规则集、链、NAT 与网络安全防护