在管理CentOS服务器的过程中,偶尔会遇到系统无法正常进入图形界面或命令行登录界面,而是在启动过程中卡住,并提示类似于“Give root password for maintenance”或直接进入一个只有提示符的shell环境,这种情况通常被称为进入“紧急模式”或“单用户模式”,这并非系统崩溃,而是一种内置的自我保护机制,旨在当系统检测到关键文件系统错误、服务启动失败或其他严重问题时,给予管理员一个机会来介入和修复,本文将详细、系统地讲解在这种情况下如何获取root权限,进行故障排查与修复,特别是重置root密码的完整流程。

理解紧急模式与单用户模式
在开始操作之前,理解这两个模式的基本概念至关重要,它们都是Linux的运行级别,专为系统维护和恢复而设计。
- 紧急模式:这是最精简的运行环境,系统会尝试挂载根文件系统(通常为只读模式),并启动最基本的服务,它的主要目的是提供一个最小的环境,让管理员能够修复导致系统无法正常启动的核心问题,比如修复
/etc/fstab错误。 - 单用户模式:这个模式比紧急模式稍多一些功能,它会挂载所有文件系统,并启动更多的系统服务,但仍然不提供网络登录功能,它允许单个用户(root)对系统进行全面的维护操作。
 
我们通常通过修改GRUB引导加载程序的启动参数来强制系统进入这些模式,从而绕过正常的身份验证流程,直接获取root shell。
通过GRUB引导进入恢复环境
获取root权限最常用且最可靠的方法是通过中断GRUB引导过程并修改内核参数,以下是详细的步骤,适用于CentOS 7及更高版本。
- 
重启服务器:你需要重启你的CentOS系统,可以在虚拟机软件中使用重启功能,或者在物理机上按
Ctrl+Alt+Delete或执行reboot命令。 - 
中断GRUB倒计时:在系统启动的最初几秒钟,你会看到一个GRUB引导菜单,其中列出了可用的内核版本,通常有一个倒计时(默认为5秒),在此期间,立即按下键盘上的
e键来编辑选中的启动项。 - 
定位并修改内核参数:按下
e键后,你会进入一个文本编辑界面,其中包含数行配置代码,使用方向键找到以linux、linux16或linuxefi开头的那一行,这行定义了传递给Linux内核的启动参数,你会看到类似ro crashkernel=auto rhgb quiet的内容。ro:代表以只读模式挂载根文件系统。rhgb:代表显示红帽图形化的启动进度条。quiet:代表在启动过程中抑制大部分内核信息的输出。
我们的目标是修改这行,这里介绍两种主流方法:
使用
rd.break(推荐) 这是基于systemd的现代Linux系统(包括CentOS 7+)推荐的方法,它会中断启动过程,并在一个临时的RAM文件系统中启动一个紧急shell。 将光标移动到该行的末尾,添加一个空格,然后输入rd.break。使用
init=/bin/bash这是一个更传统的方法,通过直接指定内核启动后要运行的第一个程序(init进程)为/bin/bash来直接获取一个root shell。 将光标移动到该行的末尾,添加一个空格,然后输入init=/bin/bash,将ro修改为rw,以确保文件系统以读写模式挂载。
 - 
启动系统:修改完成后,按下
Ctrl + X或F10组合键,系统将使用你刚刚修改过的参数来启动。 
获取Root权限并执行修复
根据你选择的方法,接下来的操作略有不同。
如果你使用了 rd.break 方法
- 系统会进入一个位于 
switch_root:/#提示符的shell,真正的系统根目录被挂载在/sysroot目录下,并且是只读的。 - 重新挂载文件系统为读写模式:执行以下命令,以便能够修改系统文件。
mount -o remount,rw /sysroot
 - 切换到真实的系统环境:使用 
chroot命令,将当前环境的根目录切换到/sysroot。chroot /sysroot
你的提示符可能会变为
sh-4.2#,表示你已经进入了正常的系统环境,并拥有root权限。 
如果你使用了 init=/bin/bash 方法
- 系统会直接进入一个  或 
bash-4.2#提示符的shell,因为你已经将ro改为了rw,所以文件系统已经是读写模式,你无需再进行挂载和chroot操作。 
重置Root密码(或执行其他维护)
现在你已经拥有了root权限,可以进行修复操作,最常见的任务是重置root密码。
- 
执行
passwd命令:passwd root
系统会提示你输入新的root密码,并再次确认,输入时屏幕上不会显示任何字符,这是正常现象。
 - 
更新SELinux上下文(关键步骤):在救援模式下直接修改了
/etc/shadow文件(passwd命令的本质是修改此文件),这会破坏其SELinux安全上下文,如果忽略这一步,重启后你可能依然无法正常登录,必须创建一个特殊的文件,让系统在下次重启时自动重新标记整个文件系统。touch /.autorelabel
这个命令会在根目录下创建一个空文件,系统启动时一旦检测到它,就会执行一次完整的SELinux文件系统重新标记。
 
重启并验证
完成所有操作后,按照以下步骤重启系统。

- 对于 
rd.break方法:先输入exit退出chroot环境,然后再次输入exit或reboot来重启系统。 - 对于 
init=/bin/bash方法:输入exec /sbin/init或reboot -f来重启系统。 
系统重启后,由于需要执行 autorelabel 过程(扫描并重新标记整个文件系统),启动时间会比平时长很多,请耐心等待,不要强制切断电源,启动完成后,你就可以使用新设置的root密码正常登录了。
为了更清晰地对比两种方法,下表小编总结了它们的主要区别:
| 特性对比 | rd.break 方法 | 
init=/bin/bash 方法 | 
|---|---|---|
| 适用系统 | CentOS 7+ (systemd) | 较旧和较新的系统均可 | 
| 推荐度 | ⭐⭐⭐⭐⭐ (更安全,符合现代系统设计) | ⭐⭐⭐ (简单直接,但可能不够彻底) | 
| 操作步骤 | mount -o remount,rw /sysrootchroot /sysroot | 
无需额外挂载和chroot | 
| 文件系统挂载 | 根目录挂载在 /sysroot,初始为只读 | 
根目录即为 ,初始为读写(需手动改ro为rw) | 
| SELinux处理 | 必须执行 touch /.autorelabel | 
必须执行 touch /.autorelabel | 
相关问答FAQs
问题1:我按照步骤操作了,但重启后密码还是不对,或者无法登录,怎么办?
解答:最常见的原因是 忘记执行 touch /.autorelabel 命令,在救援模式下修改 /etc/shadow 文件后,其SELinux安全标签会变得不正确,如果没有创建 .autorelabel 文件,系统在正常模式下将无法读取该文件,导致密码验证失败,请重复上述所有步骤,确保在修改密码后、重启前,已经执行了 touch /.autorelabel 命令,请确保在 init=/bin/bash 方法中,你已经将 ro 成功改为了 rw,否则文件系统为只读,passwd 命令会失败。
问题2:除了重置密码,我还能用单用户模式做什么?
解答:单用户或紧急模式是一个强大的系统维护工具,其用途远不止重置密码,它是一个“安全网”,当系统因配置错误而无法正常启动时,你可以在这里进行修复。
- 修复损坏的 
/etc/fstab文件:如果因为fstab配置错误导致文件系统挂载失败,你可以在这里编辑该文件,注释掉错误的条目。 - 修复网络配置:如果因为错误的网络配置导致远程无法连接,可以在这里修改 
/etc/sysconfig/network-scripts/下的配置文件。 - 回滚有问题的系统更新:可以卸载最近安装的、可能导致系统不稳定的软件包。
 - 查看启动日志:使用 
journalctl -xb命令可以查看详细的启动日志,帮助定位究竟是哪个服务或步骤出了问题。 - 备份重要数据:在系统彻底无法修复前,可以挂载U盘或移动硬盘,将 
/home等重要目录的数据备份出来。