Jetson Orin NX 忘记密码后的数据优先恢复记录

一次 Jetson Orin NX 16GB 在忘记 root 和普通用户密码后,尽量不刷机、不破坏数据的离线恢复过程。

工程实践 Jetson, Ubuntu, 数据恢复, VMware, Linux RH XING
正文

Jetson Orin NX 忘记密码后的数据优先恢复记录

这次遇到的问题挺典型:一台 Jetson Orin NX 16GB,系统是 JetPack 6.2,对应 Ubuntu。root 密码忘了,普通用户密码也忘了,板子没有传统 PC 那种 GRUB 菜单,UEFI Shell 里也没有办法直接改启动参数。

如果只看“能不能进系统”,最容易想到的是 Force Recovery;但这台机器上还有数据,所以第一原则不是快,而是别把盘刷掉。

最后采用的方案是:拆下 Jetson 上的 NVMe SSD,接到 Windows 主机上的 Ubuntu 虚拟机里,离线修改 /etc/shadow。整个过程没有刷机,也没有重新初始化磁盘。

先确认 Force Recovery 不是万能入口

这块创乐博载板上,靠近边缘有一排调试和按键相关引脚,丝印里能看到:

DISABLE
AUTO ON
GND
SYS RST
GND
FC REC
GND
PWR BIN

进入 Force Recovery 的方式是把 FC RECGND 短接后上电。理论上,Ubuntu 主机上可以通过 NVIDIA 的工具识别到处于 recovery 模式的 Jetson。

但这里有一个容易误解的地方:Force Recovery 本身并不会把 Jetson 的系统盘直接变成一个 U 盘挂到主机上。它只是让设备进入一个等待主机下发 bootloader/initrd/flash 指令的状态。

也就是说,确实可以继续折腾 initrd recovery shell,再从里面挂载 NVMe;但对于“数据优先”的场景,这条路上最怕一不小心跑到了 flash 流程。既然 SSD 能拆,那离线改盘更稳。

拆 SSD,先只读确认

Jetson 上的系统盘是一块 M.2 NVMe SSD。拆下来之后放进 NVMe 硬盘盒,再接到电脑。

一开始 Windows 没有反应,硬盘盒蓝灯亮了也没用。后来发现是 USB 线的问题:换了一根确定能传数据的线之后,VMware 立刻弹出了是否把 USB 设备连接到虚拟机的提示。

在 Ubuntu 虚拟机里先看设备:

lsusb
lsblk -f

能看到类似这样的 USB 桥接芯片,说明硬盘盒已经进虚拟机了:

Realtek Semiconductor Corp. RTL9210 M.2 NVME Adapter

lsblk -f 里出现新磁盘后,重点看根分区的文件系统类型。如果是:

ext4

说明没有常规 LUKS 全盘加密,可以继续挂载和修改。如果看到:

crypto_LUKS

那就是另一回事了,没有解密密钥基本不能直接离线改密码。

这次看到的是 ext4,所以可以继续。

找到普通用户

Ubuntu 自动挂载后,系统分区在 /media/... 下面。为了少打字,可以先设一个变量:

J="/media/你的用户名/Jetson-rootfs-UUID"

然后看系统里有哪些普通用户:

awk -F: '$3>=1000 && $3<60000 {print $1, $3, $6}' "$J/etc/passwd"

这一步确认了普通用户存在,并且 home 目录也还在。接着看它有没有 sudo 权限:

grep -E '^(sudo|admin):' "$J/etc/group"

如果 sudo 组里有这个用户,后面即使只恢复普通用户,也可以进系统后用 sudo passwd root 重新设置 root 密码。

备份 shadow,再替换密码哈希

真正要改的是 /etc/shadow。这个文件里保存的是密码哈希,不是明文密码。

先备份:

sudo cp "$J/etc/shadow" "$J/etc/shadow.bak.$(date +%Y%m%d-%H%M%S)"
sudo cp "$J/etc/passwd" "$J/etc/passwd.bak.$(date +%Y%m%d-%H%M%S)"

再生成一个新的 SHA-512 密码哈希:

openssl passwd -6

它会让你输入两次新密码,然后输出一串以 $6$ 开头的哈希。注意,后面写入 /etc/shadow 的是这串哈希,不是明文密码。

这次我把普通用户和 root 都改成同一个临时密码,方便回到 Jetson 后再重新设置:

J="/media/你的用户名/Jetson-rootfs-UUID"
NEW_HASH='这里换成 openssl passwd -6 生成的完整哈希'
TS="$(date +%Y%m%d-%H%M%S)"

sudo cp "$J/etc/shadow" "$J/etc/shadow.bak.$TS"

sudo awk -F: -v OFS=: -v h="$NEW_HASH" '
  $1=="你的普通用户名" { $2=h }
  $1=="root" { $2=h }
  { print }
' "$J/etc/shadow" | sudo tee "$J/etc/shadow.tmp" >/dev/null

sudo chown root:shadow "$J/etc/shadow.tmp"
sudo chmod 640 "$J/etc/shadow.tmp"
sudo mv "$J/etc/shadow.tmp" "$J/etc/shadow"
sync

写完后验证一下:

sudo grep -E '^(root|你的普通用户名):' "$J/etc/shadow" | cut -d: -f1-2

如果两行后面都已经变成刚才生成的 $6$... 哈希,就说明修改成功。

卸载再拔盘

这个步骤别省。先同步,再卸载:

sync
sudo umount "$J"

如果 umount 没有输出,通常就是成功了。也可以再看一眼:

lsblk -f

对应分区后面没有 /media/... 挂载点,就可以在 VMware 里断开这个 USB 设备,然后拔硬盘盒。

装回 Jetson 后

SSD 装回 Jetson,先用普通用户登录。密码是刚才输入给 openssl passwd -6 的明文密码,不是那串 $6$... 哈希。

进去之后立刻重新设置:

passwd
sudo passwd root

如果后续要 SSH 登录 root,还要单独检查 /etc/ssh/sshd_config 里的 PermitRootLogin。不过一般不建议把 root SSH 登录打开,保留普通用户加 sudo 会更稳一点。

这次的几个小结

第一,Force Recovery 是底层恢复入口,不是“直接拿到系统盘 root 权限”的魔法按钮。能用,但要知道自己在跑什么命令。

第二,只要系统盘没加密,离线改 /etc/shadow 是相对温和的做法。它不需要刷机,也不碰用户数据。

第三,USB 硬盘盒亮灯不代表数据链路正常。线不对的时候,Windows 和虚拟机都看不到盘;换一根能传数据的线,问题可能就没了。

第四,改密码前一定备份 /etc/shadow。这一步很小,但能让人心里踏实很多。

这类恢复操作最怕着急。真正重要的不是把系统立刻点亮,而是把数据留在原地。

评论

欢迎留下想法、补充或问题。评论由 GitHub Discussions 提供支持。