1. 从一次真实的“锁门”经历说起那天下午我正埋头调试一个服务突然接到同事的电话语气里带着一丝尴尬和急切“哥我那台跑着Ubuntu的测试服务器密码死活不对了用户名也记不清是dev还是deploy了现在完全进不去数据还在里面下午的测试要黄了……”这种场景对于任何一个和Linux服务器打交道的人来说都算不上陌生。无论是个人桌面机太久没登录还是管理着多台环境各异的开发/测试服务器忘记用户名或密码就像出门忘带钥匙——事情不大但足够让人抓狂。尤其是当这台机器承载着重要服务或未备份的数据时那种焦虑感瞬间拉满。网上搜“Ubuntu 忘记密码”教程很多但质量参差不齐。有的步骤跳跃对新手不友好有的方法陈旧在新版Ubuntu的GRUB或systemd设置下已经失效更关键的是很多教程只讲“怎么做”却不讲“为什么这么做”以及操作背后的风险和边界条件。盲目跟着做轻则操作无效重则可能损坏系统或丢失数据。这篇内容就是为你彻底解决这个问题而写的。它不是简单的命令罗列而是会带你走一遍完整的、基于最新Ubuntu LTS版本如22.04 24.04的排查和修复流程。我会解释每个步骤背后的原理告诉你为什么在这个界面按这个键为什么那条命令能生效以及在整个过程中有哪些绝对不能踩的“坑”。无论你是刚接触Ubuntu的新手还是需要处理同事遗留“烂摊子”的运维都能在这里找到清晰、安全、可操作的答案。2. 问题本质与解决路径总览不是修改是“重置”在深入具体步骤前我们必须先统一认知在不知道原密码的情况下我们无法“找回”或“破解”密码。Linux系统的用户密码是经过哈希加密后存储在/etc/shadow文件里的这个过程是单向的理论上不可逆。我们所做的所有操作其本质都是绕过系统的身份验证机制获得一个具有root权限的Shell然后在这个至高无上的权限下直接修改或清空目标用户的密码。因此整个解决路径非常清晰分为三大步突破认证屏障中断系统正常的启动流程让系统在启动初期就给我们一个root shell。这通常需要在GRUB引导菜单上做文章。挂载与修复获得root shell后系统的根文件分区/通常是以只读ro模式挂载的我们需要将其重新挂载为读写rw模式这样才能修改系统关键文件。修改凭据最后使用passwd或直接编辑/etc/shadow文件修改指定用户的密码。整个流程的核心和难点几乎都集中在第一步。因为现代Ubuntu的引导方式、安装模式是否全盘加密、是否UEFI安全启动千差万别导致进入GRUB菜单和修改启动参数的方法各不相同。后面的步骤反而相对标准。下面我们就以最常见的场景——使用UEFI启动、未开启全盘加密的Ubuntu 22.04/24.04桌面版或服务器版——为例展开最详细的操作指南。其他变种情况如旧版BIOS启动、GRUB菜单无法显示等会在后续章节专门讨论。3. 核心操作一步步进入系统并重置密码这个章节是整个过程的实战核心请务必在操作前确认你有对这台机器的物理或虚拟控制台访问权限。远程SSH连接一旦断开是无法进行这些操作的。3.1 第一步抓住转瞬即逝的GRUB菜单GRUB是大多数Linux系统的引导程序。默认情况下为了快速启动Ubuntu会隐藏GRUB菜单直接进入系统。我们的首要任务就是让它显示出来。操作与原理启动或重启你的Ubuntu电脑/服务器。在屏幕出现制造商Logo如Dell Lenovo或黑屏初期立即开始连续按Esc键对于某些服务器或虚拟机可能是Shift键。这个时机需要一点手感如果第一次没成功就重启再试。如果成功你会看到一个蓝底或黑底的菜单列出了“Ubuntu”、“Ubuntu 高级选项”等条目。这就是GRUB菜单。注意在UEFI启动的系统中按键时机非常短。如果按Esc或Shift无效你可能需要在系统启动时进入UEFI/BIOS设置临时关闭“快速启动”Fast Boot选项这会给按键留出更多时间。3.2 第二步修改启动参数获取Root Shell现在我们用键盘方向键选中菜单顶部的“Ubuntu”条目通常是默认选项但不要按回车。按下e键。这会进入GRUB的“编辑模式”你可以看到一长串的启动参数kernel命令行。屏幕上的内容看起来像代码。找到以linux开头的那一行。这一行定义了内核的启动参数。在这行参数的末尾找到ro quiet splash或类似的字样。ro表示以只读方式挂载根分区。将光标移动到ro这个单词处将其修改为rw init/bin/bash。rw表示以读写方式挂载。init/bin/bash这是一个“大杀器”参数。它告诉内核不要启动正常的系统初始化进程systemd或upstart而是直接执行/bin/bash这个shell。这样系统启动后不会进入登录管理器而是直接给你一个root权限的bash shell。修改前后的对比示例修改前linux /boot/vmlinuz-... rootUUID... ro quiet splash修改后linux /boot/vmlinuz-... rootUUID... rw init/bin/bash quiet splash修改完成后按Ctrl X或F10来使用这些编辑后的参数启动系统。如果一切顺利几秒后你会看到一个简单的命令行提示符可能是root(none):/#。恭喜你已经突破了系统的第一道防线拥有了最高权限。注意此时你处于一个非常规的系统环境中很多服务都没启动网络也不可用但这正是我们需要的。3.3 第三步挂载文件系统并重置密码上一步获得的shell其根文件系统可能已经以读写rw方式挂载了因为我们改了参数。但为了保险起见我们显式操作一下并开始修改密码。确认并重新挂载根分区可选但推荐mount -o remount, rw /这条命令将根分区重新挂载为读写模式。执行后可以用mount | grep ‘ / ’查看确认显示rw。查看所有用户确认用户名 如果你连用户名也忘了这是找回用户名的时候。ls /home这条命令会列出/home目录下的所有文件夹每个文件夹名通常对应一个普通用户的用户名。对于root用户它没有/home下的目录。你也可以查看/etc/passwd文件cat /etc/passwd | cut -d: -f1这会列出系统所有用户的用户名。修改对应用户的密码 假设你要修改的用户名是myuser。passwd myuser系统会提示你输入新的密码并确认一次。注意在init/bin/bash环境下密码输入时不会有任何星号*或点号·提示这是正常的你只管输入并按回车即可。Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully看到成功的提示密码就修改好了。一个更底层的方法直接编辑shadow文件备用 如果passwd命令因为某些原因如PAM配置问题不可用我们可以直接修改密码存储文件。首先生成一个新密码的加密哈希值。这里使用opensslopenssl passwd -6输入你想要的明文密码它会输出一串类似$6$...的加密字符串复制它。 然后编辑/etc/shadow文件找到myuser开头的行nano /etc/shadow找到myuser:!:...这一行将第一个冒号:后的!或加密字符串替换为你刚刚复制的新加密字符串。保存退出CtrlX 按Y 回车。3.4 第四步安全重启系统密码修改完成后千万不要直接按电源键强制关机因为系统处于不完整状态直接断电可能导致文件系统损坏。为了让系统以正常方式关闭所有进程虽然此时没多少进程我们告诉内核进行重启exec /sbin/init或者你也可以使用reboot -f-f参数表示强制重启。系统会开始重启流程。重启后GRUB菜单会恢复正常显示或者再次隐藏。选择正常的“Ubuntu”条目启动即可。在登录界面使用你刚刚修改密码的用户名和密码登录大功告成。4. 不同场景下的变通方案与疑难排错上面的流程适用于大多数标准安装的Ubuntu。但现实世界总是更复杂。下面针对一些常见“异常”情况给出解决方案。4.1 场景一GRUB菜单根本不出现尤其是云服务器这是最常见的问题。很多云服务器如AWS EC2 阿里云ECS或某些厂商预装的系统为了简化完全禁用了GRUB菜单显示。解决方案修改GRUB配置文件永久显示菜单需另辟蹊径思路是我们无法在启动时干预那就先通过其他方式如使用Live CD/USB挂载原系统盘修改其GRUB配置让它下次启动时必定显示菜单。操作步骤制作Ubuntu安装U盘在另一台电脑上下载Ubuntu ISO用Rufus、BalenaEtcher等工具制作成启动U盘。从U盘启动将U盘插入锁定的电脑从U盘启动选择“Try Ubuntu”进入Live桌面环境。挂载原系统根分区打开终端用sudo fdisk -l或lsblk查看磁盘分区。通常你的原系统会安装在类似/dev/sda2或/dev/nvme0n1p2的分区上。创建挂载点并挂载sudo mkdir /mnt/original sudo mount /dev/sda2 /mnt/original # 请替换为你的实际分区如果系统有单独的/boot或/boot/efi分区也需要挂载对于UEFI系统很重要sudo mount /dev/sda1 /mnt/original/boot/efi # 通常是EFI分区Chroot到原系统环境这让我们后续的命令像是在原系统中执行一样。sudo mount --bind /dev /mnt/original/dev sudo mount --bind /dev/pts /mnt/original/dev/pts sudo mount --bind /proc /mnt/original/proc sudo mount --bind /sys /mnt/original/sys sudo chroot /mnt/original修改GRUB配置nano /etc/default/grub找到以下两行并进行修改GRUB_TIMEOUT_STYLEhidden # 改为 menu GRUB_TIMEOUT0 # 改为一个正数如 5保存退出。更新GRUB并退出update-grub exit # 退出chroot环境卸载分区并重启sudo umount -R /mnt/original sudo reboot拔出U盘让电脑从硬盘启动。这次GRUB菜单应该会显示5秒钟你就可以按照第3章的方法操作了。重置密码后别忘了再进系统把GRUB_TIMEOUT改回0以恢复快速启动。4.2 场景二系统使用了全盘加密LUKS如果安装Ubuntu时选择了“加密整个磁盘”那么上述方法在第一步就会卡住。因为GRUB阶段就需要密码来解锁磁盘我们根本看不到系统内的菜单。解决方案使用安装介质重置密码这同样需要Ubuntu安装U盘。因为密钥是加密的我们无法绕过。但我们可以用Live环境挂载加密卷然后chroot进去修改密码。从Ubuntu安装U盘启动进入“Try Ubuntu”模式。打开终端安装必要的工具并打开加密卷sudo apt update sudo apt install cryptsetup -y sudo cryptsetup luksOpen /dev/sda3 crypt_root # /dev/sda3是你的LUKS分区名称crypt_root自定系统会提示你输入磁盘加密的密码不是用户密码。这个你必须知道否则数据无法挽回。打开后加密卷会映射到/dev/mapper/crypt_root。接着挂载它sudo mount /dev/mapper/crypt_root /mnt后续步骤就和4.1章节的4、5、6步一样了挂载必要的虚拟文件系统chroot进去然后用passwd修改用户密码。修改完成后退出、卸载、关闭加密卷exit # 退出chroot sudo umount -R /mnt sudo cryptsetup luksClose crypt_root重启这次用你刚改好的用户密码登录。4.3 场景三在虚拟机VMware VirtualBox中操作虚拟机环境是最理想的练习场。除了可以使用上述所有方法外它还有一个额外优势快照。强烈建议在尝试修改GRUB菜单之前为虚拟机创建一个快照。如果操作失误导致系统无法启动你可以瞬间回滚到快照状态毫无风险。虚拟机的按键时机有时更苛刻。如果按Esc没反应可以尝试在虚拟机启动瞬间用鼠标点一下虚拟机窗口内部确保焦点被捕获。VMware中可以尝试快速连续按F2进入BIOS设置然后调整启动顺序或关闭快速启动这有时比按Esc更容易。VirtualBox中可以在虚拟机运行时选择“发送 CtrlAltDel”来重启并在重启过程中按F12选择启动设备有时也能带出菜单。5. 安全反思、权限管理与防患于未然通过物理访问重置密码本质上暴露了Linux桌面和标准服务器部署的一个安全假设物理接触即意味着拥有最高权限。这对于个人电脑没问题但对于可能被他人接触的公共电脑或服务器就是风险。5.1 如何防范此类重置系统所有者视角设置GRUB密码这是最直接有效的方法。可以为编辑GRUB菜单条目设置密码。生成加密的密码grub-mkpasswd-pbkdf2输入密码后得到一串哈希。编辑/etc/grub.d/40_custom文件添加set superusers“root” password_pbkdf2 root 刚才生成的哈希运行sudo update-grub。重启后在GRUB菜单按e编辑时会要求输入密码。启用UEFI安全启动并设置BIOS/UEFI密码安全启动可以阻止未签名的内核如我们修改过的加载。再为服务器主板设置一个BIOS密码可以防止他人从外部介质启动。两者结合能极大提高物理安全性。使用全盘加密LUKS如前所述这是终极防护。不知道磁盘加密密码拥有物理介质也无法读取数据。但务必保管好加密密码对/boot分区加密进阶方案。即使GRUB被修改没有密码也无法解密/boot继续启动内核。5.2 如何避免自己再次忘记密码用户视角使用密码管理器这是现代最佳实践。将复杂的系统密码保存在Bitwarden、1Password等密码管理器中只需记住一个主密码。建立记录文档对于团队管理的服务器应将关键凭证至少是root或初始sudo用户密码加密存储在团队公认的密码库或配置管理系统中。启用SSH密钥登录禁用密码登录对于服务器配置SSH公钥认证并编辑/etc/ssh/sshd_config设置PasswordAuthentication no。这样忘记密码也不影响通过密钥登录的维护。创建备用管理员账户在系统初始化时除了主账户再创建一个具有sudo权限的备用账户并设置一个强密码记在安全的地方。当一个账户出问题时可以用另一个来修复。5.3 关于Root用户密码的特别说明本文主要聚焦于修改普通用户密码。如果你想修改的是root用户的密码默认Ubuntu禁用root登录但密码仍可设置方法完全一样只需在passwd命令后不跟用户名即可passwd然后为root用户设置新密码。但是更符合Ubuntu哲学的做法是不要启用root登录而是始终通过sudo来执行特权命令。如果你忘记了唯一sudo用户的密码就用本文方法修改那个用户的密码即可。修改后其sudo权限依然存在。整个过程从抓住那几秒的GRUB菜单到在陌生的单用户模式下敲下passwd命令更像是一次对Linux系统启动流程的小小“解剖”。它提醒我们在便捷与安全之间总存在权衡。掌握了这个方法你就像拿到了自家门锁的应急钥匙但同时也更应思考如何为那些真正重要的“门”配上更可靠的“锁”。