Linux虚拟机root密码重置全攻略:rd.break、init=/bin/bash与快照实战
1. 重置 root 密码前先把原理和场景捋清楚1.1 什么情况下你会需要这个操作实话实说正常人不会天天闲着没事重置 root 密码。我统计了一下自己这些年真正动手的场景基本就这几类第一类是最常见的密码忘了。尤其是测试环境和临时搭建的虚拟机经常是装完系统设了个密码一两个月没用再登录的时候怎么都想不起来。第二类是密码过期公司内部的统一密码策略强制每 90 天改一次某个虚拟机没人管过期之后账号直接没法登录。第三类是交接场景维护的虚拟机很多团队里有人离职或者换岗按规矩需要把 root 密码换掉。还有一类是系统异常比如 /etc/shadow 文件损坏或者排查问题时需要进维护模式。这些场景的共同点很明确机器本身是你有权限管理的只是“登录凭证”暂时失效了。所以标题里说的“破解”说白了就是标准的密码重置属于应急恢复操作不是什么神秘的黑客技巧。1.2 VM 环境为什么比物理机好处理在物理服务器上重置 root 密码你得考虑带外管理卡、物理开机按钮、BIOS 引导设置、甚至要刻一张光盘或者做 U 盘启动盘。要是手边设备不全整个流程非常痛苦。虚拟机就完全不一样。首先开机画面就在你眼前的控制台窗口里你不存在“抓不到启动时机”的问题最多是多按几下键盘。其次GRUB 菜单、内核参数编辑这些操作全部可以直接在界面上完成。最关键的是虚拟机有快照功能。做任何改动之前拍一个快照哪怕把引导参数改得乱七八糟导致系统起不来一秒钟就能恢复原状。这在物理机上是不可能做到的。所以如果你还没在虚拟机里练过这个操作强烈建议专门开个测试虚拟机试一次。熟练之后下次真的把密码搞忘的时候内心一点都不会慌。1.3 一句话讲清楚重置原理Linux 系统在正常运行时root 密码的验证是由 login、PAM 和 /etc/shadow 文件共同完成的。重置密码的核心思路不是去“破解”那个加密后的哈希值而是绕过正常登录流程在系统引导阶段先拿到一个 root shell然后用 passwd 命令重新写入一个密码哈希到 /etc/shadow。引导过程大概是这样的BIOS/UEFI 启动 GRUBGRUB 加载内核和 initramfsinitramfs 把磁盘驱动和基础文件系统准备好之后再把控制权交给真正的根文件系统上的 systemd。在这个链路里有两个地方可以干预一个是 GRUB 菜单本身按 e 就能编辑内核启动参数。另一个是 initramfs 阶段dracut 提供了一个叫 rd.break 的调试参数可以让引导过程在“切换根”之前停下来给你一个 shell。这两个干预点就是下面所有方法的基础。2. 动手之前的准备和检查项目2.1 先拍快照别嫌麻烦我见过不少人密码忘了着急上火直接就去改 GRUB结果一顿操作下来系统起不来了。密码没找回来反倒多了一个需要修复的问题。所以无论你多急第一步永远是拍快照。VMware Workstation 里是 VM 菜单 → Snapshot → Take SnapshotVirtualBox 里是 Machine → Take Snapshot。快照本质上是一张“后悔药”它保存了当前磁盘状态而且是在虚拟机运行状态下也能拍。万一后面操作失误回到快照点重新来就是了整个过程不超过两分钟。这个习惯不只是针对密码重置凡是涉及引导、磁盘、系统文件的修改都建议先快照。对虚拟机来说这是成本最低的保险。2.2 确认三件关键信息不同发行版、不同版本重置密码的具体方法有差异动手前先花 30 秒确认下面几项检查项为什么要确认影响发行版和版本CentOS/RHEL 7 用 linux16 行8/9 用 linux 行Ubuntu/Debian 走恢复模式或 init/bin/bash决定你按哪个流程走根文件系统是否加密LUKS加密盘在引导时先要输入 LUKS 口令这个口令和 root 密码是两回事如果没有 LUKS 口令重置 root 密码的方法无效SELinux / AppArmor 状态RHEL 系默认 SELinux enforcing改完密码后可能需要重打标签决定你是否要执行 touch /.autorelabel另外确认一下你想改的到底是哪个账号。CentOS/RHEL、Debian 这类发行版root 是默认管理员账号Ubuntu 不一样默认安装时 root 是被锁定的日常管理员是第一个创建的用户。后面提到 Ubuntu 时我会特别说明。2.3 把新密码提前想好听起来像废话但现场就卡在这的人真不少。passwd 要求输入两次新密码紧张之下两次输入不一致或者第一次输入完才发现自己没想好都得重来。提前定一个复杂度足够的密码写进你的密码管理工具再开始操作。如果系统启用了密码强度策略RHEL 8 之后的 pwquality 默认要求长度不低于 8 且包含足够复杂度太简单的密码会被 PAM 拒绝。测试环境想图省事的人要么老老实实用强密码要么临时关掉策略后面常见问题里会提。3. CentOS/RHEL 系重置 root 密码rd.break 方法3.1 rd.break 到底做了什么rd.break 是 dracut 提供的 initramfs 调试参数。dracut 是 RHEL/CentOS 系生成 initramfs 的工具整个引导过程中的临时根文件系统就是它做的。给内核参数加上 rd.break 之后initramfs 在准备切换到真实根文件系统的最后一刻会停下来抛出一个 root shell。这个 shell 里面真实根文件系统已经被识别并挂载到了 /sysroot 目录你要做的就是把家搬到 /sysroot 里去然后正常执行 passwd。这个位置选得非常巧妙因为此时系统还没有进入正常的多用户环境也就没有登录验证这回事。3.2 七步操作流程整个流程大概三分钟我拆成七步在 VMware 或 VirtualBox 控制台里重启虚拟机。如果这是生产系统先走变更流程确认影响范围。出现 GRUB 菜单时默认光标停在第一个内核项上直接按 e 进入编辑模式。找到以 linux16 开头的行RHEL 8/9 是 linux。把行里的 ro 改成 rw然后在行尾空格加上 rd.break。按 CtrlX 启动。正常情况下不会进入登录界面而是出现 switch_root:/# 提示符。依次执行下面这些命令# 把真实根分区重新挂载为可写 mount -o remount,rw /sysroot # 进入真实根环境 chroot /sysroot # 修改 root 密码 passwd root # SELinux 系统需要重打标签防止重启后上下文异常 touch /.autorelabel连续输入两次 exit。第一次退出 chroot回到 initramfs 的 shell第二次退出后initramfs 会继续完成引导。如果 exit 后卡住或者出现 kernel panic不要慌直接在虚拟机管理界面强制重启即可因为密码已经写进磁盘了。系统正常启动后用新密码登录然后确认一切正常再考虑删除之前的快照。3.3 三个容易翻车的细节第一个是 ro 改成 rw 的意义。内核参数里默认是 ro表示以只读方式挂载根文件系统。在 initramfs 阶段真实根被挂载到 /sysroot如果不改 rw就需要额外执行 mount -o remount,rw /sysroot。两个方案效果一样我习惯直接改 rw就算后面忘了 remount 也不至于踩坑。第二个是 touch /.autorelabel。这个操作只对 SELinux enforcing 的系统有必要。因为在 chroot 环境里修改 /etc/shadow 时SELinux 的标签机制不会自动处理新写入的内容重启后 PAM 读 shadow 文件可能因为上下文不对而失败。touch 这个文件后系统会在下一次启动时对全盘重新打标签。缺点是多花一点启动时间但这是最稳妥的做法。第三个是 passwd 报错的情况。如果 passwd 提示 “Authentication token manipulation error” 或者 “can not update password file”通常和 PAM 策略或 chroot 环境不完整有关。这时候不用纠结直接用下面这条绕开 PAM 修改# 在 chroot 环境下执行 echo root:你的新密码 | chpasswdchpasswd 同样会走 PAM但报错率低一些。再不行就退出来用后面第 5 节讲的手工改 /etc/shadow 方法一定管用。4. Ubuntu/Debian 系重置密码恢复模式与 init/bin/bash4.1 Ubuntu 和其他发行版不一样的地方Ubuntu 默认把 root 账户锁掉了。安装系统时创建的那个用户是 sudo 用户日常提权干活的都是它。所以在 Ubuntu 里“忘记密码”通常分两种情况一种是 sudo 用户的密码忘了另一种是真的想把 root 密码设出来。如果是第一种你重置的应该是那个 sudo 用户而不是 root。root 密码即使重置了默认状态也无法直接登录。如果是第二种重置完 root 密码之后还要考虑是否修改 sshd 的 PermitRootLogin 配置否则远程 SSH 登录照样进不去。这些细节我建议操作前就想清楚。4.2 恢复模式Ubuntu 最顺手的路径Ubuntu 在 GRUB 里内置了恢复模式recovery mode这是一条官方预留的维护通道。操作如下重启虚拟机。出现 GRUB 菜单时按住 Shift 键BIOS 引导或者不断按 EscUEFI 引导确保菜单停住。选择 “Advanced options for Ubuntu”进入子菜单后选择带 recovery mode 的那一项。在恢复模式菜单里选择 root也就是 “Drop to root shell”。这个提权过程不需要输入密码。执行下面命令# 根文件系统此时是只读的先改成可写 mount -o remount,rw / # 重置 sudo 用户的密码把 username 换成你的账号 passwd username输入 exit 回到恢复菜单选择 Resume 继续启动然后用新密码登录。如果想顺便启用 root 登录可以在第 4 步执行 passwd root。注意 root 默认锁定状态会被 passwd 自动解除但 SSH 登录仍受 PermitRootLogin 配置限制。4.3 init/bin/bash通用性最强的兜底方案如果不走恢复模式或者某个版本的恢复模式进不去用 init/bin/bash 几乎通吃所有发行版。这个参数的意思是内核启动后不加载 systemd直接执行 /bin/bash。说白了就是跳过所有服务给你一个最干净的 root shell。操作如下GRUB 菜单按 e 进入编辑。找到 linux 行在行尾加上 init/bin/bash。CtrlX 启动进入 bash 提示符。# 根文件系统默认只读先改成可写 mount -o remount,rw / # 修改密码 passwd root # Ubuntu 下想改 sudo 用户密码就写具体用户名 passwd username # 强制同步磁盘数据 sync # 强制重启 reboot -f这里有个细节直接用 reboot 命令在最小环境下可能不生效或者起了一个不完整的 shutdown所以我建议 sync 之后用 reboot -f 强制重启。密码已经写入了 /etc/shadow强制重启对结果是安全的。4.4 Debian 的处理方式Debian 的默认情况和 CentOS 类似root 密码在安装时设置。忘记之后最简单的方法也是 GRUB 编辑加 init/bin/bash步棎和 4.3 一模一样。老一点的 Debian 7/8 可以在 GRUB 菜单按 e在 kernel 行末尾加 single回车启动后直接 passwd root。这个 single 参数在 systemd 时代对应的是 rescue.target效果类似但新版本里直接加 single 有时候会被忽略所以 CentOS 和 Debian 新版本我优先推荐 rd.break 和 init/bin/bash。5. 密码重置的备选方案Live CD 与磁盘直挂5.1 Live CD 救援模式如果 GRUB 本身坏了或者你搞不清 GRUB 怎么操作Live CD 是很好的备选方案。虚拟机的好处在于挂 ISO 镜像就像插入光盘一样方便。VMware 里给虚拟机设置 CD/DVD 设备选择“使用 ISO 镜像文件”指向一个系统安装盘的 ISO开机后按 F2/F12 选光盘引导就行。这一步在 VirtualBox 里对应“存储 → 控制器 IDE → 挂载 ISO”。进入 Live 环境后以 CentOS 为例在终端里找到根分区并挂载# 查看磁盘分区结构 lsblk # 如果根分区是 LVM需要先激活卷组 vgscan vgchange -ay # 挂载根分区sda1 或 mapper 路径以实际 lsblk 为准 sudo mount /dev/mapper/你的卷组-root /mnt # 做 chroot 前把设备目录绑进去 sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys sudo chroot /mnt /bin/bash passwd rootchroot 之后实际上就是进入了原来系统的根目录passwd root 和前面操作完全一样。处理完退出并卸载分区移除 ISO正常启动就行。5.2 把虚拟磁盘挂到另一台虚拟机这个是虚拟机特有的思路直接把出问题的虚拟磁盘文件VMDK/VDI作为第二块数据盘挂到另一台正常的虚拟机上然后在那台机器上动手修改。好处是不用碰原系统的引导完全避开了 GRUB 和内核参数的风险。挂上去之后在正常的系统里做三件事mount 需要改的分区、chroot、passwd。和 Live CD 的本质一样区别只是“修车工具”用的是另一台完整系统。这个方法还有个变体如果你的宿主机是 Linux 且装有 libguestfs 工具可以完全不启动虚拟机直接改磁盘# 直接修改指定虚拟机的 root 密码 virt-customize -d 你的虚拟机名 --root-password password:新密码VMware 的 VMDK 也能用 guestfish 工具离线修改。缺点是 libguestfs 对远端云盘支持一般但本地 VMware/VirtualBox 磁盘实测没问题。这个方法适合批量维护十几台机器一条命令就能改完。5.3 高级技巧直接手工修改 /etc/shadow最后这个方法适合那些连 chroot 都懒得做的人或者说 chroot 不可用时候的终极方案。root 密码在 /etc/shadow 文件的第一行格式长这样root:$6$j8...哈希值...:19618:0:99999:7:::冒号分隔的第二个字段就是密码哈希。先挂载根分区为读写然后用工具生成一个合格的新哈希# 生成 SHA-512 哈希按提示输入两次新密码 openssl passwd -6把生成的整个字符串复制出来替换掉 /etc/shadow 里 root 行的第二个字段。如果原字段以 ! 或 * 开头说明账号处于锁定状态直接用新哈希覆盖即可解锁。改完之后确保整行以冒号分隔的字段数量一致保存退出卸载磁盘启动系统。这个方法的门槛在于要清楚 shadow 文件格式操作错了系统可能直接无法登录。所以我一般只推荐在有 Live CD、又不想装 chroot 依赖的场景下使用。新手还是老老实实走前面几步别在一开始就挑战最高难度。6. 常见问题排查和避坑心得速查6.1 高频问题速查表现象可能原因解决办法GRUB 菜单一闪而过按 e 来不及系统设置 GRUB_TIMEOUT0 或菜单被隐藏开机瞬间不断按 Esc 或 Shift下次进入系统改 /etc/default/grub 里的 GRUB_TIMEOUTrd.break 后看到的是正常登录界面参数加到了错误的行必须加到 linux/linux16 开头的那一行末尾passwd 提示密码不满足策略pwquality 强度校验使用更长的强密码或在 chroot 下临时注释 /etc/pam.d/passwd 中的 pwquality 行修改后重启卡住或登录失败SELinux 上下文问题启动时在内核行加 enforcing0登录后执行 setenforce 1一次性的正确做法是 touch /.autorelabelUbuntu 恢复模式 root 提示要密码个别版本行为差异改用 init/bin/bash 方案修改后 SSH 还是登录不了sshd 禁止 root 或禁止密码登录控制台登录后检查 /etc/ssh/sshd_config忘了的是 sudo 用户密码不是 rootUbuntu 默认 root 锁定用恢复模式 passwd 用户名按 CtrlAltDel 没反应虚拟机把该组合键交给了宿主机VMware 用 VM 菜单 Send CtrlAltDel 或按 CtrlAltInsert6.2 几个只有实操才会知道的细节我实测下来有几个小细节写文档的人通常不会提。第一VMware 里 GRUB 菜单出现的那一两秒鼠标没点进虚拟机窗口是接不到键盘事件的。所以重启后第一件事是把鼠标点进虚拟机窗口再开始按键盘。这听起来很基础但真有人因为鼠标没聚焦而错过 GRUB。第二改了 ro 为 rw 之后如果在 switch_root 提示符下做 chroot注意你的当前目录是在 initramfs 环境不是真实根。一切对文件的修改都要在 chroot 之后进行否则改的是内存里的临时系统重启就没了。第三Ubuntu 恢复模式里的菜单顺序因版本而异但 root 那一项基本都在别在 network 和 fsck 上浪费时间。直接选中 root 回车。6.3 避免把系统改挂的纪律我在实验室里围观过不少同事操作总结出三条纪律。第一条进入 GRUB 编辑后尽量少删已有参数只做修改 ro→rw 和追加参数因为删掉某些参数可能导致系统缺驱动或无法挂载文件系统。第二条passwd 改完不要立刻 reboot -f先 sync 或者连续 exit 让系统正常走完流程只有卡死了才强制重启。第三条整个过程如果超过 10 分钟还没搞定直接恢复快照从头来不要反复试错因为试错的次数越多盘面状态就越不可控。7. 最后说几句实在话这个技能解决的是“我自己有权限管理的虚拟机登录凭证丢了”的应急问题。操作不复杂原理也透明但它不应该被用在别人的系统上。没有授权的前提下尝试任何密码绕过手段那性质就变了。从预防的角度说我自己的习惯是虚拟机一律开启 SSH 密钥登录root 密码存在密码管理工具里随机生成而不是设一个自己能记住的弱密码每年至少做一次密码轮换演练每次动系统前先拍快照。做到这几条忘记 root 密码的概率会很低即便真忘了三分钟也能拿回来。我个人实际处理过的最快一次是在 VMware Workstation 里的 CentOS 7 虚拟机从点重启到新密码登录全程不到三分钟。你要是也照着走一遍大概率会发现这比换个物理服务器电源还简单。