ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux虚拟机忘记root密码?rd.break几分钟轻松重置

Linux虚拟机忘记root密码?rd.break几分钟轻松重置 这大概是运维和虚拟机爱好者最常遇到的问题之一某个之前搭好的Linux虚拟机隔了几个月再打开root密码怎么都想不起来。网盘里翻遍了wiki、聊天记录、截图全是无关内容。重装系统数据、配置、环境全都白搭了代价太大。其实在虚拟机里重置root用户密码根本不用重装也不需要对系统有什么“破解”手段只需要利用Linux引导阶段的一个维护通道几分钟就能把密码改回来数据一点不丢。这个操作在技术圈里常被叫“root密码破解”但严格说它不是漏洞利用而是一个官方的恢复机制。我的建议是只要是虚拟机环境的Linux系统无论是VMware Workstation、VirtualBox还是KVM无论是CentOS、Ubuntu还是其他发行版你都有比物理机更大的操作空间——因为虚拟化平台给了你“随时干预启动过程”的能力。这篇文章我会把重置root密码的原理讲明白再把具体的操作步骤、VMware环境下的细节坑、常见故障一次全说清楚希望能帮你少走弯路。1. 动手之前先摸清环境和底线1.1 判断系统家族与引导模式重置root密码的方法并不是所有Linux发行版都完全一样第一步要判断手上的虚拟机大概是哪个系统。一般来说虚拟机里装的Linux十有八九是两类一类是Red Hat家族包括CentOS、Rocky Linux、AlmaLinux、Oracle Linux以及一些国产系统如银河麒麟另一类是Debian家族以Ubuntu、Debian为主。这两个家族的引导界面、grub配置格式、恢复入口都有差异。判断方法很简单开机时看一眼grub菜单。Red Hat系的菜单项通常写着“CentOS Linux (核心版本号) ...”Ubuntu/Debian的菜单项写着“Ubuntu”或“Debian GNU/Linux”。如果你连grub菜单都没见过那可能是系统启动太快被跳过了或者VMware的启动延迟不够后面我会专门讲怎么解决。还要确认引导模式是BIOS还是UEFI。在VMware Workstation里可以在“虚拟机设置-选项-高级-固件类型”里看到当前是BIOS还是EFI。这个信息很重要因为UEFI引导和BIOS引导在下拉grub菜单时的按键不一样而且VMware里用来增加启动延迟的参数也不同。1.2 三条不可逾越的安全底线做密码重置之前务必记住三个原则这是我在实际运维中踩过坑后总结的。第一操作前先拍快照。VMware Workstation里右键虚拟机-快照-拍摄快照ESXi/vSphere里也一样可以在重置失败后一键回滚。快照的代价很小尤其在虚拟机磁盘不大的情况下几秒钟就完成了。生产环境千万别省这一步。第二区分测试环境和生产环境。测试环境随便折腾生产环境哪怕只是重置密码也要谨慎评估影响。特别是如果这台机器上有正在运行的服务重置密码前最好先确认是否有其他登录途径比如SSH密钥登录、其他管理账号能不动root密码就尽量不动。第三记录关键信息。包括原系统版本、grub版本、当前磁盘分区情况、之前是否开启过SELinux/AppArmor等。这些信息在重置过程中遇到异常时是排查问题的重要线索。我在给一台老旧的CentOS 7虚拟机重置密码时最开始没拍快照结果用init/bin/bash方法改完密码后重启发现SELinux上下文错乱系统直接卡在启动阶段。当时只好用ISO救援模式一点点修复折腾了两个小时。如果当时多花30秒拍个快照回滚重来一次就好了。所以这篇文章里的每一步我都习惯先说“快照了吗”。2. 重置密码的核心原理为什么这事可行2.1 Linux启动流程里的“维护窗口”要理解重置root密码为什么可行得先简单捋一下Linux的启动流程。计算机通电后固件BIOS或UEFI负责加载引导程序也就是grub。grub加载完成后会显示菜单并读取你选择的内核和initramfs然后启动内核。内核启动后首先解压initramfs执行里面的init程序这个阶段会加载各种驱动、准备真正的根文件系统最终把控制权交给真正的init进程现在是systemd。问题就在这grub菜单允许你在启动前修改内核参数。而内核参数里有两个特殊值rd.break和init/bin/bash它们会改变整个启动的行为。加rd.break后系统启动到initramfs阶段就会停下来进入一个临时的维护shell此时真实的根文件系统还没挂载或者只读挂载在/sysroot下加init/bin/bash则更直接它告诉内核把bash当作第一个用户态进程来执行不启动systemd也不启动任何服务直接给你一个命令行。这两个参数就是重置root密码的入口。因为它们都发生在系统完整启动之前所以你不需要知道旧密码就能获得一个可以读写磁盘的root环境。2.2 rd.break和init/bin/bash到底选哪个在CentOS/RHEL 7及以后的systemd时代优先推荐rd.break。它是systemd提供的一种维护机制会把系统停在initramfs阶段你会看到一个类似switch_root:/#的提示符。这个环境非常干净没有乱七八糟的服务干扰重置密码的操作路径很简单。init/bin/bash是SysV时代的经典办法在CentOS 6及更早的版本上很常用。现在的RHEL系虽然还能用但经常伴随SELinux上下文的坑——因为它是直接绕过systemd进入bash的根文件系统的挂载方式、SELinux标签都可能不完整导致改完密码重启后登录异常。所以现在遇到RHEL系系统我基本只用rd.break。Ubuntu/Debian那边历史上更习惯用recovery mode恢复模式或者直接在grub里加init/bin/bash。Ubuntu的recovery mode会在一个只读的根文件系统上给你一个root shell你只需要重新挂载为可写就可以改密码。其实说到底这些方法没有本质区别都是在“正常启动前拿到一个维护shell”。理解了这一点后面看任何系统的重置教程你都会觉得“原来如此”而不是死记步骤。3. RHEL/CentOS系实战rd.break完整操作3.1 进入grub并修改内核参数我给一台CentOS 7虚拟机做密码重置时操作流程大致如下。重启虚拟机在grub菜单界面出现前快速点进虚拟机窗口然后立刻按键盘上的上下方向键把grub菜单冻结住。如果系统启动太快grub菜单一闪而过我会先做好VMware的启动延迟设置这个后面的章节细说。grub菜单出现后光标停在第一项通常是最新的内核按字母e进入编辑模式。找到以linux开头的那一行这会很长包含rootUUID...、ro、crashkernelauto等一堆参数。把光标移到ro后面在行尾追加一个空格和rd.break。我习惯把ro改成rw rd.break这样后面挂载系统根分区时就是可写状态能少敲一条命令。改完后按Ctrlx或者F10启动。系统会加载一会儿然后停在一个switch_root:/#的提示符。看到这个提示符就说明你已经进入initramfs的维护环境了。3.2 在维护环境里真正改掉root密码进入switch_root环境后真实的系统根目录挂在/sysroot下但通常是只读的。所以第一件事是重新挂载为可写mount -o remount,rw /sysroot然后切换到真实的根文件系统chroot /sysroot这一步执行后提示符会变化你看到的就是这台虚拟机真实的根目录了。接下来设置新密码passwd root系统会提示输入两次新密码。如果密码符合策略要求会提示passwd: all authentication tokens updated successfully.。这里有一个容易漏掉的步骤如果系统开启了SELinuxRHEL系默认是开启的在退出前必须执行touch /.autorelabel这个操作会在根目录创建一个空文件标记系统重启后自动重建SELinux安全上下文让新密码相关文件获得正确的标签。不执行这一步你改完密码重启后很可能会遇到SELinux标签错乱导致的登录失败。然后连续退出两次第一次退出chroot第二次退出switch_root环境系统会自动重启。exit exit3.3 重启后的等待与验证重启后如果touch了/.autorelabel系统会进入SELinux标签重建过程这个过程在虚拟机里可能要花5到15分钟磁盘性能差的会更久。屏幕上会一路刷出大量XXXX文件名不要慌等它跑完自动进入登录界面。等系统正常登录后用新密码验证su -或者直接在图形界面用root登录。如果验证没问题密码重置就算完成了。重置成功后建议立即删除.autorelabel留下的临时文件其实不需要因为重启后系统会自动清除这个标记文件不会残留。注意在chroot之前如果发现/sysroot还是只读导致passwd无法写入可以再执行一次mount -o remount,rw /sysroot。有些系统里还需要临时挂载/proc、/dev、/sys到chroot环境否则部分命令可能异常。标准做法是mount --bind /dev /sysroot/dev mount --bind /proc /sysroot/proc mount --bind /sys /sysroot/sys不过仅改密码的话大多数情况下不需要。4. VMware虚拟机环境下的实操细节4.1 抢不到grub菜单怎么办延长启动延迟用VMware跑Linux虚拟机时最恼人的问题是系统启动速度太快grub菜单还没看清就闪过去了。尤其是UEFI引导的虚拟机grub菜单默认隐藏只在出现时停留几秒。有三种解决办法。第一种在VMware Workstation里编辑虚拟机设置找到“选项-高级”里面有一个“设置引导延迟”的选项单位是毫秒把它设为5000这样开机时会在引导阶段停顿5秒足够你进grub菜单了。第二种直接编辑虚拟机的.vmx配置文件在文件末尾加一行bios.bootDelay 5000如果虚拟机是UEFI引导的用efi.bootDelay 5000保存后重新启动虚拟机bootDelay参数生效。第三种启动虚拟机后立刻用鼠标点击虚拟机窗口然后不停按键盘的Esc或Shift键这个方法也有用但比较考验手速。在ESXi/vSphere上编辑虚拟机的“VM选项-启动选项”也可以设置“引导延迟”效果是一样的。实际操作中我建议优先用配置文件方案因为图形界面那个设置在某些版本里藏得比较深不够直观。4.2 从ISO救援模式兜底如果grub菜单彻底损坏或者磁盘引导分区出了问题rd.break根本进不去那么终极方案是用系统安装ISO做救援。在VMware里操作非常方便把ISO挂载到虚拟光驱重启虚拟机在BIOS/UEFI中让虚拟机从CD-ROM引导。以CentOS系统的ISO为例启动后选择“Troubleshooting”再选“Rescue a CentOS Linux system”按提示应答系统会把磁盘上的Linux根分区挂载到/mnt/sysimage。然后执行chroot /mnt/sysimage passwd root退出后按提示重启。这个方法在系统引导文件损坏时尤其好用因为ISO里自带了一份完整的救援环境。Ubuntu的ISO也类似启动界面里有“Try or Install Ubuntu”选项其实选择“Try Ubuntu”进入桌面后用终端挂载磁盘再chroot到里面同样可以重置密码。4.3 VMware里改完密码但仍进不去系统的排查顺序在VMware里重置密码后偶尔会遇到“密码是对的但就是登录不了”或“系统启动卡住”的情况。我的排查顺序是先看卡在哪里如果是卡在刷大量文件名那是SELinux relabel还没跑完等着就行。如果登录时提示认证失败先看是不是密码输错了或者键盘布局是不是被改成了别的语言。如果SSH远程登录失败但本地登录成功那很可能是SSH服务配置了PermitRootLogin no或PasswordAuthentication no这不是密码问题是SSH策略限制了root通过密码登录。当然在VMware里还有一个屡试不爽的终极保险——快照回滚。我在给客户虚拟机重置密码时每次都会先拍快照重置完验证没问题后再删除这个快照。这个习惯让我避免了好几次因为误操作导致的麻烦。5. Ubuntu/Debian及其他发行版的重置路径5.1 Ubuntu恢复模式最简单的方式Ubuntu用户在忘记root密码时我的首选是恢复模式recovery mode。重启虚拟机在grub菜单出现后按Esc或Shift取决于BIOS还是UEFI进入grub菜单选择第二项“Advanced options for Ubuntu”然后选择带有“(recovery mode)”字样的内核版本。进入恢复菜单后选择“root - Drop to root shell prompt”。系统此时会把根分区以只读方式挂载所以第一件事是mount -o remount,rw /然后直接重置密码passwd rootUbuntu默认的root用户是锁定的平时用sudo而不是直接登录root。重置密码后这个密码只用于su -切换到root的场景效果上没有影响。修改完成后输入exit退出选择“resume”继续启动或者直接重启。5.2 用init/bin/bash法兼容老版本或特殊系统如果你面对的Ubuntu/Debian版本比较老或者recovery mode菜单进不去可以像RHEL系那样在grub里直接编辑内核参数。找到以linux开头的行在行尾追加init/bin/bash然后Ctrlx启动。系统会直接进入一个root shell。如果发现根文件系统是只读的执行mount -o remount,rw /再运行passwd root完成后用exec /sbin/init或者reboot -f重启。注意Debian/Ubuntu上即使不用SELinux也可能有AppArmor但改密码这个场景一般不会受AppArmor影响所以安全性上比RHEL系要省心一些。5.3 其他系统的通用思路除了主流的CentOS和Ubuntu我还在一些国产系统、openEuler、AlmaLinux等发行版上做过密码重置。这些系统大多也是基于RHEL或Debian的所以方法可以平移基于RHEL的银河麒麟、openEuler、Rocky、AlmaLinuxrd.break老流程完全适用。基于Debian的恢复模式或init/bin/bash都行。如果不确定系统家族先进入grub编辑界面看内核参数行用的是linux还是linuxefi这能帮你判断用哪种姿势。有一个共通的原则先想办法进grub再想办法加维护参数最后进shell改密码。这个思路本身就足够“通用”。6. 常见故障与排查手记6.1 重置过程中最让人抓狂的报错我在实际操作中遇到过不少诡异问题整理成一张速查表希望你能提前避开。现象可能原因处理办法rd.break后挂载/sysroot提示只读没执行remount或者磁盘有异常重新执行mount -o remount,rw /sysroot若仍失败检查磁盘chroot后passwd命令报错chroot环境缺少必要的库或设备节点先挂载/dev、/proc、/sys到chroot环境再运行passwd改完密码重启后卡在SELinux relabel磁盘慢或文件系统大耐心等待如果特别慢可进单用户模式关掉SELinux再重启输入新密码提示“password too simple”系统有密码复杂度策略设置更复杂的密码或者用passwd交互式设置虚拟机UEFI引导下grub菜单不出现引导延迟太短或菜单被隐藏增加efi.bootDelay或启动时快速按Escpasswd成功后重启仍提示密码错误操作时改的不是真实根目录的shadow文件确认chroot到了/sysroot而不是在switch_root环境里直接跑了passwd登录时SELinux拒绝生成安全上下文没有touch /.autorelabel回到维护环境创建/.autorelabel后再重启这些故障里我认为最常见、也最隐蔽的是“改错了地方”。新手很容易在switch_root环境里直接执行passwd这样改的是initramfs里的临时用户信息跟磁盘上真实系统的/etc/shadow没有任何关系。所以记住chroot /sysroot之后再改密码这是整个操作的关键动作。6.2 密码改成功后SSH还是连不上这个问题经常被误判为“重置失败”尤其是对远程服务器或通过vSphere Web Client管理的虚拟机。密码重置成功、本地能登录但SSH就是连不上一般不是密码的问题。排查思路先看SSH配置检查/etc/ssh/sshd_config里的PermitRootLogin和PasswordAuthentication。很多系统为了安全会默认禁止root通过密码登录或者完全禁止root SSH。如果需要恢复远程登录可以在维护环境里调整这两个参数然后重启sshd。再看SELinuxRHEL系如果重置密码时没有做autorelabelroot的SSH上下文可能异常导致sshd拒绝加载root的认证配置。这时候可以用restorecon -Rv /root修复或者干脆等SELinux恢复标签完成。这类问题我在实际中遇到过不止一次每次都是靠看journalctl -u sshd日志找到端倪的。还有一个细节有些系统启用了PAM的pam_faillock多次输错密码会把账户临时锁定。如果重置后连续试几次错密码账户会被锁几分钟看起来就像“密码没改成”。等一会儿再试或者维护环境里清掉/var/run/faillock/目录下的记录就可以解决。6.3 快照回滚永远是你的底牌如果重置过程中出现了你搞不定的问题比如文件系统损坏、grub引导彻底崩溃最稳妥的做法不是深入研究怎么修复而是直接回滚到操作前的快照。用VMware Workstation时右键虚拟机-快照-恢复到快照即可。用ESXi的话在vSphere客户端里找到虚拟机-快照-恢复。这招在紧急情况下效率最高。我想强调一个习惯不要在一台没有快照的虚拟机上尝试重置root密码除非你已经做好重装系统的心理准备。这跟买保险一个道理用上的时候你才会庆幸当时顺手点了那个按钮。7. 重置完密码后的收尾与加固7.1 清理操作痕迹密码重置完成后维护环境里的操作会留下一些痕迹。如果这台机器是你自己的无所谓如果是帮客户处理的或者讲究合规的环境还是应该清理一下。检查/root/.bash_history看是否记录了passwd命令的操作记录。其实chroot环境下的bash_history一般不会记录到真实系统但如果你在真实root下敲过命令那就清理掉history -c cat /dev/null /root/.bash_history另外检查一下系统时间段的日志确认没有异常。如果是通过救援模式或ISO启动的谨防虚拟光驱还挂着安装ISO记得在VMware设置里断开ISO镜像防止虚拟机再次从ISO引导。7.2 防止再次遗忘日常管理建议重置密码后最重要的是避免三个月后又来一遭。我有几条实用建议。用密码管理器集中保存虚拟机凭据。哪怕只是一个小团队维护几台虚拟机整理一张密码表放在加密的密码管理工具里也比散落在聊天记录里强得多。给root账号配置SSH密钥登录。如果日常需要远程管理Linux虚拟机生成一对密钥把公钥放到/root/.ssh/authorized_keys里然后关闭root的密码登录。这样即使密码忘了只要密钥在就能进系统再重置密码不会陷入“进不去-无法重置”的死循环。而且SSH密钥相比密码安全性也高出几个量级。无论是CentOS、Ubuntu还是其他系统sudo权限的管理员账号也可以作为备用入口。日常使用一个普通账号通过sudo执行管理操作root密码偶尔忘了至少还能通过sudo去重置root密码。这也是Linux服务器最佳实践之一。7.3 一个简单脚本快速检查密码是否重置成功最后送一个我在重置密码后经常顺手跑一遍的小脚本在维护环境里执行用于确认几个关键文件没有异常awk -F: $1root{print $1: $2} /etc/shadow ls -l /etc/shadow /etc/passwd getenforce如果root行的密码字段不是!或*开头说明已经设置了有效密码。getenforce如果输出Enforcing说明SELinux还在强制模式记得确认/.autorelabel已经创建。这个小检查看起来不起眼但确实帮我避免过不少低级失误。最后补几句实际经验从我经手的这些案例来看重置虚拟机root密码这件事90%的情况用的是同一个套路进grub、加参数、挂载根分区、chroot、passwd。剩下的10%无非是在VMware环境细节和SELinux/AppArmor的坑里打转。你只要记住“快照先行、原理心里有数、步骤按顺序来”基本不会出大问题。我个人最想推荐的操作习惯是在任何一台需要长期保存的虚拟机上都把“引导延迟”这个参数提前配置好。这样重置密码时就不会遇到“grub菜单抢不到”这种纯手速问题而且日常调试内核参数、进单用户模式也都用得上。配置一次一劳永逸。
返回列表