news 2026/8/1 8:29:40

树莓派忘记密码?10分钟通过SD卡修改cmdline.txt重置root权限

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
树莓派忘记密码?10分钟通过SD卡修改cmdline.txt重置root权限

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格式分区),并启动第一个用户空间进程(通常是systemdinit)。最后,系统会启动登录管理器(如命令行下的getty或图形界面的lightdm),等待你输入用户名和密码。

关键点来了:用户密码的验证,发生在系统完全启动之后,由login程序通过查询/etc/shadow文件来完成。这个文件存储了所有用户密码的加密哈希值,普通情况下无法直接反向破解。

2.2 我们的“后门”思路:init参数与单用户模式

我们的方法,就是在系统启动的“安检流程”中,找到一个环节,插入我们自己的“特别通行证”。这个环节就是内核向初始进程传递参数的阶段。

boot分区里,有一个至关重要的文件叫cmdline.txt。这个文件里的内容,会作为命令行参数直接传递给 Linux 内核。其中有一个参数叫init,它指定了内核启动后运行的第一个程序,默认为/sbin/init。我们的突破口就在这里:我们可以修改这个参数,让内核不是去启动完整的系统,而是直接启动一个具有 root 权限的 Shell,比如/bin/sh

更常见和标准的做法,是在内核参数中添加init=/bin/shsingle等参数,来告诉系统:“别走正常流程了,直接给我个最高权限的命令行。” 一旦我们进入了这个“单用户模式”或“应急 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 卡后,两个分区通常会自动挂载。你可以用lsblkdf -h命令查看挂载点(例如/media/yourname/boot/media/yourname/rootfs)。

3.3 第三步:修改cmdline.txt文件(关键操作)

现在,找到并打开boot分区根目录下的cmdline.txt文件。强烈建议先备份这个文件,比如复制一份并重命名为cmdline.txt.backup

用文本编辑器(如 Windows 的记事本、macOS/Linux 的nanovim)打开它。你会看到一行很长的、用空格分隔的参数。内容通常类似这样:

console=serial0,115200 console=tty1 root=PARTUUID=xxxxxx-02 rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspberrypi-sys-mods/firstboot

我们的任务是在这行参数的末尾(在quiet之后或任何你觉得合适的位置,但确保在行内),添加一个启动参数。这里我推荐两种最稳妥的添加方式:

方法一:添加init=/bin/sh直接在原有参数末尾加上init=/bin/sh。例如,修改后变成:

console=serial0,115200 console=tty1 root=PARTUUID=xxxxxx-02 rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspberrypi-sys-mods/firstboot init=/bin/sh

注意,这里我保留了原有的init=参数,并在后面追加了新的init=/bin/sh。在大多数 Linux 内核中,最后一个init=参数会生效。这是一种保险的做法。

方法二:更标准的单用户模式在参数中添加singles1。例如:

console=serial0,115200 console=tty1 root=PARTUUID=xxxxxx-02 rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspberrypi-sys-mods/firstboot single

single参数是告诉初始化系统进入单用户运行级别(runlevel 1),同样会获得一个 root shell。

实操心得:我个人更倾向于使用init=/bin/sh。因为single参数依赖于系统的初始化系统(如systemd)能正确解析它。而init=/bin/sh是内核级别的指令,更加底层和通用,几乎 100% 有效。另外,确保添加参数时,前后都用空格与其他参数隔开。

保存并关闭cmdline.txt文件。

3.4 第四步:重新启动树莓派并修改密码

  1. 弹出 SD 卡:在电脑上安全弹出 SD 卡,然后将其插回树莓派。
  2. 上电启动:给树莓派接通电源和显示器(如果需要),并连接键盘。
  3. 进入应急 Shell:树莓派会开始启动。如果修改正确,你不会看到正常的登录提示符,而是直接看到一个以#结尾的命令行提示符(例如#或者root@(none):/#)。这说明你已经以 root 身份进入了 Shell。
  4. 重新挂载根文件系统为可读写:默认情况下,根文件系统 (/) 可能是以只读 (ro) 方式挂载的,这是为了防止文件系统损坏。我们需要将其重新挂载为可读写 (rw) 才能修改密码。
    mount -o remount,rw /
    执行这条命令后,不会有成功提示是正常的,Linux 的哲学是“没有消息就是好消息”。
  5. 使用passwd命令修改密码:现在,你可以修改任意用户的密码了。最常用的是修改pi用户的密码。
    passwd pi
    系统会提示你输入新的密码,并确认一次。输入时屏幕上不会有任何显示(星号也没有),这是正常的,盲输即可。请务必记住新密码!
    Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully
    看到successfully就表示成功了。
  6. 可选:修改 root 用户密码:如果你想启用并设置 root 用户的密码,也可以:
    passwd root
  7. 同步并重启:在重启前,最好执行一次sync命令,确保所有缓存数据都写入 SD 卡。然后重启系统。
    sync reboot
    或者直接拔电再上电。

3.5 第五步:恢复启动配置并验证

树莓派重启后,应该会正常进入系统。使用你刚设置的pi用户密码登录,成功!

重要收尾工作:登录后,务必记得将cmdline.txt文件改回去。否则每次启动都会进入单用户模式,这存在严重的安全风险(任何人物理接触设备都能获得 root 权限)。

  1. 再次编辑/boot/cmdline.txt文件(这次是在树莓派系统内):
    sudo nano /boot/cmdline.txt
  2. 删除你之前添加的init=/bin/shsingle参数,恢复成原始状态。
  3. 保存(Ctrl+O),退出(Ctrl+X)。
  4. 执行sync并重启一次,确保修改生效。

至此,整个密码重置流程圆满完成。

4. 不同场景与变通方案

上面的方法是通用且标准的。但在实际环境中,你可能会遇到一些特殊情况。下面是我遇到过或读者可能遇到的几种场景及应对策略。

4.1 场景一:cmdline.txt修改后无法进入 Shell

  • 现象:添加参数后启动,系统依然进入了正常的登录界面,或者卡住、报错。
  • 排查
    1. 检查语法:确保参数添加的位置正确,前后有空格。例如quiet init=/bin/sh是正确的,quietinit=/bin/sh(缺少空格)会导致内核无法正确解析。
    2. 检查文件格式:确保cmdline.txt是纯文本格式,并且是 Unix (LF) 换行符。在 Windows 上用记事本编辑有时会意外保存为 UTF-8 BOM 格式或 Windows (CRLF) 换行符,这可能导致内核读取错误。可以用Notepad++VS Code编辑,并确保换行符格式为 LF。
    3. 尝试其他参数:如果init=/bin/sh不行,可以试试init=/bin/bashrw init=/bin/shrw参数指定根文件系统以读写方式挂载)。
    4. 检查 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 后,你需要手动启动网络服务,才能通过网络连接。
    1. 按照前述步骤修改cmdline.txt,添加init=/bin/sh
    2. 启动树莓派,进入应急 Shell。
    3. 重新挂载根文件系统:mount -o remount,rw /
    4. 启动网络:这取决于你的系统使用哪种网络管理器。常见的有dhcpcdsystemd-networkd
      • 对于使用dhcpcd的系统(如旧版 Raspberry Pi OS):
        dhcpcd eth0 # 如果有线网卡是 eth0 # 或者 dhcpcd wlan0 # 如果是无线,且知道 WiFi 配置仍在
      • 对于使用systemd-networkd的系统(如新版 Raspberry Pi OS 或 Ubuntu):
        systemctl start systemd-networkd
    5. 查看获取到的 IP 地址:ip addr show
    6. 现在,你可以从同一网络下的另一台电脑,使用 SSH 以 root 身份(无需密码)连接到这个 IP 地址。然后执行passwd pi修改密码。
    7. 修改完成后,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:::

这一行由冒号:分隔成多个字段:

  1. 用户名pi
  2. 加密后的密码:以$6$开头的那一串。$6$表示使用的是 SHA-512 加密算法。如果这里是!!*,则表示该账户密码被锁定,不能用于登录。
  3. 最后一次修改密码的日期19121,这是从 1970年1月1日(Unix纪元)开始计算的天数。
  4. 密码最小年龄0,表示密码修改后,可以立即再次修改。
  5. 密码最大年龄99999,表示密码几乎永不过期。
  6. 密码过期前警告天数7,表示密码过期前7天开始警告用户。
  7. 密码过期后宽限天数:空,表示过期后立即失效。
  8. 账户过期日期:空,表示永不过期。
  9. 保留字段:空。

passwd命令的本质,就是根据你输入的新密码,使用指定的加密算法(如 SHA-512)生成一个新的哈希值,然后替换掉/etc/shadow文件中相应用户的第二个字段。我们也可以手动编辑这个文件,但极其不推荐,因为你需要手动生成符合格式的密码哈希,过程繁琐且易错。

5.2 为什么不能直接删除密码哈希?

有人可能会想:既然都拿到 root 权限了,我直接把/etc/shadowpi用户那行的密码字段清空或改成已知密码的哈希不就行了?理论上可以,但实操中强烈反对。

  1. 复杂性:你需要知道系统使用的加密算法和盐值(Salt),并用opensslmkpasswd命令生成正确的哈希字符串。这比直接用passwd命令麻烦得多。
  2. 风险性:手动编辑系统关键文件,一个字符的错误就可能导致系统无法登录,甚至破坏文件格式,引发更严重的问题。
  3. 无必要性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/shadowchown root:shadow /etc/shadow修复。极少数情况下,文件可能被设置了不可修改属性(immutable),用lsattr /etc/shadow查看,如果有i属性,用chattr -i /etc/shadow移除。

7.3 问题:修改密码成功后,重启依然无法登录

  • 可能原因 1:cmdline.txt未恢复。这是最可能的原因,系统每次启动都进入单用户模式,你修改的密码在“正常模式”下并未生效。
    • 解决:务必在修改密码并重启进入正常系统后,第一时间恢复cmdline.txt文件。
  • 可能原因 2:修改了错误的用户或拼写错误
    • 解决:在应急 Shell 中,用cat /etc/passwd | grep pi确认用户名确为pi。有时用户可能被重命名或删除。
  • 可能原因 3:键盘布局或输入法问题。在输入新密码时,可能无意中切换了键盘布局。
    • 解决:尝试使用非常简单的密码(如123)测试,确保不是输入问题。修改成功后,再进入系统改为复杂密码。

7.4 问题:SD 卡在 Windows 上不显示boot分区

  • 可能原因:分区表损坏或 SD 卡格式特殊
    • 解决
      1. 尝试使用不同的读卡器或电脑 USB 口。
      2. 在 Windows 磁盘管理(diskmgmt.msc)中查看 SD 卡是否被识别为“未分配空间”或“RAW”格式。如果是,可能需要使用数据恢复软件或DiskGenius尝试恢复分区。
      3. 使用更强大的工具,如Raspberry Pi Imager。它即使在 Windows 下也能识别并挂载树莓派镜像的各个分区。你可以用它来“自定义”打开 SD 卡,通常能访问到boot分区。
      4. 终极方案:在另一台 Linux 电脑上操作。Linux 对多种文件系统的支持最好。

忘记树莓派密码这件事,说大不大,说小不小。它不会让你永久失去你的设备或数据,但确实会带来一阵手忙脚乱。通过这次详细的梳理,你会发现其背后的原理清晰而直接,操作步骤也像一套标准的急救流程。关键点在于理解 Linux 启动的灵活性,并善用cmdline.txt这个“开关”。下次再遇到这种情况,你大可以淡定地找出读卡器,因为你知道,十分钟之内,你就能重新成为你树莓派的“主人”。养成定期备份和妥善管理密码的习惯,更能让你防患于未然。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/1 8:21:38

AI教材编写工具:低查重率与高质量内容的平衡术

1. AI教材编写工具的核心价值解析当我在教育科技行业摸爬滚打第八个年头时,第一次见到能真正解决教材编写痛点的AI工具。这种工具最核心的价值在于实现了"低查重率"与"高质量内容"的平衡——传统AI写作常见的问题就是内容同质化严重&#xff0c…

作者头像 李华
网站建设 2026/8/1 8:19:35

上门按摩平台陷入增长瓶颈?重构技师分润逻辑或成破局关键

最近在与业内同行交流时,发现一个普遍现象:不少做上门按摩的创业者都在抱怨获客成本越来越高,技师团队却极不稳定。很多平台花了重金投放广告,好不容易积累的客户,却被技师以各种方式引导到私下交易。这种“平台花钱买…

作者头像 李华
网站建设 2026/8/1 8:11:33

ECDSA数字签名算法:从椭圆曲线原理到Python实战与安全实践

1. 项目概述:从“签名”到“信任”的密码学基石 在数字世界里,如何证明“你是你”,以及你发出的信息“未被篡改”?这听起来像是一个哲学问题,但在工程实践中,它直接关系到资产安全、身份认证和系统可信。想…

作者头像 李华
网站建设 2026/8/1 8:09:09

黑马商城怎么解决docker内存不足问题以及容器端口访问失败

由于本人要在hmall这个项目的虚拟机的内存容量只有3GB导致,写完search-service模块后,还没意识到我的内存不足了。在后续的自开发Agent-service启动所有要用容器总是出现如下情况:在AI的时候总是没有根本性的解决这个问题。输入:d…

作者头像 李华
网站建设 2026/8/1 8:06:15

PHP应用打包与分发实战:深入PHAR文件格式与构建实践

1. 项目概述:从“压缩包”到“自包含应用”的PHAR革命 如果你用PHP做过项目部署,肯定对那一大堆零散的 .php 文件、配置文件、静态资源感到头疼。传统的部署方式要么是直接上传整个目录,要么是用ZIP打包再解压,不仅繁琐&#xf…

作者头像 李华