第一章:核心原理(理解为什么能成功)
在重置密码前,需要理解 Linux 的启动与认证机制:
-
GRUB2 引导器:系统启动时第一个可交互的界面。我们可以通过修改内核启动参数进入特殊模式。
-
Initramfs (初始根文件系统):内存中的临时根环境。我们可以在它加载真正的硬盘根目录之前,介入系统。
-
rd.break 参数:内核参数。告诉系统在进入正式根目录前“打断”启动过程,此时硬盘上的真实根分区被挂载在
/sysroot下。 -
selinux 重标记:如果启用了 SELinux,修改密码文件后必须触发自动重标记,否则无法登录。
第二章:准备工作
2.1 虚拟化平台控制台访问
-
VMware Workstation:开启虚拟机,在启动画面迅速点击屏幕并按方向键。
-
vSphere (ESXi):通过 Web 控制台或 VMRC。
-
VirtualBox:直接点击显示窗口。
-
KVM/libvirt:使用
virsh console或 virt-viewer。
2.2 必要的手速
-
必须在 GRUB 菜单出现后的 2-3 秒内 按下
e键(编辑模式)。 -
如果错过:强制重启虚拟机(虚拟机环境安全,可直接重置电源)。
第三章:快速重置法(rd.break)—— 90%场景推荐
这是最标准、最安全的方法。
步骤 1:进入 GRUB 编辑界面
启动虚拟机 → 出现 CentOS 菜单(黑色背景,白字) → 按 e。
步骤 2:找到内核启动行
找到以 linux16 或 linuxefi 开头的行(通常在 vmlinuz-xxx 后面)。
步骤 3:添加 rd.break 参数
在该行的末尾,空格后输入:
bash
rd.break
(可选,但推荐添加:rd.break console=tty0 防止控制台问题)
步骤 4:启动进入救援模式
按 Ctrl + X 或 F10 启动。
此时你会进入一个紧急 shell,提示符类似:
bash
switch_root:/#
步骤 5:重新挂载根分区为可写
默认 /sysroot 是只读挂载的。必须改为读写:
bash
mount -o remount,rw /sysroot
验证:mount | grep sysroot 应显示 rw。
步骤 6:切换根目录
bash
chroot /sysroot
此时提示符变为 sh-4.2#,你现在真正进入了硬盘上的操作系统。
步骤 7:重置 root 密码
bash
passwd root
输入两次新密码(注意:输入时屏幕无任何显示,正常现象)。
步骤 8:处理 SELinux(关键!)
-
如果系统曾开启 SELinux(默认 CentOS 开启):
bash
touch /.autorelabel
这会在下次重启时自动重标记整个文件系统,耗时几分钟。
-
如果确定 SELinux 是 disabled:
跳过此步骤。
步骤 9:退出并重启
bash
exit # 退出 chroot exit # 退出 switch_root(或 reboot -f)
或直接:
bash
reboot -f
成功:使用新密码登录 root。
第四章:备选方案(传统 init=/bin/bash)
当 rd.break 因某些内核问题不可用时。
-
同第三章步骤1、2。
-
在内核行末尾添加:
bash
init=/bin/bash
-
Ctrl+X启动。 -
此时直接进入单用户 bash(根分区只读):
bash
mount -o remount,rw / passwd root
-
SELinux 处理(同上):
bash
touch /.autorelabel
-
重启:
bash
exec /sbin/init
第五章:极端情况排错(2万字中的精华部分)
5.1 键盘布局导致密码输入错误?
在 passwd 之前执行:
bash
loadkeys us
(虚拟机通常美国键盘)
5.2 忘记密码且系统启用了 FIPS 模式?
FIPS 会校验密码文件完整性。修改密码后必须:
bash
touch /.autorelabel
否则重启后提示“Authentication token manipulation error”。
5.3 虚拟机提示“Give root password for maintenance”?
这表示根分区损坏(fsck 失败)。先修复磁盘:
bash
fsck /dev/mapper/centos-root -y
然后按上述方法重置。
5.4 使用 LVM + 加密磁盘 (LUKS)?
在 rd.break 之前需要先解密:
-
GRUB 行末尾添加
rd.luks.uuid=<UUID> -
进入 shell 后:
bash
cryptsetup luksOpen /dev/sdaX luks-root mount /dev/mapper/luks-root /sysroot
后续步骤相同。
5.5 VMware 虚拟机启动太快,按不到 e 键?
-
方法A:在虚拟机 BIOS 中增加“启动延迟”(Boot Delay)。
-
方法B:使用 VMware 发送“Ctrl+Alt+Del”强制中断启动。
-
方法C(推荐):修改
/etc/default/grub永久显示 GRUB 菜单(提前配置):bash
GRUB_TIMEOUT=10 GRUB_HIDDEN_TIMEOUT=10
5.6 重置后依然“密码错误”?
原因1:键盘映射问题(远程控制台发送了不同键码)。
解决:尝试 sh-4.2# passwd 时使用纯字母数字密码,避开特殊符号。
原因2:SELinux 阻止了 shadow 文件修改。
解决:重启时在 GRUB 行临时添加 selinux=0,进入系统后手动执行 restorecon -v /etc/shadow。
第六章:安全加固(防止下次再忘 & 防止他人恶意重置)
6.1 防止物理/控制台重置
GRUB 设置密码(防止任意编辑内核参数):
bash
grub2-setpassword
重启后,按 e 需要输入 root 密码。
6.2 审计日志
检查谁重置过密码:
bash
ausearch -m USER_CHAUTHTOK -i
6.3 制作救援策略
-
配置
sudo给一个普通用户。 -
部署 Puppet/Ansible 定期备份
/etc/shadow。
第七章:虚拟机特有的注意事项
| 虚拟机平台 | 特别注意 |
|---|---|
| VMware | 快照回滚是最快恢复方式。重置前建议先拍快照。 |
| Hyper-V | 关闭“安全启动”可能影响某些自定义内核。 |
| VirtualBox | 控制台窗口缩放可能导致键盘中断失效,用 Host+Home 发送 Ctrl+Alt+Del。 |
| 云虚拟机 (ECS) | 大部分云厂商提供“救援模式”或“VNC 连接”,直接在网页控制台操作。 |
第八章:完整命令速查表(复制即用)
场景 A:标准 rd.break 重置
bash
# 在 GRUB 行末尾添加: rd.break mount -o remount,rw /sysroot chroot /sysroot passwd root touch /.autorelabel exit reboot -f
场景 B:完全自动化的重置脚本(需预先放在 initramfs 中)
(略,但原理同上)
结论
对于 CentOS 虚拟机忘记 root 密码,最安全快速的流程是:
GRUB e 键 → 添加 rd.break → Ctrl+X → mount -o remount,rw /sysroot → chroot /sysroot → passwd root → touch /.autorelabel → reboot -f
成功率接近 100%,且不会影响任何业务数据或配置。
VMware ESXi 下的 CentOS Stream 9 + LUKS + TPM2 密码重置:超详细分步版
前言:为什么这个组合最复杂?
普通虚拟机忘记 root 密码,标准的 rd.break 方法就能搞定。但当你面对的是 CentOS Stream 9 + LUKS 全盘加密 + TPM2 自动解锁 时,情况完全不同:
-
LUKS 加密层:在进入系统之前,必须先解密根分区——这意味着你无法直接进入
rd.breakshell -
TPM2 自动解锁:系统本来设计成“无感启动”,你从来没输入过密码,或者只有 TPM 存储的密钥
-
CentOS Stream 9:使用较新版本的 systemd 和 dracut,与 CentOS 7 有些差异
本教程分为 三个递进方案,建议按顺序尝试。
第一部分:准备工作与前置诊断
1.1 确认你的加密配置类型
在开始之前,需要判断你的系统属于哪种情况。在 VMware ESXi 控制台中,观察启动过程:
| 启动时现象 | 你的加密类型 | 推荐方案 |
|---|---|---|
| 出现“Enter passphrase for hd0”或类似提示 | LUKS 密码解锁 | 方案一(你有密码)或方案二(你没有密码) |
| 无任何提示,直接启动到 GRUB → 系统 | TPM2 自动解锁 | 方案三 |
| 启动到 GRUB 后卡住,提示找不到根设备 | LUKS + TPM 配置损坏 | 方案二/三结合 |
1.2 VMware ESXi 控制台操作要点
在 ESXi 环境下操作,注意以下几点:
-
打开 Web 控制台:在 vSphere Client 中,右键虚拟机 → 打开控制台
-
发送 Ctrl+Alt+Del:控制台菜单栏选择“发送键” → Ctrl+Alt+Del(或使用快捷键)
-
BIOS 启动延迟:如果按不到 GRUB 菜单,编辑虚拟机设置 → 虚拟机选项 → 引导选项 → 勾选“强制 BIOS 设置”并增加引导延迟
1.3 需要准备的物品
-
CentOS Stream 9 Live ISO(或任何包含 LUKS 工具的 Linux Live CD,如 Ubuntu Live)
-
在 VMware 中挂载 ISO:编辑虚拟机设置 → CD/DVD 驱动器 → 选择 ISO 文件
方案一:你知道 LUKS 解密密码(最直接)
适用场景:系统启动时你需要输入 LUKS 密码,但现在忘了 root 密码,但还记得 LUKS 密码。
第 1 步:进入 GRUB 编辑模式
-
在 ESXi 控制台中重启虚拟机
-
出现 GRUB 菜单时(蓝色/黑色背景),立即按
e键进入编辑模式 -
如果 GRUB 菜单不显示,在重启后立即按住 Shift 键(部分版本需要按 Esc)
第 2 步:修改内核启动参数
找到以 linux 开头的那一行(通常在 vmlinuz 之后),在行末添加以下参数:
bash
rd.break
完整示例(你的实际内容会不同):
bash
linux /vmlinuz-5.14.0-162.6.1.el9.x86_64 root=/dev/mapper/cs-root ro crashkernel=1G-4G:192M rd.lvm.lv=cs/root rd.luks.uuid=luks-xxxxx rd.break
第 3 步:启动到救援模式
按 Ctrl+X 或 F10 启动系统。
第 4 步:解密 LUKS 分区(关键步骤!)
由于根分区是加密的,/sysroot 此时还不可用。你需要手动解密:
bash
# 查看 LUKS 加密分区 lsblk # 输出示例:nvme0n1p3 或 sda3 类型为 crypto_LUKS # 解密分区(替换为你的加密分区设备名) cryptsetup luksOpen /dev/nvme0n1p3 root
此时系统会提示你输入 LUKS 密码。输入正确后,解密后的设备会在 /dev/mapper/root 出现。
第 5 步:挂载并 chroot
bash
# 挂载解密后的根分区 mount /dev/mapper/root /sysroot # 以读写方式重新挂载 mount -o remount,rw /sysroot # 切换根目录 chroot /sysroot
第 6 步:重置 root 密码
bash
passwd root
输入两次新密码(屏幕无显示,正常现象)。
第 7 步:处理 SELinux
bash
touch /.autorelabel
第 8 步:退出并重启
bash
exit # 退出 chroot exit # 退出 switch_root reboot -f
预期结果:系统重启后,使用新密码登录 root。
方案二:你不知道 LUKS 密码,但有 Live CD(万能方案)
适用场景:LUKS 密码也忘了,或者 TPM 自动解锁失效。
第 1 步:挂载 CentOS Stream 9 Live ISO
在 VMware 虚拟机设置中:
-
编辑虚拟机 → CD/DVD 驱动器 → 选择 CentOS Stream 9 Live ISO
-
勾选“连接”和“启动时连接”
-
进入 BIOS(开机按 F2),将 CD/DVD 设置为第一启动项
第 2 步:进入 Live 环境
从 ISO 启动后,选择“Try CentOS Stream”进入 Live 桌面环境。
第 3 步:识别加密分区
打开终端,执行:
bash
# 查看所有分区 sudo lsblk -f # 找到标记为 crypto_LUKS 的分区 sudo blkid | grep LUKS
记下加密分区的设备名,例如 /dev/sda3 或 /dev/nvme0n1p3。
第 4 步:暴力破解/恢复 LUKS 密码(如果你完全忘记了)
重要提示:LUKS 设计上无法绕过密码!如果你完全没有密码,以下方法只能尝试恢复:
方法 A:尝试所有可能的密码变体
bash
# 尝试用密码短语文件批量测试
for pwd in "password1" "password2" "your-guess"; do
echo -n "$pwd" | cryptsetup luksOpen --test-passphrase /dev/sda3 && echo "Found: $pwd"
done
方法 B:检查是否保存了恢复密钥
bash
# 如果系统有备份,可能在以下位置 ls -la /boot/ ls -la /etc/luks/
如果实在无法解锁 LUKS:数据无法恢复!这就是加密的代价。需要重装系统。
第 5 步:解锁 LUKS(假设你有密码)
bash
# 创建挂载点 sudo mkdir -p /mnt/root # 解密并映射 sudo cryptsetup luksOpen /dev/sda3 root # 挂载解密后的卷(可能是 LVM) sudo lvscan # 查看逻辑卷 sudo mount /dev/mapper/cs-root /mnt/root
第 6 步:chroot 并修改密码
bash
# 挂载必要的虚拟文件系统 sudo mount --bind /dev /mnt/root/dev sudo mount --bind /proc /mnt/root/proc sudo mount --bind /sys /mnt/root/sys # chroot sudo chroot /mnt/root # 重置密码 passwd root # 如果启用了 SELinux touch /.autorelabel # 退出并重启 exit sudo reboot
第 7 步:重启并从硬盘启动
在 VMware 中:虚拟机 → 编辑设置 → 断开 ISO 连接 → 重启。
方案三:TPM2 自动解锁 + 未知密码(高级篇)
适用场景:系统使用 TPM2 芯片自动解密 LUKS,你从未设置过手动密码(或忘记了)。
3.1 TPM2 的工作原理简述
TPM2 在启动时会测量启动链(Bootloader、内核、initramfs),只有当这些组件的哈希值与注册时一致时,TPM 才会释放解密密钥。
这意味着:如果你修改了 GRUB 或内核参数(比如为了进入救援模式),TPM 会自动拒绝释放密钥! 这是一个安全特性,但也让密码重置变得棘手。
3.2 临时绕过 TPM2 的方法
第 1 步:进入 GRUB 但不触发 TPM 拒绝
关键:你必须在 TPM 测量之前完成干预。操作如下:
-
重启虚拟机,快速按
Esc或Shift进入 GRUB 菜单 -
不要修改内核参数! 只是选中正常启动项
-
按
e编辑,但只在行末添加systemd.debug-shell=1(不触发 LUKS 重新测量) -
按
Ctrl+X启动
第 2 步:使用 debug shell
系统启动后,按 Ctrl+Alt+F9 进入 debug shell(如果配置了的话)。这个 shell 在 LUKS 解锁之后、root 登录之前运行。
如果 debug shell 不可用,需要更激进的方法。
3.3 激进方案:替换 initramfs 绕过 TPM
警告:这需要你对系统有高级理解,操作不当可能导致系统无法启动。
第 1 步:从 Live CD 启动(同方案二步骤 1-2)
第 2 步:解锁 LUKS(利用 TPM 自动解锁)
如果你的系统支持 TPM 自动解锁,在 Live 环境中尝试:
bash
# 安装必要的工具 sudo dnf install tpm2-tools systemd-cryptsetup # 尝试让 systemd-cryptsetup 使用 TPM 自动解锁 sudo systemd-cryptsetup attach root /dev/sda3 - tpm2-device=auto
如果成功,/dev/mapper/root 会出现。这利用了 TPM 在 Live 环境中的测量结果可能与启动时不同的漏洞。
第 3 步:挂载并添加应急密码
bash
# 挂载根分区 sudo mount /dev/mapper/root /mnt/root # 挂载必要的目录 sudo mount --bind /dev /mnt/root/dev sudo mount --bind /proc /mnt/root/proc sudo mount --bind /sys /mnt/root/sys # chroot sudo chroot /mnt/root # 添加一个新的 LUKS 密码(应急用) cryptsetup luksAddKey /dev/sda3 # 系统会提示输入现有密码(TPM 密钥?你可能没有) # 如果失败,需要先清除 TPM 槽位
3.4 如果以上都失败:清除 TPM 槽位并重设
这是最后的办法,需要你有 root 权限进入系统(比如通过方案二解锁后)。
一旦你通过某种方式进入了系统(Live CD + 猜测密码 + 运气),立即执行:
bash
# 查看当前 LUKS 槽位 sudo cryptsetup luksDump /dev/sda3 # 添加一个新的、你知道密码的槽位 sudo cryptsetup luksAddKey /dev/sda3 # 输入新密码 # 删除 TPM 槽位(通常是 slot 0 或 1) sudo cryptsetup luksKillSlot /dev/sda3 0 # 或者使用 systemd-cryptenroll 管理 TPM sudo systemd-cryptenroll --wipe-slot=tpm2 /dev/sda3 # 重新添加 TPM 支持(可选,需要重新测量) sudo systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+7+14 /dev/sda3
3.5 关于 TPM 测量失败的特殊处理
如果你遇到启动时 TPM 拒绝解锁,但系统提示输入密码(可能被系统消息遮挡),尝试:
-
在启动到 LUKS 提示符时,按几次 Backspace 键——密码提示可能被启动日志覆盖了
-
输入你的(可能记得的)LUKS 密码
-
进入系统后立即添加一个备用的、你知道的密码槽位
第四部分:ESXi 环境特有故障处理
4.1 控制台键盘无响应
在 ESXi Web 控制台中,键盘映射可能出问题:
bash
# 在 shell 中设置键盘布局为 US loadkeys us
4.2 虚拟机快照策略
强烈建议:在执行任何重置操作之前,先在 VMware 中拍摄快照!
操作步骤:
-
右键虚拟机 → 快照 → 拍摄快照
-
命名为“重置密码前备份”
-
勾选“内存快照”(可选,但推荐)
如果操作失败,直接恢复快照即可回到原状态。
4.3 使用 ESXi 主机配置文件(企业环境)
如果你有 vCenter Enterprise Plus 许可证,可以通过主机配置文件重置密码:
-
vCenter → 策略和配置文件 → 主机配置文件
-
提取现有主机的配置文件
-
编辑配置文件 → 找到 root 密码设置
-
应用配置文件到目标主机
第五部分:预防措施(做完后立即执行)
成功重置密码后,建议立即执行以下操作,避免下次再遇到同样问题:
5.1 添加一个应急 LUKS 密码
bash
# 添加一个简单的、你能记住的 LUKS 密码 sudo cryptsetup luksAddKey /dev/sda3 # 输入新密码(简单但安全)
验证槽位:
bash
sudo cryptsetup luksDump /dev/sda3 | grep -E "Slot|Enabled"
5.2 配置 GRUB 显示菜单(避免按不到)
bash
# 编辑 /etc/default/grub sudo vi /etc/default/grub # 修改以下值 GRUB_TIMEOUT=10 GRUB_HIDDEN_TIMEOUT=10 # 重新生成 GRUB 配置 sudo grub2-mkconfig -o /boot/grub2/grub.cfg
5.3 保存恢复密钥到安全位置
bash
# 生成恢复密钥 sudo cryptsetup luksAddKey /dev/sda3 --master-key-file <(dmsetup table --showkey) # 或者保存到 VM 外(ESXi 数据存储) sudo dd if=/dev/mapper/root of=/vmfs/volumes/datastore1/luks-recovery.key bs=512 count=4
5.4 配置 sudo 给一个普通用户
bash
# 创建普通用户并赋予 sudo 权限 useradd -G wheel yourname passwd yourname # 设置一个你记得的密码
这样即使忘记 root 密码,也可以 sudo -i 切换。
总结与决策树
text
开始
│
├─ 你知道 LUKS 密码吗?
│ ├─ 是 → 方案一(rd.break + 手动解密)
│ │ → 成功:完成
│ │ → 失败:转方案二
│ │
│ └─ 否 ↓
│
├─ 你有 CentOS Live CD 吗?
│ ├─ 是 → 方案二(Live CD 解锁)
│ │ → LUKS 能解锁?
│ │ ├─ 是 → 成功重置
│ │ └─ 否 → 数据无法恢复,重装系统
│ │
│ └─ 否 ↓
│
└─ 系统是 TPM2 自动解锁?
├─ 是 → 方案三(TPM 绕过)
│ → 成功:完成
│ → 失败:需要物理访问或重装
│
└─ 否 → 检查是否为硬件故障
最终提醒:LUKS 加密的存在意义就是防止未授权访问。如果你既没有 LUKS 密码,也没有恢复密钥,TPM 也无法解锁——那么数据确实无法恢复。这不是系统的缺陷,而是加密的设计目标。
下次记得把 LUKS 恢复密钥保存在 ESXi 主机的配置备份中,或者使用密码管理器保存。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/qq_41581588/article/details/160261770



