用虚拟机这些年,我印象最深的一次翻车,就是刚装好一台Ubuntu虚拟机,随手设了一个自己都记不住的复杂密码,第二天就再也登不进去了。后来在GRUB命令行里折腾了半天,才把用户密码重置回来。说实话,修改虚拟机用户密码这件事,看着像是最基础的入门操作,真上手之后却藏着不少坑:认不清发行版、分不清单用户模式、挂载只读导致认证失败、Windows虚拟机还有另一套完全不同的逻辑……这篇就来把“如何修改虚拟机用户密码”这件事彻底讲清楚,从主动改密到忘记密码重置,再到改完密码之后那些容易被忽略的连锁问题,一次理清。内容同时覆盖VMware Workstation和VirtualBox两种最常见的单机虚拟机场景,Linux和Windows系统的改密方法都会说到,适合刚接触虚拟机的新手,也适合被“忘密码”折磨过的老手直接抄作业。
1. 为什么虚拟机的用户密码这么容易被忽略
1.1 虚拟机里的用户密码,本质上也是“门锁”
很多人觉得虚拟机的密码不重要,理由很统一:“这就是个测试环境,挂了就挂了,大不了重装。”但真实情况是,虚拟机里的系统和你物理机上的系统,在权限和认证层面没有任何区别。Linux靠/etc/passwd和/etc/shadow维护用户信息,Windows靠SAM注册表文件维护账户信息,你修改密码,实际上就是在修改虚拟磁盘里的这些文件,而不是什么“模拟”出来的假账号。换句话说,虚拟机只是把物理硬件换成了虚拟硬件,但里面的操作系统是完整真实运行的,密码保护机制也一并延续下来了。
我在实际工作中见过太多次这种场景:拉了一个虚拟机镜像,里面所有机器共用一套默认账号密码,然后扔给团队几个人一起用。有人需要装个软件就顺手改了下密码,结果整个团队的登录凭据全部失效,谁都不知道新密码是什么。这就是典型的“重装成本不高,但返工成本极高”的事故。所以虚拟机密码管理,其实是你开始正式使用虚拟机的时候,第一件就该认真对待的事。
1.2 哪些场景会让你必须动“改密码”这个念头
结合我平时接触到的案例,常见的改密码场景可以归纳成这几类。
第一类是刚装完系统时的初始化。不管你是照着教程装Ubuntu、CentOS还是Windows,安装向导里设置的那个密码通常比较随意,上了生产用途之后必须改成符合复杂度要求的独立密码,避免镜像里的默认口令留在运行环境里。
第二类是虚拟机被克隆或者被分发之后。克隆出来的虚拟机,默认情况下拥有和源虚拟机一模一样的账户和密码。很多教程只教你怎么克隆,却不提醒你克隆之后立刻改密码,结果就是一批虚拟机全部共用同一套凭据,安全风险非常突出。
第三类是多人共享一台虚拟机。研发团队内部互借虚拟机跑测试是常态,人员交接的时候,上一任管理员留下的密码不会写在交接文档里,与其反复猜,不如走正规流程直接把相关账号的密码重置掉。
第四类就是你忘掉了密码,而且这台虚拟机还在跑着重要服务,重装意味着数据全部作废。这种场景下,“怎么把密码找回来”会直接从优先级最低的问题变成必须要解决的问题。
1.3 这篇要帮你解决的具体问题
围绕“修改虚拟机用户密码”,这篇会按照三条线展开:第一条线,在你还记得密码的前提下,如何分别修改Linux和Windows虚拟机中的用户密码;第二条线,在已经忘记密码的前提下,如何在虚拟机环境中进入恢复模式重置密码;第三条线,改完密码之后可能出现的登录失败、认证失败、启动异常等典型问题,以及对应的排查思路。这三条线覆盖了从虚拟机初始化、日常维护到故障恢复的完整路径,对你后续使用虚拟机非常有价值。
2. 动手改密码之前,先把环境认清楚
2.1 不同虚拟机平台下的操作入口差异
修改虚拟机用户密码,最核心的前提是先搞清楚你手里的虚拟机到底是什么平台、什么形态。常见的单机虚拟机环境主要就是VMware Workstation/VMware Fusion、Oracle VirtualBox、以及KVM/libvirt这些。云平台上的云主机本质上也是虚拟机,但它的密码重置逻辑走的是另一个体系。
先说VMware Workstation,它通过一个“虚拟机控制台”窗口来模拟物理显示器,你在控制台里看到的画面和操作方式,跟在物理机前操作几乎一模一样。改密码的时候,你可以像操作真机一样在控制台里打开终端或者设置界面。VirtualBox的操作逻辑也类似,它的窗口同样模拟了一台完整的主机,支持键盘和鼠标输入。这两个平台最大的共同点是,虚拟机启动过程中你都可以介入引导阶段,比如按F2进BIOS、按Esc进GRUB菜单,这对我后面说的“用单用户模式重置密码”至关重要。
KVM的话略有不同,如果你没有配置图形化的virt-manager界面,而是用命令行远程管理,那通常是通过virsh console连接到串口控制台,操作起来不如前面两个平台直观,但对密码重置来说原理是相同的。云平台上的虚拟机则要特别注意,很多云厂商的VNC/SPICE控制台在引导时无法让你灵活打断引导流程,而且有些系统镜像默认禁止了串口、默认密码策略也非常严格,这种情况下我更建议直接使用云平台提供的“重置密码”功能,而不是去模仿单机虚拟机的GRUB操作,因为很多步骤在云端环境根本走不通。
2.2 分清“主动改密”和“遗忘重置”是两条不同路线
我见过不少新手在“忘记密码”的时候,却去网上搜“如何修改虚拟机用户密码”的教程,结果看到的是passwd命令,就以为自己已经掌握了解法,实际上这两件事完全不是一回事。
主动改密的前提是:你知道当前密码,并且已经成功登录系统。Linux下用passwd改自己的密码,Windows下在账户设置里直接修改,这套流程很简单。遗忘重置的前提是:你已经完全进不去系统了,而你手边唯一能操作的就是虚拟机的关机/开机和引导选项。在这种情况下,你不仅不能依赖系统里已有的命令,还要小心不要破坏原系统数据。
这两条路线最大的区别在于操作地址不同。主动改密是在操作系统内部运行认证程序,由系统自身负责把加密后的密码写入对应的存储文件;遗忘重置则是通过特殊引导方式绕开正常登录流程,直接以恢复权限去修改存储密码的文件。搞清楚这一点之后,你在操作的时候才不容易把两步走成一步,尤其是在恢复模式下,别一进去就到处乱翻,目标非常明确:找到对应的密码存储文件并重置内容。
2.3 修改密码前一定要做快照
这一条是我吃了好几次亏才养成的习惯。VMware Workstation和VirtualBox都提供了快照(Snapshot)功能,它的效果是在某个时间点给虚拟机的整个磁盘状态拍一张“照片”,之后任何时候让你回退到这个时间点的状态。
修改用户密码,本质上是在操作系统内部执行敏感操作,一旦发生误操作,例如不小心把用户锁了、把sudo权限弄坏了、或者失手删掉了关键用户,系统就会变得非常难处理。有了快照,你只需要回滚到修改前的状态,一分钟就能恢复。尤其在你尝试各种“忘记密码重置”的方法时,快照更是保命用的。我自己在演示GRUB单用户模式改密码的时候,前后会打两次快照,一次在实验前,一次在成功改完密码后,中间无论哪一步出问题都不怕。
这里也顺带提醒一句,快照不是备份。快照依赖当前的虚拟磁盘文件,如果你删掉了虚拟机原始的VMDK、VHD文件,或者把虚拟机迁移到了另一台宿主机上,快照很可能就失效了。所以重要数据该备份还是得备份,不要把快照当成唯一保险。
3. Linux虚拟机用户密码修改实操
3.1 还记得当前密码的话,用这几条命令就够了
Linux系统下修改用户密码的命令,最常用的就是passwd。当前登录用户想改自己的密码,直接执行:
passwd系统会先要求输入当前密码,然后输入两次新密码,通过之后即时生效,不需要重启虚拟机。这种方式最适合日常维护,比如你已经用默认密码登录上了刚装好的Ubuntu虚拟机,想立刻换掉初始密码,只要在终端里运行这一条命令就可以。
如果是管理员帮其他用户重置密码,需要用到root权限。在Ubuntu、Debian等系统上,通过sudo执行:
sudo passwd 用户名注意这里不需要输入这个用户的当前密码,直接设置新的就行。在CentOS、RHEL等系统上,如果你当前就是root用户,直接执行passwd 用户名就完成了。它们之间的差异主要在是否默认启用了sudo以及root是否可以直接登录,在我做的多台虚拟机测试中,习惯做法是先确定当前用户是否有sudo权限,再决定用哪种方式。
还有一种适合脚本自动化或者批量设置的命令是chpasswd。比如想把名叫zhangsan的用户密码改成NewPass@123,可以这样操作:
echo "zhangsan:NewPass@123" | sudo chpasswdchpasswd的好处有三个:一是非交互式执行,适合在初始化脚本里批量设置;二是不需要在终端里输入两遍密码,减少人为失误;三是它可以一次处理多个用户,以“用户名:密码”的形式逐行喂给它就可以了。批量初始化一组虚拟机镜像时,用chpasswd明显比一个个手动执行passwd效率高得多。
3.2 忘记密码时,通过GRUB进入单用户模式重置
这是Linux虚拟机忘记密码时最核心的恢复手段。原理其实不复杂:Linux引导过程中,GRUB会加载内核,如果我们通过编辑GRUB启动项,让内核在启动时直接以指定运行级别或者指定init程序运行,就可以绕开系统本身要求输入密码的登录流程,进入一个拥有root权限的临时环境,然后在里面修改密码。
以最常见的RHEL系发行版(CentOS、Rocky Linux、AlmaLinux等)为例,步骤如下:
第一步,重启虚拟机,在GRUB菜单界面出现时,光标移动到默认内核那一行,按字母e进入编辑模式。
第二步,找到以linux开头的那一行,一般是linux /boot/vmlinuz-xxx或者linux16,在行尾追加一个参数rd.break。这个参数的意思是:在切换到真正的根文件系统之前停下来,把当前环境扔给管理员处理。
第三步,按Ctrl+x或者F10启动,进入一个临时的内存环境。看到switch_root:/#提示符后,先执行:
mount -o remount,rw /sysroot因为默认情况下/sysroot是只读挂载的,不重新挂载成可读写就直接用passwd,会报出经典的passwd: Authentication token manipulation error,根本没有办法完成修改。这一步重挂载是很多人容易漏掉的关键操作。
第四步,用chroot切换到真实的系统根目录:
chroot /sysroot passwd root输入两遍新密码,完成root密码重置。如果还想重置其他用户密码,继续执行passwd 用户名即可。
第五步,更新SELinux上下文并退出:
touch /.autorelabel exit exit系统会继续完成启动流程,你可能看到进度比平时慢一些,这是在自动给文件系统重新标记SELinux标签,属正常现象。等系统启动完成后,用新密码登录即可。
Debian系发行版(Ubuntu、Debian本身)操作上略有区别,不需要rd.break,而是把内核行末尾的ro quiet splash直接替换为rw init=/bin/bash,然后启动,系统会直接进入一个root shell,进入之后同样是执行passwd 用户名,重置完成后执行reboot -f强制重启,不影响原系统。
在实操中还有个小技巧,按e进入编辑模式的时候,如果GRUB菜单是你之前没有见过的样式,不要慌,仔细观察有没有包含vmlinuz或者initrd的行,那基本就是内核行。另外,有的版本GRUB在文本模式下需要按Ctrl+e才跳到行尾,有的直接用End键就行,建议试验的时候两手准备。
3.3 修改完Linux密码后容易踩的坑
改完密码不等于万事大吉。我遇到的第一个坑,是重启之后系统完全没有报错,但登录时输入正确的密码,界面却卡在原地,表现为黑屏或者回到登录界面循环。排查下来很多情况是因为改密码用的恢复环境破坏了当前用户会话相关的配置,或者桌面环境没有正常加载。解决思路很简单,按Ctrl+Alt+F2切换到另一个TTY用命令行登录,登录成功后再去修复桌面组件。这个问题跟密码本身已经没有关系了。
第二个坑是关于密码过期和锁定状态。Linux系统允许配置密码有效期,比如默认90天到期,时间到了系统就会要求用户立即改密码。也有一种情况是管理员之前用passwd -l锁定了某个用户,你这样看密码好像没错,但实际上账户处于锁定状态。排查时用chage -l 用户名查看密码过期时间,用passwd -S 用户名查看账户状态。如果看到L标志就说明被锁了,root用户下执行passwd -u 用户名解锁。
第三个坑是关于权限被收紧。修改密码时如果顺便动了用户的组、家目录权限或者sudo配置,很可能导致原本能跑的服务突然起不来。比如/etc/sudoers文件权限被误改,sudo就直接失效了。这类问题其实和密码无直接关系,但经常被误报成“改完密码系统出问题了”。处理方法是提前用快照对比前后配置变化,别靠猜。
4. Windows虚拟机的用户密码修改实操
4.1 还记得当前密码的话,图形界面和命令行都行
Windows虚拟机修改用户密码,比Linux直观很多。在登录系统之后,打开“设置 -> 账户 -> 登录选项”,点击“密码”,在“修改”区域输入当前密码和新密码即可完成修改。如果你用的是Windows 10/11 企业版或服务器版,还可以通过“计算机管理 -> 本地用户和组”去管理多个账户。
命令行方式也很高效,尤其是在多台Windows虚拟机需要统一切换本地密码的时候。用管理员身份打开命令提示符或者PowerShell,执行:
net user 用户名 新密码比如把名为admin的用户密码改成Passw0rd!:
net user admin Passw0rd!如果要顺带把账户的“密码永不过期”属性打开,加一个/expires:never参数。如果想把某账户设为禁用状态,用:
net user admin /active:no实际上我更推荐在VMware Workstation里验证Windows虚拟机密码是否生效的方式是:先通过控制台登录试一次,再通过远程桌面(RDP)登录试一次。RDP会影响很多人容易忽略的一点:Windows登录界面默认锁定当前控制台会话,你通过RDP改密码之后,控制台界面的状态和RDP会话的状态可能存在差异,导致你明明改了密码,在控制台上却仍然看到锁屏画面。这种情况按一下锁定界面的“其他用户”,重新输入新账号信息就好。
4.2 忘记Windows虚拟机密码时的重置思路
Windows系统忘记密码比Linux麻烦一些,因为Windows没有提供类似GRUB单用户模式那样的官方便捷入口,在虚拟机里操作需要借助另外的手段。下面说三种我实际用过的恢复思路。
第一种是使用系统安装介质或PE环境。你在虚拟机里挂载一个Windows安装镜像(ISO),设置为从光盘启动,进入“修复计算机 -> 疑难解答 -> 命令提示符”。在这个命令提示符里,可以定向操作目标系统盘。经典的离线重置方法是利用“启用粘滞键替换技巧”:正常Windows登录界面连按五次Shift,会弹出粘滞键程序sethc.exe,我们可以用工具把它替换成cmd.exe,从而在登录界面直接弹出命令行,再执行net user重置密码。
具体操作分几步:进入修复环境的命令提示符,先确定系统盘的盘符,通常不再是C盘,因为PE环境会重新分配盘符,我一般用diskpart或wmic logicaldisk get name查看分区情况。然后执行:
move d:\windows\system32\sethc.exe d:\ copy d:\windows\system32\cmd.exe d:\windows\system32\sethc.exe第一行意思是把原来的sethc.exe改个名字备份起来,第二行是用cmd程序顶替这个文件。重启虚拟机,正常进入系统登录界面,连续按五次Shift调出命令行,然后执行net user 管理员 新密码。重置完成之后,记得再进入恢复环境把文件还原,因为如果你把改动留在生产系统里,任何人都能在登录界面按五次Shift打出命令行,这就等于把门锁换成了门帘,安全等级瞬间归零。
第二种方法是借用第三方的离线密码重置工具,比如类似chntpw这类工具,它可以直接修改Windows注册表里的SAM文件,不需要进入系统。用法是把工具镜像挂载到虚拟机的光驱里,从该镜像引导,按提示选择目标系统和目标账户,然后清空或重置密码。这个方法我已经验证过多次,对Windows 10和Windows Server 2019/2022的本地账户都比较可靠,但有一个前提:你的虚拟机使用的是本地账户,如果你登录的是微软在线账户,SAM文件里保存的并不是实时密码,这个方法就派不上用场了。
第三种最省事的方案,是直接用虚拟机平台的快照回滚到还能登录的那个状态。这个方法听上去有点“作弊”,但非常有效,尤其是你只是想在系统上临时做个操作,改完密码忘了记账,回滚快照能把系统恢复到你还有把握登录的时候。注意快照会把这个时间点之后产生的新数据一并回退掉,所以只在不上生产数据的情况下用它。
4.3 微软账号密码和本地账户密码必须分清楚
Windows虚拟机和Linux虚拟机在“用户密码”上的最大不同,就是Windows可能有微软在线账户和本地账户两种情况。如果你安装Windows时登录的是微软账号,那么系统里保存的密码其实是一个本地缓存的凭据,真正的密码管理权在微软服务器侧。你在虚拟机里通过设置界面修改密码,走的是在线密码变更流程,需要网络连通、需要可能触发双重验证,整个过程中不依赖虚拟机自身的本地账户体系。
在实际工作中,我的建议是:虚拟机里尽量使用本地账户。原因很简单,改密码、重置密码、离线修复都基于本地账户这套体系,操作可控、不受网络影响、不需要连到云端。如果一定要用微软账号,请务必在系统里同时创建一个具有管理员权限的本地账户作为“逃生通道”,这样虚拟机在完全断网、或者微软账户无法登录的情况下也有退路。
5. 修改完密码后,那些跟着一起出现的“怪问题”
5.1 密码明明正确,系统却一直提示认证失败
这个问题在虚拟机上出现的概率远高于物理机,主要原因有三个。第一个是键盘布局问题。VMware Workstation和VirtualBox默认向虚拟机模拟的键盘是标准104键美式布局,但你自己的物理键盘可能设着中文输入法或者德语、法语布局。密码中包含特殊符号像@、#、$的时候,尤其在中文输入法环境下会打出中文标点,导致密码认证失败。看到登录界面一直转圈或者提示“用户名或密码错误”时,先检查一下虚拟机窗口右上角的输入法状态,切回英文状态再试。
第二个是小键盘NumLock的问题。密码里的数字用的是主键盘区和小键盘区,如果虚拟机启动时NumLock状态和物理机不一致,那么你用独立小键盘输入的数字串可能根本不等于你心里想的那个数字。解决方案很简单,用最上面一排数字键输入密码。
第三个是账户被锁定或者被禁用。Windows虚拟机连续输错密码会触发账户锁定策略,默认锁定时间十分钟到半小时不等;Linux中有PAM配置/etc/security/faillock.conf,同样可能因为失败次数过多而锁定账户。这种情况下再多试密码也没有意义,要么等锁定窗口过期,要么去恢复环境里解锁。
5.2 虚拟机启动异常:蓝屏、卡logo、循环重启
修改密码本身不会直接导致系统启动异常,但很多人往往是把“改密码”和“改配置、清理空间、升级驱动”放在一起操作,出问题之后归因成了“改密码导致”。我在虚拟机群里见过最多的case,是用户在执行密码重置步骤时误改了内核启动参数、丢失了GRUB配置、或者破坏了引导分区,重启后一张蓝屏或者光标闪烁。
遇到启动异常,先不要急着重装系统。第一步确认虚拟机的硬件兼容性,比如你之前用的虚拟机版本是Workstation 15,后来又用Workstation 17打开,某些内核模块可能需要重新适配。第二步看引导日志,比如Windows出现自动修复引导界面时,进去选择“高级选项 -> 启动设置 -> 重启”,按F8进入安全模式试试能不能登录。如果安全模式能进,说明系统本身的账号数据库没有问题,密码重置操作也没问题,问题出在某个第三方驱动或者开机自启程序上。第三步直接回到快照点,把我前面提到的快照回滚方案用起来,这比研究蓝屏代码要快得多。
还有一类启动异常是在宿主机层面出现的,比如VMware Workstation突然报“无法连接到虚拟机”,或者虚拟机平台提示被占用。这往往和Windows Hyper-V相关组件冲突有关,和虚拟机内部改密码无关。处理方法是检查Windows功能中“虚拟机监控程序平台”和“虚拟机平台”的开关状态,避免同一环境下Hyper-V与VMware并存冲突。
5.3 改完密码之后,网络、共享目录、计划任务“突然失效”
Windows修改密码后出现“网络共享访问被拒绝”时,很多人第一反应是共享权限变了,其实更常见的原因是你改的密码和你保存的凭据不一致。Windows的凭据管理器里可能存着旧密码的凭据,Windows服务(比如计划任务、IIS应用池)也各自有“登录身份”密码信息,它们不会因为你执行net user自动同步。如果发现计划任务报0x80070569之类的错误,就去“任务计划程序”修改任务的“运行用户”密码;如果发现共享盘访问不了,就在“控制面板 -> 凭据管理器”里把对应共享的旧凭据删掉,重新用新密码添加,这个问题就能解决。
Linux下也有类似的坑。比如你通过SSH密钥登录虚拟机,修改密码后SSH密钥并不受影响,因为SSH密钥登录走的是/root/.ssh/authorized_keys,和密码认证是两套体系。但是像cron任务或者systemd服务里的文件如果有加密或者需要认证,它们可能存储的是旧凭据,换密码后只能手动更新。另外,如果你在/etc/fstab里配置了需要密码的挂载点(SMB、CIFS或LUKS加密盘),密码变更后重启虚拟机会出现挂载失败,系统可能因此卡在启动流程里。这个情况排查时可以用dmesg | grep -i password快速定位相关报错。
5.4 虚拟机密码管理的几个推荐习惯
根据我做虚拟机运维的实践,最后总结几条非常“实战向”的习惯。
第一条,所有虚拟机首次初始化完成之后,立刻改掉镜像默认密码,并停用或删除默认安装时创建的临时账号。这条既适用于Linux也适用于Windows,目的是避免多台虚拟机共用相同口令。
第二条,正规场景给重要虚拟机设置密码策略。Linux可以通过/etc/login.defs和pam_pwquality来管理密码长度和复杂度,Windows可以通过“本地安全策略 -> 账户策略”来设置。如果只是个人折腾的测试机,那就确保密码兼顾复杂度和你能记住的程度,别陷入“密码复杂到谁都记不住”的悖论。
第三条,养成修改前打快照的习惯,修改后确认能登录再删掉之前的临时快照。一个命名规范的快照,比如“before-password-change”,能让你在操作失误时两分钟回到原点。
第四条,把“修改用户密码”这件事纳入虚拟机存档管理的一部分。每次给虚拟机改名、克隆、迁移或者交付给其他人之前,都重新确认一次当前系统内到底有哪些用户、有没有密码过期、有没有锁定状态。批量管理多台虚拟机时,我通常直接把修改密码脚本写进初始化配置流程,用chpasswd或者PowerShell统一执行,避免一台一台手点。
6. 下一个要解决的是“改IP”和“网络访问”
既然这篇是“如何使用虚拟机(一)”,我可以先告诉你接下来大概率会遇到的问题:密码处理好之后,你要面对的就是IP地址。虚拟机的IP地址和宿主机怎么互通、怎么固定静态IP、怎么配置多站点自定义域名,这几乎是所有虚拟机用户跨不过去的一道坎。你在VMware里装完Ubuntu虚拟机,重启一次IP就变了,SSH连接也断了,到时候你又会发现,原来在虚拟机里配置网络比改密码更要细心。后面我会专门写一篇修改虚拟机IP地址和网络连接的内容,有需要的话可以顺着这个系列继续看。
最后再分享一个我个人的习惯。每次我成功重置完一台虚拟机的用户密码,都会顺手做两件事:第一,在宿主机上新建一个文本说明文件,把虚拟机的机器名、用户名、密码变更日期、谁负责这台机器这些信息列一个表,这个文件虽然不在虚拟机里,但对我这种同时维护十几台虚拟机的人来说,相当于一个最简陋的资产管理清单;第二,马上把旧密码从各种命令行历史和笔记软件里清掉,避免下次自己都分不清哪个是当前有效密码。别笑,这种低级错误我踩过不止一次——有一次我把新密码写进了笔记,然后命令行历史里还留着旧密码,一周之后再登录,我自己都试了一整天才确定是新密码还是旧密码。密码这件事,多数时候不是被强猜的,而是自己把自己绕晕的。希望这篇内容能帮你绕开这些坑,把虚拟机的密码管理理顺。