1. 为什么我们需要掌握密码重置技能?
朋友们,不知道你们有没有遇到过这种情况:一台很久没登录的CentOS 7服务器,突然需要维护,结果死活想不起来root密码是什么。我前两年就吃过这个亏,当时给客户部署的一台测试机,放了小半年没动,等要用的时候,密码本找不到了,试了十几个可能的组合都不对,真是急出一身汗。好在Linux系统设计得很人性化,给我们留了“后门”——单用户模式。这个模式就像是系统的“安全屋”,不需要密码就能进去,专门用来处理这类紧急情况。
今天我就把自己这些年处理CentOS 7密码重置的经验,从头到尾、掰开揉碎了讲给大家。这不仅仅是记几个命令,更重要的是理解背后的原理。比如,为什么要把ro改成rw init=/sysroot/bin/sh?那个touch /.autorelabel文件到底是干嘛的?搞明白了这些,下次再遇到问题,你就能举一反三,甚至自己排查一些更复杂的启动故障了。整个过程其实并不复杂,从重启到登录成功,顺利的话十分钟内就能搞定,但每一步都不能错,错了可能就进不了系统了。别担心,跟着我的步骤走,保证你能稳稳当当地把密码拿回来。
2. 前期准备与启动引导的关键操作
在动手之前,有件事我得先唠叨一下:如果你操作的是一台远程服务器,比如云主机,这个方法可能不适用。因为单用户模式需要你在开机瞬间手动按键盘中断启动流程,而绝大多数云平台的控制台是不支持在启动时发送e这样的编辑指令的。对于云服务器,密码重置通常要通过云服务商提供的控制台“重置密码”功能或者挂载救援镜像来实现。所以,今天这个方法主要适用于你物理上能接触到键盘的机器,比如你自己的电脑、本地虚拟机或者托管在机房的物理服务器。
好了,我们正式开始。第一步肯定是重启系统。在虚拟机里,你可以直接点重启;如果是物理机,就按电源键或者用reboot命令。当屏幕开始出现CentOS的启动画面,也就是那个有倒计时的GRUB菜单时,你的手就要放在键盘上了,动作要快。这个界面通常只停留几秒钟,错过了就得再重启一次。菜单上会有一行像“CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)”这样的选项,用上下箭头键选中它,然后立刻按下键盘上的e键。这个e就是“edit”的意思,告诉GRUB:“先别急着启动,让我编辑一下启动参数”。
按下e之后,你会进入一个满是参数的文本界面。别被这些密密麻麻的英文吓到,我们只关心其中一行。你需要用方向键向下翻找,找到以linux16或linuxefi开头的那一行(具体关键词取决于你的系统是传统BIOS还是UEFI启动)。这一长串就是内核启动参数。我们的目标是在这行里找到ro这两个字母。ro代表“read-only”,即以只读方式挂载根文件系统。在单用户模式下,我们需要写入新密码,所以必须把它改成可写的。找到后,把光标移到ro上,把它修改为rw init=/sysroot/bin/sh。
这里我解释一下改动的含义:rw就是“read-write”,可读写;init=/sysroot/bin/sh则是告诉内核,别启动正常的系统初始化进程了,直接给我一个Shell(命令解释器),并且把这个Shell的根目录切换到/sysroot下。为什么是/sysroot?因为在系统初始化的早期阶段,真正的根文件系统是被挂载在/sysroot这个临时位置下的。做完这个修改,整个启动参数行可能看起来像这样:linux16 /vmlinuz-3.10.0-693.el7.x86_64 ro root=UUID=XXXX rw init=/sysroot/bin.sh quiet。确认修改无误后,就可以进行下一步了。
3. 深入单用户模式与密码修改实战
修改完启动参数,接下来就是进入单用户模式的核心操作了。这时候,你只需要按下Ctrl + x这个组合键。系统就会按照我们刚才修改的参数启动,跳过所有登录验证,直接给你一个以root权限运行的Shell命令行提示符。这个环境非常“原始”,没有正常的路径,很多命令也不能直接用,但足够我们完成密码重置了。
进入这个特殊的Shell后,第一件要做的事是执行chroot /sysroot命令。chroot是“change root”的缩写,它的作用是切换根目录。刚才说了,真实的系统文件都在/sysroot下面,这个命令就是把我们的工作环境“搬”到真正的系统根目录/下。执行之后,你使用的passwd、touch等命令,才会是原系统里的那些程序,而不是内存盘里的简易版。执行完chroot,命令行提示符可能不会有明显变化,但你可以用ls /命令看看,现在列出的应该是bin,etc,home这些熟悉的系统目录了。
现在,重头戏来了:修改root密码。直接输入passwd命令。因为当前是root身份,所以passwd命令默认就是修改root用户的密码。系统会提示你输入新的密码。这里有个非常重要的注意事项:在单用户模式的这个简易Shell里,你输入密码时,光标可能是不会移动的,也不会显示星号*,看上去就像键盘没反应一样。别慌,这是正常的,你只管稳稳地输入密码,然后按回车。系统会让你再输入一次以确认。两次输入一致后,你就会看到“all authentication tokens updated successfully”的成功提示。
我遇到过不少朋友在这一步卡住,因为出现了中文乱码提示,导致看不懂。这是因为系统语言环境设置的问题。如果passwd命令的提示变成了乱码,你可以先输入LANG=en这条命令,把当前会话的语言临时改成英文,然后再执行passwd,提示就清晰了。改完root密码,如果你还需要修改其他用户(比如一个普通用户zhangsan)的密码,可以用passwd zhangsan命令,过程是一样的。
4. 至关重要的收尾:SELinux上下文修复与重启
密码改好了,是不是直接重启就行了?千万别!如果你现在直接重启,有很大概率会登录失败。这是因为CentOS 7默认开启了SELinux(安全增强Linux),它是一个强大的安全模块。SELinux会给系统中的每个文件、进程都打上一个“标签”(安全上下文)。我们刚才在单用户模式下修改了/etc/shadow文件(密码就存储在这里),但这个操作绕过了SELinux的管理,导致这个文件的“标签”可能不对了。系统重启后,SELinux发现/etc/shadow的标签不对,就会拒绝访问,导致密码验证失效。
所以,我们必须告诉系统:“下次启动时,请重新检查并修复一下所有文件的SELinux标签”。方法就是在根目录/下创建一个特殊的标记文件。输入命令:touch /.autorelabel。这个touch命令创建了一个名为.autorelabel的空文件(文件名前面有个点,是隐藏文件)。这个文件的存在就是一个信号,系统在下次启动过程中,看到这个文件,就会自动对整个文件系统进行一遍完整的SELinux上下文重新标记(relabeling)。这个过程在重启时会花一些时间,具体时长取决于你硬盘上文件的多少,可能会看到屏幕上滚过很多***的进度提示,耐心等待它完成就好。
创建完标记文件,我们就可以退出chroot环境并重启了。先输入exit退出chroot环境,回到最初的简易Shell。然后,再输入reboot命令重启系统。当然,你也可以用一条更直接的命令:在chroot环境里直接输入exec /sbin/init。这条命令会直接启动系统的初始化进程,系统会正常执行关机重启流程,并在这个过程中完成我们上面设置的SELinux重新标记。两种方式任选其一即可。机器会开始正常重启流程,这时你就可以松开双手,等待它再次进入登录界面了。
5. 最终验证与登录成功
系统重启完成后,你会看到熟悉的图形化登录界面或者字符界面的login:提示。如果是在图形界面,通常会有一个“未列出?”或“其他用户”的选项,点击它,然后在用户名处输入root。在密码框里,输入你刚才在单用户模式下设置的新密码。如果一切顺利,你就会成功进入桌面或看到root的命令行提示符了。
如果很不幸,登录失败了,提示密码错误,别急着否定自己。我们可以按顺序排查一下:首先,回忆一下在单用户模式输入密码时,是否因为光标不动而输错了?当时应该输入两次,确保一致。其次,确认是否执行了touch /.autorelabel命令?没有这一步,SELinux问题会导致认证失败。你可以重新进入单用户模式检查一下根目录下有没有这个文件(ls -la /)。最后,极少数情况下,如果系统使用了特殊的认证模块或磁盘加密(LUKS),单用户模式的方法可能会更复杂,需要额外的解锁步骤。
成功登录之后,我建议你马上做两件事:第一,打开一个终端,尝试用su -切换到root,或者用sudo执行一个命令,再次确认密码无误。第二,立刻去创建一个具有sudo权限的普通用户,并记好密码。日常操作尽量使用这个普通用户,避免直接使用root。你可以用adduser username创建用户,然后用passwd username设密码,最后通过visudo命令编辑配置文件,在root ALL=(ALL) ALL这行下面,添加一行username ALL=(ALL) ALL,这样就能赋予新用户sudo权限了。养成这个习惯,既能保证安全,下次万一再忘记root密码,你还可以用这个普通用户登录,然后通过sudo passwd root来修改,比进单用户模式更方便。