Jetson NX devices boot from NVME, how do I clone/restore NVMe to back up my own rootfs for Image-based OTA upgrades?

我已经完成了从R32.6.1至R35.4.1基于image的OTA升级,也成功完成了自定义的APP分区118G的rootfs的OTA升级,但是我安装了nvidia-jetpack之后根文件系统rootfs有16G,用这个rootfs替换BSP包中的rootfs之后在执行生成otapayload包的命令时会提示错误,我附上了一些操作步骤在下面ota_payload.log中,如下:

ota_payload.log (7.0 MB)

我安装完nvidia-jetpack之后按照Flashing Support — Jetson Linux Developer Guide documentation
里的1-4步骤完成rootfs的克隆

,然后用 $ sudo -t ext4 -o loop system.img.raw /自己的OTA BSP路径/rootfs/,然后执行生成ota_payload包的命令,执行过程中会报错

挂载的/home/uii/NX/OTA_35.4.1/Linux_for_Tegra/bootloader/mnt最大只能14G吗?这个大小是固定的吗?或者这个问题有什么解决方法吗?

是否方便提供你在第2步驟時所使用的完整command?

第二步执行的命令是
$ cd Linux_for_Tegra
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --initrd jetson-xavier-nx-devkit-emmc nvme0n1p1

麻煩改為使用mmcblk0p1 for <rootdev>,因為你要用dd command來clone NVMe上的partition,複製當前正在使用的partition會造成clone不完整的問題,所以在這個步驟你要用mmcblk0p1來load initrd

$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --initrd jetson-xavier-nx-devkit-emmc mmcblk0p1

第4步用dd if=/dev/nvme0n1p1 of=/mnt/system.img.raw 来备份NVME分区是吗?

對,這邊讓我提供下我們驗證過的流程(clone rootfs from NVMe)給你參考,看你最後是否可以將system.img.raw mount起來

1. Set the board to force-recovery mode

2. Follow the instructions
[Host]
$ cd Linux_for_Tegra
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --initrd jetson-xavier-nx-devkit-emmc mmcblk0p1

[Board]
(plug USB drive)
$ mount /dev/sda1 /mnt
$ dd if=/dev/nvme0n1p1 of=/mnt/system.img.raw
$ sync
$ umount /mnt

3. Test
[Host]
(plug USB drive and copy system.img.raw to PC)
$ sudo mount -t ext4 -o loop system.img.raw /mnt

我根据您给的步骤做的,还是出现一样的问题,备份的NVME根文件系统rootfs可以在主机上正常加载,只不过会有15G的大小。
在执行了$ sudo -E ./tools/ota_tools/version_upgrade/l4t_generate_ota_package.sh --external-device nvme0n1 -S 118GiB jetson-xavier-nx-devkit-emmc R32-6这条命令后还是会报Faild. Your APPSIZE might be too small.
在执行生成otapayload包的这条命令过程中加载的bootloader/mnt会用完14G 用了100% 而过程还没结束,还需要更多的存储,感觉问题好像出在了这里在这里,如果这里没有用完14G应该不会失败。

麻煩先幫忙檢查下生成出來的system.img.raw的大小為何?

重新看了下你的流程,如果要用自己的rootfs來生成OTA package,並不是把它先mount到<Linux_for_Tegra>/rootfs/底下,而是將它複製到<Linux_for_Tegra>/bootloader/system.img.raw.
詳細流程你可以參考Linux_for_Tegra/tools/ota_tools/version_upgrade/Image_based_OTA_Examples.txt文件的2. Using golden image in OTA update.

這看起來和你換了system.img.raw無關,還是和你環境的設定比較有關,確認是否因為有用sudo而造成它抓不到這個變數(BASE_BSP).
另外,請提供下目前產生出來system.img.raw的大小是多少? 它必須和你-S後面給的大小相等

沒問題,請用它來替換掉原 BSP package 下的 <Linux_for_Tegra>/bootloader/system.img.raw .

我替换掉原 BSP package 下的 <Linux_for_Tegra>/bootloader/system.img.raw之后在root用户权限下通过
./tools/ota_tools/version_upgrade/l4t_generate_ota_package.sh -s --external-device nvme0n1 -S 118GiB jetson-xavier-nx-devkit-emmc R32-6 成功生成了ota_payload包,然后我把ota_payload包拷贝到R32.6.1的设备上执行OTA在线升级,下面是执行的log:
ota_20230925-211532.log (9.5 KB)。
执行结束后设备重启的log如下:
putty20230925.log (2.7 MB)
提示设备存储空间不足。

Do write APP action

eval ROOTFS_PARTITION=/dev/mmcblk0p1

rootfs_disk=/dev/mmcblk0 rootfs_part=/dev/mmcblk0p1
...
Failed to decompress rootfs image into /dev/mmcblk0p1

從你的fail log看起來他想把rootfs放到mmcblk0p1而不是nvme0n1p1
請對照之前可以成功更新(未換system.img.raw)時的command和log

Hi,KevinFFF,我试了还是同样的错误。有一点想不通,为啥刷了基础系统之后不安装nvidia-jetpack可以正常生成otapayload包,安装了nvidia-jetpack之后再生产otapayload包就会出问题呢?

目前能想到的只有size問題,是否可能安裝nvidia-jetpack後的size超出rootfs的partition大小

因你之前有成功更新的log, 建議還是比對下log看是哪邊出錯了

好像rootfs默认的大小不能超过14G,在生成otapayload包时会挂载/home/uii/NX/OTA_35.4.1/Linux_for_Tegra/bootloader/mnt,这个挂载最大只能14G吗?超过就会报错:Failed.Your APPSIZE might be too small. 可是已经给了APPSIZE 118GiB了,"-S 118GiB"不就是给APPSIZE设置大小吗?还需要修改什么配置文件吗?

除了這之外,你也有改flash時所使用XML裡的num_sectors嗎?
感覺像是XML裡給的大小不夠

另外請問這步驟是可以成功mount起來的嗎?

xml中的num_sectors修改了。
sudo mount -t ext4 -o loop system.img.raw /mnt 是可以mount成功的。
你那边有做过测试验证吗?安装了nvidia-jetpack之后可以正常生成otapayload包吗?

請問你現在的問題是產生OTA package就失敗?
還是更新過程中的失敗?

照你這邊的說法,應該加完-s 參數後就能成功產生出 ota_payload吧!?

若你現在可以成功產生OTA package但是Fail在OTA更新過程
原因是R32到R35的image-based OTA會同時更新 eMMC和NVMe,且它會用同一個rootfs (bootloader/system.img.raw)因此造成eMMC的空間不足

以下有個workaround可以解決這個狀況
在R35的BSP package內的
<Linux_for_Tegra>/tools/ota_tools/version_upgrade/upgradetasklist.txt.jetson-xavier-nx-devkit-emmc.R32x_to_R35-ToT_emmc 裡面移除下面這行

Update_B2:Write_APP:sdmmc_user:APP :R35-ToT/flash.idx

再產生OTA package (記得加-s參數):

$ sudo -E ./tools/ota_tools/version_upgrade/l4t_generate_ota_package.sh -s --external-device nvme0n1 -S 118GiB jetson-xavier-nx-devkit-emmc R32-6

I’ve verified this use case on the Xavier NX-eMMC devkit.

Hi, KevinFFF
把<Linux_for_Tegra>/tools/ota_tools/version_upgrade/upgradetasklist.txt.jetson-xavier-nx-devkit-emmc.R32x_to_R35-ToT_emmc里面的Update_B2:Write_APP:sdmmc_user:APP :R35-ToT/flash.idx这行注释掉之后经测试是可行的,没问题,非常感谢!