树莓派忘记密码?三步进入单用户模式重置密码 1. 问题场景与核心思路树莓派玩久了密码忘了这事儿太常见了。不管是自己设的复杂密码时间一长忘了还是接手了别人的二手板子又或者是在某个项目里临时改了密码没记录结果重启后直接傻眼进不去系统。看着登录提示符输入啥都提示“Authentication failure”那种感觉确实挺让人上火的。尤其是当你的树莓派正跑着一个重要的服务或者里面存了没备份的数据时这种焦虑感会加倍。别慌这个问题有标准解法而且几乎对所有基于Linux的树莓派系统Raspberry Pi OS 包括旧版的Raspbian 以及Ubuntu for Raspberry Pi等都有效。核心思路其实很简单绕过正常的系统启动流程直接以单用户模式Single User Mode或恢复模式Recovery Mode进入一个拥有root权限的Shell。在这个Shell里系统不会要求你输入任何用户密码你可以直接修改任意用户的密码包括默认的pi用户和root用户。听起来是不是有点像拿到了“万能钥匙”原理上确实如此。这个方法之所以“亲测有效”是因为它利用了Linux内核的启动参数机制。我们通过修改SD卡上引导分区里的一个关键配置文件告诉内核“这次启动别进正常的图形界面或多用户模式了直接给我开个root shell。” 这个操作不需要你懂高深的Linux内核知识只需要你能把树莓派的SD卡拔出来插到另一台电脑Windows、macOS或Linux都行上进行简单的文件编辑即可。整个过程不涉及重装系统不会丢失你SD卡里已有的任何数据属于一种“外科手术式”的精准修复。2. 准备工作与工具选择在动手之前我们需要做好两件事找到正确的SD卡和准备一台可以读写它的电脑。2.1 识别与取出SD卡首先确保你的树莓派已经完全断电。然后找到SD卡插槽轻轻按下SD卡使其弹出或者直接拔出视树莓派型号而定。树莓派Zero/1/2/3/4/5的SD卡槽位置略有不同但操作大同小异。取出的这张小小的存储卡就是承载整个树莓派系统的“硬盘”。2.2 选择读卡器与电脑你需要一个匹配你SD卡规格的读卡器。现在常见的树莓派SD卡多是MicroSD卡所以需要一个MicroSD to USB的读卡器。如果你的笔记本电脑自带SD卡插槽也可以直接插入。确保你使用的电脑我们称之为“宿主机”系统是Windows、macOS或Linux之一因为后续操作在这三个平台上略有差异但核心步骤一致。这里有个关键点宿主机系统需要能识别并挂载FAT32文件系统。因为树莓派的引导分区boot partition格式化为FAT32这是为了保证最大兼容性让树莓派的固件能够读取。Windows和macOS原生支持FAT32的读写所以通常插上就能在“文件资源管理器”或“访达”里看到一个新的盘符或设备。对于Linux它也会自动挂载通常出现在/media/或/run/media/目录下。2.3 为什么是FAT32和cmdline.txt这里稍微展开一下原理。树莓派上电后GPU图形处理器中的第一阶段引导加载程序bootloader会先运行它从SD卡的第一个分区必须是FAT32格式中加载后续的固件和内核。这个分区我们通常称为“引导分区”或“boot分区”。在这个分区里有几个关键文件kernel.img或kernel8.img等Linux内核镜像文件。config.txt硬件配置参数文件。cmdline.txt内核启动参数文件。这就是我们本次操作的核心目标。cmdline.txt文件里是一行长长的文本里面包含了传递给Linux内核的各种参数比如根文件系统root filesystem的位置、控制台设备等。我们要做的就是在这行参数的末尾添加一个特殊的参数来改变系统的启动行为。3. 分步操作指南Windows/macOS/Linux现在我们进入实操环节。请根据你的宿主机操作系统选择对应的步骤。3.1 在宿主机上访问引导分区Windows将SD卡通过读卡器插入电脑。稍等片刻打开“此电脑”你会看到多出一个可移动磁盘盘符可能是D:、E:、F:等。双击打开它。你应该能看到kernel.img、config.txt、cmdline.txt等文件。如果看不到可能是磁盘管理里没有分配盘符或者SD卡损坏。如果只看到一个要求格式化的提示千万不要格式化这很可能意味着你找错了分区看到了后面的EXT4 Linux数据分区Windows无法直接识别。此时你需要使用磁盘管理工具确认哪个是FAT32分区。macOS插入SD卡后桌面通常会显示一个名为“boot”的磁盘图标。双击打开即可。如果没有显示可以打开“访达”在“位置”侧边栏里应该能找到它。同样里面应包含上述关键文件。Linux插入SD卡后系统通常会将其自动挂载。你可以打开文件管理器在侧边栏的“设备”下找到它名称可能也是“boot”。或者你可以在终端里输入lsblk或sudo fdisk -l命令来查看新增的磁盘设备如/dev/sdb1然后使用mount命令查看其挂载点通常会在/media/[你的用户名]/boot或/run/media/[你的用户名]/boot路径下。注意在macOS和某些Linux发行版上这个分区可能被挂载为只读。如果出现无法保存文件的情况你可能需要先卸载再以读写方式重新挂载或者使用sudo权限来编辑文件。3.2 定位并备份cmdline.txt在引导分区根目录下找到cmdline.txt文件。在编辑它之前强烈建议先做一个备份。这是一个好习惯万一操作失误我们可以轻松恢复。备份方法很简单将其复制一份重命名为cmdline.txt.backup或cmdline.txt.bak。3.3 编辑cmdline.txt文件用任何纯文本编辑器打开cmdline.txt例如Windows的记事本Notepad、macOS的文本编辑TextEdit需设置为纯文本模式或者Linux的gedit、nano、vim等。不要使用Word、Pages这类富文本编辑器它们可能会引入隐藏的格式字符导致系统无法启动。打开后你会看到一行内容可能类似这样具体内容因系统版本和配置而异consoleserial0,115200 consoletty1 rootPARTUUIDxxxxxx-02 rootfstypeext4 fsck.repairyes rootwait quiet init/usr/lib/raspi-config/init_resize.sh或者更简洁的consoleserial0,115200 consoletty1 root/dev/mmcblk0p2 rootfstypeext4 fsck.repairyes rootwait我们的任务是在这行内容的最后先添加一个空格然后加上以下参数之一方案A添加init/bin/sh这是最经典的方法。将内核的初始化进程init直接替换为/bin/sh这个Shell。系统启动后会跳过所有正常的服务启动、登录管理直接给你一个root权限的Shell。... rootwait quiet init/usr/lib/raspi-config/init_resize.sh **init/bin/sh**注意如果原行末尾已有init...比如上面的init_resize.sh你可以直接覆盖它或者在其后添加。为了保险起见我通常选择覆盖即删除原有的init...部分替换为init/bin/sh。方案B添加systemd.unitrescue.target适用于使用systemd的系统如新版Raspberry Pi OS这个方法更“优雅”一些它告诉systemd系统和服务管理器进入救援模式rescue target。救援模式也会提供一个root shell并且会尝试挂载所有文件系统比单纯的init/bin/sh环境更完整一些。... rootwait **systemd.unitrescue.target**方案C添加single或1这是传统的Unix/Linux进入单用户模式的方式。在某些系统上可能有效但在树莓派上尤其是使用systemd的系统中不如前两种方法可靠。... rootwait **single**我个人最推荐方案Ainit/bin/sh因为它最直接、兼容性最广几乎在所有情况下都有效。编辑完成后保存文件。3.4 一个重要的细节文件末尾换行符这是一个极易被忽略但可能导致失败的坑。确保你编辑保存后的cmdline.txt文件最后一行末尾没有多余的换行符空行。也就是说你的光标应该紧跟在添加的参数如init/bin/sh之后不要在后面按回车键。在Linux下可以用cat -A cmdline.txt检查行尾应该只有$代表换行如果后面还有^M$之类的就是多了空行。在Windows记事本里编辑尤其容易产生这个问题。稳妥的做法是使用像Notepad、VS Code、Sublime Text这类能显示行尾符的编辑器并确保保存为UnixLF格式或者直接用echo命令追加Linux/macOS下。3.5 安全弹出SD卡并启动树莓派编辑并保存好cmdline.txt后在宿主机上安全地弹出或卸载SD卡。在Windows上点击任务栏的“安全删除硬件”图标在macOS上将“boot”磁盘拖入废纸篓此时废纸篓图标会变成弹出图标在Linux上使用umount命令。将SD卡插回树莓派连接电源和显示器如果需要观察启动过程上电启动。4. 进入恢复Shell与修改密码如果一切顺利树莓派将不会进入正常的图形登录界面或命令行登录提示。屏幕可能会显示一系列内核启动信息最后停在一个命令提示符可能类似#或root(none):/#也可能没有任何提示符只有一个闪烁的光标。这说明你已经进入了拥有root权限的Shell环境。4.1 挂载根文件系统为可读写当我们使用init/bin/sh启动时根文件系统/通常是以只读read-only方式挂载的。这是Linux的一种安全机制。而修改密码需要向/etc/shadow文件写入数据因此我们必须先将其重新挂载为可读写模式。在Shell提示符下输入以下命令并回车mount -o remount,rw /mount是挂载命令-o指定选项remount表示重新挂载rw表示读写read-write/表示根目录。执行成功后不会有太多提示但接下来你就可以修改系统文件了。4.2 修改用户密码现在可以使用passwd命令来修改密码了。修改默认用户pi的密码passwd pi系统会提示你输入新的密码然后再次确认输入。为了安全密码在输入时是不显示任何字符星号也没有的这是正常现象放心输入即可。Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully看到successfully就表示成功了。修改root用户密码可选 如果你也想设置或修改root用户的密码可以执行passwd root同样按照提示输入两次新密码。4.3 为什么是passwd命令passwd是Linux下标准的修改用户密码的命令。它会做几件事1) 提示用户输入新密码2) 对密码进行哈希加密现代系统通常使用SHA-512等强哈希算法3) 将加密后的哈希值写入/etc/shadow文件。/etc/shadow文件存储了所有用户的密码哈希普通用户无法读取只有root有权修改这就是为什么我们必须获得root shell才能操作。4.4 同步数据并重启密码修改完成后建议执行一次sync命令它将所有缓存中的数据写入磁盘确保修改被持久化保存。sync现在我们可以重启树莓派了。由于当前Shell是唯一的进程直接断电重启可能不太优雅。我们可以使用exec命令来执行重启exec /sbin/reboot或者如果reboot命令不可用也可以使用exec /sbin/shutdown -r now如果上述命令都报错最直接的方法就是物理断电再上电。因为密码已经写入磁盘所以不用担心数据丢失。5. 验证与恢复原配置树莓派重启后会使用正常的启动参数启动。此时你应该可以使用新设置的密码登录pi用户了。5.1 一个重要的事后步骤恢复cmdline.txt成功登录后切记要恢复之前修改的cmdline.txt文件。如果不恢复下次启动树莓派又会直接进入单用户模式这等于在系统门口留了一把万能钥匙存在严重的安全风险。恢复方法有两种在树莓派系统内恢复登录系统后打开终端因为cmdline.txt在引导分区而引导分区默认可能没有挂载。我们可以手动挂载或直接编辑。最简单的方法是sudo nano /boot/cmdline.txt删除你之前添加的init/bin/sh或systemd.unitrescue.target等参数确保其恢复原样。然后按CtrlX再按Y最后回车保存退出。再次通过宿主机恢复如果觉得麻烦也可以像步骤3那样再次将SD卡插到宿主机上用备份文件cmdline.txt.backup覆盖cmdline.txt或者手动编辑删除添加的参数。5.2 验证登录使用新密码通过SSH或直接接显示器键盘登录确认一切功能正常。如果修改的是pi用户密码图形界面如果安装了的登录也应该使用新密码。6. 可能遇到的问题与深度排查虽然上述方法在绝大多数情况下有效但实践中可能会遇到一些“意外”。下面我们来拆解几个常见问题及其背后的原因。6.1 启动后依然卡在登录界面密码错误可能性1cmdline.txt修改未生效。检查你是否编辑了正确的cmdline.txt文件确保在boot分区并且保存无误。特别检查文件末尾是否有多余空行。可以重新用宿主机查看文件内容确认。可能性2键盘布局问题。如果你在恢复Shell里设置密码时键盘布局是默认的US美式但平时登录时系统使用的是其他布局如中文输入法状态那么你实际输入的字符可能和你想的不一样。例如在US布局下按某些键在其他布局下可能对应不同符号。建议在恢复Shell设置密码时使用简单的数字和字母组合并暂时关闭宿主机的输入法。可能性3文件系统挂载失败。如果根文件系统损坏即使你修改了密码系统在正常启动时也无法读取/etc/shadow文件。启动时观察内核信息看是否有fsck文件系统检查的错误或者mount根文件系统失败的提示。这种情况可能需要更深入的磁盘修复。6.2 启动后黑屏或无法进入恢复Shell可能性1内核参数错误导致内核恐慌Kernel Panic。仔细检查cmdline.txt的语法参数之间必须以空格分隔且不能有语法错误。错误的参数可能导致内核无法启动。恢复备份文件重试。可能性2SD卡或读卡器接触不良/损坏。尝试换一个读卡器或电脑USB口。极端情况下SD卡本身寿命已到会出现读写错误。可能性3针对树莓派4/5及更新机型的注意事项。这些机型支持USB启动、网络启动等其引导流程更复杂。确保你的SD卡里安装的是兼容的系统。如果之前玩过USB启动记得切换回SD卡启动。6.3 在恢复Shell中找不到passwd命令或提示只读文件系统passwd命令找不到这通常是因为/usr/bin等路径没有设置或者环境非常精简。可以尝试使用绝对路径/usr/bin/passwd pi。如果还是不行可以尝试chroot到真正的根环境但这比较复杂。更简单的方法是直接手动编辑/etc/shadow文件不推荐新手操作风险高。只读文件系统如果你忘记了执行mount -o remount,rw /或者执行失败了就会遇到“Read-only file system”错误。务必先执行这个命令。如果执行后依然报错可能是文件系统有错误内核自动以只读方式挂载以防止进一步损坏。可以尝试运行fsck -y /dev/mmcblk0p2假设根分区是mmcblk0p2请根据实际情况调整来修复文件系统然后再重新挂载。7. 安全强化与预防措施通过这次“忘记密码”的修复我们实际上暴露了树莓派以及许多Linux设备的一个潜在安全风险物理接触意味着几乎完全的控制权。因此除了解决问题我们更应该思考如何预防和加强安全。7.1 预防密码遗忘使用密码管理器将树莓派等重要设备的密码保存在Bitwarden、KeePass等密码管理器中。设置强密码并记录在安全的地方避免使用简单密码并将密码记录在只有自己能访问的物理笔记本或加密文件里。启用SSH密钥认证禁用密码登录这是最佳实践。在树莓派上生成SSH密钥对将公钥添加到~/.ssh/authorized_keys文件中然后在SSH服务配置/etc/ssh/sshd_config中设置PasswordAuthentication no。这样只能通过私钥登录根本不需要记忆密码。为pi用户设置易记但复杂的密码如果必须用密码可以设计一个对自己有特殊意义但别人难以猜测的短语。7.2 缓解单用户模式风险既然攻击者或捡到你设备的人可以通过修改cmdline.txt进入单用户模式我们能否防御呢给SD卡加锁理论上可以给SD卡设置写保护但树莓派系统运行时也需要写入日志、临时文件等所以不现实。全盘加密LUKS这是最安全的方法。将根文件系统加密启动时需要输入解密密码。这样即使别人拔出SD卡也无法读取其中的数据更别提修改cmdline.txt了因为/boot分区仍需保持未加密以供引导。但配置相对复杂且如果忘记解密密码数据将永久丢失。设置GRUB密码对于使用GRUB引导的高级用户可以给GRUB菜单设置密码防止他人修改启动参数。但树莓派默认不使用GRUB而是使用自己的引导流程此方法不适用。物理安全是根本将树莓派放置在安全的物理环境中是最有效且最简单的安全措施。7.3 定期备份与镜像养成定期备份重要数据的习惯。对于树莓派可以使用dd命令或Win32 Disk Imager等工具对整个SD卡进行全量镜像备份。这样即使SD卡损坏或系统完全崩溃也可以快速从备份恢复。忘记树莓派密码是一个典型的“小问题大麻烦”。通过修改cmdline.txt进入单用户模式的方法我们巧妙地利用了Linux系统的灵活性解决了这个问题。整个过程的核心在于理解Linux的启动流程和内核参数的作用。操作本身并不复杂但细节决定成败正确的分区访问、准确的参数编辑、文件系统的重新挂载每一步都需要细心。从我个人的经验来看成功操作几次后你会发现这几乎成了树莓派玩家的必备技能。不过在享受这种“后门”便利的同时一定要意识到它对应的安全风险。操作完成后务必记得恢复cmdline.txt文件。对于部署在外的树莓派强烈建议采用SSH密钥认证并尽可能保证其物理安全。技术是把双刃剑既能救急也可能成为漏洞关键在于我们如何使用它。