必须用救援模式修复,因单用户模式依赖已损坏的/bin/bash或其软链接/bin/sh;Rescue模式下chroot失败时需直接挂载操作,通过rpm重装或busybox临时替代恢复bash。

必须用救援模式(Rescue Mode)修复,不能靠单用户模式或 init=/bin/bash —— 因为它们本身依赖 /bin/bash 或其软链接 /bin/sh。
为什么单用户模式进不去
单用户模式常被误认为万能入口,但实际启动时内核会尝试执行 init=/bin/bash 或默认调用 /bin/sh;而 CentOS/RHEL 系统中 /bin/sh 是指向 /bin/bash 的软链接。一旦 /bin/bash 被删,/bin/sh 就失效,导致 init 启动失败,卡在黑屏或循环回到登录界面。
常见错误现象包括:
- GRUB 编辑后按 Ctrl+X,屏幕闪一下就回到登录界面
- 终端报错
/bin/sh: No such file or directory或直接静默退出 - 系统日志(若能挂载查看)显示
Failed to start default target: Unit bash.service not found
进入 Rescue 模式后 chroot 失败怎么办
Rescue 环境自带完整 bash,但执行 chroot /mnt/sysimage 时仍报 chroot: failed to run command '/bin/bash': No such file or directory —— 这不是路径问题,是 chroot 内部仍试图调用目标根目录下的 /bin/bash 来启动 shell,而它已不存在。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
绕过方式是:不依赖 chroot 启动交互 shell,而是直接对挂载的根目录操作:
- 确认原系统已挂载:
ls /mnt/sysimage/bin/应能看到ls、cp等命令,但无bash - 从安装介质恢复:
mkdir -p /mnt/localrepo && mount /dev/sr0 /mnt/localrepo(若光驱设备是/dev/sr0) - 找到 bash 包:
find /mnt/localrepo -name "bash-*.rpm" | head -1 - 强制重装到原系统:
rpm -Uvh --force --root=/mnt/sysimage /mnt/localrepo/Packages/bash-*.rpm - 若提示 rpmdb 锁:
rm -f /mnt/sysimage/var/lib/rpm/__db*,再重试
没有安装介质时的应急替代方案
如果手边没有光盘或 USB 安装盘,且系统是联网的(例如 Rescue 环境能访问网络),可尝试用静态二进制工具临时补位:
- 检查是否有其他可用 shell:
ls /mnt/sysimage/bin/*sh,如存在/mnt/sysimage/bin/dash或/mnt/sysimage/bin/ksh,可临时改/etc/passwd中 root 的 shell 字段为对应路径(需先mount -o remount,rw /mnt/sysimage) - 若完全无可用 shell,但有
/lib64/ld-linux-x86-64.so.2和静态busybox(某些 Rescue 镜像自带),可拷贝busybox到/mnt/sysimage/bin/bash并加执行权限:cp /bin/busybox /mnt/sysimage/bin/bash && chmod +x /mnt/sysimage/bin/bash - 注意:
busybox bash功能有限,仅够完成后续 rpm 安装,不可长期替代真实 bash
验证与重启前的关键检查
修复完成后不要急着 exit,务必逐项确认:
-
ls -l /mnt/sysimage/bin/bash—— 确保文件存在、权限为-rwxr-xr-x、属主 root -
ldd /mnt/sysimage/bin/bash—— 若报not a dynamic executable是静态编译,可跳过;否则应列出 libc 等依赖,且路径都落在/mnt/sysimage下 -
chroot /mnt/sysimage /bin/bash -c 'echo OK'—— 成功输出 OK 才算真正可运行 - 检查
/mnt/sysimage/etc/passwd中 root 行末尾是否仍为/bin/bash,避免之前手动改过未还原
最后 exit 退出 Rescue shell,移除安装介质,重启。真正麻烦的从来不是删了 bash,而是删完还顺手 kill -9 -1 或清空 /var/log——那会把线索也一起抹掉。

















