Linux

CentOS7 开机卡在 systemd 初始化排查

·8 分钟阅读·2810 字

梳理CentOS7 开机卡在 systemd 初始化的故障定位流程、关键命令与处理方案

📋 目录

CentOS7 开机卡在 systemd 初始化排查

1. CentOS7 开机卡在 systemd 初始化完整排查流程

2. 先进入单用户/救援模式(必做第一步)

2.1. 方式1:内核启动参数修改(本地服务器/虚拟机)

  1. 开机 GRUB 界面,选中内核按 e 进入编辑
  2. 找到以 linux16 开头的一行,修改两处:
  • 末尾添加:init=/bin/bash
  • 把 ro 改为 rw(只读改读写)
  1. 按 Ctrl+X 启动,直接进入 root shell,无需密码

2.2. 方式2:系统救援盘(无法进单用户时)

CentOS7 ISO 镜像启动,选择 Troubleshooting → Rescue a CentOS system,挂载原系统 /mnt/sysimage,执行 chroot /mnt/sysimage 进入原系统环境。


3. 高频卡死根因 & 分层排查

3.1. 文件系统损坏(最常见)

3.1.1. 现象

卡在 Started Show Plymouth Boot Screen / systemd-fsck、长时间磁盘读写无响应、报 UUID xxx does not exist

3.1.2. 修复步骤

  1. 单用户模式下执行磁盘检查:
# 查看磁盘分区
lsblk
# 修复根分区(例/dev/mapper/centos-root /dev/sda1)
fsck -f /dev/mapper/centos-root

注意:fsck 禁止挂载状态执行,若已挂载先 umount /dev/xxx2. 若 /etc/fstab 配置错误(UUID写错、不存在磁盘、swap异常)

# 注释异常行,临时开机
vi /etc/fstab
# 注释所有非系统盘、错误UUID、swap行,重启测试

3.2. 磁盘/存储硬件异常

3.2.1. 现象

日志大量 I/O error、timeout、卡在挂载存储卷、云服务器云盘离线

  1. 单用户查看内核磁盘日志:
dmesg | grep -i error
dmesg | grep -i sd
  1. 本地机器:检查硬盘、RAID、SATA线;云服务器:检查云盘是否解绑、磁盘性能打满

3.3. systemd 关键服务启动死锁(第二高发)

systemd 并行启动,某服务卡死会阻塞整个初始化,常见:

  • network 网络服务(网卡不存在、静态IP配置错误、NetworkManager 崩溃)
  • mount 挂载服务(NFS/共享存储超时)
  • lvm2、加密磁盘、docker/k8s 容器服务、chrony 时间同步

3.3.1. 排查方案

  1. 单用户模式临时禁用阻塞服务
# 永久屏蔽开机自启
systemctl mask network.service
systemctl mask NetworkManager.service
systemctl mask docker.service
# 或临时删除开机自启
systemctl disable xxx.service
  1. 查看开机启动依赖树,定位阻塞单元
systemd-analyze blame
systemd-analyze critical-chain
  1. 查看服务详细报错日志
journalctl -xb  # 完整开机日志,重点看 red 错误
journalctl -u network.service

3.4. 内核/系统文件损坏

3.4.1. 场景:yum 升级中断、误删系统文件、磁盘坏道

  1. 修复系统rpm包损坏
rpm -Va  # 校验所有系统文件,缺失文件会标M/S
# 修复损坏包
yum reinstall $(rpm -Va | grep 'missing' | awk '{print $NF}')
  1. 内核损坏:GRUB切换旧内核启动,删除问题内核重装

3.5. SELinux 上下文损坏

3.5.1. 现象:开机大量权限拒绝、卡在 systemd-logind

单用户模式下执行自动修复标签:

# 开机自动重建selinux上下文
touch /.autorelabel
exec /sbin/init
# 重启后会自动全盘relabel,等待完成即可

3.6. 主机名/hosts 解析死锁

/etc/hosts 缺失本机主机名,systemd 启动日志、dbus 阻塞:

# 检查主机名
hostname
# 确保/etc/hosts存在对应条目
echo "127.0.0.1   localhost localhost.localdomain $(hostname)" >> /etc/hosts

4. 日志定位核心命令(卡机后必查)

  1. 完整开机启动日志(最关键)
journalctl -xb --no-pager
# 只看错误日志
journalctl -xb -p err
  1. 查看启动耗时最长、阻塞服务
systemd-analyze blame | head -20
systemd-analyze critical-chain
  1. 查看磁盘挂载、文件系统日志
dmesg | grep -i fsck
dmesg | grep -i mount

5. 快速急救步骤(按顺序操作,90%场景解决)

  1. GRUB 修改 init=/bin/bash rw 进入单用户
  2. 注释 /etc/fstab 所有额外挂载、swap、NFS 行
  3. 执行 fsck -f 修复根文件系统
  4. 临时 mask 网络、docker、lvm 等非核心服务
  5. 若有 SELinux 报错:touch /.autorelabel
  6. 执行 exec /sbin/init 正常启动,观察卡在哪个服务
  7. 根据 journalctl 报错针对性修复对应服务/硬件

6. 典型卡死场景对应解决

  1. 卡在 Started Mount File System→ /etc/fstab 错误 / 磁盘UUID失效 / NFS服务器不可达
  2. 卡在 NetworkManager / network.service→ 网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-* 写错、网卡硬件不存在
  3. 卡在 Docker / containerd→ 存储驱动损坏,删除 /var/lib/docker 重建
  4. 卡在 SELinux relabel 无限循环→ 根分区空间不足,清理磁盘后重新 touch /.autorelabel
  5. 报 cannot find root device / UUID not found→ 磁盘脱机、LVM卷组损坏,执行 vgscan / lvscan 修复LVM

关联文档

Yanche Blog

记录云原生、Linux、数据库等技术领域的学习心得,以及日常生活的思考与感悟。

© 2026 Yanche Blog. All rights reserved.

Powered by Astro