引言
开机黑屏/卡住/报错,是最让人慌的场景——但启动失败有清晰的定位路径。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. 启动排错的定位框架
- 2. 看启动日志:journalctl -b 与 console
- 3. GRUB 故障:引导丢失与修复
- 4. initramfs 问题与重建
- 5. 内核启动参数:单用户与 root 修复
- 6. 文件系统挂载失败
- 7. systemd 服务失败与救援目标
- 8. Live 系统救援与数据挽救
- 9. 内核崩溃:Panic 与 kdump 诊断
- 10. 速查表与一句话记忆
- 延伸阅读
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]] — 服务器运维与排障
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。