Linux

CentOS7 开机卡在 systemd 初始化排查

·8 分钟阅读·2924 字
📋 目录

一、先吃透完整启动原理(卡死根源定位依据)

完整启动链路:
BIOS/UEFI自检 → GRUB2引导 → 内核+initramfs镜像加载 → 内核挂载临时rootfs → 切换真实磁盘根分区 → 内核拉起PID1 systemd(原init位置) → systemd依次执行target链

initrd.target → sysinit.target → basic.target → multi-user.target/graphical.target

卡在init=卡死在systemd拉起→执行target区间,分2个层级故障:

  1. 内核层卡死:找不到/无法执行/sbin/init(软链接指向systemd),报错:Failed to execute /sbin/initVFS unable mount root
  2. 用户态systemd卡死:根能挂载,但挂载fstab/启动某服务死循环阻塞,卡在开机滚动条、黑屏不动。

二、第一步:紧急进入修复环境(单用户/救援,必操作)

方式1:GRUB修改内核参数进入急救shell(虚拟机/物理机VNC首选)

  1. 开机GRUB菜单选中内核,按e编辑启动项;
  2. 找到linux16开头内核行:
  • 方案A(最简):行尾添加 init=/bin/bash,删除rhgb quiet(关闭开机静默日志,看报错);
  • 方案B(标准redhat急救):行尾添加rd.break
  1. Ctrl+X启动,直接进入root无密码shell;
  2. 重新挂载根分区可写:
mount -o remount,rw /
# rd.break进入时根是sysroot,执行:mount -o remount,rw /sysroot ; chroot /sysroot

操作完修复后:exec /sbin/init 正常启动系统。

方式2:系统盘挂载到其他机器/安装光盘救援模式

无法进GRUB时,CentOS7安装U盘启动→救援模式,挂载原系统分区排查。

三、分级排查(从高频→低频,按顺序排查)

1. 最高频:/etc/fstab配置错误(90%卡init场景)

原理

systemd执行sysinit.target时自动挂载fstab所有分区,UUID写错、分区不存在、文件系统损坏、swap异常,挂载阻塞直接卡死开机。

修复步骤

# 单用户下编辑fstab,注释异常行
vi /etc/fstab
# 临时全部注释所有非/分区,#开头,先开机,再逐个排查
# 查看磁盘UUID,核对fstab
blkid
# xfs/ext4分区损坏修复
xfs_repair /dev/xxx
fsck -f /dev/xxx(ext4禁止挂载中执行)

2. /sbin/init软链接丢失/systemd文件损坏(内核报错找不到init)

原理

/sbin/init是软链接→/usr/lib/systemd/systemd,文件误删、glibc依赖缺失、二进制损坏,内核拉起init失败直接卡住。

# 检查软链接
ls -l /sbin/init
# 正确输出:lrwxrwxrwx /sbin/init -> ../usr/lib/systemd/systemd
# 修复链接
ln -s /usr/lib/systemd/systemd /sbin/init
# 校验systemd完整性
rpm -V systemd
# 缺失文件重装systemd
yum reinstall systemd

3. rc.local自启脚本死循环/异常命令阻塞启动

原理

multi-user.target加载/etc/rc.d/rc.local,脚本死循环、挂载异常、错误命令,阻塞后续服务启动卡死。

# 注释rc.local所有内容
vi /etc/rc.d/rc.local
# 取消执行权限
chmod -x /etc/rc.d/rc.local

4. SELinux策略损坏导致无法启动systemd

原理

误关/开启SELinux、selinux上下文损坏,systemd无法读取系统文件权限卡死。

# 临时关闭SELinux开机,grub内核行添加:selinux=0
# 单用户永久关闭
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 修复上下文
restorecon -Rv /

5. 磁盘根分区空间100%占满

原理

根分区爆满,systemd无法创建临时文件、日志,初始化阻塞。

df -h
# 清理大文件
find / -type f -size +1G

6. 某核心系统服务异常卡死systemd并行启动

原理

systemd并行启动服务,关键服务(network、lvm2、udev)故障死锁,阻塞target。
临时绕过:GRUB内核参数指定启动救援目标

# linux16行末尾添加 systemd.unit=rescue.target

进入救援模式后查看异常服务:

systemctl --failed
# 禁用故障自启服务
systemctl disable xxx.service

7. initramfs镜像损坏(内核阶段找不到驱动,无法挂载根)

报错特征:卡在Loading initial ramdiskVFS: Cannot open root device

# 救援模式重建initramfs
dracut -f /boot/initramfs-$(uname -r).img $(uname -r)

四、开机查看详细日志(定位精准卡死点)

  1. GRUB去掉rhgb quiet,开机输出详细内核+systemd日志,看最后报错关键词;
  2. 正常开机后查看历史启动日志:
journalctl -b -1  # 上一次失败开机完整日志

五、速查故障对照表

卡死现象故障点修复方案
报错Failed to execute /sbin/initsystemd丢失/软链接异常修复init软链接、重装systemd
挂载磁盘超时、提示mount失败fstab错误/分区损坏注释fstab异常项+fsck/xfs_repair
滚动条长时间不动无报错rc.local死循环/服务卡死注释rc.local、rescue.target禁用故障服务
SELinux denied日志SELinux损坏临时selinux=0、修复上下文
VFS unable mount rootinitramfs/root参数错误重建initramfs、核对grub root=设备

需要我整理Obsidian可入库笔记版,或者补充救援模式实操命令清单?

关联文档