KVM虚拟机密码重置,不用登录虚拟机修改root密码
KVM虚拟机密码重置的核心是在宿主机上直接修改虚拟机的磁盘镜像文件,不需要进入虚拟机系统。
只要宿主机能正常访问虚拟机的磁盘文件,就可以通过离线修改镜像或注入临时服务的方式重新设置 root 密码。
本文以常见的 CentOS、Ubuntu 虚拟机为例,给出不用登录虚拟机就能完成密码重置的完整操作步骤。
准备工作:先确认宿主机环境和虚拟机关机状态
在执行密码重置前,先确认几件事,避免操作中途失败或损坏虚拟机磁盘:
- 你有宿主机(运行 KVM 的物理机或云服务器)的 root 或 sudo 权限。
- 准备重置密码的虚拟机当前处于关机状态。如果虚拟机正在运行,先在宿主机上执行
virsh shutdown 虚拟机名称或virsh destroy 虚拟机名称强制关闭。 - 确认虚拟机磁盘镜像的路径和格式。通常用
virsh domblklist 虚拟机名称查看磁盘路径。
下面这个命令可以查看虚拟机名称列表:
virsh list --all
如果虚拟机名为 vm-test,查看它的磁盘路径:
virsh domblklist vm-test
输出会显示磁盘类型和源文件路径,例如 /var/lib/libvirt/images/vm-test.qcow2。
记住这个路径,后续操作都要用到。
方法一:使用 virt-customize 直接注入新密码(推荐)
virt-customize 是 libguestfs 工具集提供的一个命令,可以直接在关闭状态的虚拟机镜像中修改文件,无需启动虚拟机。
适合 qcow2 和 raw 格式镜像。
先安装对应工具。
Debian/Ubuntu 宿主机执行:
apt install libguestfs-tools -y
CentOS/RHEL 宿主机执行:
yum install libguestfs-tools -y
安装完成后,使用 virt-customize 设置 root 密码:
virt-customize -a /var/lib/libvirt/images/vm-test.qcow2 --root-password password:这里填你的新密码
命令执行过程中会显示类似 Setting a random seed 的提示,看到 Finished 就表示操作完成。
此时密码已被写入镜像,再启动虚拟机即可用新密码登录。
如果虚拟机系统是 Ubuntu 等默认禁用 root 账号的系统,这种方法可能只修改了 root 密码但未启用 root 登录权限。
建议配合注入 SSH 公钥或启用 root 登录,或者改用下面方法二。
方法二:通过单用户模式重置密码
如果虚拟机系统比较特殊,或者 virt-customize 不支持该镜像,可以采用引导进入单用户模式的方式。
原理是在内核启动参数中临时加一条 rd.break 或 init=/bin/bash,让系统跳过密码验证直接进入调试环境。
操作步骤如下:
- 在宿主机上编辑虚拟机的启动配置,给内核增加参数。例如:
virsh edit vm-test
- 在
区域的或启动引导相关位置加入rd.break(适用于 RHEL/CentOS 7 及后续版本)。如果是 GRUB 引导,需要修改内核命令行。 - 启动虚拟机后,系统会停在
switch_root:/#提示符。此时根文件系统是只读的,先重新挂载为可写:
mount -o remount,rw /sysroot
chroot /sysroot
passwd root
输入两次新密码后,执行 exit 退出 chroot,再执行 exit 重启,即可用新密码登录。
对于 Ubuntu 系统,
可以在 GRUB 菜单处按 e 编辑启动项,
在 linux 行末尾加上 init=/bin/bash,
然后按 Ctrl+X 启动,
同样进入单用户模式后执行 mount -o remount,rw / 再 passwd root。
避坑指南:密码重置最容易出错的几个地方
忘记关机直接修改镜像。virt-customize 操作的是磁盘文件,如果虚拟机正在运行,磁盘内容被缓存,直接修改会造成数据不一致甚至损坏镜像。
一定要先关闭虚拟机,并用 virsh list --all 确认状态为 shut off。
使用 LVM 分区或 LUKS 加密磁盘。
如果虚拟机磁盘使用了加密或 LVM,virt-customize 可能无法直接识别分区,报错信息类似 libguestfs: error: mount: /dev/sda1: filesystem was not recognized。
这种情况下建议改用方法二的单用户模式,并在进入系统后用 lsblk 和 cryptsetup 手动处理加密卷。
修改完密码后无法登录。
如果虚拟机启用了 SELinux,直接修改密码后可能需要重置安全上下文。
执行完 virt-customize 后,可以额外执行:
virt-customize -a /path/to/disk.qcow2 --selinux-relabel
这条命令会重打 SELinux 标签,避免登录时权限异常。
如果是没有 SELinux 的 Ubuntu 系统则不需要。
备份镜像再操作。
虽然上述步骤风险低,但磁盘文件操作一旦失误可能无法恢复。
建议先复制一份镜像:
cp /var/lib/libvirt/images/vm-test.qcow2 /root/vm-test-backup.qcow2
出现任何异常都可回滚。
验证密码是否重置成功
完成以上操作后,直接启动虚拟机并尝试用新密码登录。
验证方法很简单:
virsh start vm-test
然后通过 VNC 或 SSH 连接虚拟机,输入新密码,能够进入系统就说明重置成功。
如果无法登录,首先确认镜像是否被正确修改。
可以用 virt-ls 检查镜像内 /etc/shadow 文件是否存在:
virt-ls -l -a /var/lib/libvirt/images/vm-test.qcow2 /etc/shadow
还能用 virt-cat 直接查看文件内容,但密码是密文,只能看到是否被修改。
常见疑问补充
宿主机是 Windows 系统,能用这些命令吗? 不能。
以上命令依赖 Linux 下的 libvirt 和 libguestfs 工具,Windows 宿主机建议用 KVM 前先去宿主机 Linux 环境操作,或者改用其他虚拟化平台支持的密码重置方式。
没有宿主机权限,只有虚拟机控制台怎么办? 那就只能通过 VNC 或挂在救援模式处理。
宿主机权限是重置密码的前提,如果用户没有宿主机 root 权限,请联系云服务商或管理员协助。
virt-customize 提示超时或网络错误? 检查镜像是否被锁,先执行 virsh undefine 虚拟机名称(不删除磁盘)取消定义,再操作镜像。
如果你正在处理 KVM虚拟机密码重置场景,建议先按本文步骤完整执行,再根据自己的环境做微调。
遇到异常时优先回看避坑和高频问题部分,大多数报错都是因为虚拟机未关机、镜像格式不兼容或分区加密导致的。