1. 项目概述当树莓派成为“黑盒子”玩树莓派的朋友估计都经历过那么一两次心跳加速的时刻——对着熟悉的登录界面手指悬在键盘上大脑却一片空白“密码是什么来着” 这感觉就像你把家门钥匙锁在了屋里而你是唯一有钥匙的人。树莓派默认的pi用户密码raspberry虽然简单但出于安全或个性化我们往往会修改它。时间一长或者项目一多忘记密码就成了一个大概率事件。别慌这绝不是世界末日。与传统的桌面操作系统不同树莓派运行的是 Linux 系统而 Linux 系统的一个核心设计哲学就是“一切皆文件”包括用户账户信息。这意味着我们不需要借助任何第三方破解工具只需直接操作存储系统的 SD 卡就能从“外部”重置密码。这个方法的核心思路就是绕过正常的系统启动流程在系统加载用户认证模块之前获得一个具有 root 权限的 Shell然后直接修改密码文件。我最近在整理一个闲置许久的树莓派 4B 项目时就亲历了这一幕。那个派被我用来跑过一个家庭媒体服务器密码设得又长又复杂早就忘得一干二净。通过下面要详细拆解的方法我用了不到十分钟就重新获得了控制权。整个过程不涉及任何高深莫测的黑客技术只需要另一台能读 SD 卡的电脑Windows、macOS 或 Linux 均可和一点点对 Linux 启动过程的理解。无论你是刚入门的新手还是玩树莓派多年的老鸟把这个“急救技能”放进工具箱里绝对有备无患。2. 核心原理破解启动链获取至高权限要理解为什么我们能“重置”密码首先得搞清楚树莓派或者说大多数 Linux 系统的启动和登录过程。这个过程就像一个层层递进的安检流程。2.1 正常的启动与登录流程当你给树莓派通电处理器会首先从 SD 卡上一个非常小的、被称为boot的分区读取引导程序。这个分区通常是 FAT32 格式即使 Windows 电脑也能直接识别。引导程序接着会加载 Linux 内核kernel.img或类似文件以及设备树文件然后将控制权交给内核。内核启动后会挂载根文件系统通常是 SD 卡上第二个更大的ext4格式分区并启动第一个用户空间进程通常是systemd或init。最后系统会启动登录管理器如命令行下的getty或图形界面的lightdm等待你输入用户名和密码。关键点来了用户密码的验证发生在系统完全启动之后由login程序通过查询/etc/shadow文件来完成。这个文件存储了所有用户密码的加密哈希值普通情况下无法直接反向破解。2.2 我们的“后门”思路init参数与单用户模式我们的方法就是在系统启动的“安检流程”中找到一个环节插入我们自己的“特别通行证”。这个环节就是内核向初始进程传递参数的阶段。在boot分区里有一个至关重要的文件叫cmdline.txt。这个文件里的内容会作为命令行参数直接传递给 Linux 内核。其中有一个参数叫init它指定了内核启动后运行的第一个程序默认为/sbin/init。我们的突破口就在这里我们可以修改这个参数让内核不是去启动完整的系统而是直接启动一个具有 root 权限的 Shell比如/bin/sh。更常见和标准的做法是在内核参数中添加init/bin/sh或single等参数来告诉系统“别走正常流程了直接给我个最高权限的命令行。” 一旦我们进入了这个“单用户模式”或“应急 Shell”整个文件系统就像不设防一样我们可以直接读写/etc/shadow文件用passwd命令修改任意用户的密码。注意这种方法之所以有效是因为在单用户模式下系统跳过了所有需要密码认证的服务直接以 root 身份运行 Shell。这本身就是 Linux 系统管理员进行系统修复的标准方法之一。因此物理接触设备SD卡是执行此操作的前提这也符合安全模型——能物理接触设备的人本身就拥有设备的最高控制权。3. 详细操作步骤从拔卡到改密理论清楚了我们一步步来实操。请准备好你的树莓派、SD 卡以及另一台可以读取这张 SD 卡的电脑。3.1 第一步安全关机与取出 SD 卡首先如果树莓派还在运行请务必通过命令sudo shutdown -h now或在桌面界面正常关机。如果已经无法登录那就直接拔掉电源。切忌在系统读写时直接断电虽然概率不高但有可能损坏 SD 卡上的文件系统。关机后小心地将 SD 卡从树莓派的卡槽中取出。树莓派 4B/5 的卡槽是弹簧式的按一下卡会弹出来更早的型号可能需要轻轻拔出。3.2 第二步在电脑上挂载 SD 卡分区将 SD 卡通过读卡器插入你的电脑Windows、macOS 或 Linux。在 Windows 上插入后你通常只能看到第一个分区也就是boot分区它会被识别为一个可移动磁盘比如F:盘。这是因为 Windows 默认不支持ext4文件系统。不过没关系我们只需要操作boot分区。直接打开“此电脑”就能访问。在 macOS 上macOS 同样能自动识别boot分区。ext4分区默认不挂载但我们可以通过安装mounty等免费工具来挂载它以便访问系统文件。不过修改密码只需要动boot分区和通过终端访问ext4分区我们可以用更直接的方法。在 Linux 上插入 SD 卡后两个分区通常会自动挂载。你可以用lsblk或df -h命令查看挂载点例如/media/yourname/boot和/media/yourname/rootfs。3.3 第三步修改cmdline.txt文件关键操作现在找到并打开boot分区根目录下的cmdline.txt文件。强烈建议先备份这个文件比如复制一份并重命名为cmdline.txt.backup。用文本编辑器如 Windows 的记事本、macOS/Linux 的nano或vim打开它。你会看到一行很长的、用空格分隔的参数。内容通常类似这样consoleserial0,115200 consoletty1 rootPARTUUIDxxxxxx-02 rootfstypeext4 fsck.repairyes rootwait quiet init/usr/lib/raspberrypi-sys-mods/firstboot我们的任务是在这行参数的末尾在quiet之后或任何你觉得合适的位置但确保在行内添加一个启动参数。这里我推荐两种最稳妥的添加方式方法一添加init/bin/sh直接在原有参数末尾加上init/bin/sh。例如修改后变成consoleserial0,115200 consoletty1 rootPARTUUIDxxxxxx-02 rootfstypeext4 fsck.repairyes rootwait quiet init/usr/lib/raspberrypi-sys-mods/firstboot init/bin/sh注意这里我保留了原有的init参数并在后面追加了新的init/bin/sh。在大多数 Linux 内核中最后一个init参数会生效。这是一种保险的做法。方法二更标准的单用户模式在参数中添加single或s或1。例如consoleserial0,115200 consoletty1 rootPARTUUIDxxxxxx-02 rootfstypeext4 fsck.repairyes rootwait quiet init/usr/lib/raspberrypi-sys-mods/firstboot singlesingle参数是告诉初始化系统进入单用户运行级别runlevel 1同样会获得一个 root shell。实操心得我个人更倾向于使用init/bin/sh。因为single参数依赖于系统的初始化系统如systemd能正确解析它。而init/bin/sh是内核级别的指令更加底层和通用几乎 100% 有效。另外确保添加参数时前后都用空格与其他参数隔开。保存并关闭cmdline.txt文件。3.4 第四步重新启动树莓派并修改密码弹出 SD 卡在电脑上安全弹出 SD 卡然后将其插回树莓派。上电启动给树莓派接通电源和显示器如果需要并连接键盘。进入应急 Shell树莓派会开始启动。如果修改正确你不会看到正常的登录提示符而是直接看到一个以#结尾的命令行提示符例如#或者root(none):/#。这说明你已经以 root 身份进入了 Shell。重新挂载根文件系统为可读写默认情况下根文件系统 (/) 可能是以只读 (ro) 方式挂载的这是为了防止文件系统损坏。我们需要将其重新挂载为可读写 (rw) 才能修改密码。mount -o remount,rw /执行这条命令后不会有成功提示是正常的Linux 的哲学是“没有消息就是好消息”。使用passwd命令修改密码现在你可以修改任意用户的密码了。最常用的是修改pi用户的密码。passwd pi系统会提示你输入新的密码并确认一次。输入时屏幕上不会有任何显示星号也没有这是正常的盲输即可。请务必记住新密码Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully看到successfully就表示成功了。可选修改 root 用户密码如果你想启用并设置 root 用户的密码也可以passwd root同步并重启在重启前最好执行一次sync命令确保所有缓存数据都写入 SD 卡。然后重启系统。sync reboot或者直接拔电再上电。3.5 第五步恢复启动配置并验证树莓派重启后应该会正常进入系统。使用你刚设置的pi用户密码登录成功重要收尾工作登录后务必记得将cmdline.txt文件改回去。否则每次启动都会进入单用户模式这存在严重的安全风险任何人物理接触设备都能获得 root 权限。再次编辑/boot/cmdline.txt文件这次是在树莓派系统内sudo nano /boot/cmdline.txt删除你之前添加的init/bin/sh或single参数恢复成原始状态。保存CtrlO退出CtrlX。执行sync并重启一次确保修改生效。至此整个密码重置流程圆满完成。4. 不同场景与变通方案上面的方法是通用且标准的。但在实际环境中你可能会遇到一些特殊情况。下面是我遇到过或读者可能遇到的几种场景及应对策略。4.1 场景一cmdline.txt修改后无法进入 Shell现象添加参数后启动系统依然进入了正常的登录界面或者卡住、报错。排查检查语法确保参数添加的位置正确前后有空格。例如quiet init/bin/sh是正确的quietinit/bin/sh缺少空格会导致内核无法正确解析。检查文件格式确保cmdline.txt是纯文本格式并且是 Unix (LF) 换行符。在 Windows 上用记事本编辑有时会意外保存为 UTF-8 BOM 格式或 Windows (CRLF) 换行符这可能导致内核读取错误。可以用Notepad或VS Code编辑并确保换行符格式为 LF。尝试其他参数如果init/bin/sh不行可以试试init/bin/bash或rw init/bin/shrw参数指定根文件系统以读写方式挂载。检查 SD 卡兼容性极少数情况下SD 卡接触不良或损坏会导致文件写入不完整。可以重新插拔 SD 卡在电脑上再次确认文件已保存。4.2 场景二需要修改非pi用户或其他系统的密码修改其他用户在应急 Shell 里passwd命令后跟用户名即可修改对应用户的密码如passwd your_username。用于其他 Linux 发行版此方法不仅适用于树莓派官方系统 (Raspberry Pi OS)也适用于在树莓派上运行的 Ubuntu、Debian、Arch Linux ARM 等绝大多数 Linux 发行版。原理完全相通。用于启用 root 登录默认情况下树莓派的 root 账户密码未设置无法直接登录。在应急 Shell 中设置root密码后你还可以通过修改/etc/ssh/sshd_config文件将PermitRootLogin设置为yes来允许 root 通过 SSH 登录出于安全考虑一般不推荐。4.3 场景三没有显示器只能通过 SSH 访问这是一个常见困境树莓派作为服务器无头运行忘记密码后 SSH 无法连接。解决方案核心步骤不变依然是修改 SD 卡上的cmdline.txt。区别在于进入应急 Shell 后你需要手动启动网络服务才能通过网络连接。按照前述步骤修改cmdline.txt添加init/bin/sh。启动树莓派进入应急 Shell。重新挂载根文件系统mount -o remount,rw /。启动网络这取决于你的系统使用哪种网络管理器。常见的有dhcpcd和systemd-networkd。对于使用dhcpcd的系统如旧版 Raspberry Pi OSdhcpcd eth0 # 如果有线网卡是 eth0 # 或者 dhcpcd wlan0 # 如果是无线且知道 WiFi 配置仍在对于使用systemd-networkd的系统如新版 Raspberry Pi OS 或 Ubuntusystemctl start systemd-networkd查看获取到的 IP 地址ip addr show。现在你可以从同一网络下的另一台电脑使用 SSH 以 root 身份无需密码连接到这个 IP 地址。然后执行passwd pi修改密码。修改完成后sync; reboot并记得恢复cmdline.txt。重要警告在无头模式下使用此方法尤其是在公共网络或你不完全信任的网络中存在安全风险。因为从你启动树莓派到修改密码、关闭应急模式的这段时间内任何知道你树莓派 IP 的人都可以无需密码通过 SSH 获得 root 权限。因此操作过程应尽可能快并在操作完成后立即恢复配置并重启。5. 深度解析/etc/shadow文件与密码安全我们通过passwd命令修改了密码这个命令到底做了什么它修改了/etc/shadow文件。理解这个文件能让你对 Linux 用户认证有更深的认识。5.1shadow文件格式解析在应急 Shell 里你可以用cat /etc/shadow查看这个文件。其中一行对应pi用户的信息可能如下pi:$6$W4Z1bS7fN6$...很长一串哈希值...:19121:0:99999:7:::这一行由冒号:分隔成多个字段用户名pi。加密后的密码以$6$开头的那一串。$6$表示使用的是 SHA-512 加密算法。如果这里是!!或*则表示该账户密码被锁定不能用于登录。最后一次修改密码的日期19121这是从 1970年1月1日Unix纪元开始计算的天数。密码最小年龄0表示密码修改后可以立即再次修改。密码最大年龄99999表示密码几乎永不过期。密码过期前警告天数7表示密码过期前7天开始警告用户。密码过期后宽限天数空表示过期后立即失效。账户过期日期空表示永不过期。保留字段空。passwd命令的本质就是根据你输入的新密码使用指定的加密算法如 SHA-512生成一个新的哈希值然后替换掉/etc/shadow文件中相应用户的第二个字段。我们也可以手动编辑这个文件但极其不推荐因为你需要手动生成符合格式的密码哈希过程繁琐且易错。5.2 为什么不能直接删除密码哈希有人可能会想既然都拿到 root 权限了我直接把/etc/shadow里pi用户那行的密码字段清空或改成已知密码的哈希不就行了理论上可以但实操中强烈反对。复杂性你需要知道系统使用的加密算法和盐值Salt并用openssl或mkpasswd命令生成正确的哈希字符串。这比直接用passwd命令麻烦得多。风险性手动编辑系统关键文件一个字符的错误就可能导致系统无法登录甚至破坏文件格式引发更严重的问题。无必要性passwd命令就是为安全、正确地完成这个任务而设计的工具何必舍近求远因此永远优先使用passwd命令来修改密码这是最安全、最标准的方式。6. 高级技巧与防范措施掌握了基本方法我们再来看看一些能提升效率或安全性的技巧。6.1 使用chroot进行更安全的操作在应急 Shell 中直接操作环境非常简陋缺少很多命令和库。如果你需要进行更复杂的系统修复不仅仅是改密码可以使用chroot。在挂载根文件系统后执行mount --bind /dev /mnt/dev mount --bind /proc /mnt/proc mount --bind /sys /mnt/sys chroot /mnt /bin/bash这样你就“切换”到了完整的系统环境中可以运行几乎所有的系统命令就像在正常启动的系统里一样。修改完密码后退出 chroot (exit)卸载绑定的目录再重启。6.2 如何防止他人用此法破解你的树莓派这个方法的核心前提是物理接触 SD 卡。因此最根本的防范措施就是物理安全将你的树莓派放在一个可靠的地方。此外还有一些增强措施设置 BIOS/固件密码树莓派的引导固件存储在板载 EEPROM 中目前没有设置密码的功能。它的设计是开放的。全盘加密如果你对数据安全要求极高可以考虑使用 LUKS 等工具对根文件系统进行全盘加密。这样即使 SD 卡被拔出没有密码也无法解密数据。但代价是启动时需要输入解密密码无法实现完全无头启动且对性能有轻微影响。使用只读文件系统对于某些特定应用如信息亭、数字标牌可以将根文件系统设置为只读这样即使有人修改cmdline.txt重启后也会被还原。但这不适合需要频繁写入数据的通用计算场景。定期备份与密码管理最实用的方法还是养成良好的习惯1) 使用密码管理器妥善保管重要密码2) 定期对树莓派的 SD 卡进行完整镜像备份可使用dd命令或Raspberry Pi Imager的“自定义”功能。这样即使忘记密码或系统崩溃也能快速恢复。6.3 忘记密码与 SSH 密钥登录如果你为树莓派配置了 SSH 密钥登录并且禁用了密码登录在/etc/ssh/sshd_config中设置PasswordAuthentication no那么忘记用户密码不会影响你通过 SSH 密钥连接。但是当你需要执行sudo命令时可能仍然需要输入用户密码除非配置了NOPASSWD。此时你仍然需要用到本文的方法来重置密码。一个更好的实践是在启用 SSH 密钥登录并禁用密码登录后为sudo配置免密码。这样你既保证了远程访问的安全防暴力破解又避免了忘记密码的尴尬。具体做法是在/etc/sudoers.d/目录下为你的用户创建一个文件例如010_pi-nopasswd内容为pi ALL(ALL) NOPASSWD: ALL。注意这降低了本地安全门槛请确保你的用户账户和私钥安全。7. 常见问题排查与解决实录即使按照步骤操作也可能遇到一些意外。下面是我和社区里常见的一些问题及解决方法。7.1 问题修改cmdline.txt后启动卡在彩虹屏或黑屏可能原因 1内核参数冲突或错误。某些第三方系统或自己编译的内核可能对init参数支持不完整。解决尝试更简单的参数如只添加single。或者更彻底的方法是在boot分区找到config.txt文件暂时注释掉在行首加#所有非必要的叠加层overlay和设备树dtb配置以最简模式启动。可能原因 2文件系统损坏。非正常关机可能导致ext4分区损坏。解决在电脑上使用 Linux 环境或工具如fsck对 SD 卡的第二个分区ext4分区进行文件系统检查与修复。对于 Windows 用户可以使用DiskGenius等专业工具尝试修复或者最直接的办法——从备份恢复镜像。7.2 问题进入应急 Shell 后passwd命令报错或无效可能原因 1根文件系统只读。这是最常见的原因。解决务必先执行mount -o remount,rw /。执行后可以用mount | grep ‘on / ’检查确认显示rw字样。可能原因 2/etc/shadow文件权限或属性异常。解决检查文件权限ls -l /etc/shadow应为-rw-r—– 1 root shadow。如果不是可以用chmod 640 /etc/shadow和chown root:shadow /etc/shadow修复。极少数情况下文件可能被设置了不可修改属性immutable用lsattr /etc/shadow查看如果有i属性用chattr -i /etc/shadow移除。7.3 问题修改密码成功后重启依然无法登录可能原因 1cmdline.txt未恢复。这是最可能的原因系统每次启动都进入单用户模式你修改的密码在“正常模式”下并未生效。解决务必在修改密码并重启进入正常系统后第一时间恢复cmdline.txt文件。可能原因 2修改了错误的用户或拼写错误。解决在应急 Shell 中用cat /etc/passwd | grep pi确认用户名确为pi。有时用户可能被重命名或删除。可能原因 3键盘布局或输入法问题。在输入新密码时可能无意中切换了键盘布局。解决尝试使用非常简单的密码如123测试确保不是输入问题。修改成功后再进入系统改为复杂密码。7.4 问题SD 卡在 Windows 上不显示boot分区可能原因分区表损坏或 SD 卡格式特殊。解决尝试使用不同的读卡器或电脑 USB 口。在 Windows 磁盘管理diskmgmt.msc中查看 SD 卡是否被识别为“未分配空间”或“RAW”格式。如果是可能需要使用数据恢复软件或DiskGenius尝试恢复分区。使用更强大的工具如Raspberry Pi Imager。它即使在 Windows 下也能识别并挂载树莓派镜像的各个分区。你可以用它来“自定义”打开 SD 卡通常能访问到boot分区。终极方案在另一台 Linux 电脑上操作。Linux 对多种文件系统的支持最好。忘记树莓派密码这件事说大不大说小不小。它不会让你永久失去你的设备或数据但确实会带来一阵手忙脚乱。通过这次详细的梳理你会发现其背后的原理清晰而直接操作步骤也像一套标准的急救流程。关键点在于理解 Linux 启动的灵活性并善用cmdline.txt这个“开关”。下次再遇到这种情况你大可以淡定地找出读卡器因为你知道十分钟之内你就能重新成为你树莓派的“主人”。养成定期备份和妥善管理密码的习惯更能让你防患于未然。