虚拟机安装Linux后忘记登录密码?可通过以下步骤轻松找回:重启虚拟机,在GRUB引导界面按“e”键编辑启动参数;找到“linux”或“linux16”行,删除“ro”参数,添加“rw init=/bin/bash”;然后按Ctrl+X启动,进入系统后执行“passwd 用户名”修改密码(输入两次新密码),最后输入“exec /sbin/init”重启,操作简单,无需重装系统,即可快速恢复登录权限。
在虚拟机中安装Linux系统进行学习、测试或部署时,偶尔会遇到“忘记登录密码”的尴尬情况——可能是新手操作不熟悉、长时间未使用记错,或是临时搭建的系统未及时记录密码,别担心,Linux系统本身提供了多种找回密码的方式,本文以CentOS 7/8和Ubuntu 18.04/20.04为例,介绍通过GRUB引导编辑重置密码的通用方法,无需重装系统,三步即可搞定!
问题背景:为什么能重置密码?
Linux系统的登录密码存储在/etc/shadow文件中,普通用户无法直接修改,但通过GRUB引导加载程序的“单用户模式”或“恢复模式”,我们可以绕过正常启动流程,以root权限挂载系统根分区,手动修改密码文件,这种方法本质是利用了Linux启动时的“内核参数可编辑性”,属于系统内置的恢复机制,无需第三方工具。
准备工作:确认虚拟机类型与系统版本
- 适用场景:适用于绝大多数虚拟机(VMware、VirtualBox、Hyper-V等)中的Linux发行版,包括CentOS、RHEL、Ubuntu、Debian等(不同发行版GRUB编辑界面略有差异,但核心逻辑一致)。
- 前提条件:确保虚拟机已正常安装Linux系统,且能进入GRUB引导菜单(若GRUB被禁用或加密,需提前调整BIOS/UEFI设置)。
详细步骤:三步找回Linux登录密码
第一步:关闭虚拟机并进入GRUB引导界面
- 完全关机:在虚拟机窗口中,点击“电源”选项,选择“关机”(非重启),确保系统完全停止运行。
- 重启并进入GRUB:重新启动虚拟机,在系统启动的自检阶段(屏幕出现品牌LOGO时),快速连续按下
Esc键(部分系统需按Shift或F2),直到看到类似下面的GRUB引导菜单:CentOS Linux (7.9.2009) Core CentOS Linux (7.9.2009) Core (recovery mode) Ubuntu 20.04.5 LTS (GNU/Linux 5.15.0-88-generic) Ubuntu 20.04.5 LTS (recovery mode)若GRUB菜单一闪而过,可尝试在BIOS/UEFI中设置“启动时显示GRUB菜单”(如VMware中进入BIOS的“Boot”选项,将“Boot Option #1”设为“ubuntu”,勾选“Show boot menu”)。

第二步:编辑内核参数,进入单用户模式
根据系统类型选择对应操作(CentOS/RHEL和Ubuntu/Debian略有不同,需区分):
▶ CentOS 7/8 系统
- 选择内核版本:在GRUB菜单中,用上下方向键选中第一个正常启动的选项(如“CentOS Linux (7.9.2009) Core”),按
e键进入编辑模式。 - 定位内核参数行:在编辑界面中,找到以
linux16(CentOS 7)或linux(CentOS 8)开头的行(类似linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/centos-root ro rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet)。 - 修改参数:在该行末尾空格一个字符,添加
rd.break(CentOS 7)或systemd.unit=rescue.target(CentOS 8),然后按Ctrl+X或F10启动系统。
▶ Ubuntu 18.04/20.04 系统
- 选择内核版本:在GRUB菜单中,选中第一个正常启动的选项(如“Ubuntu 20.04.5 LTS”),按
e键编辑。 - 定位内核参数行:找到以
linux开头的行(类似linux /boot/vmlinuz-5.15.0-88-generic root=UUID=xxx ro quiet splash)。 - 修改参数:删除行末的
quiet splash,添加rw init=/bin/bash(“rw”表示以读写模式挂载根分区,“init=/bin/bash”直接启动bash shell),然后按Ctrl+X或F10启动。
第三步:重置密码并重启系统
进入单用户模式后,你会看到类似switch_root:/#(CentOS)或root@(none):/#(Ubuntu)的命令行提示符,此时已获得root权限,可执行以下操作:
▶ 通用步骤(所有系统适用)
-
挂载根分区(若未自动挂载):
CentOS 7/8 中,rd.break参数会临时挂载根分区到/sysroot,需手动切换:mount -o remount,rw /sysroot # 重新挂载为读写模式 chroot /sysroot # 切换到根环境
Ubuntu 中,
rw init=/bin/bash已直接挂载根分区,无需此步,直接进入root shell。 -
修改用户密码:
假设要重置的用户是root(或普通用户,如admin),执行:passwd root # 重置root密码(若普通用户,替换为passwd admin)
按提示输入两次新密码(输入时不会显示字符,直接输入即可)。
-
更新SELinux上下文(仅CentOS/RHEL):
CentOS 7/8 默认启用SELinux,直接修改密码后可能导致文件标签异常,需执行:touch /.autorelabel # 创建标记文件,重启后自动修复SELinux标签
-
重启系统:
执行reboot或exec /sbin/init(Ubuntu中用exec /sbin/init),系统会正常启动。
▶ 验证登录
重启后,在登录界面输入新设置的密码,即可成功进入系统,若仍无法登录,检查GRUB参数是否修改正确(如是否漏空格、拼写错误)。
注意事项与常见问题
-
GRUB菜单不显示怎么办?
- 虚拟机启动时按
Esc/Shift无效,可在BIOS中调整启动顺序:- VMware:开机时按
F2进入BIOS,找到“Boot”选项,将“Boot Option #1”设为硬盘,勾选“Boot Menu Enable”。 - VirtualBox:开机时按
F2或Del进入BIOS,在“Boot”菜单中勾选“Show Boot Menu”。
- VMware:开机时按
- 虚拟机启动时按
-
重置密码后系统无法启动?
- CentOS:检查是否执行了
touch /.autorelabel,未执行可能导致SELinux阻止登录,重启后系统会自动修复(可能较慢)。 - Ubuntu:检查内核参数是否添加了
rw init=/bin/bash,漏掉rw可能导致根分区只读,无法修改密码。
- CentOS:检查是否执行了
-
忘记root密码,且只有普通用户权限?
若能进入普通用户账户,可通过sudo passwd root直接修改root密码(需普通用户在sudoers列表中,即默认有sudo权限)。
安全建议:避免再次忘记密码
- 设置密码提示:在Linux中,可通过
sudo passwd --stdin root <<< "newpassword"批量设置密码,或记录密码到加密管理工具(如KeePass)。 - 启用GRUB密码:为GRUB引导菜单设置密码,防止他人随意修改内核参数(编辑
/etc/grub.d/01_users,添加用户并运行grub2-mkconfig -o /boot/grub2/grub.cfg)。 - 使用密钥登录:虚拟机中推荐通过SSH密钥认证而非密码,避免密码泄露或遗忘(生成密钥:
ssh-keygen,复制公钥到~/.ssh/authorized_keys)。
忘记Linux登录密码并非“绝境”,通过GRUB引导编辑进入单用户模式是最直接、最安全的恢复方法,只要掌握上述步骤,无论是学习用虚拟机还是生产环境服务器,都能快速解决问题,记得重置密码后及时加强密码管理,避免再次出现类似尴尬!
