ARTICLE DETAIL

资讯详情

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

VMware虚拟机忘记root密码?GRUB单用户模式重置实操指南

VMware虚拟机忘记root密码?GRUB单用户模式重置实操指南 1. 虚拟机忘记root密码先别急着重装系统做运维或者搞开发环境的朋友应该都有过这种经历一台VM虚拟机里的Linux系统放了一段时间没动等再想起来要进去配点什么的时候发现root密码怎么都想不起来了。尤其是测试环境、临时搭的实验机密码往往不是用统一台账管理的随手设一个test123之类的过两周就忘得一干二净。遇到这种情况很多人的第一反应是重装系统或者想尽办法去找当初的安装文档。其实完全没必要虚拟机的系统密码重置在技术上比物理机要简单得多因为我们可以绕过物理机的很多限制直接通过宿主机层面介入系统引导过程。而且VMware虚拟机在这个场景下有一个天然优势在开机引导时通过编辑GRUB参数进入单用户模式就能直接重置root密码。这个操作本质上不算破解更准确的说法是密码重置前提是你对这虚拟机的确有合法的管理权限。我下面要讲的方案适用于VMware Workstation、VMware vSphere/ESXi里运行的Linux虚拟机包括CentOS、RHEL、Ubuntu、Debian这类主流发行版也适用于大部分基于GRUB引导的系统。整个过程不需要额外工具不烧录光盘不需要PE镜像只需要你有虚拟机的宿主机控制台权限。先说清楚适用范围和边界后面各章节再详细展开。2. 为什么虚拟机能轻松重置密码引导链路与物理机差异要理解为什么虚拟机的密码重置比物理机容易得先搞清楚系统在启动过程中密码校验发生在哪个环节。Linux系统的root密码校验发生在内核启动完成、init进程接管系统之后。也就是说密码是操作系统层面的认证不是BIOS/UEFI层面的东西。物理机上你想绕过它得在开机时打断引导流程但物理机有Secure Boot、有磁盘加密LUKS、有各种硬件层面的保护操作起来相当麻烦稍有不慎就把系统搞坏了。虚拟机则不同。VMware给虚拟机提供了一套虚拟化的硬件环境你可以随时在虚拟机设置里调整引导顺序、挂载ISO镜像、甚至直接进入固件设置。更关键的一点是虚拟机开机时你可以通过Console窗口直接与GRUB引导菜单交互而不需要像物理机那样掐着键盘抢启动时间。这意味着你有充足的时间去打断引导过程、编辑启动参数。从本质上看重置密码的操作链路是这样的虚拟机Power On - BIOS自检 - GRUB引导菜单 - 编辑启动参数 - 内核启动 - init接管 - 进入单用户/紧急模式 - 挂载根文件系统 - 执行passwd命令 - 重置密码 - 重启关键点在于第三步和第七步。GRUB菜单允许你临时追加内核启动参数这相当于你在系统完全启动前获得了一次指挥权单用户模式下系统只挂载必要的文件系统不启动网络服务、不加载其他守护进程直接给你一个root shell。这里要特别强调一个前置条件如果是vSphere/ESXi环境里加了TPM设备、启用了磁盘加密的虚拟机重置的过程会涉及密钥释放的问题复杂度会上升。但在绝大多数普通VMware虚拟机里没有这层保护所以下面的操作方法就是最常用、最直接的一种。还有一个很容易被忽略的点虚拟机快照。如果这台虚拟机之前打过快照重置密码之前最好先确认一下当前的快照状态。万一操作过程中出了什么问题快照可以秒回滚比任何抢救手段都管用。我自己的习惯是做任何系统级修改之前先对虚拟机做一次快照或者备份VM文件这属于基本功。3. 核心操作两种重置root密码的可行路径进入正题。下面两种方法我都实际用过适用场景略有不同但目的都一样拿到root shell重置密码。3.1 方法一GRUB引导时以single模式进入这是最经典的方法很多人叫它单用户模式。适用系统CentOS 6/7、RHEL 6/7、老版本Ubuntu使用GRUB2引导的系统基本都支持。操作流程在VMware Workstation中启动虚拟机等到出现GRUB引导菜单时一般开机后1-2秒内用键盘上下键选中默认的内核条目通常是第一项按e进入编辑模式。找到以linux16或linux开头的那一行。这一行很长包含内核镜像路径和一堆启动参数。在这一行的末尾加上single参数或者再加一个rd.break详见方法二。也可以不加single而是加s或1效果是一样的都是告诉内核以单用户模式启动。按CtrlX或者F10启动。系统会跳过常规的登录认证直接进入一个shell提示符。此时根文件系统通常是只读挂载的需要重新以读写模式挂载mount -o remount,rw /执行passwd修改密码passwd root如果是CentOS 7等带有SELinux的系统系统提示SELinux is preventing...之类的报错时需要先处理SELinux标签问题touch /.autorelabel重启虚拟机exec /sbin/init或者reboot -f这个方法在CentOS 7上很好用但在Ubuntu 18.04以上版本里single参数并不一定会给你弹出root shell因为systemd对单用户模式做了调整。这时候需要换一种方式。3.2 方法二使用rd.break参数打断initramfs阶段这个方法本质上是针对systemd接管后单用户模式行为变化而设计的。它的原理是在initramfs初始内存文件系统阶段暂停启动流程在真正的根文件系统被切换到/chroot之前给你一个shell。适用系统CentOS 7/8、RHEL 7/8、Rocky Linux、Ubuntu 18.04、Debian 9。操作流程启动虚拟机在GRUB菜单出现时按e进入编辑模式。找到以linux旧版本可能是linux16开头的那一行在行尾加上rd.break参数。如果你用的方法一不好使可以尝试直接加rd.break而不是single。按CtrlX启动。系统会在initramfs阶段中断出现类似switch_root:/#的提示符。此时根文件系统还没切换过来但挂载点在/sysroot目录下。先以读写模式重新挂载mount -o remount,rw /sysroot切根chroot /sysroot修改密码passwd root关键一步如果开启了SELinux需要更新安全上下文。在CentOS 7/8中执行touch /.autorelabel如果是RHEL 8/Rocky Linux可以在chroot后直接检查一下SELinux状态必要时手动执行restorecon /etc/shadow。退出chroot并重启exit reboot两种方法对比来看对比项方法一single方法二rd.break适用系统老版CentOS/RHEL部分UbuntuCentOS 7/8新版Ubuntu/Debian复杂度较低中等稳定性看系统版本新版systemd下有失效风险更通用对SELinux的兼容性需处理autorelabel需处理autorelabel实质原理跳过正常init流程直接进shell在initramfs阶段打断手动chroot我个人建议从方法二开始尝试。因为很多现代Linux发行版对single模式的响应已经不如以前那么直接了而rd.break是RHEL/CentOS官方文档里明确记载的恢复方式更符合当前主流系统。3.3 补充进入GRUB菜单失败的快速自救实际操作中最让人抓狂的不是进去之后不会改密码而是压根进不了GRUB菜单。有的虚拟机关闭了引导菜单的显示等待时间或者GRUB配置里GRUB_TIMEOUT被设成了0开机直接跳过菜单。这种情况下有两个办法第一个是在VMware虚拟机Power On时用鼠标快速点击Console窗口然后反复按Esc键有时候能强制显示GRUB菜单。但这个方法成功率不高。第二个是把虚拟机的CD/DVD挂载一个Linux救援镜像通过救援模式进入系统。但这需要你有对应的安装ISO操作更繁琐。所以我更推荐另一种方式在VM设置里调整固件引导类型如果从UEFI改成BIOS或反过来某些虚拟机在引导方式切换后GRUB菜单会重新显示出来。不过这个操作有点看人品而且修改引导类型可能导致引导失败需要配合LiveCD修复。如果真到了这一步我的经验是直接挂载一个对应发行版的安装ISO用救援模式进去改密码反而更省心。4. 实战案例CentOS 7.9虚拟机密码重置全过程下面用一台实际环境中的CentOS 7.9虚拟机走一遍完整流程把每一步的界面表现和注意事项都记录下来。这台虚拟机跑在VMware Workstation 17上2核4G配置磁盘40G系统分区采用LVM/boot单独分区。4.1 开启虚拟机进入GRUB编辑界面开机后在虚拟机窗口内点击一下确保键盘焦点在虚拟机上然后快速连续按上下方向键。如果GRUB配置里等待时间比较长默认5秒你都不用抢等它显示菜单时按e就行。进入GRUB界面后可以看到类似下面这样的内容setparams CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core) load_video set gfxpayloadkeep insmod gzio insmod part_gpt insmod xfs ... linuxefi /vmlinuz-3.10.0-1160.el7.x86_64 root/dev/mapper/centos-root ro crashkernelauto rhgb quiet initrdefi /initramfs-3.10.0-1160.el7.x86_64.img在UEFI引导的虚拟机上显示的是linuxefi而不是linux。这是一个容易踩坑的细节很多人习惯了CentOS 6时代的linux16到了CentOS 7 UEFI环境看到linuxefi就不知道往哪加参数了。其实键位都一样移动到那一行末尾加参数即可。4.2 注入rd.break参数本次使用的方法把光标移到linuxefi那一行末尾此时是ro crashkernelauto rhgb quiet。我直接把这几个参数改了ro改成rw这个很有用后面不用手动remount了去掉rhgb quiet去掉图形启动和安静模式可以看到详细的启动输出方便诊断末尾追加rd.break修改后这一行看起来像这样linuxefi /vmlinuz-3.10.0-1160.el7.x86_64 root/dev/mapper/centos-root rw crashkernelauto rd.break按CtrlX启动。这一步的预期结果屏幕上滚动一堆系统启动日志然后停在一个类似switch_root:/#的提示符。这台机器大概等了20秒左右才停下来中间有个别地方看起来像报错红色的[FAILED]字样但不用慌张只要最后停在了switch_root:/#就是正常的。4.3 chroot挂载根文件系统修改密码在switch_root:/#提示符下依次执行mount -o remount,rw /sysroot chroot /sysroot passwd root因为我在GRUB参数里已经把ro改成了rw第一步实际上可以省略但写在这里是为了让大家知道标准操作是什么样的。进入chroot后当前路径会自动切到/然后执行passwd修改密码。这里有一个值得注意的地方passwd要求输入两次新密码并且会做强度校验。如果密码太简单比如少于8位或者是纯数字序列CentOS 7默认会拒绝。但这是终端环境下的PAM限制如果你就是想要一个简单的测试密码可以先用passwd设置一个合规密码等系统重启后用chage或者直接改/etc/shadow再简化。不过我建议别贪图简单root密码还是有点强度比较好。4.4 SELinux上下文刷新退出chroot前需要根除SELinux带来的麻烦。如果你在chroot状态下执行过passwd/etc/shadow文件的SELinux标签可能会被错误设置导致重启后系统虽然密码对了但SELinux拒绝某些进程访问shadow文件。处理方法有两种第一种是在chroot状态下输入touch /.autorelabel然后退出重启。系统会在下次启动时重新标记所有文件的安全上下文这个过程耗时较长取决于磁盘大小和文件数量这台40G的虚拟机花了大概3分钟。第二种是只针对shadow文件做恢复restorecon -v /etc/shadow这种方法更快但对于不熟悉SELinux命令的朋友来说直接touch /.autorelabel更稳妥通用性更强。我在实际过程中选择了第二种因为系统文件不多重启一次更省事。4.5 重启系统验证新密码退出chrootexit然后执行reboot。有朋友可能会问这时候还在switch_root环境直接reboot安全吗答案是可以的systemd会正常处理这个阶段的重新引导。虚拟机重启后使用新密码登录root验证成功。整个过程中没有出现SELinux报错也没有文件系统异常。从虚拟机开机到登录成功含自动标签刷新在内总共耗时不到5分钟。5. 破解过程中的失败案例与排查链路前面讲的是顺利的情况但现实中总有意外。下面分享几个我实际踩过的坑以及对应的排查思路。这些内容都是常规文档里不会细写的但对想自己动手的朋友来说价值最大。5.1 问题一执行CtrlX后虚拟机直接卡在GRUB命令行了症状修改完启动参数后按CtrlX屏幕没有进入正常的启动流程而是出现了一个grub提示符。原因分析这通常不是你操作的问题而是GRUB环境本身损坏或者输入了无法识别的参数。比如在某些安装了多个内核的系统上如果你误删了启动行里的关键参数比如rootGRUB会直接放弃加载进入命令行等待用户手动操作。排查思路在grub提示符下输入ls看看GRUB能否识别到磁盘和分区如果识别正常可以用linux和initrd命令手动指定内核和initramfs再执行boot。但这个过程需要对GRUB语法很熟悉对新手不友好我的建议如果诊断超过5分钟还没有头绪果断关掉虚拟机检查VM配置文件.vmx里是否有不正常的引导设置或者直接用安装ISO的救援模式进去别在GRUB命令行里耗时间。5.2 问题二single模式进入后执行passwd报错Authentication token manipulation error症状通过single参数进入了单用户模式mount -o remount,rw /也成功了但执行passwd时报了这个错误。原因分析这个错误在CentOS 7中很常见核心原因是系统的认证模块PAM配置在了只读文件系统上或者系统时间异常导致的kerberos校验失败。在单用户模式下某些PAM模块可能依赖的网络服务不可用导致密码写入失败。排查和解决办法先检查是否真的以读写方式挂载了根分区mount | grep / 确认rw标志存在尝试直接编辑shadow文件绕过passwd命令vi /etc/shadow找到root:开头的一行把第二个字段密码哈希部分清空变成root::0:99999:7...保存退出然后重启。这样系统不会询问密码登录后立即设置新密码。但这个方法有安全风险操作完要马上设置新密码。另外有一个冷门坑如果系统启用了SELinux的password-auth策略在单用户模式下可能因为无法读取到某些selinux上下文而失败。这时候在单用户shell里执行setenforce 0临时关闭SELinux再执行passwd成功率大幅提升。5.3 问题三rd.break后chroot成功但系统重启后新密码不正确症状在rd.break环境里执行了chroot和passwd显示修改成功了。但重启后用新密码登录系统提示密码错误。原因分析这是最隐蔽的坑之一。在rd.break模式下如果你没有正确退出系统可能根本没有保存你对/etc/shadow的修改到磁盘。特别是当你只执行了exit而没有执行reboot、或者虚拟机在修改后直接强退时写缓存没有落盘一切努力白费。另一个可能原因是你进的是旧内核的rd.break环境而系统默认启动的是另一个内核两者的/etc/shadow属于同一个根文件系统按理说不会出现不一致。但如果你在某个chroot阶段误操作把根挂载到了错误的位置就可能出现改了A盘的shadow启动看的B盘shadow这种怪异现象。排查思路在rd.break环境里每次修改完密码后执行sync强制落盘确认挂载情况df -h看根文件系统是不是挂在/sysroot下有没有重复挂载如果用的是LVM检查是否有多个逻辑卷都包含了root文件系统是否错误挂载到了旧卷6. 重置完成后的收尾工作清单密码改完不代表事情就结束了。一个负责任的运维人员不会就这么把虚拟机丢回去继续跑。以下收尾工作每项都是我经历过实际教训后总结出来的。6.1 检查日志与安全审计重置密码这件事本身会在系统日志里留下痕迹虽然你是在emergency mode下操作的但日志记录依然存在。journalctl --sincetoday | grep -i passwd\|su\|sudo这条命令可以看到当日和密码修改相关的日志。如果你所在的环境有等保要求或者审计要求重置密码后的48小时内要特别关注这台虚机的登录日志防止因为密码变更导致某些自动化任务运行失败。6.2 确认SSH密钥和定时任务是否受影响密码重置本身不会动到SSH密钥和crontab但要注意两点第一如果这台虚拟机上有依赖密码认证的自动化脚本比如Ansible用password类型的ssh连接新密码需要同步更新到对应的凭据库否则下一个自动化任务就会因为认证失败而报警。第二检查cron任务。如果某些定时任务涉及加密解密或者使用了旧密码相关的凭据在重置密码后可能连锁触发失败。实际案例中一台机器因为root密码被重置导致其上的备用备份脚本脚本内嵌了旧密码的加密串无法执行直接影响了增量备份的连续性。6.3 如果开启了账号锁定策略检查账户状态有的系统配置了账户锁定策略比如/etc/security/faillock.conf、pam_faillock短时间内多次输错密码会临时锁定root账户。重置密码后要检查一下root账户是否处于锁定状态passwd -S root如果显示L或者LK执行解锁passwd -u root这个坑我在生产环境踩过一次。当时用rd.break重置了root密码重启后怎么输都说密码错误后来一查才发现是之前测试密码猜测次数过多触发了PAM锁定密码重置没影响锁定状态解锁后立刻就能登录了。6.4 关于快照和备份策略的一句话提醒前文提过操作前最好有快照。操作完成后确认系统正常运行了至少24小时再删掉这个快照。如果这台虚拟机承载着重要数据平时也应该定期把VM文件备份出来而不只是依赖VMware的快照功能——快照不是备份这是很多新手容易混淆的。7. 扩展思考不同发行版与云环境下的密码重置变体机制理解了你会发现密码重置这件事能组合出很多变体。选一个维度展开说说因为不同环境下的操作思路还是有比较大的差异。7.1 新版RHEL系RHEL 8/9、Rocky Linux、AlmaLinux这些系统走的还是rd.break的路线但有一个新变化RHEL 9开始默认启用了TPM 2.0和UEFI Secure Boot如果你在VMware里给虚拟机加了TPM设备rd.break阶段可能需要处理密钥释放的问题。如果你只是简单使用而不加密磁盘这个层面碰不到。另外RHEL 9在GRUB层面做了调整linuxefi命令变成了linuxEFI统一化但编辑方式还是老一套。实测下来rd.break在RHEL 9上依然可以正常进入switch_root环境。7.2 Ubuntu/Debian系的差异Ubuntu 18.04之后的系统single参数基本失效正确的方式是在GRUB的linux行末尾加init/bin/bash然后直接进入bash。但这个方法有个弊端它跳过的是所有systemd服务挂载根文件系统的方式比较粗放可能在CentOS上和LVM配合不佳。更稳妥的做法是用rd.break或者直接改recovery模式。Ubuntu还有一个Ubuntu专属的坑如果根文件系统是btrfs或者LVMinit/bin/bash后需要手动确认挂载情况btrfs的subvol有时会只挂载了顶层而数据不可见。这个坑我还没实际踩过但接触过几个求助案例后要提醒一句手动挂载文件系统时永远先ls看一眼目录结构别急着干下一步。7.3 云环境与虚拟化的类比云上的Linux云主机遇到root密码遗忘处理方式和VMware虚拟机类似但入口不同。阿里云、腾讯云这类云平台一般提供了重置密码的控制台功能原理是云平台在底层可以直接挂载系统盘到救援实例然后修改shadow文件。这和我们在VMware里做的chroot本质上是同一个思路绕过系统的正常运行在维护者模式下修改认证数据。理解了这层原理你就明白了为什么云平台的控制台重置密码往往要求先关机——因为需要在挂载层面操作磁盘而运行中的系统无法安全地修改磁盘上的shadow文件。8. 事后总结这套操作的本质与边界回到标题本身VM虚拟机系统密码的破解在技术上不算高深但它背后的系统引导逻辑、chroot机制、SELinux标签维护等内容反而是值得花时间吃透的。很多人照着网上教程操作一次成功了就以为会了但换个发行版、换个引导方式、加个加密磁盘就又懵了原因就是没搞懂原理。我再强调一次安全边界这篇文章的所有操作只适用于你有合法管理权的虚拟机和系统。公司环境里重置密码可能要走审批流程生产环境里亮机密码变更要提前通知相关同事避免业务受到影响。密码重置不是娱乐项目而是一项需要规范操作的运维动作。最后给一个小建议把每一次密码重置的过程记录下来包括虚拟机名称、时间、原因、操作人、新旧密码的变更方式。半年之后你回看这些记录会发现这比任何运维教程都有价值。密码这种东西临时记性靠不住管理台账才能扛得住时间。
返回列表