虚拟机这东西,用久了总会遇到一个尴尬时刻:密码忘了。尤其是你在里面跑着重要的服务、做着实验,或者只是存了点个人文件,突然被锁在门外,那种感觉比物理机忘密码还难受。物理机忘密码好歹还能抠电池、拆硬盘,虚拟机虽然“虚拟”,但门锁是实打实的,进不去就是进不去。
今天这篇东西,就是专门聊虚拟机修改密码这件事。我会把Windows、Linux两大类系统的常见改密思路都梳理一遍,包括单用户模式、LiveCD、PE工具这三种主流路径,外加一些我在实际排查中踩过的坑。如果你用的是VMware Workstation、VirtualBox,或者公司里的KVM、Hyper-V,原理都相通,照着做基本都能解决。无论你是运维老手,还是刚入门虚拟机的小白,这篇文章都能让你在忘记密码时少走弯路。
1. 先想清楚:虚拟机改密码和物理机到底差在哪
很多人第一次遇到虚拟机忘密码,第一反应是“直接重装系统”。这当然可行,但代价太大。虚拟机里的数据、配置、服务全没了,装完还要重新配环境,折腾半天。实际上,虚拟机有一个物理机不具备的巨大优势:你可以随时挂载ISO镜像、调整启动顺序、甚至直接修改虚拟磁盘文件,这在物理机上几乎不可能做到。
1.1 虚拟机密码问题的常见场景
我总结了一下,遇到虚拟机改密码需求的基本是这几种情况:
- 忘密码:最常见,长期不用或者密码设得太复杂,某天要用突然想不起来了。
- 接手别人的虚拟机:同事离职、项目交接,对方没告诉你密码,或者压根没人知道密码。
- 系统故障导致账户异常:比如/etc/passwd文件被改坏、Windows账户被锁、域策略强制改密等。
- 安全审计/合规要求:需要定期强制重置虚拟机的管理员密码,尤其是等保、ISO27001这类合规场景。
不管是哪种情况,核心诉求都一样:在尽量不影响系统数据的前提下,重新获得系统访问权限。
1.2 三条改密路线怎么选
根据系统类型和你手头的工具,我整理出三条主流路线:
| 路线 | 适用系统 | 核心思路 | 难度 |
|---|---|---|---|
| 系统内改密 | 你知道当前密码,只是要改 | 登录系统,命令行或图形界面改 | 极低 |
| 维护模式/单用户模式 | Linux | 通过GRUB进入维护模式,直接重置密码 | 中等 |
| 外部介质引导(LiveCD/PE) | Linux、Windows | 用安装盘或PE系统启动,挂载磁盘修改 | 中等偏高 |
先说结论:如果你还能登录系统,哪怕只有一个普通权限账户,那直接在系统里修改密码是最快的,这个没什么好讲的,passwd命令或者“设置-账户”里改一下就行。如果已经完全被锁在外面,那就要走后面两条路。
这里面有个关键细节:虚拟机的BIOS/EFI启动顺序是可以人为控制的,你不需要像物理机那样狂按F2、Del,只需要在VMware或VirtualBox的虚拟机设置里,把CD/DVD光驱的启动顺序调到硬盘之前,然后挂载一个ISO镜像,就能让虚拟机从安装盘启动。这是所有虚拟机改密操作的基础,也是虚拟机的“福利”。物理机即便有光驱,你手上也未必有刚好合适的系统盘,虚拟机里要挂一个ISO文件,几秒钟就能搞定。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心细节解析:不同系统的改密方法与注意事项
有备无患,我把Windows和Linux在虚拟机场景下最常用的改密方法拆开讲透。这里面有一些细节你如果不知道,非常容易卡壳,比如PE系统下盘符变化、Linux的SELinux上下文、LUKS加密的分区,以及VMware工具和磁盘锁的问题。
2.1 Windows虚拟机:PE重置与辅助工具替换
Windows虚拟机的改密,主流方案是两种:PE工具重置 和 辅助工具替换(比如sethc、utilman)。
先说PE工具。原理很简单:用一个WinPE系统U盘(或者ISO镜像)启动虚拟机,打开PE内置的密码重置工具,直接对虚拟机磁盘里的SAM文件进行修改。虚拟机里使用PE和物理机完全一样,只需要把PE的ISO文件挂载到虚拟光驱,设置从光驱启动即可。
再说辅助工具替换。这个方法的核心思路是:Windows登录界面有几个特殊的辅助工具,比如放大镜(Magnify.exe)、屏幕键盘(osk.exe)、粘滞键(sethc.exe),它们在登录界面就可以触发。如果我把这些工具替换成cmd.exe,那么在登录界面按对应的快捷键,就会弹出一个拥有SYSTEM权限的命令提示符,然后你就可以用net user命令来修改密码了。
这个方法的优点是速度快、不需要额外下载重置工具,只需要一个Windows安装镜像或者能进入命令行修复环境(WinRE)的镜像就行。缺点是步骤多,且现在Win10/Win11对系统文件保护更强,但实测在传统BIOS模式下配合虚拟机跑Win10 LTSC这类版本,成功率还是很高的。
如果你用的是PE下可视化的密码重置软件,还需要注意一点:PE下看到的磁盘盘符往往不是C:。因为PE系统自己会占用一个盘符,然后原来的系统C盘可能变成D、E、F。所以用工具前先打开“我的电脑”看一下你的系统盘实际盘符是哪个,别选错盘。选错了虽然通常不会损坏系统,但白白浪费时间。
2.2 Linux虚拟机:单用户模式与chroot
Linux的改密路径相对更“原生态”,主要靠的是内核启动参数。只要你能在GRUB界面编辑启动项,基本就等于拿到了系统的“万能钥匙”。
原理我简单解释一下:Linux内核启动时,init进程是所有进程的祖先,PID永远是1。正常情况下init会启动所有服务,然后让你登录。但如果你在内核启动参数里加上init=/bin/bash或者rd.break,内核启动到一半后,就会直接丢给你一个root shell,而不是走正常的登录流程。在这个shell里,你可以用passwd命令直接重置密码。
这里要特别强调一个坑:用init=/bin/bash进入的shell,根文件系统通常是只读(ro)挂载的,直接执行passwd可能会报错“Authentication token manipulation error”。必须先把根文件系统重新以读写(rw)方式挂载,才能写密码。
另外,很多教程会让你用mount -o remount,rw /,这在大多数场景下没问题。但如果你的系统分区是LVM、甚至做了LUKS加密,那还涉及先解锁加密盘、激活卷组这些步骤。这也是为什么我强烈建议用宿主机上的另外一个Linux系统加载磁盘去修改密码,而不是硬撑着一个shell到处碰壁。
2.3 特殊情况:LVM、LUKS、域账户等复杂环境
这里要单独提一下“特殊情况”,因为实际做事时总会遇到“不按套路出牌”的环境。
- LVM逻辑卷:很多企业级Linux发行版(RHEL、CentOS、Ubuntu Server)默认使用LVM。如果你直接从外部挂载这块虚拟磁盘,可能看不到普通的分区,而是一个物理卷(PV)。需要先
vgscan、vgchange -ay激活卷组,然后挂载逻辑卷(LV)。这个操作在LiveCD环境里也是一样的。 - LUKS全盘加密:如果虚拟机在做系统安装时勾选了全盘加密,那么任何外部方法都绕不过去。你要么知道密码,要么有密钥文件,否则神仙难救。这种场景下,单纯“修改密码”已经没有意义,只能恢复备份或者丢数据重来。
- Windows域控制器:域控(DC)上重置本地管理员密码也会有一个问题,就是确保你改的是本地SAM,而不是域账户。域账户的密码需要域管理权限,或者在AD恢复模式下重置KRBTGT等,那已经超出“修改虚拟机密码”的范畴了。
3. 实操过程与核心环节实现
理论说再多都不如动手做一遍。我以最常见的VMware Workstation Pro和VirtualBox为例,把两个核心场景的完整操作流程写出来:一个是Windows虚拟机用PE重置密码,另一个是Linux用单用户模式/LiveCD改密码。
3.1 Windows 10/Server虚拟机:用PE完整重置密码
我平时最稳的方案是:下载一个WePE或微PE的ISO,挂载到虚拟光驱,引导后直接使用“Windows密码修改”小工具。但有些PE工具精简得厉害,可能只包含基础恢复功能,所以我下面再给一个“纯手动+安装镜像”的方案,保证不用额外找工具也能干成。
3.1.1 先把ISO挂载到虚拟机光驱
在VMware Workstation里,选中你的虚拟机,点击“编辑虚拟机设置”,选择“CD/DVD (SATA)”设备,勾选“启动时连接”,然后在右侧选择“使用ISO映像文件”,浏览选择你的PE ISO或Windows安装ISO。确定后,回到虚拟机详情页,重点来了:先“关闭客户机”,然后把虚拟机的“固件类型”和“启动顺序”确认一下。正常情况下,只要光驱在硬盘之前,启动时就会自动从ISO引导。
3.1.2 通过“系统恢复”进入命令行
如果你没有PE工具,直接用Windows官方安装镜像也是可以的。步骤是:
- 用Windows安装镜像引导虚拟机,在第一个安装界面选择“下一步”,然后点击左下角的“修复计算机”。
- 选择“疑难解答” → “高级选项” → “命令提示符”。
- 此时你会进入一个命令行窗口。这个窗口的权限是SYSTEM,权限远高于普通管理员。
这个命令行窗口就是整个操作的“主战场”。
3.1.3 定位系统盘并替换辅助工具
这里的核心逻辑是:替换登录界面的某个程序为cmd.exe,然后在登录界面触发它。
先确定盘符:
cmd复制diskpart
list volume
exit
看一下哪个卷是你的系统盘。我前面说了,这里的盘符可能不是C,一般是D或E,对应原来系统里的C盘。比如你看到“卷 1 D: Windows”那么原系统盘就是D:。
然后备份原文件并替换:
cmd复制D:
cd Windows\System32
ren utilman.exe utilman.exe.bak
copy cmd.exe utilman.exe
这样操作之后,重启虚拟机,在登录界面右下角点击“轻松使用”图标(或者直接按Win+U),系统就会自动调起cmd.exe(因为utilman已经被替换成cmd了)。在弹出的命令行里,执行:
cmd复制net user Administrator newpassword
或者,如果你要改的是当前登录的账户,比如test:
cmd复制net user test newpassword
看到“命令成功完成”的提示后,重启即可用新密码登录。
注意:如果你修改的是系统内置的Administrator,而当前系统是绑定了微软账户(Microsoft Account)的Win10/11,可能不能直接用
net user改动在线账户的密码。但net user修改的是本机账户密码,对本地用户有效;如果是微软账户,建议你更改为本地账户,或者直接用PE工具更省心。
3.2 Ubuntu忘记密码被锁在外面:用LiveCD修改密码
热搜词里“使用livecd修改密码”是个高频词,我单独写一下。这里以Ubuntu Server 22.04虚拟机为例,展示通过LiveCD修改被遗忘的root密码(或用户密码)。
3.2.1 挂载Ubuntu安装ISO并进入Live环境
- 在VMware虚拟机设置中,把Ubuntu的安装ISO挂载到CD/DVD光驱。
- 开机后,虚拟机从ISO引导,选择“Try or Install Ubuntu”,然后选择“Try Ubuntu”进入Live环境。
这里有一个操作细节:如果你的虚拟机默认不弹出GRUB引导菜单,而是直接进入硬盘系统,说明光驱启动优先级不对,或者是ISO引导路径被硬盘占了先。先关机,在“编辑虚拟机设置”里把CD/DVD的“设备状态”勾选“启动时连接”,然后“选项”页签里“高级”里的“固件类型”选BIOS或EFI,要和你原系统一致。如果还不行,就通过“虚拟机”菜单里的“电源”选项,把“启动时进入固件(BIOS/EFI)设置”打开,实时调整启动顺序。
3.2.2 挂载根分区并chroot
进入Live桌面后,打开终端。这里要特别小心,不要挂载错分区。
先看当前磁盘分区情况:
bash复制lsblk
假设你的系统根分区是/dev/sda2(根据你看到的实际情况调整),挂载它,并chroot进去:
bash复制sudo mount /dev/sda2 /mnt
sudo mount /dev/sda1 /mnt/boot # 如果有EFI分区的话
sudo chroot /mnt
如果根分区是LVM,先激活卷组:
bash复制sudo vgscan
sudo vgchange -ay
lsblk
# 找到LV,比如 /dev/ubuntu-vg/ubuntu-lv
sudo mount /dev/ubuntu-vg/ubuntu-lv /mnt
然后执行passwd修改你想要的用户:
bash复制passwd username
这里的username是你要改密码的用户名,比如ubuntu或者root。
3.2.3 处理SELinux/AppArmor相关上下文
在Red Hat系(RHEL/CentOS/Fedora)系统里,chroot改完密码后,需要确保SELinux上下文不被破坏。一般执行:
bash复制touch /.autorelabel
这会触发系统在下次启动时自动重新打SELinux标签,不会影响密码修改,但能避免因为标签错误导致的启动异常。Ubuntu/AppArmor则一般不需要额外处理。
然后卸载分区,重启虚拟机(记得把ISO卸载或取消挂载,否则又会从光盘启动):
bash复制exit
sudo umount /mnt/boot
sudo umount /mnt
sudo reboot
3.3 Linux系统:用单用户模式/紧急模式重置密码
这个方案不需要外部ISO,充分利用虚拟机里已有的GRUB引导。前提是你对Linux启动流程有一点概念,并且虚拟机在开机时可以手动操作GRUB菜单。
-
虚拟机开机,在GRUB菜单出现时,快速按键盘上的
e进入编辑模式。如果是启动后就立刻进系统,没看到GRUB菜单,可以在虚拟机重启时快速连点ESC或Shift,强制显示菜单(Ubuntu)或按e(CentOS等)。 -
找到以
linux或linuxefi开头的那一行(通常是倒数第二行),在行尾添加参数:
- 对于RHEL/CentOS 7/8/9:
rd.break(这是最推荐的,因为它在SELinux重新标记之前就中断,后续更安全) - 对于Ubuntu:
init=/bin/bash(或者recovery模式)
- 按Ctrl+X或F10启动。如果是
rd.break,系统会进入一个initramfs的shell,根目录是只读状态,执行:
bash复制mount -o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
exit
reboot
如果是init=/bin/bash,进入的是一小段systemd还未完全启动的环境,同样需要:
bash复制mount -o remount,rw /
passwd root
# 执行下面这行,修改默认target,否则重启后可能进入救援模式
systemctl default
reboot -f
systemctl default这一步很多人不知道。如果你使用init=/bin/bash方式修改完密码后直接重启,系统可能会停留在emergency模式,因为systemd认为你的默认target被覆盖了。加上这步就能避免这个诡异问题。
- 重启后,用新密码登录,然后第一时间把密码策略、账户锁定策略再检查一遍,防止下次再被锁。
3.4 通用技巧:离线挂载虚拟磁盘直接改密码
这是虚拟机独有的“作弊”方法,在物理机上做不到:你可以在宿主机上安装libguestfs工具,直接修改虚拟机磁盘镜像里的密码文件,而无需启动虚拟机。
以Linux宿主机为例:
bash复制sudo apt install libguestfs-tools # Debian/Ubuntu
sudo yum install libguestfs-tools # RHEL/CentOS
然后查看虚拟机的磁盘路径(.vmdk或.qcow2),使用virt-customize:
bash复制sudo virt-customize -a /path/to/your-vm-disk.vmdk --root-password password:NewPassword
它会自动处理LVM、分区、SELinux等复杂情况,非常稳。这是自动化场景下批量重置虚拟机的首选。
提示:使用宿主机直接改磁盘的方式,强烈建议在虚拟机处于关机状态时操作。如果虚拟机正在运行,直接改虚拟磁盘文件会导致数据不一致或者损坏,这个不是闹着玩的。
4. 常见问题与排查技巧实录
改密码的过程虽然听起来简单,但实际执行时经常出各种幺蛾子。我把这些年遇到的高频问题整理成一个速查表,再挑几个典型的详细说。
| 问题 | 可能原因 | 解决思路 |
|---|---|---|
| VMware Workstation 无法连接到虚拟机 | 权限不足、服务未启动、虚拟机被另一进程占用 | 检查VMware Authorization Service、以管理员身份运行VMware |
| 虚拟机一直在启动转圈,进不了系统 | 改了错误的启动参数、ISO没有卸载、磁盘文件损坏 | 尝试在BIOS里恢复默认启动顺序、用快照回滚、用diskpart检查磁盘 |
| passwd能执行,但重启后密码还是不对 | 修改的是chroot里的虚拟环境,而非真实系统;或者SELinux阻止 | 确认chroot操作的挂载点是真实根分区,执行touch /.autorelabel |
| 修改Windows密码后,无法登录或显示账户被禁用 | 账户策略锁定、本地管理员被禁用、模块替换不完全 | 在命令行里用net user查看账户状态,执行net user username /active:yes |
| 虚拟机磁盘文件损坏,无法启动 | 强制关机、宿主机断电、磁盘克隆不当 | 使用vmware-vdiskmanager修复、或者用qemu-img check检查qcow2 |
4.1 VMware Workstation 无法连接到虚拟机
这个热搜词我单独拎出来说一下,因为在虚拟机改密码过程中特容易遇到。当你修改了某些启动参数或者ISO挂载设置后,虚拟机很可能报“无法连接到虚拟机”,原因大概率是:VMware Authorization Service服务没起来,或者虚拟机被挂起后残留进程占用了锁文件。
排查思路:
- 按Win+R输入
services.msc,找到“VMware Authorization Service”,确认状态是“正在运行”,如果不是就右键启动。 - 如果服务正常,关闭VMware Workstation,去虚拟机的目录下找
.lck文件夹(比如Windows 10.vmx.lck),把这个文件夹删掉或改名。这个文件夹是VMware用来防止多实例同时打开同一台虚拟机的锁,异常退出后没删掉就很烦人。 - 以管理员身份重新运行VMware Workstation。
这里有个实战心得:改密码前最好先给虚拟机做一个快照。快照不是说改完密码要留着,主要是为了防止操作过程中因为设置错误导致虚拟机无法启动。只要出了乱子,一键还原到快照,再按正确流程走一遍就行了。
4.2 修改后密码不生效的几种原因
明明passwd显示成功了,重启后新密码却登录不了,这个问题很恶心。我排查过很多次,基本是这么几个原因:
- SELinux上下文错误:Red Hat系系统里尤其明显。你没执行
touch /.autorelabel,系统启动后无法正常写入/etc/shadow。解决方法是回到Single User模式或LiveCD下执行一次。 - 修改错了用户:你以为是root,但系统默认禁用了root登录(比如Ubuntu默认没有root密码,而是用sudo用户)。这时候你改root密码其实没意义,要改的是
ubuntu这类普通用户。 - 密码策略拦截:Windows下如果改的密码太简单,比如少于8位、没有特殊字符,系统策略直接不给修改。
net user命令不会明确告诉你“密码太简单”,它会提示“密码不满足密码策略的要求”。遇到这种情况,把密码设复杂一点。 - 账户被锁定/禁用:Windows域环境下,本地管理员可能被策略禁用了。需要执行
net user administrator /active:yes来启用。
4.3 虚拟机启动异常与密码相关的坑
还有一类问题,出现在虚拟机改完密码后无法正常进入系统。我遇到过几次,原因往往是操作过程中不小心把GRUB的启动参数搞乱了,或者启动顺序里ISO镜像没有卸掉,又或者磁盘文件因为强制关机产生了损坏。
如果你遇到“虚拟机一直转圈”或者黑屏,第一个动作就是重启进入GRUB后选高级选项里的“恢复模式”,看系统是否能进。如果恢复模式能进,那大概率是启动参数或某个服务出的问题。如果恢复模式也进不去,那基本是文件系统损坏了。
在VMware环境里,还可以用vmware-vdiskmanager工具检查和修复虚拟磁盘:
bash复制vmware-vdiskmanager -R your-disk.vmdk
VirtualBox用户可以用VBoxManage:
bash复制VBoxManage internalcommands repairhd --filename your-disk.vdi
但这些都是治标不治本。我的建议是:如果是重要虚拟机,平时多做快照,做操作前再做一次,这样出问题基本能回到起点。
5. 一些必须强调的安全与规范问题
修改虚拟机密码这件事,既是救命神技,也是一把双刃剑。用好了能快速恢复业务,用不好可能被别有用心的人钻空子。我在这里说几点必须注意的:
- 修改密码不是为了留后门。无论你是运维人员、开发人员还是测试人员,修改虚拟机密码的最终目的是恢复正常使用。不要为了“方便”刻意留下后门账户或者弱密码,尤其是在生产环境。一旦被扫描器扫到,虚拟机可能直接被拿去做跳板,再小的漏洞都可能引火烧身。
- 密码复杂度要达标。虚拟机里的密码建议不低于12位,包含大小写、数字、特殊字符。别学网上那些“密码简单方便记忆”的说法,虚拟机密码强度直接关系到宿主机和云环境的整体安全。
- 操作要留痕。如果是团队环境,最好在工单系统或者运维记录里记一下“本次重置了哪台虚拟机的密码、原因是什么”。这既是合规要求,也是团队协作的常识。不然你重置了密码,别人不知道,下次又卡在同一道门上。
- 不要在生产环境上直接尝试。能先在测试虚拟机演练一遍,就不要拿生产环境当小白鼠。我见过有人在生产虚机上用
init=/bin/bash改密码,结果因为系统版本差异,把根分区挂载参数搞错了,重启后文件系统变成只读,业务直接挂了半天。这不是危言耸听,是我同事的真实经历。
6. 实际踩坑记录与经验总结
最后再分享两个最近真实遇到的坑,希望能帮各位绕开。
第一件是帮朋友处理一台Ubuntu 22.04虚拟机,他忘记密码后自己在网上找了个教程,按教程用init=/bin/bash进入了系统,改了root密码,但重启后系统卡在“Started Update UTMP about System Runlevel Changes”不动,一查才发现,因为跳过了正常的systemd初始化,很多服务没有正常起来,重启后各种缓存不一致。最后我只能帮他进恢复模式,把损坏的临时文件清了一部分,才算救回来。所以还是那句话,优先用rd.break,不要图省事直接init=/bin/bash,毕竟那个环境里系统状态太原始,手动修复的坑特别多。
第二件是VirtualBox上的Windows Server 2019。我用了PE工具重置密码,结果改完密码后,发现这台虚拟机在宿主机网络里怎么都ping不通。排查了半天才发现,因为我在PE工具里操作时,不小心改了网卡配置信息,导致Windows的网卡被禁用。进系统后重新启用网卡才恢复正常。用PE工具时,尽量只点密码重置功能,不要手贱去点“系统配置”之类的选项,免得误改其他设置。
虚拟机改密码的方法其实不难,核心就一句话:想尽一切办法获取一个能操作虚拟磁盘的shell,然后执行改密命令。掌握了这个思路,不管系统怎么变,你都能找到对应的入口。我个人在实际操作中最推荐的是先做快照,然后优先尝试GRUB单用户模式(Linux)或PE工具(Windows),其次才是LiveCD。至于宿主机直接改磁盘文件,那是自动化批量场景下的利器,日常用不上,但学会了绝不吃亏。
