1. 项目概述当Ubuntu的钥匙丢了之后作为一名常年与各种Linux发行版打交道的工程师无论是调试嵌入式系统、搭建开发环境还是维护服务器Ubuntu都是绕不开的“工作台”。但越是熟悉的东西越容易在某个不经意的时刻给你“惊喜”——比如在一个需要紧急调试的深夜你发现自己无论如何也想不起那个用了好几年的登录密码。这感觉就像你明明知道工具箱就在眼前却找不到开锁的钥匙。更棘手的是如果这台机器是团队共用的开发机或者里面存有尚未提交的关键代码和项目配置直接重装系统带来的时间成本和数据风险是难以承受的。本文要解决的就是这个在工程师群体中并不罕见却又让人有点尴尬的“小麻烦”Ubuntu忘记密码后的恢复与破解。请注意这里的“破解”并非指攻击他人系统而是特指在合法拥有设备所有权的前提下通过技术手段恢复对系统的访问权限。整个过程的核心逻辑是绕过正常的用户认证机制直接获取最高权限root然后重置密码。这不仅是桌面用户的救急技巧对于从事嵌入式开发、物联网设备维护的工程师来说当目标设备如基于Ubuntu Core的工控机、边缘计算盒子因配置错误或人员变动而锁死时这套方法同样适用。我们将从最经典的GRUB恢复模式入手逐步深入到使用Live CD/USB等更通用的救援方案并详细拆解每一步背后的原理、可能遇到的坑以及对应的排查技巧。无论你是软件开发者、硬件工程师还是系统管理员掌握这套“自救”流程都能在关键时刻为你省下大量时间避免不必要的损失。2. 核心思路与方案选型为什么是GRUB和Live介质当Ubuntu系统因为密码遗忘而将你拒之门外时你面对的是一个完整的、正在运行或等待运行的操作系统。系统设计者为了安全将用户认证模块如PAM置于登录流程的核心。我们的目标不是去暴力破解这个加密模块那几乎不可能而是“绕开”它。这就好比一栋大楼的正门锁死了我们不是去撬锁而是去找是否有管理员通道、通风管道或者未上锁的窗户。2.1 方案一利用GRUB引导菜单最快捷这是首选方案前提是你的系统引导程序GRUB没有设置密码保护。GRUB在启动时加载内核和初始化内存盘initrd并传递启动参数给内核。默认情况下Ubuntu的GRUB菜单中有一个“Advanced options for Ubuntu”子菜单里面包含了各个内核版本的“恢复模式recovery mode”选项。其工作原理是选择恢复模式启动后内核会以一个特殊的“运行级别”或通过init/bin/bash之类的参数启动直接将你丢到一个root shell中而跳过了所有需要密码认证的服务如登录管理器gdm、lightdm或网络管理器。此时你所在的文件系统通常是以只读ro模式挂载的因为系统处于一个最小化的恢复环境。你需要手动将其重新挂载为读写rw模式然后才能修改密码文件/etc/shadow。这个方案的优点是无需任何外部工具只要你能物理接触机器并操作启动过程几分钟内就能解决问题。其局限性也很明显第一如果GRUB菜单被隐藏且快速启动开启你可能需要熟练地敲击Esc键第二如果系统管理员出于安全考虑为GRUB设置了密码此路不通第三对于某些深度定制的系统或文件系统严重损坏的情况恢复模式可能无法正常启动。2.2 方案二使用Ubuntu安装盘或Live USB最通用这是一个更强大、更通用的方案。你只需要一个Ubuntu的安装U盘或光盘任何版本能与目标系统架构匹配即可。用这个Live介质启动电脑你就进入了一个完整的、运行在内存中的Ubuntu系统。在这个环境里你可以访问到本地硬盘上原有的Ubuntu系统分区。其核心原理是Linux系统在运行时会将硬盘分区挂载到目录树的某个位置如//home。当另一个系统Live系统启动后它可以将原系统的分区挂载到自己目录树下的一个临时位置如/mnt。由于Live系统拥有root权限它就可以直接读写原系统分区上的所有文件包括至关重要的/etc/shadow存储加密密码哈希和/etc/passwd文件。修改这些文件就等同于修改了原系统的用户密码。这个方案的普适性极高它不依赖于原系统的GRUB配置即使原系统内核损坏、引导丢失只要硬盘没坏就能抢救。它也是处理加密硬盘LUKS时必不可少的步骤需要先解密再挂载。对于工程师来说手边常备一个集成了各种工具的Live USB如SystemRescueCd, GParted Live本身就是一种良好的工作习惯。注意无论使用哪种方法你都必须拥有该计算机的物理访问权限。从远程无法完成此操作。同时请务必确保你是在对自己拥有合法所有权的设备进行操作未经授权破解他人系统密码是违法行为。3. 实操详解从GRUB恢复模式到密码重置理论清晰后我们进入实战环节。我将以最常见的场景为例展示两种方案的标准操作流程并穿插讲解每个步骤的意图和注意事项。3.1 方案一实操通过GRUB恢复模式重置密码步骤1中断启动过程进入GRUB菜单启动或重启电脑。在主板Logo或黑屏出现后立即持续按下Esc键部分电脑可能是Shift键。目的是阻止GRUB的自动引导让菜单显示出来。如果屏幕一闪而过直接进入系统可能是GRUB等待时间设置为0或启用了“安静启动”你需要更精准地 timing或者在UEFI/BIOS设置中临时关闭“快速启动”。步骤2选择恢复模式内核在GRUB菜单中使用上下方向键选择“Advanced options for Ubuntu”回车进入。然后你会看到一个列表显示了所有已安装的内核版本每个版本通常对应两个条目普通启动和恢复模式。选择带有“recovery mode”字样的那一项回车启动。步骤3获取Root Shell并重新挂载文件系统系统会启动到一个恢复菜单界面蓝底白字。在这个菜单中选择“root- Drop to root shell prompt”回车。这时你会看到一个以root身份登录的命令行提示符通常是root(hostname):~#。关键的一步来了默认情况下根文件系统/是以只读read-only模式挂载的这是为了防止在恢复环境中误操作破坏系统。你需要将其改为读写read-write模式。mount -o remount,rw /执行这条命令后如果没有报错就表示根分区已经可以写入了。你可以用mount | grep ‘on / ’来确认输出中应包含rw字样。步骤4重置用户密码现在你可以为任何用户重置密码。假设你要重置的用户名是leo请替换为你的实际用户名passwd leo系统会提示你“Enter new UNIX password:”输入新密码屏幕上不会显示星号这是正常的回车。然后提示“Retype new UNIX password:”再次输入相同密码并回车。如果看到“passwd: password updated successfully”的提示就表示成功了。如果你想顺便启用root用户Ubuntu默认禁用并设置其密码可以执行passwd root同样按照提示输入两次密码即可。步骤5重启系统密码修改完成后建议同步一下文件系统然后重启。sync reboot -fsync命令确保所有缓存中的数据写入磁盘。reboot -f是强制重启。电脑重启后你就可以用刚设置的新密码登录了。3.2 方案二实操使用Live USB“外挂”修改密码当GRUB方法失效时Live USB是你的终极武器。步骤1制作与启动Live USB你需要另一台能上网的电脑从Ubuntu官网下载ISO镜像文件并使用工具如RufusWindows、balenaEtcher跨平台或dd命令Linux/Mac将其写入U盘制作成可启动的安装盘。将U盘插入目标电脑在启动时按F12、F2、Del等键因主板而异进入启动菜单Boot Menu选择从U盘启动。步骤2进入“试用Ubuntu”模式并打开终端Live介质启动后你会看到安装界面。切记不要点击“安装Ubuntu”。而是选择“Try Ubuntu without installing”。系统会加载一个完整的桌面环境。进入桌面后按CtrlAltT打开终端。步骤3识别原系统分区这是最关键且容易出错的一步。你需要找到原Ubuntu系统安装在哪个分区上。使用lsblk或sudo fdisk -l命令查看所有磁盘和分区。sudo fdisk -l输出会列出类似/dev/sda1,/dev/sda2,/dev/nvme0n1p2这样的设备名。你需要根据分区大小、类型Linux filesystem和之前的记忆来判断哪个是系统的根分区/。通常一个标准的Ubuntu安装会有一个较小的ESP分区EFI系统分区FAT32格式几百MB一个交换分区swap和一个较大的根分区ext4格式。你的目标就是那个最大的ext4分区。步骤4挂载原系统分区并Chroot假设你确认原系统根分区是/dev/sda2。创建一个挂载点并挂载sudo mkdir /mnt/ubuntu sudo mount /dev/sda2 /mnt/ubuntu如果原系统使用了单独的/boot或/home分区也需要分别挂载到/mnt/ubuntu/boot和/mnt/ubuntu/home下。对于大多数情况只挂载根分区即可。为了确保后续修改密码时使用的库文件与原系统一致我们需要使用chrootchange root命令将当前进程的根目录切换到/mnt/ubuntu。但在此之前需要挂载一些关键的虚拟文件系统sudo mount --bind /dev /mnt/ubuntu/dev sudo mount --bind /proc /mnt/ubuntu/proc sudo mount --bind /sys /mnt/ubuntu/sys执行chrootsudo chroot /mnt/ubuntu执行成功后你的命令行提示符可能会变化此时你的操作环境就“变成”了原系统。步骤5在Chroot环境中重置密码现在你可以像在原系统里一样使用passwd命令修改密码了。passwd 用户名同样输入两次新密码。你也可以在这里启用root用户。步骤6退出、卸载并重启修改完成后输入exit退出chroot环境。卸载所有挂载的资源顺序很重要sudo umount /mnt/ubuntu/dev sudo umount /mnt/ubuntu/proc sudo umount /mnt/ubuntu/sys sudo umount /mnt/ubuntu关闭Live系统拔出U盘然后重启电脑sudo reboot电脑将从硬盘启动此时你就可以用新密码登录原系统了。4. 深度解析密码存储机制与修改的本质作为一名工程师我们不能只满足于“怎么做”更要理解“为什么能这么做”。这能帮助我们在更复杂的情况下比如加密磁盘、非标准安装举一反三。4.1 Linux密码存储机制/etc/shadow文件现代Linux系统将用户密码以加密哈希值的形式存储在/etc/shadow文件中而非早年的/etc/passwd。这是一个只有root用户可读的敏感文件。一行记录可能长这样leo:$y$j9T$8rBzH/...省略很长哈希值...$QjW.NZ2u...更多哈希值...:19677:0:99999:7:::各部分由冒号分隔其中第一个字段是用户名第二个字段就是密码哈希值。passwd命令的本质就是由root权限调用一个名为chpasswd或usermod的底层工具使用强大的加密算法如SHA-512对应$6$或$y$开头的标识符将你输入的明文密码转化为这个哈希值然后写入/etc/shadow文件。当我们通过GRUB恢复模式或Live USB获得root权限后我们运行的passwd命令其效果与在正常登录的系统中用sudo passwd完全一样都是直接修改这个/etc/shadow文件。系统在下次认证时会将你输入的密码用相同算法哈希然后与文件中存储的哈希值比对一致则通过。4.2 Chroot环境的意义保持环境一致性在Live USB方案中为什么要大费周章地使用chroot而不是直接在Live系统里用sudo nano /mnt/ubuntu/etc/shadow去编辑文件呢理论上直接编辑shadow文件是可行的但极其容易出错。shadow文件的格式非常严格一个多余的空格或冒号都会导致系统无法解析。而passwd命令是一个封装好的安全工具它会处理所有细节提示输入、验证强度如果配置了、生成哈希、安全地写入文件。更重要的是chroot确保了passwd命令运行时所依赖的所有动态链接库/lib,/lib64、配置文件/etc/pam.d/passwd等都来自原系统而不是Live系统。这避免了因库版本或PAM配置不同而导致的意外错误。这是一种“在外部搭建一个与原系统一致的操作环境”的经典方法在系统修复中应用广泛。5. 进阶场景、常见问题与排查实录在实际操作中你可能会遇到各种“非标准”情况。下面是我在多年运维和帮同事解决问题中积累的一些典型场景和应对策略。5.1 场景一GRUB菜单被跳过或设置了密码问题电脑启动太快根本看不到GRUB菜单。排查与解决检查UEFI/BIOS设置进入主板设置关闭“Fast Boot”快速启动或“Quick Boot”选项。这能确保GRUB有足够时间接收按键中断。修改GRUB配置需提前准备如果你能预见风险可以在还能登录系统时编辑/etc/default/grub文件将GRUB_TIMEOUT_STYLEhidden改为GRUB_TIMEOUT_STYLEmenu并将GRUB_TIMEOUT的值设为比如5秒。然后运行sudo update-grub。这样GRUB菜单就会持续显示5秒。终极方案如果上述无效或者GRUB本身设置了密码那么方案一基本失效请直接采用方案二Live USB。5.2 场景二使用全盘加密LUKS的Ubuntu系统问题硬盘被加密Live系统无法直接读取分区内容。解决步骤从Live USB启动打开终端。使用lsblk查看加密分区通常类型显示为crypto_LUKS。使用cryptsetup luksOpen命令打开加密容器sudo cryptsetup luksOpen /dev/nvme0n1p3 crypt_root # 假设加密分区是nvme0n1p3映射名称为crypt_root系统会提示你输入磁盘加密的密码注意这是磁盘加密密码不是用户登录密码。打开后会在/dev/mapper/下出现一个名为crypt_root的设备节点。这个节点对应的就是解密后的数据。此时再按照方案二的步骤挂载这个/dev/mapper/crypt_root设备到/mnt/ubuntu然后进行chroot和密码修改操作。操作完成后记得关闭加密容器sudo cryptsetup luksClose crypt_root。5.3 场景三修改密码时提示“Authentication token manipulation error”问题在恢复模式或chroot环境中执行passwd命令时报此错误。原因与排查文件系统只读最常见在恢复模式下你没有执行mount -o remount,rw /。用mount命令检查根分区的挂载属性。磁盘错误或空间已满系统无法写入shadow文件。可以尝试运行df -h查看磁盘使用情况或用touch /testfile测试是否能创建文件。PAM配置问题在chroot中较常见如果Live系统与原系统的PAM模块版本差异太大可能导致passwd命令工作异常。此时可以尝试直接编辑shadow文件需谨慎sudo cp /etc/shadow /etc/shadow.backup # 先备份 sudo nano /etc/shadow找到对应用户行将第二个字段密码哈希直接替换为一个已知哈希。例如将其替换为*星号表示禁用密码或替换为一个预先用mkpasswd或openssl passwd生成的哈希。此方法风险高不推荐新手操作。5.4 场景四为SSH密钥登录的服务器重置密码场景一台云端Ubuntu服务器你一直用SSH密钥登录从未设过密码或密码已忘现在需要密码进行sudo操作或应急控制台登录。解决大部分云服务商如AWS EC2, Google Cloud, Azure, 阿里云腾讯云都提供了“重置密码”或“连接串行控制台”的功能。你通常需要在云控制台停止实例部分厂商支持热重置。找到“重置密码”或“修改密码”选项并按照指引操作。这本质上是云厂商在后台帮你执行了一次类似Live USB挂载修改shadow文件的操作。重启实例使用新密码通过VNC/串行控制台或配置了密码的SSH登录。重要提示此操作会重启或停止实例请务必在业务低峰期进行并确认云厂商的具体操作流程。6. 安全加固与防范建议俗话说亡羊补牢为时未晚。在成功“救回”系统后我们更应该思考如何避免重蹈覆辙并提升系统的整体安全性。6.1 密码管理策略使用密码管理器像Bitwarden、KeePassXC这样的开源密码管理器可以为你生成并存储高强度、唯一的密码。你只需要记住一个主密码即可。启用SSH密钥认证禁用密码登录对于服务器这是最佳实践。在/etc/ssh/sshd_config中设置PasswordAuthentication no和PubkeyAuthentication yes。将公钥添加到~/.ssh/authorized_keys文件中。设置sudo免密码谨慎使用对于个人开发机如果觉得每次sudo都输密码麻烦可以将当前用户添加到sudo组并编辑/etc/sudoers文件使用visudo命令添加一行你的用户名 ALL(ALL) NOPASSWD: ALL。注意这会降低安全性请仅在可信的私人环境中考虑。6.2 系统引导安全加固为GRUB设置密码这可以有效防止他人通过恢复模式随意修改你的密码。编辑/etc/grub.d/40_custom文件添加set superusers”root”和password root 你的GRUB密码或用password_pbkdf2生成加密密码。然后运行sudo update-grub。设置后在GRUB菜单界面按e编辑启动项或进入恢复模式时都需要先按p输入密码。启用全盘加密LUKS在安装Ubuntu时选择“加密整个磁盘”。这样即使硬盘被物理拆走没有密码也无法读取数据。这是保护笔记本等移动设备数据的终极手段。设置BIOS/UEFI密码防止他人从外部介质如Live USB启动。但这把钥匙如果丢了自己也会很麻烦务必牢记。6.3 建立系统恢复应急方案制作系统恢复盘不仅仅是一个Ubuntu安装盘可以准备一个功能更全的Live USB如SystemRescueCd或GParted Live它们集成了海量的硬盘修复、数据恢复和网络工具。记录关键信息将重要的分区表信息sudo fdisk -l的输出、网络配置、加密容器的UUID等安全地记录在密码管理器或离线笔记中。定期备份使用rsync,BorgBackup,Timeshift等工具定期备份系统和重要数据。当所有方法都失效时一份可靠的备份是最后的救命稻草。记住能让你安心入睡的不是复杂的密码而是随时可恢复的备份。经过以上从原理到实践从基础到进阶的梳理相信你已经对Ubuntu密码恢复这件事有了透彻的理解。这套方法的价值不仅在于解决“忘记密码”这一具体问题更在于它揭示了Linux系统引导、权限管理和文件系统的内在联系。掌握它意味着你在面对更复杂的系统故障时拥有了一个清晰的问题定位和解决思路框架。技术之路就是在不断解决一个又一个具体问题的过程中积累起对复杂系统的掌控力。
Ubuntu密码恢复实战:从GRUB到Live USB的完整解决方案
1. 项目概述当Ubuntu的钥匙丢了之后作为一名常年与各种Linux发行版打交道的工程师无论是调试嵌入式系统、搭建开发环境还是维护服务器Ubuntu都是绕不开的“工作台”。但越是熟悉的东西越容易在某个不经意的时刻给你“惊喜”——比如在一个需要紧急调试的深夜你发现自己无论如何也想不起那个用了好几年的登录密码。这感觉就像你明明知道工具箱就在眼前却找不到开锁的钥匙。更棘手的是如果这台机器是团队共用的开发机或者里面存有尚未提交的关键代码和项目配置直接重装系统带来的时间成本和数据风险是难以承受的。本文要解决的就是这个在工程师群体中并不罕见却又让人有点尴尬的“小麻烦”Ubuntu忘记密码后的恢复与破解。请注意这里的“破解”并非指攻击他人系统而是特指在合法拥有设备所有权的前提下通过技术手段恢复对系统的访问权限。整个过程的核心逻辑是绕过正常的用户认证机制直接获取最高权限root然后重置密码。这不仅是桌面用户的救急技巧对于从事嵌入式开发、物联网设备维护的工程师来说当目标设备如基于Ubuntu Core的工控机、边缘计算盒子因配置错误或人员变动而锁死时这套方法同样适用。我们将从最经典的GRUB恢复模式入手逐步深入到使用Live CD/USB等更通用的救援方案并详细拆解每一步背后的原理、可能遇到的坑以及对应的排查技巧。无论你是软件开发者、硬件工程师还是系统管理员掌握这套“自救”流程都能在关键时刻为你省下大量时间避免不必要的损失。2. 核心思路与方案选型为什么是GRUB和Live介质当Ubuntu系统因为密码遗忘而将你拒之门外时你面对的是一个完整的、正在运行或等待运行的操作系统。系统设计者为了安全将用户认证模块如PAM置于登录流程的核心。我们的目标不是去暴力破解这个加密模块那几乎不可能而是“绕开”它。这就好比一栋大楼的正门锁死了我们不是去撬锁而是去找是否有管理员通道、通风管道或者未上锁的窗户。2.1 方案一利用GRUB引导菜单最快捷这是首选方案前提是你的系统引导程序GRUB没有设置密码保护。GRUB在启动时加载内核和初始化内存盘initrd并传递启动参数给内核。默认情况下Ubuntu的GRUB菜单中有一个“Advanced options for Ubuntu”子菜单里面包含了各个内核版本的“恢复模式recovery mode”选项。其工作原理是选择恢复模式启动后内核会以一个特殊的“运行级别”或通过init/bin/bash之类的参数启动直接将你丢到一个root shell中而跳过了所有需要密码认证的服务如登录管理器gdm、lightdm或网络管理器。此时你所在的文件系统通常是以只读ro模式挂载的因为系统处于一个最小化的恢复环境。你需要手动将其重新挂载为读写rw模式然后才能修改密码文件/etc/shadow。这个方案的优点是无需任何外部工具只要你能物理接触机器并操作启动过程几分钟内就能解决问题。其局限性也很明显第一如果GRUB菜单被隐藏且快速启动开启你可能需要熟练地敲击Esc键第二如果系统管理员出于安全考虑为GRUB设置了密码此路不通第三对于某些深度定制的系统或文件系统严重损坏的情况恢复模式可能无法正常启动。2.2 方案二使用Ubuntu安装盘或Live USB最通用这是一个更强大、更通用的方案。你只需要一个Ubuntu的安装U盘或光盘任何版本能与目标系统架构匹配即可。用这个Live介质启动电脑你就进入了一个完整的、运行在内存中的Ubuntu系统。在这个环境里你可以访问到本地硬盘上原有的Ubuntu系统分区。其核心原理是Linux系统在运行时会将硬盘分区挂载到目录树的某个位置如//home。当另一个系统Live系统启动后它可以将原系统的分区挂载到自己目录树下的一个临时位置如/mnt。由于Live系统拥有root权限它就可以直接读写原系统分区上的所有文件包括至关重要的/etc/shadow存储加密密码哈希和/etc/passwd文件。修改这些文件就等同于修改了原系统的用户密码。这个方案的普适性极高它不依赖于原系统的GRUB配置即使原系统内核损坏、引导丢失只要硬盘没坏就能抢救。它也是处理加密硬盘LUKS时必不可少的步骤需要先解密再挂载。对于工程师来说手边常备一个集成了各种工具的Live USB如SystemRescueCd, GParted Live本身就是一种良好的工作习惯。注意无论使用哪种方法你都必须拥有该计算机的物理访问权限。从远程无法完成此操作。同时请务必确保你是在对自己拥有合法所有权的设备进行操作未经授权破解他人系统密码是违法行为。3. 实操详解从GRUB恢复模式到密码重置理论清晰后我们进入实战环节。我将以最常见的场景为例展示两种方案的标准操作流程并穿插讲解每个步骤的意图和注意事项。3.1 方案一实操通过GRUB恢复模式重置密码步骤1中断启动过程进入GRUB菜单启动或重启电脑。在主板Logo或黑屏出现后立即持续按下Esc键部分电脑可能是Shift键。目的是阻止GRUB的自动引导让菜单显示出来。如果屏幕一闪而过直接进入系统可能是GRUB等待时间设置为0或启用了“安静启动”你需要更精准地 timing或者在UEFI/BIOS设置中临时关闭“快速启动”。步骤2选择恢复模式内核在GRUB菜单中使用上下方向键选择“Advanced options for Ubuntu”回车进入。然后你会看到一个列表显示了所有已安装的内核版本每个版本通常对应两个条目普通启动和恢复模式。选择带有“recovery mode”字样的那一项回车启动。步骤3获取Root Shell并重新挂载文件系统系统会启动到一个恢复菜单界面蓝底白字。在这个菜单中选择“root- Drop to root shell prompt”回车。这时你会看到一个以root身份登录的命令行提示符通常是root(hostname):~#。关键的一步来了默认情况下根文件系统/是以只读read-only模式挂载的这是为了防止在恢复环境中误操作破坏系统。你需要将其改为读写read-write模式。mount -o remount,rw /执行这条命令后如果没有报错就表示根分区已经可以写入了。你可以用mount | grep ‘on / ’来确认输出中应包含rw字样。步骤4重置用户密码现在你可以为任何用户重置密码。假设你要重置的用户名是leo请替换为你的实际用户名passwd leo系统会提示你“Enter new UNIX password:”输入新密码屏幕上不会显示星号这是正常的回车。然后提示“Retype new UNIX password:”再次输入相同密码并回车。如果看到“passwd: password updated successfully”的提示就表示成功了。如果你想顺便启用root用户Ubuntu默认禁用并设置其密码可以执行passwd root同样按照提示输入两次密码即可。步骤5重启系统密码修改完成后建议同步一下文件系统然后重启。sync reboot -fsync命令确保所有缓存中的数据写入磁盘。reboot -f是强制重启。电脑重启后你就可以用刚设置的新密码登录了。3.2 方案二实操使用Live USB“外挂”修改密码当GRUB方法失效时Live USB是你的终极武器。步骤1制作与启动Live USB你需要另一台能上网的电脑从Ubuntu官网下载ISO镜像文件并使用工具如RufusWindows、balenaEtcher跨平台或dd命令Linux/Mac将其写入U盘制作成可启动的安装盘。将U盘插入目标电脑在启动时按F12、F2、Del等键因主板而异进入启动菜单Boot Menu选择从U盘启动。步骤2进入“试用Ubuntu”模式并打开终端Live介质启动后你会看到安装界面。切记不要点击“安装Ubuntu”。而是选择“Try Ubuntu without installing”。系统会加载一个完整的桌面环境。进入桌面后按CtrlAltT打开终端。步骤3识别原系统分区这是最关键且容易出错的一步。你需要找到原Ubuntu系统安装在哪个分区上。使用lsblk或sudo fdisk -l命令查看所有磁盘和分区。sudo fdisk -l输出会列出类似/dev/sda1,/dev/sda2,/dev/nvme0n1p2这样的设备名。你需要根据分区大小、类型Linux filesystem和之前的记忆来判断哪个是系统的根分区/。通常一个标准的Ubuntu安装会有一个较小的ESP分区EFI系统分区FAT32格式几百MB一个交换分区swap和一个较大的根分区ext4格式。你的目标就是那个最大的ext4分区。步骤4挂载原系统分区并Chroot假设你确认原系统根分区是/dev/sda2。创建一个挂载点并挂载sudo mkdir /mnt/ubuntu sudo mount /dev/sda2 /mnt/ubuntu如果原系统使用了单独的/boot或/home分区也需要分别挂载到/mnt/ubuntu/boot和/mnt/ubuntu/home下。对于大多数情况只挂载根分区即可。为了确保后续修改密码时使用的库文件与原系统一致我们需要使用chrootchange root命令将当前进程的根目录切换到/mnt/ubuntu。但在此之前需要挂载一些关键的虚拟文件系统sudo mount --bind /dev /mnt/ubuntu/dev sudo mount --bind /proc /mnt/ubuntu/proc sudo mount --bind /sys /mnt/ubuntu/sys执行chrootsudo chroot /mnt/ubuntu执行成功后你的命令行提示符可能会变化此时你的操作环境就“变成”了原系统。步骤5在Chroot环境中重置密码现在你可以像在原系统里一样使用passwd命令修改密码了。passwd 用户名同样输入两次新密码。你也可以在这里启用root用户。步骤6退出、卸载并重启修改完成后输入exit退出chroot环境。卸载所有挂载的资源顺序很重要sudo umount /mnt/ubuntu/dev sudo umount /mnt/ubuntu/proc sudo umount /mnt/ubuntu/sys sudo umount /mnt/ubuntu关闭Live系统拔出U盘然后重启电脑sudo reboot电脑将从硬盘启动此时你就可以用新密码登录原系统了。4. 深度解析密码存储机制与修改的本质作为一名工程师我们不能只满足于“怎么做”更要理解“为什么能这么做”。这能帮助我们在更复杂的情况下比如加密磁盘、非标准安装举一反三。4.1 Linux密码存储机制/etc/shadow文件现代Linux系统将用户密码以加密哈希值的形式存储在/etc/shadow文件中而非早年的/etc/passwd。这是一个只有root用户可读的敏感文件。一行记录可能长这样leo:$y$j9T$8rBzH/...省略很长哈希值...$QjW.NZ2u...更多哈希值...:19677:0:99999:7:::各部分由冒号分隔其中第一个字段是用户名第二个字段就是密码哈希值。passwd命令的本质就是由root权限调用一个名为chpasswd或usermod的底层工具使用强大的加密算法如SHA-512对应$6$或$y$开头的标识符将你输入的明文密码转化为这个哈希值然后写入/etc/shadow文件。当我们通过GRUB恢复模式或Live USB获得root权限后我们运行的passwd命令其效果与在正常登录的系统中用sudo passwd完全一样都是直接修改这个/etc/shadow文件。系统在下次认证时会将你输入的密码用相同算法哈希然后与文件中存储的哈希值比对一致则通过。4.2 Chroot环境的意义保持环境一致性在Live USB方案中为什么要大费周章地使用chroot而不是直接在Live系统里用sudo nano /mnt/ubuntu/etc/shadow去编辑文件呢理论上直接编辑shadow文件是可行的但极其容易出错。shadow文件的格式非常严格一个多余的空格或冒号都会导致系统无法解析。而passwd命令是一个封装好的安全工具它会处理所有细节提示输入、验证强度如果配置了、生成哈希、安全地写入文件。更重要的是chroot确保了passwd命令运行时所依赖的所有动态链接库/lib,/lib64、配置文件/etc/pam.d/passwd等都来自原系统而不是Live系统。这避免了因库版本或PAM配置不同而导致的意外错误。这是一种“在外部搭建一个与原系统一致的操作环境”的经典方法在系统修复中应用广泛。5. 进阶场景、常见问题与排查实录在实际操作中你可能会遇到各种“非标准”情况。下面是我在多年运维和帮同事解决问题中积累的一些典型场景和应对策略。5.1 场景一GRUB菜单被跳过或设置了密码问题电脑启动太快根本看不到GRUB菜单。排查与解决检查UEFI/BIOS设置进入主板设置关闭“Fast Boot”快速启动或“Quick Boot”选项。这能确保GRUB有足够时间接收按键中断。修改GRUB配置需提前准备如果你能预见风险可以在还能登录系统时编辑/etc/default/grub文件将GRUB_TIMEOUT_STYLEhidden改为GRUB_TIMEOUT_STYLEmenu并将GRUB_TIMEOUT的值设为比如5秒。然后运行sudo update-grub。这样GRUB菜单就会持续显示5秒。终极方案如果上述无效或者GRUB本身设置了密码那么方案一基本失效请直接采用方案二Live USB。5.2 场景二使用全盘加密LUKS的Ubuntu系统问题硬盘被加密Live系统无法直接读取分区内容。解决步骤从Live USB启动打开终端。使用lsblk查看加密分区通常类型显示为crypto_LUKS。使用cryptsetup luksOpen命令打开加密容器sudo cryptsetup luksOpen /dev/nvme0n1p3 crypt_root # 假设加密分区是nvme0n1p3映射名称为crypt_root系统会提示你输入磁盘加密的密码注意这是磁盘加密密码不是用户登录密码。打开后会在/dev/mapper/下出现一个名为crypt_root的设备节点。这个节点对应的就是解密后的数据。此时再按照方案二的步骤挂载这个/dev/mapper/crypt_root设备到/mnt/ubuntu然后进行chroot和密码修改操作。操作完成后记得关闭加密容器sudo cryptsetup luksClose crypt_root。5.3 场景三修改密码时提示“Authentication token manipulation error”问题在恢复模式或chroot环境中执行passwd命令时报此错误。原因与排查文件系统只读最常见在恢复模式下你没有执行mount -o remount,rw /。用mount命令检查根分区的挂载属性。磁盘错误或空间已满系统无法写入shadow文件。可以尝试运行df -h查看磁盘使用情况或用touch /testfile测试是否能创建文件。PAM配置问题在chroot中较常见如果Live系统与原系统的PAM模块版本差异太大可能导致passwd命令工作异常。此时可以尝试直接编辑shadow文件需谨慎sudo cp /etc/shadow /etc/shadow.backup # 先备份 sudo nano /etc/shadow找到对应用户行将第二个字段密码哈希直接替换为一个已知哈希。例如将其替换为*星号表示禁用密码或替换为一个预先用mkpasswd或openssl passwd生成的哈希。此方法风险高不推荐新手操作。5.4 场景四为SSH密钥登录的服务器重置密码场景一台云端Ubuntu服务器你一直用SSH密钥登录从未设过密码或密码已忘现在需要密码进行sudo操作或应急控制台登录。解决大部分云服务商如AWS EC2, Google Cloud, Azure, 阿里云腾讯云都提供了“重置密码”或“连接串行控制台”的功能。你通常需要在云控制台停止实例部分厂商支持热重置。找到“重置密码”或“修改密码”选项并按照指引操作。这本质上是云厂商在后台帮你执行了一次类似Live USB挂载修改shadow文件的操作。重启实例使用新密码通过VNC/串行控制台或配置了密码的SSH登录。重要提示此操作会重启或停止实例请务必在业务低峰期进行并确认云厂商的具体操作流程。6. 安全加固与防范建议俗话说亡羊补牢为时未晚。在成功“救回”系统后我们更应该思考如何避免重蹈覆辙并提升系统的整体安全性。6.1 密码管理策略使用密码管理器像Bitwarden、KeePassXC这样的开源密码管理器可以为你生成并存储高强度、唯一的密码。你只需要记住一个主密码即可。启用SSH密钥认证禁用密码登录对于服务器这是最佳实践。在/etc/ssh/sshd_config中设置PasswordAuthentication no和PubkeyAuthentication yes。将公钥添加到~/.ssh/authorized_keys文件中。设置sudo免密码谨慎使用对于个人开发机如果觉得每次sudo都输密码麻烦可以将当前用户添加到sudo组并编辑/etc/sudoers文件使用visudo命令添加一行你的用户名 ALL(ALL) NOPASSWD: ALL。注意这会降低安全性请仅在可信的私人环境中考虑。6.2 系统引导安全加固为GRUB设置密码这可以有效防止他人通过恢复模式随意修改你的密码。编辑/etc/grub.d/40_custom文件添加set superusers”root”和password root 你的GRUB密码或用password_pbkdf2生成加密密码。然后运行sudo update-grub。设置后在GRUB菜单界面按e编辑启动项或进入恢复模式时都需要先按p输入密码。启用全盘加密LUKS在安装Ubuntu时选择“加密整个磁盘”。这样即使硬盘被物理拆走没有密码也无法读取数据。这是保护笔记本等移动设备数据的终极手段。设置BIOS/UEFI密码防止他人从外部介质如Live USB启动。但这把钥匙如果丢了自己也会很麻烦务必牢记。6.3 建立系统恢复应急方案制作系统恢复盘不仅仅是一个Ubuntu安装盘可以准备一个功能更全的Live USB如SystemRescueCd或GParted Live它们集成了海量的硬盘修复、数据恢复和网络工具。记录关键信息将重要的分区表信息sudo fdisk -l的输出、网络配置、加密容器的UUID等安全地记录在密码管理器或离线笔记中。定期备份使用rsync,BorgBackup,Timeshift等工具定期备份系统和重要数据。当所有方法都失效时一份可靠的备份是最后的救命稻草。记住能让你安心入睡的不是复杂的密码而是随时可恢复的备份。经过以上从原理到实践从基础到进阶的梳理相信你已经对Ubuntu密码恢复这件事有了透彻的理解。这套方法的价值不仅在于解决“忘记密码”这一具体问题更在于它揭示了Linux系统引导、权限管理和文件系统的内在联系。掌握它意味着你在面对更复杂的系统故障时拥有了一个清晰的问题定位和解决思路框架。技术之路就是在不断解决一个又一个具体问题的过程中积累起对复杂系统的掌控力。