上周朋友发消息说,自己搭的Ubuntu虚拟机一个多月没动,密码怎么都想不起来了。我让他把虚拟机文件拷过来,用LiveCD花十分钟把密码重置掉,他直呼还有这种操作。其实虚拟机修改密码这件事,入门之后你会碰到无数次:要么忘记密码、要么系统交接、要么安全巡检要求定期更换。跟物理机比起来,虚拟机在密码恢复上有天然优势——快照、挂载镜像、随时备份,只要方法对,基本不会走到重装系统那一步。
这篇内容我打算把虚拟机改密码的完整方案都过一遍,包括Linux和Windows两套系统,覆盖“能进系统正常改”和“进不去系统绕道改”两种场景,顺便把VMware里常见的启动报错、无法连接虚拟机这类周边问题也整理出来。无论你是刚装好虚拟机发现密码没记住,还是老系统被锁在外面,这篇都能直接照着操作。
1. 动手之前先想清楚:你要改的是哪一类密码
1.1 不同场景对应不同改密方案
很多人一上来就问“虚拟机密码怎么改”,但这个问题其实可以拆成好几个完全不同的场景,每种的解决路径都不一样:
- 虚拟机里是Linux系统,能正常登录,只是想把用户密码换成新的。
- 虚拟机里是Linux系统,登录界面已经进不去,密码彻底忘了。
- 虚拟机里是Windows系统,密码忘了,被锁在登录界面。
- 刚装完系统,安装时设置的密码没记住,需要重置。
- 虚拟机里跑的是数据库或中间件,提示密码过期,需要强制修改。
前两种情况在实操中最常见。第三种Windows场景我也见过不少,特别是用别人封装好的镜像装完系统,登录密码不透明。第四种更逗,很多人安装时随手敲了一个密码,装完彻底忘了。
所以在动手之前,先判断自己属于哪一类:是Linux还是Windows,是能进系统还是被锁在外面。判断错了容易白折腾。我见过有人明明是Windows系统,非要照着Linux的LiveCD教程操作,折腾半小时发现完全对不上号。
1.2 分清磁盘加密和普通分区,这是关键前提
这里有一个特别容易被忽略但实际影响巨大的点:你的虚拟机磁盘有没有做全盘加密。
绝大多数虚拟机默认是不开LUKS磁盘加密的,这意味着一件事——你完全可以直接从外部访问虚拟机的磁盘内容,改密码本质上就是改几个认证相关的文件,不需要通过系统本身的登录认证。这也是Linux虚拟机改密码能“绕过登录”的根本原因。
但如果你或者你的团队在安装系统时,选择了全盘加密(比如Ubuntu安装时的加密选项,或者手动分区时用LUKS),那么磁盘内容本身就是密文。此时必须要有密码才能解锁磁盘,LiveCD进去之后看不到正常的分区内容。这种情况下,单用户模式也会因为无法解锁root分区而卡住。遇到这种,只能靠恢复密钥或者找当初设置加密时保存的密钥文件了。
判断方式很简单:在LiveCD的终端里执行lsblk,如果看到crypt字样或者分区类型是LUKS,说明做了加密。没有的话就是普通分区,下面的方案都能用。
提示:个人折腾用的虚拟机基本不会开全盘加密,所以大多数时候不用过度担心。但如果你管理的是公司内部比较严格的环境,建议提前确认清楚。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为什么能绕过登录直接改密码,原理必须搞清楚
2.1 Linux的密码到底存在哪里
Linux系统里,账号密码信息不是存在某个“用户数据库”里的,而是分散在两个文件:/etc/passwd和/etc/shadow。
/etc/passwd保存的是用户账号的基础信息,比如用户名、UID、GID、家目录、默认Shell,这些是任何程序都可能读到的,所以这一行里的密码字段通常是一个x。真正的密码哈希值放在/etc/shadow里,这个文件只有root才能读。shadow文件里每一行对应一个用户,其中第二个字段就是密码的哈希值,格式类似$6$xxx(SHA-512)或者$y$xxx(yescrypt,新版本Ubuntu默认)。
当你执行passwd命令修改密码时,其实就是在更新/etc/shadow中的哈希值。而系统登录时,输入密码后经过相同算法加盐哈希,和shadow里的值比对,一致就放行。
所以“忘记密码”这个说法,准确讲不是密码没救了,而是“你忘了密码,但密码哈希值一直就在磁盘上”。只要能写入磁盘,重新生成一个哈希覆盖掉旧值,就等同于把密码“改”了,哪怕是root密码也一样。
2.2 虚拟机的“可篡改性”让密码重置变得简单
物理机上忘记密码,你得拆机、借设备、操作引导加载器,虽然也能救,但步骤繁琐。虚拟机的优势在于,整个系统其实是放在宿主机上的几个文件(vmdk虚拟磁盘文件、vmx配置文件),你可以随时把ISO镜像挂到虚拟光驱里,或者直接备份一份vmdk再操作,风险极低。
这也是我一直推荐大家用虚拟机学Linux的原因:折腾坏了,快照回滚一下,三秒复活。改密码这套操作在物理机上也适用,但心理压力完全不一样——虚拟机里你根本不担心弄坏。
理解了上面这些,你就能看懂下面的操作了:所有“绕道”的方案,本质上都不是绕过系统,而是让你进入系统内部,以root权限直接改写认证文件。
2.3 Linux有几种“绕过登录”的路径
目前主流的方案有两条:
- 单用户模式:通过GRUB引导参数进入一个特殊的运行级别,系统会启动到root shell,不需要登录。这在物理机和虚拟机都适用。
- LiveCD挂载:用另一个系统(比如Ubuntu安装盘的Try Ubuntu模式)启动虚拟机,把磁盘挂载上来,用chroot进入原系统,再执行
passwd。
两条路各有优劣。单用户模式操作快,但前提是系统能正常引导到GRUB,而且磁盘没有加密。LiveCD方案通用性最强,几乎所有场景都能用,操作也不会太复杂,后面我会详细拆解。
3. 方案一:GRUB单用户模式,五分钟搞定未加密的Linux
3.1 适用条件和准备工作
这个方案最适合的场景:虚拟机里是Ubuntu、Debian这类常见Linux发行版,密码被锁在登录界面,系统引导正常,磁盘没有全盘加密。
需要准备的东西只有一个:能打开虚拟机控制台的VMware或其他虚拟化软件,以及虚拟机的开机权限。不需要额外的ISO镜像。
整体思路是这样的:重启虚拟机,在GRUB引导菜单出现时按e进入编辑模式,在linux开头的内核引导行末尾加上init=/bin/bash,然后按Ctrl+X引导,系统会直接进入root shell。因为进入的是bash而不是完整的系统初始化流程,所以不会要求输入密码。
3.2 实际操作步骤
以VMware Workstation里的Ubuntu 22.04为例:
- 重启虚拟机,开机后立刻按住
Shift键,直到出现GRUB菜单。如果没出现,多试几次,有的系统要狂按Esc。 - 光标移动到默认的启动项上,按
e进入编辑模式。 - 找到以
linux开头的那一行(通常是第二行),把光标移到行尾,在末尾空格后追加:code复制如果你不想进bash,想直接进单用户模式,也可以写init=/bin/bashsingle,但Ubuntu新版本对single的处理有时候会要求输入root密码,所以init=/bin/bash更稳。 - 按
Ctrl+X或F10引导系统,稍等片刻,你会看到root shell,提示符类似bash-5.1#。 - 此时根文件系统是只读挂载的,先重新挂载为可写:
bash复制
这点非常关键,我见过很多人卡在这一步:mount -o remount,rw /passwd执行后提示成功,但一重启密码根本没变,就是因为忘记重新挂载,写入失败。 - 执行修改密码命令:
bash复制
如果是想改root密码,直接passwd 你的用户名passwd root。系统会提示输入两次新密码,输入时屏幕上不显示字符是正常的,别以为是没输入进去。 - 修改完成后,执行
exec /sbin/init正常启动系统,或者直接重启。VMware里也可以直接重启虚拟机。
3.3 这个方案的坑和注意点
实际测试中,有几个坑值得单独提一下:
- systemd版本不同,
init=/bin/bash之后可能不会自动执行/etc/fstab里的挂载,所以一些非根分区可能没有mount。如果系统把家目录放在独立分区,passwd可能会提示写不进去,需要手动挂载对应分区。 - 如果系统启用了SELinux(CentOS、RHEL常见),单纯改密码一般没问题,但如果有其他救援操作需要关注SELinux上下文。Ubuntu默认没开SELinux,不用太担心。
- 进入bash之后,网络服务什么的都没启动,这是正常的,不要惊慌,我们只需要本地操作。
- 如果GRUB菜单设置了密码保护(enterprise环境常见),单用户模式会被拦截,这时候只能换LiveCD方案了。
4. 方案二:LiveCD挂载根分区,最通用也最稳的改密方式
4.1 准备Ubuntu安装镜像并挂载
这个方案我推荐给所有人,因为它的出错概率最低,逻辑也最好理解——相当于把虚拟机的磁盘当U盘插到另一台电脑上改文件。
实际操作里,我一般直接用Ubuntu的桌面版ISO,因为它自带一个“Try Ubuntu”的完整桌面环境,操作直观。Windows系统也可以用Ubuntu ISO来处理,后面会讲。
准备步骤:
- 从Ubuntu官网下载对应的桌面版ISO文件,比如ubuntu-22.04.4-desktop-amd64.iso。
- 打开VMware,选中需要修改密码的虚拟机,点击“编辑虚拟机设置”。
- 在“CD/DVD”选项里,选择“使用ISO映像文件”,浏览选择刚下载的ISO。
- 确认虚拟机启动顺序里光驱优先于硬盘。可以在“虚拟机设置 -> 选项 -> 高级 -> 引导顺序”里确认,也可以直接在开机时按F2进入BIOS调整。
- 启动虚拟机,等出现GRUB菜单时选择“Try or Install Ubuntu”,进入后再选“Try Ubuntu”进入桌面。
4.2 挂载磁盘和chroot操作
进入Live桌面后,打开终端,按这个顺序操作:
-
先查看磁盘分区情况:
bash复制sudo lsblk -f你会看到虚拟机的硬盘,一般是
sda或nvme0n1,根分区通常是sda2(前面大概率有个sda1是EFI分区)。加上-f参数可以看到文件系统类型,ext4的一般就是Linux根分区。 -
挂载根分区到/mnt:
bash复制sudo mount /dev/sda2 /mnt如果你的系统有独立的/boot分区,也要一并挂载:
bash复制sudo mount /dev/sda1 /mnt/boot这里有个判断技巧:
lsblk -f里如果看到某个分区标记为/boot,说明是独立的boot分区。不过改密码不依赖boot分区,挂不挂影响不大。 -
挂载必要的虚拟文件系统,让chroot环境更完整:
bash复制sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys sudo mount --bind /run /mnt/run这一步不是必须的,但绑定了之后,chroot里执行
passwd时,可以正常处理设备节点和系统状态,避免奇怪的报错。 -
进入chroot环境:
bash复制sudo chroot /mnt执行之后,终端提示符会变化,此时你已经是原系统的root身份了。
-
修改密码:
bash复制
passwd 你的用户名或者改root密码:
passwd root。 -
退出并重启:
bash复制exit sudo umount -R /mnt sudo reboot记得在重启前把ISO从光驱里移除,或者等重启后按Ctrl+Alt+Del关闭虚拟机,然后在VMware里把ISO断开连接再开机。否则再次启动还是会引导到Live环境。
4.3 为什么推荐chroot而不是直接改shadow文件
有人可能会问:既然密码哈希在/etc/shadow里,那直接编辑这个文件把hash值替换掉不也行吗?
理论上可以,实操中不建议。原因有两个:第一,生成合法的密码哈希不是随手就能写的,你得用openssl passwd -6之类的命令生成,格式要对,否则系统登录解析失败,直接把你锁得更死。第二,/etc/shadow文件的权限字段、用户密码状态标记(比如是否过期)都需要处理,出了细节问题排查起来很麻烦。
而chroot进去执行passwd,相当于让系统自己处理所有细节,生成合法的哈希、更新过期标记、维护密码策略,全部一步到位。这个思路后面也可以复用到别的地方:系统坏了进不去,只要根分区能挂载,就能chroot进去修,不限于改密码。
4.4 LiveCD方式处理全盘加密系统的说明
如果前面验证过磁盘有LUKS加密,LiveCD方案就多几步。在lsblk时你会看到类似nvme0n1p3_crypt的设备,真正的根分区被映射成这个加密设备。
此时先需要解锁:
bash复制sudo cryptsetup luksOpen /dev/nvme0n1p3 映射名
执行后会提示输入LUKS密码,输入正确的磁盘加密密码后,映射设备出现在/dev/mapper/下。然后再mount这个映射设备,比如sudo mount /dev/mapper/映射名 /mnt。
如果你连磁盘加密密码也忘了,那基本只能靠密钥文件或者物理方式处理了,LiveCD也帮不上忙。所以强烈建议:开全盘加密的虚拟机,一定要把恢复密钥保存在宿主机安全的位置。
5. 方案三:Windows虚拟机忘记密码,利用安装介质破局
5.1 Windows改密码的不同思路
Windows的情况和Linux有很大不同。Windows的SAM数据库存放着密码哈希,而且系统运行时会锁定这个文件,不能在系统内直接替换。不过虚拟机的优势依然在——你可以通过Windows安装ISO进入恢复环境,用命令行工具来操作。
网上的教程很多,但有一种方法我觉得最简洁可靠:利用Windows安装介质自带的命令行,把登录界面上的“轻松使用”按钮替换成命令行入口,然后再用net user命令重置密码。
这个方法本质上是利用了Windows登录界面辅助工具的特性。在没有登录的情况下,系统会运行C:\Windows\System32\utilman.exe(轻松使用工具栏)。如果我们把它替换成cmd.exe,那么在登录界面点击“轻松使用”就会打开一个命令行窗口,而这个窗口具有系统权限。
实际操作中,这个方案的难点在于找到正确的系统盘符,因为WinRE环境下盘符和正常系统下不一样。比如正常状态是C盘的,在恢复环境里往往是D盘甚至E盘。
5.2 完整操作流程
- 下载Windows安装ISO,挂载到虚拟机的光驱。
- 虚拟机从光驱启动,进入Windows安装界面。
- 在安装界面点击左下角的“修复计算机”,进入“疑难解答 -> 高级选项 -> 命令提示符”。有些版本可以直接Shift+F10调出命令行。
- 在命令行里,先确认盘符。执行:
cmd复制如果提示找不到,依次试C盘、E盘。dir D:\Windows\System32\utilman.exe - 找到系统盘符后(假设是D:),备份并替换:
cmd复制如果提示权限不足,系统盘是只读的,先执行move D:\Windows\System32\utilman.exe D:\Windows\System32\utilman.exe.bak copy D:\Windows\System32\cmd.exe D:\Windows\System32\utilman.exediskpart,然后list volume,选中对应卷执行attributes volume clear readonly,再退出:cmd复制diskpart list volume select volume X attributes volume clear readonly exit - 重启虚拟机,正常进入登录界面。
- 点击右下角的“轻松使用”图标(就是那个小人或时钟图标),会弹出命令行窗口。
- 执行:
cmd复制如果忘记用户名,先执行net user 你的用户名 新密码net user列出所有账号。 - 关闭命令行,用新密码登录。
- 登录后恢复utilman.exe,在管理员命令提示符里执行:
cmd复制这一步别漏了,否则下次登录界面点“轻松使用”还是命令行,会有安全隐患。move C:\Windows\System32\utilman.exe.bak C:\Windows\System32\utilman.exe
5.3 Windows改密码的注意事项
- 这种方法对本地账号有效,如果你的Windows是Microsoft账号登录的,直接重置本地密码没意义,需要在登录界面选择“忘记密码”走微软找回流程。不过虚拟机一般用本地账号就能避免。
- Windows 11对系统文件保护更严格,但利用WinRE的File Replacement方法实测在多数版本上依然可行。
- 替换utilman.exe后如果重启登录界面没有变化,检查一下替换的文件是不是真的覆盖到了系统分区,以及系统分区是不是有多个。
6. 能正常进系统时,改密码的前因后果
6.1 passwd命令用法与常见参数
如果你还记得密码,能正常登录,那么改密码就是一条命令的事:
bash复制passwd
这条命令默认修改当前登录用户的密码。执行后会先要求输入当前密码验证身份,然后设置新密码。如果当前用户没有权限修改自己的密码(极少数情况),用sudo提权:
bash复制sudo passwd 用户名
注意,sudo passwd 用户名和sudo passwd、sudo passwd root三者的区别,很多新手容易搞混:
sudo passwd:修改root密码,因为sudo把命令以root身份执行,但没指定用户名时有些发行版默认改root。sudo passwd root:明确修改root密码。sudo passwd 用户名:管理员强制修改指定用户的密码,不需要知道该用户的旧密码。
还有几个实用的参数:
bash复制# 设置密码立即过期,下次登录必须改密码
sudo passwd -e 用户名
# 查看密码状态,包括最近修改时间、过期时间
sudo chage -l 用户名
# 设置密码有效期90天
sudo chage -M 90 用户名
# 禁用某账号的密码登录(不删除账号)
sudo passwd -l 用户名
6.2 批量修改虚拟机密码的思路
如果你管理一批虚拟机,一个一个登录修改效率太低。常见做法是结合SSH和脚本。不过需要注意,SSH修改密码要小心锁死连接。
比较稳妥的批处理思路:
- 在宿主机上准备一个密码修改脚本,通过SSH分发。
- 或者直接利用虚拟化平台的管理接口(比如VMware的vCenter、Proxmox的API)执行客户机命令。
- 修改密码后立刻测试登录,避免批量操作后一批机器全部失联。
对于个人用户,最简单的还是登录后修改。批量场景下我用过sshpass配合chpasswd,但我不推荐在生产环境这么干,容易出问题。
6.3 虚拟机密码管理的个人建议
踩过不少次坑之后,我现在对虚拟机密码管理有这几个习惯,分享出来供参考:
- 所有重要虚拟机,创建完成后立即打一个“干净系统”快照,标注好密码策略。以后忘了密码,回滚快照比修改密码快得多。
- 密码尽量写入密码管理器,不要直接存文本文件。我见过有人把虚拟机密码存在桌面上一个叫“密码.txt”的文件里,等于没锁门。
- Linux的root密码和普通用户密码建议不同。默认普通用户sudo权限很高,完全够日常使用,root密码反而容易忘记。
- Windows虚拟机尽量用本地账号,不要登录微软公司账号,否则改密流程完全不同。
- 如果虚拟机模板要批量复制,记得复制后立即改密码,否则一批机器都是同一个密码,风险很大。
7. 实操中踩过的坑:VMware与虚拟机的常见问题排查
7.1 VMware无法连接虚拟机,提示“请确保您有权运行该程序”
这个问题几乎每个VMware用户都会遇到。最常见的两个原因:
- 当前Windows用户对虚拟机文件没有写权限。检查vmx文件所在目录的权限,右键属性,安全选项卡里添加当前用户的“完全控制”权限。
- VMware的Authorization Service没有运行。在Windows服务管理器里找到“VMware Authorization Service”,确保它正在运行。如果没运行,手动启动,并且设置为自动启动。
这个看似和改密码没关系,但如果在重置密码过程中遇到“无法连接虚拟机”,你连控制台都看不了,所以顺手排查一下。
7.2 虚拟化未启用导致虚拟机无法启动
打开虚拟机的时候报错“此计算机上未启用虚拟化”,这个问题在新装VMware的机器上太常见了。
解决方式很简单:重启电脑进入BIOS/UEFI设置,找到Intel Virtualization Technology或AMD-V选项,设为Enabled。这台机器如果之前跑过WSL2或Hyper-V,还需要确认Windows功能里没有冲突。
不过在用了Win11之后,我还遇到过另一种情况:Windows自带的内存完整性(内核隔离)和VMware冲突,导致虚拟机一直转圈打不开。这种可以尝试在Windows安全中心临时关闭内核隔离,或者在VMware设置里关闭侧通道缓解。改动比较大,建议你先排查BIOS虚拟化是否开启。
7.3 客户机操作系统已禁用CPU,需要重置虚拟机
这个报错在改密码过程中偶尔会出现,尤其是虚拟机配置较低、虚拟机运行时间较长时。它通常意味着虚拟机里的客户机操作系统陷入死锁或CPU挂起状态。
处理方式:打开VMware菜单栏的“虚拟机 -> 电源 -> 重新启动客户机”,如果无效,在“虚拟机 -> 电源 -> 关闭客户机”后再重新开机。实在不行,直接从VMware里点“重置”。
这个报错通常不是配置问题,不用太担心,但频繁出现可能需要检查虚拟机分配的内存和CPU核数是否足够。
7.4 Ubuntu虚拟机网络图标上有个问号
有时候改了密码重启后发现Ubuntu的网络图标出现问号,上不了网。这个和改密码本身关系不大,一般是虚拟机的网络适配器连接状态问题。
检查几个地方:
- VMware编辑虚拟机设置,确认网络适配器勾选了“已连接”和“启动时连接”。
- 网络模式是NAT还是桥接。NAT模式下宿主机能上网虚拟机就能上网,桥接模式依赖局域网分配IP。
- 进入Ubuntu后,执行
ip addr查看网卡是否有IP。如果没有,执行sudo dhclient 网卡名手动获取。
如果WLAN环境下要配置桥接模式,VMware Workstation的非商业版本对无线网卡的桥接支持有限,很多时候会失败。这种情况老老实实用NAT模式就好。
7.5 VMware虚拟机一直转圈打不开,怎么处理
改密码操作之后,有时候虚拟机启动会卡在VMware的启动画面一直转圈。通常原因有:
- VMware Workstation的虚拟打印服务和虚拟机冲突,可以尝试在虚拟机设置里移除打印机设备。
- 虚拟机配置文件损坏,用文本编辑器打开vmx检查最后几行是否有未闭合的配置。
- VMware版本和客户机内核版本不兼容,尝试升级VMware到最新版。
7.6 常见问题速查表
| 问题现象 | 可能原因 | 处理方式 |
|---|---|---|
| 虚拟机无法连接 | 服务未运行、权限不足 | 启动VMware Authorization Service,检查vmx目录权限 |
| 提示虚拟化未启用 | BIOS中VT-x/AMD-V未开启 | 重启进入BIOS开启虚拟化技术 |
| 客户机操作系统已禁用CPU | 客户机死锁 | 重置虚拟机,检查资源分配 |
| Ubuntu网络有个问号 | 网卡没连接、驱动问题 | 编辑虚拟机设置勾选已连接,检查网络模式 |
| 虚拟机一直转圈 | VMware服务异常、配置损坏 | 移除打印机设备,检查配置文件 |
| 引导到GRUB时卡住 | GRUB损坏或加载异常 | 用LiveCD进入救援模式重装GRUB |
这些坑很多是和改密码无关的周边问题,但实际操作中往往会在同一天遇见。把这些整理在一份速查表里,后面自己排查起来也省事。
最后再说一个我自己的习惯:虚拟机改密码之前,先打一个快照。这样万一操作过程中手滑删错了什么,或者新密码设置完反而登录不进去了,一键回滚,成本几乎为零。另外,改完密码之后,重新启动一次虚拟机确认能正常登录,再删掉之前打的快照。这个习惯救了我不止一次,强烈建议你也用起来。
