17年的圣诞节, 网站的服务器出现了一起事故, 时恰逢考试, 不得已直到今日才对此事故有所眉目.
运行环境
服务器: Dell PowerEdge 操作系统: CentOS 5.11 后端框架: php-cmsv9
事故表现
- ssh登陆时提示root无法登陆
- tty登陆时提示root密码错误
- 按下 ctrl + alt + delete 后INIT进程报错:
shutdown[7326]: shutting down for system reboot
INIT: cannot execute "/etc/rc.d/rc"
INIT: no more processes left in this runlevel
- 开机后INIT依然报错.登陆依然失败, 同时主机名显示为"(none)"
INIT: cannot execute "/etc/rc.d/rc"
-
刻录的Ubuntu 16.04启动盘和CentOS 6.8启动盘均无法引导并启动服务器, 但随身携带的使用工具制作的Windows PE盘可以引导并启动
- 进入 救援模式 后使用
chroot /mnt/sysimage/
报错chroot: /bin/sh can not be executable
日志分析
- 日志文件: secure
发现关键信息:
sshd[5181]: User root not allowed because shell /bin/bash is not executable
- 日志文件: message
shutdown[7326]: shutting down for system reboot
init: cannot execute "/etc/rc.d/rc"
init: no more processes left in this runlevel
shutdown[7329]: shutting down for system reboot
shutdown[7331]: shutting down for system reboot
信息检索
于Google发现一条重要信息: Locked out after installing a bash without executable bit
问题分析
- 测试的两个启动盘无法引导机器 考虑到机器比较老旧, 而新系统(Ubuntu 16.04和CentOS 6.8 均使用基于UEFI引导的Grub 2启动管理器, 而使用工具制作的Windows PE则一般使用grub4dos启动管理器, 所以决定使用基于mbr方式引导的grub4dos启动管理器引导u盘上的CentOS 5.11, 再进入救援模式解决问题.
- rc文件不能执行
rc文件的解释器就是
/bin/bash
, 如果bash不能执行, 那么rc脚本也就不能执行, 因此bash的执行权限是关键.解决方案
- 进入救援模式
- 修改bash可执行权限
chmod +x /mnt/sysimage/bin/bash