Ubuntu 20.04密码重置:通过GRUB修改内核参数获取Root权限 1. 问题场景与核心思路“Ubuntu 20.04密码忘记了怎么办”——这几乎是每个Linux用户无论是新手还是老手在某个深夜与系统搏斗时都可能遇到的灵魂拷问。它不像Windows系统在登录界面给你一个显眼的“重置密码”链接。Linux尤其是Ubuntu这种默认启用sudo权限管理的发行版将安全放在了更优先的位置但也因此让密码恢复变得不那么直观。我遇到过不止一次在服务器上、在个人开发机上甚至是在给同事配置的虚拟机里因为长时间不登录或者密码管理器同步失败导致被挡在系统大门之外。那种感觉就像你明明有家钥匙却怎么也打不开门锁。别慌这个问题有标准且可靠的解决方案。其核心思路非常直接绕过当前的系统身份验证直接获得一个具有root权限的Shell然后修改指定用户的密码。听起来有点“黑客”行为但实际上这只是利用了Linux系统引导过程的可干预性。在系统启动加载内核、初始化系统服务之前我们有机会向内核传递特殊的启动参数或者直接进入一个最小化的恢复环境。对于Ubuntu 20.04 LTS长期支持版由于其使用GRUB 2作为默认的引导加载程序并且采用了systemd作为初始化系统我们的操作路径非常清晰。整个过程不需要任何额外的启动介质如Live USB完全在本地硬盘上完成前提是你能物理接触到这台机器或者拥有服务器的控制台访问权限。2. GRUB 2引导菜单的调出与操作整个重置流程的第一步也是最关键的一步就是进入GRUB 2引导菜单。GRUB 2是Ubuntu 20.04的默认引导程序负责在开机时加载Linux内核。默认情况下为了快速启动GRUB 2菜单是隐藏的。我们的目标就是让它显示出来。2.1 触发GRUB菜单显示在开启电脑或虚拟机电源后你需要立刻、反复地按下Shift键对于传统的BIOS启动方式或者Esc键对于大多数UEFI启动方式的电脑。这个时机要抓得准最好在制造商Logo比如Dell, HP, Lenovo的标识出现之后、Ubuntu的紫色启动画面出现之前就开始按。如果成功你会看到一个蓝底黑字或黑底白字的菜单列出了可启动的内核选项通常最上面一个是“Ubuntu”下面可能还有“Ubuntu 高级选项”等。注意在一些较新的UEFI电脑上快速启动Fast Boot功能可能会缩短甚至跳过按键检测的时间窗口。如果按Shift或Esc无效可以尝试进入BIOS/UEFI设置暂时关闭“快速启动”或“安全启动”Secure Boot然后再试。安全启动通常不会影响GRUB菜单的调出但极端情况下可能有影响。2.2 理解GRUB菜单选项进入菜单后用上下方向键选择第一行的“Ubuntu”不要进入“高级选项”然后按下e键。这个操作是“编辑”edit当前选中的启动条目。此时你会进入一个文本编辑界面屏幕上会显示一大堆配置参数。这些参数最终会传递给Linux内核告诉它如何启动系统。我们的“魔法”就发生在这里。2.3 修改内核启动参数以获取Root Shell在这个编辑界面中你需要找到一行以linux开头的内容。这一行非常长通常会换行显示包含了内核镜像的路径 (/boot/vmlinuz-...) 和一大堆参数比如ro(只读挂载根文件系统)、quiet(静默启动)、splash(显示启动动画) 等。我们的目标是让系统启动后不执行正常的登录管理器如GDM, LightDM而是直接给我们一个具有root权限的Shell。有两种主流且等效的方法方法一在行末追加rw init/bin/bash找到linux那一行将光标移动到该行末尾。首先确保有一个空格然后输入rw init/bin/bash。rw 将根文件系统从默认的只读(ro)挂载改为读写(rw)挂载这样我们才能修改系统文件如密码文件。init/bin/bash 这是一个“核武器”级别的参数。它告诉内核不要启动完整的systemd初始化系统而是直接将/bin/bash这个Shell程序作为系统的第一个进程PID 1。这样系统启动后就会直接进入一个bash终端并且这个终端默认拥有root权限因为它就是“init”进程。方法二替换quiet splash为rw init/bin/bash更常见的做法是找到linux行中的quiet splash这两个参数直接把它们删掉然后替换成rw init/bin/bash。这样做更干净同时禁用了启动时的安静模式和动画方便你看到启动过程中的信息。修改完成后它看起来应该是这样的具体路径可能略有不同linux /boot/vmlinuz-5.4.0-42-generic rootUUIDxxxx ro quiet splash $vt_handoff修改为linux /boot/vmlinuz-5.4.0-42-generic rootUUIDxxxx rw init/bin/bash或者方法二linux /boot/vmlinuz-5.4.0-42-generic rootUUIDxxxx rw init/bin/bash $vt_handoff重要提示$vt_handoff是GRUB的一个变量通常保留即可。修改时务必小心不要删除或改动rootUUIDxxxx这部分它指定了你的根文件系统在哪里改错了可能导致无法启动。参数修改完毕后按下Ctrl X或者F10来使用这些修改后的参数启动系统。接下来系统会开始引导但不会出现图形登录界面而是直接跳转到一个命令行终端并且提示符通常是root(none):/#这表示你已经在一个临时的、以root身份运行的Shell环境中了。3. 只读文件系统的重新挂载与密码修改当你按下CtrlX启动后系统会按照我们的指令将根文件系统以读写方式挂载并直接启动bash。但是这里有一个非常重要的细节虽然我们在内核参数里指定了rw但有时根文件系统可能仍然处于只读状态或者某些特定的挂载点如/home是分离的。这是一个常见的坑点直接操作可能导致密码修改失败。3.1 确认并重新挂载根文件系统首先我们需要确认当前根文件系统的挂载状态。输入以下命令mount | grep -w “/”或者findmnt /查看输出中是否有ro(read-only) 字样。如果显示为rw那很好可以直接下一步。但很多时候你会看到ro。这是因为内核参数rw可能被某些初始化脚本覆盖了或者文件系统本身需要重新挂载。为了确保万无一失我们手动将其重新挂载为读写模式mount -o remount,rw /这条命令的意思是重新挂载(remount)根目录(/)使用选项(-o)读写模式(rw)。执行后通常不会有成功提示但你可以再次运行mount | grep -w “/”来确认现在已经是rw了。3.2 修改用户密码现在我们可以使用万能的passwd命令来修改密码了。你需要知道你要修改哪个用户的密码。最常见的是修改自己的普通用户密码如果你忘记的是你日常使用的账户比如用户名为ubuntu或yourname并且这个用户拥有sudo权限通常安装时创建的第一个用户就是那么直接修改它。passwd username将username替换为你的实际用户名。系统会提示你输入新的密码并确认一次。在bash作为init进程的这个特殊环境里它不会要求你输入旧密码。修改root用户密码如果你想直接启用root账户Ubuntu默认禁用root登录或者你的普通用户账户出了问题可以修改root密码。passwd root同样输入并确认新密码即可。实操心得与避坑指南密码复杂性虽然在这个恢复环境下系统可能不会强制要求密码复杂度但出于安全考虑建议还是设置一个强密码。你可以先想好密码再在这里输入避免临时想一个简单的然后忘记。用户不存在如果你输入passwd username时提示“用户不存在”请先检查用户名是否拼写正确。可以查看/etc/passwd文件来确认系统中有哪些用户cat /etc/passwd | cut -d: -f1。“鉴定令牌操作错误”如果遇到这个错误几乎可以肯定是文件系统仍然是只读的。请务必回头执行mount -o remount,rw /命令并确认成功。SELinux/AppArmorUbuntu 20.04默认使用AppArmor作为安全模块。在恢复模式下修改密码AppArmor可能未完全加载一般不会造成问题。但如果你的系统有特殊的强制访问控制策略可能需要额外的步骤不过对于绝大多数桌面和服务器场景无需考虑。3.3 可选但推荐更新所有文件系统属性修改密码后passwd命令实际上更新的是/etc/shadow文件。为了确保所有更改都写入磁盘并且系统状态一致可以执行一次同步sync这个命令强制将内存中所有已修改的文件系统缓存写入磁盘。4. 完整重启流程与验证密码修改成功后我们还需要正确地退出这个特殊的恢复环境并正常重启系统。4.1 退出并重启在当前这个以bash作为init进程的环境里你不能使用常见的reboot或shutdown -r now命令因为正常的关机管理服务由systemd提供并没有运行。这些命令可能会报错或没有反应。正确的重启方式是exec /sbin/init或者exec /lib/systemd/systemdexec命令会用指定的程序这里是完整的初始化系统init或systemd替换当前的shell进程。执行后系统会重新按照标准流程启动你会看到systemd启动各个服务的日志最终到达图形登录界面或命令行登录提示符。你也可以直接使用硬重启的方式即按下电脑的物理重启键或使用虚拟机管理界面的重置功能。但使用exec命令是更优雅、更安全的方式它让系统自己完成清理和正常启动流程。4.2 验证新密码系统重启后在登录界面图形或命令行输入你修改密码时对应的用户名和新密码。如果一切顺利你应该能成功登录。4.3 可能遇到的问题与排查登录后提示“读取/创建家目录锁文件失败”或桌面异常这通常是因为你以root身份在恢复Shell里动过家目录的文件或者权限出现了混乱。解决方法是在成功登录你自己的账户后检查家目录的权限ls -la ~/确保所属用户和组是正确的。极端情况下可以备份数据后参考对应用户的权限模板重建家目录但这种情况很少见。图形界面登录循环输入密码后闪一下又回到登录界面。这通常不是密码错误而是图形环境如GNOME的配置或权限问题。此时可以尝试切换到文本终端按CtrlAltF3用命令行登录。如果能登录说明密码是正确的问题出在图形环境。可以尝试重装显示管理器sudo apt install --reinstall gdm3如果你用的是GDM。“sudo” 仍然要求密码这是正常的。sudo的密码就是你刚刚修改的用户密码不是root密码除非你修改了sudo配置。输入新密码即可。5. 其他相关场景与进阶操作上述方法是针对最常见情况的通用解法。但在一些特殊配置或更复杂的环境下你可能需要一些变通。5.1 启用Root用户并设置密码Ubuntu默认禁用了root用户的密码登录。如果你希望直接启用root账户除了用passwd root设置密码外可能还需要修改SSH配置/etc/ssh/sshd_config中的PermitRootLogin或确保root账户的shell是有效的usermod -s /bin/bash root。不过出于安全最佳实践不建议直接使用root进行日常操作而是通过sudo来提权。5.2 使用Live USB重置密码当GRUB无法修改时如果GRUB菜单因为某些原因无法编辑例如GRUB本身损坏或者系统是全盘加密的LUKS你就需要借助外部介质了。你需要另一台电脑制作一个Ubuntu 20.04的Live USB启动盘。用Live USB启动电脑选择“试用Ubuntu”。进入Live桌面后打开终端。你需要挂载原来系统的根分区。首先用sudo fdisk -l或lsblk找到你的系统分区通常是较大的EXT4分区。假设你的系统分区是/dev/nvme0n1p2创建一个挂载点并挂载它sudo mkdir /mnt/sysroot sudo mount /dev/nvme0n1p2 /mnt/sysroot为了使用原系统的用户数据库还需要绑定挂载几个关键目录sudo mount --bind /dev /mnt/sysroot/dev sudo mount --bind /proc /mnt/sysroot/proc sudo mount --bind /sys /mnt/sysroot/sys使用chroot切换到原系统的根环境sudo chroot /mnt/sysroot现在你就像在原系统里一样了可以直接使用passwd username命令修改密码。修改完成后退出chroot环境exit然后卸载所有挂载sudo umount /mnt/sysroot/{dev,proc,sys} sudo umount /mnt/sysroot重启拔掉U盘用新密码登录。5.3 处理全盘加密LUKS的情况如果你的Ubuntu安装时选择了全盘加密那么上述修改GRUB参数的方法行不通。因为在GRUB阶段就需要输入密码来解密磁盘你无法在未解密的情况下挂载根文件系统。对于这种情况唯一的办法是记住加密密码。如果你连加密密码也忘了那么数据将无法恢复因为加密的初衷就是防止这种物理访问攻击。你可以重装系统但原来的数据会丢失。这凸显了加密密码和用户登录密码分开管理并将加密密码妥善备份的重要性。5.4 预防措施与日常管理建议最好的“解决方法”是预防。这里有一些建议使用密码管理器为系统登录密码这类重要且不常输入的密码使用Bitwarden、1Password等密码管理器生成并保存强密码。启用SSH密钥登录对于服务器禁用密码登录改用SSH公钥认证这样你根本不需要记住复杂的密码。记录恢复密钥如果使用了磁盘加密务必将恢复密钥通常是一长串字符打印出来或保存在其他安全的离线介质中。定期登录验证对于不常登录的测试机、备用机设置日历提醒每隔一段时间登录一次确保密码有效。了解sudo与root的区别清楚你的日常操作使用的是sudo权限而root账户是禁用的。这能帮助你在出问题时更快定位。我自己就曾因为依赖浏览器保存的密码在一次系统迁移后忘记了服务器密码幸亏通过GRUB方法救了回来。从那以后所有重要系统的密码和加密密钥我都会在初始化后立即存入密码管理器并告知一位可信的同事备份位置。密码是守护系统的第一道门但别让它成为锁死你自己的最后一道锁。掌握这种“破门而入”的方法是为了在意外发生时你依然是系统的掌控者。