偶然间我一个朋友pve的Windows虚拟机密码忘了 问我有没有方法解决。
有的,有的兄弟。这样的方法有三种,今天教一种,方法如下:
准备工作
停止虚拟机
确保目标虚拟机处于停止状态:
qm stop <虚拟机ID>
安装必要的工具
安装 chntpw 工具:
apt install chntpw
开启nbd
modprobe nbd max_part=8
定位虚拟机的 .qcow2 文件
.qcow2 是虚拟机磁盘的主要存储文件格式。以下是定位该文件的方法:
查看虚拟机配置
通过以下命令查看虚拟机的磁盘路径:
qm config <虚拟机ID>
检查存储池路径
方法1:进入存储池目录,查找 .qcow2 文件:
ls /mnt/pve/<存储名称>/images/<虚拟机ID>/
例如:
ls /mnt/pve/nvme/images/206/
方法2:简单粗暴直接 find
比如说你找 206 的 qcow2 文件,直接输入:
find / -name "vm-206-disk-0.qcow2" 2>/dev/null
创建快照(重要!)
创建快照
使用以下命令创建一个虚拟机快照:
qm snapshot <虚拟机ID> reset_password_snapshot
验证快照
列出虚拟机的快照,确保快照已成功创建:
qm listsnapshots <虚拟机ID>
如果需要恢复快照,可以使用以下命令:
qm rollback <虚拟机ID> reset_password_snapshot
挂载和修改 SAM 文件
使用 QEMU-NBD 挂载磁盘
将虚拟机的磁盘文件挂载到本地系统:
qemu-nbd -c /dev/nbd0 /mnt/pve/<存储名称>/images/<虚拟机ID>/vm-<虚拟机ID>-disk-0.qcow2
检查分区信息
确认分区表正确无误:
fdisk -l /dev/nbd0
挂载 NTFS 分区
创建挂载点并尝试挂载 NTFS 分区为读写模式:
mkdir /mnt/windows
mount -o rw /dev/nbd0p1 /mnt/windows
启动虚拟机并测试登录
编辑 SAM 文件
进入 Windows 系统目录并备份原始 SAM 文件:
cd /mnt/windows/Windows/System32/config
cp SAM SAM.bak
使用 chntpw 编辑 SAM 文件:
chntpw -i SAM
卸载分区并断开 NBD 设备
完成操作后卸载分区并断开 NBD 设备:
umount /mnt/windows
qemu-nbd -d /dev/nbd0
启动虚拟机
启动虚拟机以验证修改是否成功:
qm start <虚拟机ID>
正常情况下到这里就结束了
*如果碰到只读挂载的情况
强制挂载为读写模式*
尝试强制挂载为读写模式:
mount -o remount,rw /mnt/windows
检查文件系统错误
如果仍然无法挂载为读写模式,可能是文件系统存在错误。使用 ntfsfix 修复文件系统:
ntfsfix /dev/nbd0p1
再次尝试挂载
重新挂载分区为读写模式:
mount -o rw /dev/nbd0p1 /mnt/windows