一、事故背景

某天服务器突然出现异常:

  • 宝塔面板无法访问
  • SSH 无法连接(22端口连接失败)
  • 只能通过云控制台 VNC 进入

尝试登录时发现:

login: root
Password:
Login incorrect

同时,系统启动卡在:

Starting Switch Root...

问题叠加:

  • 磁盘疑似已满
  • root 密码遗忘

二、问题分析

这是一个典型的“双重故障”:

1. 磁盘满

磁盘写满后会导致:

  • sshd 无法写日志,启动失败
  • systemd 服务异常
  • 宝塔等服务崩溃
  • 系统启动卡住

2. 忘记 root 密码

导致无法:

  • 登录系统
  • 清理磁盘
  • 修复服务

结论:

必须绕过密码进入系统,手动清理磁盘。


三、常规方法尝试(失败记录)

方法一:init=/bin/bash

在 GRUB 中添加:

init=/bin/bash

结果:

  • 系统仍进入 dracut 流程
  • 被 systemd 接管
  • 无法进入 shell

方法二:init=/sysroot/bin/sh

rw init=/sysroot/bin/sh

init=/sysroot/bin/sh
结果:

Failed to start Switch Root

Failed to start Switch Root
分析:

云厂商镜像(如 OpenStack + CentOS7)对启动流程有定制,普通方式可能失效。


四、最终解决方案

使用 GRUB 命令行强制进入 shell


1. 重启服务器,进入 GRUB


2. 按 c 进入命令行

grub>

3. 输入以下命令

set root=(hd0,msdos1)
linux16 /boot/vmlinuz-3.10.0-1160.119.1.el7.x86_64 root=/dev/vda1 rw init=/bin/sh
initrd16 /boot/initramfs-3.10.0-1160.119.1.el7.x86_64.img
boot

4. 成功进入系统

sh-4.2#

此时已经获得 root 权限(无需密码)。


五、修复步骤

1. 挂载为可写

mount -o remount,rw /

2. 修改 root 密码

passwd root

注意密码复杂度要求:

  • 至少包含三类字符(大小写、数字、符号)

示例:

A9x!Q7p#L2

3. 清理磁盘

rm -rf /var/log/*
rm -rf /www/wwwlogs/*
rm -rf /www/server/panel/logs/*
rm -rf /tmp/*

4. 查看磁盘使用情况

df -h

示例:

/dev/vda1 112G 104G 8G 93%

说明空间已释放。


5. 重启系统

由于当前环境为精简 shell,需要使用完整路径:

/sbin/reboot -f

六、恢复结果

系统重启后:

  • SSH 可以正常连接
  • root 登录恢复
  • 宝塔面板正常
  • 系统服务恢复

七、问题根因总结

本次问题本质是:

磁盘写满引发的系统级故障:

  • 日志无法写入
  • 服务启动失败
  • 系统启动异常

同时密码遗忘,使问题复杂化。


八、经验总结

1. 定期监控磁盘

df -h

建议设置告警阈值(80% / 90%)。


2. 日志定期清理

建议配置:

logrotate

或定期清理:

rm -rf /www/wwwlogs/*

3. root 密码必须可恢复

建议:

  • 使用密码管理工具
  • 或记录在安全位置
  • 或启用云厂商密码重置功能

4. 掌握 GRUB 救援方法

在无法登录系统时,这是最关键的自救手段。


九、总结

磁盘满 + 忘记密码 是典型的复合型故障,但只要能够进入 GRUB,就一定可以恢复系统。

关键在于:

  • 能否绕过认证进入 shell
  • 能否快速释放磁盘空间
最后修改:2026 年 03 月 21 日
如果觉得我的文章对你有用,请随意赞赏