油墨香^_^头像

CentOS 虚拟机忘记 root 密码:快速安全重置全流程详解

第一章:核心原理(理解为什么能成功)

在重置密码前,需要理解 Linux 的启动与认证机制:

  1. GRUB2 引导器:系统启动时第一个可交互的界面。我们可以通过修改内核启动参数进入特殊模式。

  2. Initramfs (初始根文件系统):内存中的临时根环境。我们可以在它加载真正的硬盘根目录之前,介入系统。

  3. rd.break 参数:内核参数。告诉系统在进入正式根目录前“打断”启动过程,此时硬盘上的真实根分区被挂载在 /sysroot 下。

  4. 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. 同第三章步骤1、2。

  2. 在内核行末尾添加:

    bash

    init=/bin/bash
  3. Ctrl+X 启动。

  4. 此时直接进入单用户 bash(根分区只读):

    bash

    mount -o remount,rw /
    passwd root
  5. SELinux 处理(同上):

    bash

    touch /.autorelabel
  6. 重启:

    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 之前需要先解密:

  1. GRUB 行末尾添加 rd.luks.uuid=<UUID>

  2. 进入 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 自动解锁 时,情况完全不同:

  1. LUKS 加密层:在进入系统之前,必须先解密根分区——这意味着你无法直接进入 rd.break shell

  2. TPM2 自动解锁:系统本来设计成“无感启动”,你从来没输入过密码,或者只有 TPM 存储的密钥

  3. 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 环境下操作,注意以下几点:

  1. 打开 Web 控制台:在 vSphere Client 中,右键虚拟机 → 打开控制台

  2. 发送 Ctrl+Alt+Del:控制台菜单栏选择“发送键” → Ctrl+Alt+Del(或使用快捷键)

  3. 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 编辑模式

  1. 在 ESXi 控制台中重启虚拟机

  2. 出现 GRUB 菜单时(蓝色/黑色背景),立即按 e 键进入编辑模式

  3. 如果 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 虚拟机设置中:

  1. 编辑虚拟机 → CD/DVD 驱动器 → 选择 CentOS Stream 9 Live ISO

  2. 勾选“连接”和“启动时连接”

  3. 进入 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 测量之前完成干预。操作如下:

  1. 重启虚拟机,快速按 Esc 或 Shift 进入 GRUB 菜单

  2. 不要修改内核参数! 只是选中正常启动项

  3. 按 e 编辑,但只在行末添加 systemd.debug-shell=1(不触发 LUKS 重新测量)

  4. 按 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 拒绝解锁,但系统提示输入密码(可能被系统消息遮挡),尝试:

  1. 在启动到 LUKS 提示符时,按几次 Backspace 键——密码提示可能被启动日志覆盖了

  2. 输入你的(可能记得的)LUKS 密码

  3. 进入系统后立即添加一个备用的、你知道的密码槽位

第四部分:ESXi 环境特有故障处理

4.1 控制台键盘无响应

在 ESXi Web 控制台中,键盘映射可能出问题:

bash

# 在 shell 中设置键盘布局为 US
loadkeys us

4.2 虚拟机快照策略

强烈建议:在执行任何重置操作之前,先在 VMware 中拍摄快照!

操作步骤:

  1. 右键虚拟机 → 快照 → 拍摄快照

  2. 命名为“重置密码前备份”

  3. 勾选“内存快照”(可选,但推荐)

如果操作失败,直接恢复快照即可回到原状态。

4.3 使用 ESXi 主机配置文件(企业环境)

如果你有 vCenter Enterprise Plus 许可证,可以通过主机配置文件重置密码:

  1. vCenter → 策略和配置文件 → 主机配置文件

  2. 提取现有主机的配置文件

  3. 编辑配置文件 → 找到 root 密码设置

  4. 应用配置文件到目标主机

第五部分:预防措施(做完后立即执行)

成功重置密码后,建议立即执行以下操作,避免下次再遇到同样问题:

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

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--