21、安全与更新:固件更新流程、安全启动配置、SSH密钥管理、系统备份与恢复

说到 Jetson 平台的安全与更新,我脑子里第一个蹦出来的词就是「别翻车」。做嵌入式这么多年,见过太多因为固件更新到一半断电变砖、SSH 密钥泄露被扫、系统崩了没备份只能重头来的惨案。嗯,今天咱们就把这几个硬骨头啃下来。

21.1 固件更新流程

Jetson 的固件更新,说白了就是给板子换「底层系统」。我个人习惯用 SDK Manager 来做,但如果你在产线或者远程环境,那就要用命令行工具了。

21.1.1 使用 SDK Manager 更新

这是最直观的方式。把 Jetson 接到 Host PC,打开 SDK Manager,勾选「Jetson OS」和「Jetson SDK Components」,点下一步就行。但注意——

⚠️ 警告: 更新过程中绝对不能断电!我有个同事曾经在刷写 80% 的时候拔了 USB 线,结果板子直接变砖,最后只能拆机短接恢复模式。所以,请务必接上 UPS 或者确保供电稳定。

21.1.2 命令行刷写(适合批量部署)

如果你像我一样喜欢命令行,那这套流程你肯定用得上:

# 进入 JetPack 的 Linux_for_Tegra 目录
cd ~/nvidia/nvidia_sdk/JetPack_5.1.2_Linux_JETSON_ORIN_NX/Linux_for_Tegra/

# 刷写系统(以 Orin NX 为例)
sudo ./flash.sh jetson-orin-nx-devkit mmcblk0p1

这里有个坑——一定要先让板子进入恢复模式。怎么进?按住板子上的 FORCE RECOVERY 键,再按一下 RESET,然后松开。用 lsusb 检查,如果看到 NVidia Corp. 就说明成功了。

💡 小技巧: 我习惯在刷写前先备份当前的 bootloader 分区。万一新固件有问题,还能回滚。命令是:sudo ./flash.sh -r -k bootloader jetson-orin-nx-devkit mmcblk0p1

21.2 安全启动配置

安全启动(Secure Boot)这东西,说白了就是给系统加一把锁。只有经过签名的固件才能跑,防止别人往你的板子里塞恶意代码。我在做边缘计算项目时,客户明确要求必须开启,否则不给验收。

21.2.1 生成密钥对

首先,你需要生成自己的 RSA 密钥对:

# 生成私钥
openssl genpkey -algorithm RSA -out rsa_private.pem -pkeyopt rsa_keygen_bits:2048

# 提取公钥
openssl rsa -pubout -in rsa_private.pem -out rsa_public.pem

21.2.2 烧录安全启动配置

把密钥放到 Linux_for_Tegra 目录下,然后执行:

# 生成安全启动的签名文件
sudo ./flash.sh -u rsa_public.pem -v rsa_private.pem jetson-orin-nx-devkit mmcblk0p1

刷完之后,板子就只认你签名的固件了。别人拿到的板子,就算刷了官方镜像也跑不起来。

🔑 关键点: 私钥一定要保管好!我曾经见过一个团队把私钥存在 Git 仓库里,结果被离职员工带走,整个产线的安全启动形同虚设。建议用 HSM(硬件安全模块)或者离线存储。

21.3 SSH 密钥管理

SSH 密钥这东西,我建议你从一开始就养成好习惯。别用密码登录,太容易被暴力破解了。

21.3.1 生成并部署密钥

在 Host PC 上生成密钥对:

ssh-keygen -t ed25519 -C "jetson-orin-nx"

然后把公钥传到 Jetson 上:

ssh-copy-id -i ~/.ssh/id_ed25519.pub nvidia@192.168.1.100

21.3.2 禁用密码登录

这一步很多人会忘。登录到 Jetson,编辑 /etc/ssh/sshd_config

# 找到这行,改成 no
PasswordAuthentication no

# 重启 SSH 服务
sudo systemctl restart sshd
⚠️ 警告: 改完配置后,先别关当前终端!另开一个窗口测试能否用密钥登录。如果连不上,你还有机会改回来。我曾经手快直接关了终端,结果发现自己把密钥路径写错了,只能接显示器去修。

21.3.3 多设备密钥管理

如果你管理多台 Jetson,我推荐用 ~/.ssh/config 来管理:

Host orin-nx-1
    HostName 192.168.1.101
    User nvidia
    IdentityFile ~/.ssh/id_ed25519_orin1

Host orin-nx-2
    HostName 192.168.1.102
    User nvidia
    IdentityFile ~/.ssh/id_ed25519_orin2

这样你只需要 ssh orin-nx-1 就能连上,不用记 IP 和密钥路径。

21.4 系统备份与恢复

系统备份,我觉得是每个嵌入式工程师的「后悔药」。你想想看,辛辛苦苦配了大半天的环境,一个误操作把系统搞崩了,如果没有备份,那真是欲哭无泪。

21.4.1 使用 dd 命令备份整个 eMMC/SD 卡

这是最粗暴也最有效的方法:

# 查看 Jetson 的存储设备
lsblk

# 备份(假设设备是 /dev/mmcblk0)
sudo dd if=/dev/mmcblk0 of=~/jetson_backup.img bs=4M status=progress

恢复的时候反过来:

sudo dd if=~/jetson_backup.img of=/dev/mmcblk0 bs=4M status=progress
💡 小技巧: 如果你只想备份系统分区,不想备份数据,可以用 parted 查看分区表,然后只备份 rootfs 分区。这样镜像会小很多,恢复也快。

21.4.2 使用 tar 备份关键目录

有时候你不需要整个磁盘的镜像,只需要备份配置和用户数据。我常用这个:

# 备份 /etc 和 /home
sudo tar -czf jetson_config_backup.tar.gz /etc /home/nvidia

# 恢复
sudo tar -xzf jetson_config_backup.tar.gz -C /

21.4.3 使用 NVIDIA 官方工具备份

JetPack 自带的 flash.sh 也支持备份:

# 备份当前系统为镜像
sudo ./flash.sh -r -k APP jetson-orin-nx-devkit mmcblk0p1

这个命令会把当前的 rootfs 打包成一个镜像,下次刷写时可以直接用这个镜像恢复。

📌 我的建议: 每次完成一个阶段性的配置(比如装完 CUDA、配好 Docker、部署完模型),都做一次备份。我一般会按日期命名,比如 jetson_backup_20250321.img。这样万一出问题,最多损失一天的工作量。

21.5 知识体系总览

下面这张图,是我自己梳理的安全与更新知识体系。你可以把它当成一个检查清单,看看自己还有哪些没覆盖到。

Jetson 安全与更新知识体系 安全与更新 固件更新 SDK Manager 图形化 命令行 flash.sh 恢复模式进入 bootloader 备份 安全启动 RSA 密钥对生成 签名固件烧录 私钥安全存储 HSM 硬件保护 SSH 密钥管理 ed25519 密钥生成 禁用密码登录 多设备 config 管理 密钥轮换策略 系统备份与恢复 dd 全盘镜像 tar 关键目录备份 flash.sh 官方工具 建议:每次完成阶段性配置后立即备份

嗯,以上就是安全与更新的核心内容。固件更新别断电,安全启动管好私钥,SSH 别用密码,系统勤备份。这几条做到了,你的 Jetson 开发环境就能稳如老狗。


公众号:蓝海资料掘金营,微信deep3321