linux启动失败的核心思路是分层回溯:从grub、内核、initramfs到系统服务逐层排查,以日志为依据,按顺序提取dmesg、journalctl和boot.log等关键信息定位故障点。

Linux启动失败时,核心思路是“分层回溯”:从引导加载器开始,逐层检查内核、initramfs、系统服务是否正常加载和运行。日志是唯一客观依据,必须按顺序、有针对性地提取关键信息。
一、先看 GRUB 和内核启动画面残留信息
如果卡在黑屏、光标闪烁、GRUB rescue 提示或刚显示几行就中断,说明问题发生在早期阶段。此时无法依赖磁盘日志,需依靠视觉线索:
- 启动时按 Shift(BIOS)或 Esc(UEFI)调出 GRUB 菜单,选中启动项后按 e 编辑内核参数
- 检查
linux行中的root=是否指向有效分区(推荐用root=UUID=...,可用blkid验证) - 确认
initrd路径是否存在(ls /boot/查看对应 initramfs 文件名是否匹配) - 临时添加
rd.debug systemd.log_level=debug或quiet splash改为noquiet nosplash,让启动过程输出更多细节
二、进单用户/救援模式后优先抓取三类日志
能进入命令行环境(如通过 systemd.unit=rescue.target 或 Live 系统挂载)后,立即执行以下三项检查,覆盖硬件、内核、用户空间全链路:
- dmesg -l err,warn:查看内核级错误,重点关注存储设备识别(
sda: unknown partition table)、驱动加载失败(Failed to load module xxx)、内存/PCIe 初始化异常 - journalctl -b -p err:过滤本次启动所有错误级日志,快速定位 systemd 启动哪个 unit 时崩溃(如
Failed to start Network Manager) - cat /var/log/boot.log(若存在)或 journalctl -u systemd-sysusers.service -n 30:观察用户/组初始化、fstab 挂载、关键基础服务(logind、dbus、udev)是否成功启动
三、聚焦失败服务与依赖链
当系统能进入 shell 但桌面或网络等关键功能缺失,大概率是某个服务启动失败并阻塞了后续流程:
- 运行 systemctl list-units –state=failed 列出所有失败单元
- 对每个失败服务执行 systemctl status 服务名 -n 50,重点看
Process行的完整命令和status=后的退出码 - 用 systemctl show 服务名 | grep -E “(Wants|Requires|After)” 查依赖关系,确认前置服务(如
local-fs.target、cryptsetup.target)是否就绪 - 手动运行
ExecStart=后的命令,观察是否报权限、路径、配置文件缺失等直接错误
四、验证文件系统与关键配置
日志无明显报错但系统仍无法完成启动,需排查底层一致性问题:
- 运行 fsck -n /dev/sdXN(只读检查),确认根分区无损坏;若提示错误,重启前加
-y自动修复 - 检查 /etc/fstab:是否有 UUID 错误、挂载点不存在、文件系统类型写错(如把
ext4写成ntfs) - 验证 /etc/crypttab(如有加密卷):设备路径、密钥文件路径、选项是否合法
- 确认 /boot 分区是否被意外清空或损坏(
ls /boot/vmlinuz* /boot/initrd*)