Jetpack OTA from 32.7.4 to 35.3.1 fails due to getting dtbfile name failure

Dear experts,

I’ve distributed a number of Jetson Xavier NX 16GB boards flashed Jetson Linux 32.7.4 version on a global scale. In order to utilise a new DeepStream application, I need to update its Jetson Linux version to at least 35.3.1.

I’ve been following this official document:
https://docs.nvidia.com/jetson/archives/r35.3.1/DeveloperGuide/text/SD/SoftwarePackagesAndTheUpdateMechanism.html#updating-jetson-linux-with-image-based-over-the-air-update

along with this forum discussion:

However, I came across an error which I cannot search for any information elsewhere.

Here’s what I’ve done thus far.

Basically I’m using my own Ubuntu PC as a host device.

  1. Downloaded 32.7.4 BSP and Sample Root Filesystem from this website:
    https://developer.nvidia.com/embedded/linux-tegra-r3274
  2. Create a new directory named “R32.7.4” on the home/username path and ran the following command
tar xpf Jetson_Linux_R32.7.4_aarch64.tbz2
  1. And in this R32.7.4 directory, get into “Linux_for_Tegra/rootfs” directory and run the following command.
tar xpf Tegra_Linux_Sample-Root-Filesystem_R32.7.4_aarch64.tbz2 
  1. And in the R32.7.4/Linux_for_Tegra directory, run the following command.
./apply_binaries.sh

And it’s successful
5. Create a new “R35.3.1” directory again on the home/username path.
6. In this “R35.3.1” directory run the following command

tar xpf ota_tools_R35.3.1_aarch64.tbz2
  1. And then move to “R35.3.1/Linux_for_Tegra” directory and run the following command
./tools/ota_tools/version_upgrade/build_base_recovery_image.sh jetson-xavier-nx-devkit-emmc R32-7 ${BASE_BSP} ${BASE_BSP}/rootfs ${TARGET_BSP}

However, I’ve got the following error:

/home/username/R32.7.4/Linux_for_Tegra /home/username/R35.3.1/Linux_for_Tegra

**BOARDID=3668 FAB=100 BOARDSKU= BOARDREV= FUSELEVEL=fuselevel_production /home/username/R32.7.4/Linux_for_Tegra/flash.sh --no-flash -Z jetson-xavier-nx-devkit-emmc mmcblk0p1**

**Error: failed to get dtbfile name**

FYI, I’ve set the as below.

export BASE_BSP=/home/username/R32.7.4/Linux_for_Tegra
export TARGET_BSP=/home/username/R35.3.1/Linux_for_Tegra

And username is replaced with the actual directory name of course.

Thank you very much for your help in advance

Hi @kang12,

I’ve been working with OTA successfully for a while on Xavier AGX and Orin, I can provide some ideas about your error.

The OTA payload generation process uses the configuration and variables defined in the conf file in the Linux_for_tegra folder, I would suggest you to inspect the conf file being loaded by the OTA payload process for your target machine (jetson-xavier-nx-devkit-emmc) to verify that the dtb file name set is correctly placed in the Linux_for_tegra/kernel/dtb folder.

The log from the OTA payload generation is big, I have seen errors before the error message shown at the end on the OTA process, be sure that there are not other errors before. Maybe you can share a log.

Hope this helps to figure out the problem.

Hi Greivin.

Thank you so much for your response.

I was using an x84 ubuntu laptop when I got that error.

And now I’m trying to build the image based on another Jetson Xavier NX board.
This time there’s no “get dtbfile name” error anymore.

However, I’ve got another error like this:

/home/username/R32.7.4/Linux_for_Tegra /home/username/R35.3.1/Linux_for_Tegra
BOARDID=3668 FAB=100 BOARDSKU= BOARDREV= FUSELEVEL=fuselevel_production /home/username/R32.7.4/Linux_for_Tegra/flash.sh --no-flash -Z jetson-xavier-nx-devkit-emmc mmcblk0p1

SUCCESS: get dtbfile name "tegra194-p3668-all-p3509-0000.dtb"
Unpacking initrd ...
30412 blocks
grep: /home/username/R35.3.1/Linux_for_Tegra/tools/ota_tools/version_upgrade/recovery_copy_binlist.txt: No such file or directory
/tmp/R32x_recovery/initrd_tmp/lib /tmp/R32x_recovery/initrd_tmp /home/username/R35.3.1/Linux_for_Tegra
sed: can't read /tmp/R32x_recovery/initrd_tmp/sbin/dhclient-script: No such file or directory

This is literally the full log of the command.

I tried to search for those missing files such as

/home/username/R35.3.1/Linux_for_Tegra/tools/ota_tools/version_upgrade/recovery_copy_binlist.txt
/tmp/R32x_recovery/initrd_tmp/sbin/dhclient-script

manually once again and confirm that they are missing.

I’ve followed this document as it is:
https://docs.nvidia.com/jetson/archives/r35.3.1/DeveloperGuide/text/SD/SoftwarePackagesAndTheUpdateMechanism.html#updating-jetson-linux-with-image-based-over-the-air-update

This is what exactly I did:

# It's done in /home/username/R32.7.4 directory
sudo tar xpf Jetson_Linux_R32.7.4_aarch64.tbz2

# It's done in /home/username/R32.7.4/Linux_for_tegra/rootfs/ directory
sudo tar xpf Tegra_Linux_Sample-Root-Filesystem_R32.7.4_aarch64.tbz2

# It's done in /home/username/R32.7.4/Linux_for_tegra directory
sudo ./apply_binaries.sh  

# It's done in /home/username/R35.3.1/ directory
sudo tar xpf ota_tools_R35.3.1_aarch64.tbz2

# It's triggered in /home/username/R35.3.1/Linux_for_tegra
sudo ./tools/ota_tools/version_upgrade/build_base_recovery_image.sh jetson-xavier-nx-devkit-emmc R32-7 ${BASE_BSP} ${BASE_BSP}/rootfs ${TARGET_BSP}

# And I confirmed the following env is correctly set
export BASE_BSP=/home/username/R32.7.4/Linux_for_Tegra
export TARGET_BSP=/home/username/R35.3.1/Linux_for_Tegra

What did I wrong?
The Jetson that I’m working on is

# result of head -n 1 /etc/nv_tegra_release
R35 (release), REVISION: 4.1, GCID: 33958178, BOARD: t186ref, EABI: aarch64, DATE: Tue Aug  1 19:57:35 UTC 2023

# ubuntu 20.04.6 LTS

Thank you in advance.

Hi @kang12,

I think those files are generated by the OTA payload generation process, just wondering if there is another error in your system like a missing dependency.

I don’t have a build like yours (R35.3.1) but I’ve been working with the R35.4.1 version and JetPack 5.1.2 in the last week, I was checking for the files reported in your error, the tmp folder is deleted after the payload generation so I recommend to solve the missing recovery_copy_binlist.txt first. In my case this file was generated by the OTA tools (R35.4.1), adding it as reference, maybe this works for R35.3.1 as well. Give it a try.

recovery_copy_binlist.txt (12.6 KB)

Hi @greivin.fallas

Really appreciate your swift response.

It’s actually the perfect timing because I’m now trying to update it to R35.4.1 version actually because my host Jetson already has that R35.4.1 so I wanted to match the version of the host device to be the target version.

Let me try with this file and get back to you.

Hi @greivin.fallas

With your file, that error is resolved but I unfortunately came across another error while executing the same command:

./tools/ota_tools/version_upgrade/build_base_recovery_image.sh jetson-xavier-nx-devkit-emmc R32-7 ${BASE_BSP} ${BASE_BSP}/rootfs ${TARGET_BSP}

Full log:

/home/username/R32.7.4/Linux_for_Tegra /home/username/R35.4.1/Linux_for_Tegra
BOARDID=3668 FAB=100 BOARDSKU= BOARDREV= FUSELEVEL=fuselevel_production /home/username/R32.7.4/Linux_for_Tegra/flash.sh --no-flash -Z jetson-xavier-nx-devkit-emmc mmcblk0p1

SUCCESS: get dtbfile name "tegra194-p3668-all-p3509-0000.dtb"
Unpacking initrd ...
30412 blocks
cp: cannot stat '/home/username/R35.4.1/Linux_for_Tegra/tools/ota_tools/version_upgrade/init': No such file or directory
Warning: cp -f /home/username/R35.4.1/Linux_for_Tegra/tools/ota_tools/version_upgrade/init /tmp/R32x_recovery/initrd_tmp//init
cp: cannot stat '/home/username/R35.4.1/Linux_for_Tegra/tools/ota_tools/version_upgrade/nv_recovery.sh': No such file or directory
Warning: cp -f /home/username/R35.4.1/Linux_for_Tegra/tools/ota_tools/version_upgrade/nv_recovery.sh /tmp/R32x_recovery/initrd_tmp//bin/nv_recovery.sh
cp: cannot stat '/home/username/R35.4.1/Linux_for_Tegra/tools/ota_tools/version_upgrade/nv_ota_disk_enc.func': No such file or directory
Warning: cp -f /home/username/R35.4.1/Linux_for_Tegra/tools/ota_tools/version_upgrade/nv_ota_disk_enc.func /tmp/R32x_recovery/initrd_tmp//bin/nv_ota_disk_enc.func
cp: cannot stat '/home/username/R35.4.1/Linux_for_Tegra/tools/ota_tools/version_upgrade/nv_ota_exception_handler.sh': No such file or directory
Warning: cp -f /home/username/R35.4.1/Linux_for_Tegra/tools/ota_tools/version_upgrade/nv_ota_exception_handler.sh /tmp/R32x_recovery/initrd_tmp//bin/nv_ota_exception_handler.sh
cp: cannot stat '/home/username/R35.4.1/Linux_for_Tegra/tools/ota_tools/version_upgrade/nv_ota_internals.sh': No such file or directory
Warning: cp -f /home/username/R35.4.1/Linux_for_Tegra/tools/ota_tools/version_upgrade/nv_ota_internals.sh /tmp/R32x_recovery/initrd_tmp//bin/nv_ota_internals.sh
cp: cannot stat '/home/username/R35.4.1/Linux_for_Tegra/tools/ota_tools/version_upgrade/nv_ota_utils.func': No such file or directory
Warning: cp -f /home/username/R35.4.1/Linux_for_Tegra/tools/ota_tools/version_upgrade/nv_ota_utils.func /tmp/R32x_recovery/initrd_tmp//bin/nv_ota_utils.func
/tmp/R32x_recovery/initrd_tmp/lib /tmp/R32x_recovery/initrd_tmp /home/username/R35.4.1/Linux_for_Tegra
Packing initrd ...
55602 blocks
/home/username/R32.7.4/Linux_for_Tegra/bootloader/mkbootimg --kernel /home/username/R32.7.4/Linux_for_Tegra/kernel/Image --ramdisk /tmp/R32x_recovery/R32x_initrd.img --output /tmp/R32x_recovery/recovery.img --cmdline "root=/dev/initrd rw rootwait console=ttyTCU0,115200n8 fbcon=map:0 net.ifnames=0 video=tegrafb no_console_suspend=1 earlycon=tegra_comb_uart,mmio32,0x0c168000 base_version=R32-7 target_board=jetson-xavier-nx-devkit-emmc "
./tools/ota_tools/version_upgrade/build_base_recovery_image.sh: line 318: /home/username/R35.4.1/Linux_for_Tegra/l4t_sign_image.sh: No such file or directory
ERROR: Failed to sign /tmp/R32x_recovery/recovery.img

By the way I only unzip the BSP and Filesystem for the current version (32.7.4), not for the target version (35.4.1)
Should I also install BSP and Filesystem for the target version (35.4.1) too?

I only unzip the OTA tool of the target version (35.4.1)

Can you double check that the paths and the environment are correctly set?

Warning: cp -f /home/username/R35.4.1/Linux_for_Tegra/tools/ota_tools/version_upgrade/nv_recovery.sh /tmp/R32x_recovery/initrd_tmp//bin/nv_recovery.sh

The paths reported in the error show a double slash ‘//’, I have seen that kind of error when a variable is not being set.

The recovery file that I share was generated for a Orin, just wondering if there is a specific version for jetson-xavier-nx-devkit-emmc

Hi @greivin.fallas

I’ve realised that the Nvidia document is misleading.
I should unzip BSP and Filesystem not only for the current version (32.7.4) but also the target version (35.4.1) and then I unzip OTA as guided the document. The document doesn’t mention that we should do this for the target version as well.

By doing this I passed this command.

sudo ./tools/ota_tools/version_upgrade/build_base_recovery_image.sh jetson-xavier-nx-devkit-emmc R32-7 ${BASE_BSP} ${BASE_BSP}/rootfs ${TARGET_BSP}

The next challenge is that when I execute this command

sudo -E ./tools/ota_tools/version_upgrade/l4t_generate_ota_package.sh jetson-xavier-nx-devkit-emmc R32-7

I’ve got the following log:

Copying mb1 image from /home/username/R32.7.4/Linux_for_Tegra for re-signing
Copying cbo.dts from /home/username/R32.7.4/Linux_for_Tegra for specifying boot order

ROOTFS_AB=0 SKIP_REC_IMG=0 BOARDID=3668 FAB=100 BOARDSKU= BOARDREV= FUSELEVEL=fuselevel_production CHIP_SKU=  /home/username/R35.4.1/Linux_for_Tegra/flash.sh --no-flash --sign  jetson-xavier-nx-devkit-emmc mmcblk0p1

###############################################################################
# L4T BSP Information:
# R35 , REVISION: 4.1
# User release: 0.0
###############################################################################
Board ID(3668) version(100) sku() revision()
lz4c installed at /usr/bin/lz4c
Compressing /home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/tegra194-a02-bpmp-p3668-a00.dtb ...
Copy /home/username/R35.4.1/Linux_for_Tegra/kernel/dtb/tegra194-p3668-0001-p3509-0000.dtb to /home/username/R35.4.1/Linux_for_Tegra/kernel/dtb/tegra194-p3668-0001-p3509-0000.dtb.rec
NVDISP+UEFI in bootloader/nvdisp-init.bin ..
copying bctfile(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra194-mb1-bct-memcfg-p3668-0001-a00.cfg)... done.
copying bctfile1(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra194-memcfg-sw-override.cfg)... done.
copying minratchet_config(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra194-mb1-bct-ratchet-p3668.cfg)... done.
copying device_config(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra19x-mb1-bct-device-qspi-p3668.cfg)... done.
copying misc_cold_boot_config(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra194-mb1-bct-misc-l4t.cfg)... done.
copying misc_config(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra194-mb1-bct-misc-flash.cfg)... done.
copying pinmux_config(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra19x-mb1-pinmux-p3668-a01.cfg)... done.
copying gpioint_config(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra194-mb1-bct-gpioint-p3668-0001-a00.cfg)... done.
copying pmic_config(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra194-mb1-bct-pmic-p3668-0001-a00.cfg)... done.
copying pmc_config(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra19x-mb1-padvoltage-p3668-a01.cfg)... done.
copying prod_config(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra19x-mb1-prod-p3668-0001-a00.cfg)... done.
copying scr_config(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra194-mb1-bct-scr-cbb-mini-p3668.cfg)... done.
copying scr_cold_boot_config(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra194-mb1-bct-scr-cbb-mini-p3668.cfg)... done.
copying bootrom_config(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra194-mb1-bct-reset-p3668-0001-a00.cfg)... done.
copying dev_params(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra194-br-bct-qspi-l4t.cfg)... done.
copying dev_params_b(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra194-br-bct_b-qspi-l4t.cfg)... done.
Existing bootloader(/home/username/R35.4.1/Linux_for_Tegra/bootloader/nvtboot_cpu_t194.bin) reused.
copying initrd(/home/username/R35.4.1/Linux_for_Tegra/bootloader/l4t_initrd.img)... done.
bl is uefi
Making Boot image... done.
Not signing of boot.img
Making recovery ramdisk for recovery image...
Re-generating recovery ramdisk for recovery image...
~/R35.4.1/Linux_for_Tegra/bootloader/ramdisk_tmp ~/R35.4.1/Linux_for_Tegra/bootloader ~/R35.4.1/Linux_for_Tegra
42010 blocks

gzip: /home/username/R35.4.1/Linux_for_Tegra/kernel/Image: not in gzip format
_BASE_KERNEL_VERSION=5.10.120-tegra
cp: cannot stat '/home/username/R35.4.1/Linux_for_Tegra/rootfs/lib/modules/5.10.120-tegra/kernel/drivers/mtd/mtd.ko': No such file or directory
warning: cp -f /home/username/R35.4.1/Linux_for_Tegra/rootfs/lib/modules/5.10.120-tegra/kernel/drivers/mtd/mtd.ko /home/username/R35.4.1/Linux_for_Tegra/bootloader/ramdisk_tmp//lib/modules/5.10.120-tegra/kernel/drivers/mtd/mtd.ko
cp: cannot stat '/home/username/R35.4.1/Linux_for_Tegra/rootfs/lib/modules/5.10.120-tegra/kernel/drivers/mtd/mtdblock.ko': No such file or directory
warning: cp -f /home/username/R35.4.1/Linux_for_Tegra/rootfs/lib/modules/5.10.120-tegra/kernel/drivers/mtd/mtdblock.ko /home/username/R35.4.1/Linux_for_Tegra/bootloader/ramdisk_tmp//lib/modules/5.10.120-tegra/kernel/drivers/mtd/mtdblock.ko
cp: cannot stat '/home/username/R35.4.1/Linux_for_Tegra/rootfs/lib/modules/5.10.120-tegra/kernel/drivers/mtd/mtd_blkdevs.ko': No such file or directory
warning: cp -f /home/username/R35.4.1/Linux_for_Tegra/rootfs/lib/modules/5.10.120-tegra/kernel/drivers/mtd/mtd_blkdevs.ko /home/username/R35.4.1/Linux_for_Tegra/bootloader/ramdisk_tmp//lib/modules/5.10.120-tegra/kernel/drivers/mtd/mtd_blkdevs.ko
cp: cannot stat '/home/username/R35.4.1/Linux_for_Tegra/rootfs/lib/modules/5.10.120-tegra/kernel/drivers/mtd/devices/qspi_mtd.ko': No such file or directory
warning: cp -f /home/username/R35.4.1/Linux_for_Tegra/rootfs/lib/modules/5.10.120-tegra/kernel/drivers/mtd/devices/qspi_mtd.ko /home/username/R35.4.1/Linux_for_Tegra/bootloader/ramdisk_tmp//lib/modules/5.10.120-tegra/kernel/drivers/mtd/devices/qspi_mtd.ko
cp: cannot stat '/home/username/R35.4.1/Linux_for_Tegra/rootfs/lib/modules/5.10.120-tegra/kernel/drivers/spi/spi-tegra210-qspi.ko': No such file or directory
warning: cp -f /home/username/R35.4.1/Linux_for_Tegra/rootfs/lib/modules/5.10.120-tegra/kernel/drivers/spi/spi-tegra210-qspi.ko /home/username/R35.4.1/Linux_for_Tegra/bootloader/ramdisk_tmp//lib/modules/5.10.120-tegra/kernel/drivers/spi/spi-tegra210-qspi.ko
cp: cannot stat '/home/username/R35.4.1/Linux_for_Tegra/rootfs/usr/lib/modules/5.10.120-tegra/kernel/drivers/net/ethernet/realtek/r8168.ko': No such file or directory
warning: cp -f /home/username/R35.4.1/Linux_for_Tegra/rootfs/usr/lib/modules/5.10.120-tegra/kernel/drivers/net/ethernet/realtek/r8168.ko /home/username/R35.4.1/Linux_for_Tegra/bootloader/ramdisk_tmp//lib/modules/5.10.120-tegra/kernel/drivers/net/ethernet/realtek/r8168.ko
57812 blocks
Making Recovery image...
copying recdtbfile(/home/username/R35.4.1/Linux_for_Tegra/kernel/dtb/tegra194-p3668-0001-p3509-0000.dtb.rec)... done.
20+0 records in
20+0 records out
20 bytes copied, 0.000959753 s, 20.8 kB/s
Existing sosfile(/home/username/R35.4.1/Linux_for_Tegra/bootloader/mb1_t194_prod.bin) reused.
Existing tegraboot(/home/username/R35.4.1/Linux_for_Tegra/bootloader/nvtboot_t194.bin) reused.
Existing cpu_bootloader(/home/username/R35.4.1/Linux_for_Tegra/bootloader/nvtboot_cpu_t194.bin) reused.
Existing mb2blfile(/home/username/R35.4.1/Linux_for_Tegra/bootloader/nvtboot_recovery_t194.bin) reused.
Existing mtspreboot(/home/username/R35.4.1/Linux_for_Tegra/bootloader/preboot_c10_prod_cr.bin) reused.
Existing mcepreboot(/home/username/R35.4.1/Linux_for_Tegra/bootloader/mce_c10_prod_cr.bin) reused.
Existing mtsproper(/home/username/R35.4.1/Linux_for_Tegra/bootloader/mts_c10_prod_cr.bin) reused.
Existing mb1file(/home/username/R35.4.1/Linux_for_Tegra/bootloader/mb1_t194_prod.bin) reused.
Existing bpffile(/home/username/R35.4.1/Linux_for_Tegra/bootloader/bpmp-2_t194.bin) reused.
Existing bpfdtbfile(/home/username/R35.4.1/Linux_for_Tegra/bootloader/tegra194-a02-bpmp-p3668-a00_lz4.dtb) reused.
Existing scefile(/home/username/R35.4.1/Linux_for_Tegra/bootloader/camera-rtcpu-sce.img) reused.
Existing camerafw(/home/username/R35.4.1/Linux_for_Tegra/bootloader/camera-rtcpu-t194-rce.img) reused.
Existing apefile(/home/username/R35.4.1/Linux_for_Tegra/bootloader/adsp-fw.bin) reused.
Existing spefile(/home/username/R35.4.1/Linux_for_Tegra/bootloader/spe_t194.bin) reused.
Existing wb0boot(/home/username/R35.4.1/Linux_for_Tegra/bootloader/warmboot_t194_prod.bin) reused.
Existing tosfile(/home/username/R35.4.1/Linux_for_Tegra/bootloader/tos-optee_t194.img) reused.
Existing eksfile(/home/username/R35.4.1/Linux_for_Tegra/bootloader/eks_t194.img) reused.
copying soft_fuses(/home/username/R35.4.1/Linux_for_Tegra/bootloader/t186ref/BCT/tegra194-mb1-soft-fuses-l4t.cfg)... done.
copying dtbfile(/home/username/R35.4.1/Linux_for_Tegra/kernel/dtb/tegra194-p3668-0001-p3509-0000.dtb)... done.
Copying nv_boot_control.conf to rootfs
	populating kernel to rootfs... done.
	populating initrd to rootfs... done.
	populating kernel_tegra194-p3668-0001-p3509-0000.dtb to rootfs... done.
Making system.img... 
/home/username/R35.4.1/Linux_for_Tegra/rootfs/boot/extlinux/extlinux.conf is not found, exiting...

Now the problem is that according to the document, I should have this file ota_payload_package.tar.gz in this directory ${TARGET_BSP}/bootloader/<target_board>/ but there’s no <target_board> directory which is supposed to be jetson-xavier-nx-devkit-emmc in the bootloader folder.

Could you guess any reason for this according to the log?

Hi @kang12, good to know that you got progress.

I remember this new error, the rootfs folder within the Linux_for_tegra folder should look like this:

bin   dev  home  media  nv_preseed.cfg  proc        root  sbin  srv  tmp  var
boot  etc  lib   mnt    opt             README.txt  run   snap  sys  usr

So be sure your are decompressing the sample_rootfs tar to match this output.

Regarding the specific error, there should be a ‘extlinux.conf’ file in Linux_for_tegra/rootfs/boot/extlinux/.
Attaching the file for your reference.
extlinux.zip (603 Bytes)

Decompress the zip and place it in the path mentioned on the error log.
You may need to update the FDT entry to match the correct dtb name for your machine.

1 Like

@greivin.fallas Thanks very much again. Really appreciate it.

Now it’s going in progress. Fingers crossed.

I’ll keep this post up to date for anyone’s future reference because the Nvidia’s official document is not kind for those like me who tries this image based OTA for the first time.

1 Like

@greivin.fallas Hi, unfortunately I missed this part of your comment
“You may need to update the FDT entry to match the correct dtb name for your machine.”
and already started the payload creation process.

And then I realised my dtb name is different from the one in your file.

Would this be critical? The process itself is so far so good.
But if it’s critical then I’ll do it once the current process is somehow ended.

Sorry @greivin.fallas to bother you.

But I found FDT entry is not a problem. It’s correctly detected. But anyway I modified the extlinux.conf file.

It had been going well but then somehow got into another missing file :(

Copy NVIDIA provided rootfs updater to /home/username/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp/nv_ota_rootfs_updater.sh
~/R35.4.1/Linux_for_Tegra/tools/ota_tools/version_upgrade ~/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp ~/R35.4.1/Linux_for_Tegra
'nv_ota_validate.sh' -> '/home/username/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp/nv_ota_validate.sh'
'nv_ota_update.sh' -> '/home/username/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp/nv_ota_update.sh'
'nv_ota_common_utils.func' -> '/home/username/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp/nv_ota_common_utils.func'
'nv_ota_check_version.sh' -> '/home/username/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp/nv_ota_check_version.sh'
'nv_ota_update_all_in_recovery.sh' -> '/home/username/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp/nv_ota_update_all_in_recovery.sh'
'nv_ota_update_rootfs_in_recovery.sh' -> '/home/username/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp/nv_ota_update_rootfs_in_recovery.sh'
~/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp ~/R35.4.1/Linux_for_Tegra
The file /home/username/R35.4.1/Linux_for_Tegra/rootfs/opt/nvidia/l4t-bootloader-config/nv-l4t-bootloader-config.sh is not found

nvidia directory doesn’t even exist in this path /home/username/R35.4.1/Linux_for_Tegra/rootfs/opt

Have you experienced this too?
I don’t understand why there are many missing files even though I followed Nvidia’s instruction.

Hi @kang12, I’m not sure if it is critical, I think the bootloader will fail to find the dtb file and should boot anyways using the dtb partition instead, so it can work even if the dtb is missing from /boot/ folder.

In any case, if there is a problem, just changing that entry should fix it.
Generating the Payload takes like 20~30 minutes depending the host hw.

Hi @kang12,

Adding the l4t-bootloader-config files for your reference.
Let me know if there is something else missing.
l4t-bootloader-config.zip (9.0 KB)

1 Like

Thank you @greivin.fallas

And this time

Copy NVIDIA provided rootfs updater to /home/username/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp/nv_ota_rootfs_updater.sh
~/R35.4.1/Linux_for_Tegra/tools/ota_tools/version_upgrade ~/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp ~/R35.4.1/Linux_for_Tegra
'nv_ota_validate.sh' -> '/home/username/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp/nv_ota_validate.sh'
'nv_ota_update.sh' -> '/home/username/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp/nv_ota_update.sh'
'nv_ota_common_utils.func' -> '/home/username/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp/nv_ota_common_utils.func'
'nv_ota_check_version.sh' -> '/home/username/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp/nv_ota_check_version.sh'
'nv_ota_update_all_in_recovery.sh' -> '/home/username/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp/nv_ota_update_all_in_recovery.sh'
'nv_ota_update_rootfs_in_recovery.sh' -> '/home/username/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp/nv_ota_update_rootfs_in_recovery.sh'
~/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp ~/R35.4.1/Linux_for_Tegra
The utility /home/username/R35.4.1/Linux_for_Tegra/rootfs/usr/sbin/nvbootctrl is not valid
Failed to run "copy_utility /home/username/R35.4.1/Linux_for_Tegra/rootfs/usr/sbin/nvbootctrl /home/username/R35.4.1/Linux_for_Tegra/ota_base_dir_tmp/nvbootctrl"
Failed to run "copy_utilities_for_ota_update"

I confirm that nvbootctrl this doesn’t exist in /home/username/R35.4.1/Linux_for_Tegra/rootfs/usr/sbin/.

You are almost doing the Nvidia’s job!

Hi @kang12,

nvbootctrl.zip (11.9 KB)
Binary attached, We are here to help others haha.

I faced those problems in the past, glad to help.

1 Like

Hi @greivin.fallas
Thanks to your help, I’ve successfully created the OTA image.

And while trying to update a target Jetson Xavier NX board remotely over ssh connection, I modified /boot/extlinux/extlinux.conf file according to the official guideline:

Originally it was:

APPEND ${cbootargs} quiet root=/dev/nvme0n1p1 rw rootwait rootfstype=ext4 console=ttyTCU0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0

And I changed it to:

APPEND ${cbootargs} quiet root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyTCU0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0

I confirmed that mmcblk0p1 exists in this board according to lsblk command.

After changing this, I rebooted because I thought I should apply this, then afterwards this device seems not to be booted up. I cannot connect the device through ssh anymore.

Is there anything I can do to recover this back? Did I do something wrong?

@greivin.fallas in case you can have a look at this message too.

This time I tried with another board.

Also the update was failed with this log.

Checking partition kernel-dtb in the ota index file
The start and end offset for kernel-dtb partition matches
Checking partition kernel-dtb_b in the ota index file
The start and end offset for kernel-dtb_b partition matches
Checking partition recovery in the ota index file
The start and end offset for recovery partition matches
Checking partition recovery-dtb in the ota index file
The start and end offset for recovery-dtb partition matches
Checking partition kernel-bootctrl in the ota index file
The start and end offset for kernel-bootctrl partition matches
Checking partition kernel-bootctrl_b in the ota index file
The start and end offset for kernel-bootctrl_b partition matches
enable_a_b_redundancy
Nvidia A/B-Redundancy Update tool Version 2.1
enabling A/B redundancy
A/B Redundancy has been enabled.
both_slots_valid
write_base_recovery /ota_work
Verifying image /ota_work/recovery.img.R32x with sha1 chksum file /ota_work/recovery.img.R32x.sha1sum
Sha1 checksum for /ota_work/recovery.img.R32x (9786c5dc430cba949bcc2b3f19727f351963f79d) matches
Verifying image /ota_work/recovery.dtb.R32x with sha1 chksum file /ota_work/recovery.dtb.R32x.sha1sum
Sha1 checksum for /ota_work/recovery.dtb.R32x (5a0259bdd2692ac041652d7c569a6e821bc7e6d4) matches
Backed up recovery and recovery-dtb partition under /ota_work before writing them
Writing base recovery image into /dev/mmcblk0p6
Read back base recovery image into /ota_work/image.tmp and verify it
Reading 47636480 bytes from /dev/mmcblk0p6: 1KB block=46520 remainder=0 offset=47636480
Verifying image /ota_work/image.tmp with sha1 chksum file /ota_work/recovery.img.R32x.sha1sum
Sha1 checksum for /ota_work/image.tmp (9786c5dc430cba949bcc2b3f19727f351963f79d) matches
Writing base recovery dtb into /dev/mmcblk0p7
Read back base recovery dtb into /ota_work/image.tmp and verify it
Reading 208736 bytes from /dev/mmcblk0p7: 1KB block=203 remainder=864 offset=207872
Verifying image /ota_work/image.tmp with sha1 chksum file /ota_work/recovery.dtb.R32x.sha1sum
Sha1 checksum for /ota_work/image.tmp (5a0259bdd2692ac041652d7c569a6e821bc7e6d4) matches
write_kernel_bootctrl /ota_work
512+0 records in
512+0 records out
262144 bytes (262 kB, 256 KiB) copied, 0,00786074 s, 33,3 MB/s
Backed up kernel-bootctrl partition under /ota_work before writing them
Writing bootctrl update file into /dev/mmcblk0p8
Read back bootctrl update file into /ota_work/image.tmp and verify it
Reading 20 bytes from /dev/mmcblk0p8: 1KB block=0 remainder=20 offset=0
force_booting_from_emmc /ota_work
The file /ota_work/cbo.dtb is not found
Failed to run "force_booting_from_emmc /ota_work"

This failure happens even though I modified the /boot/extlinux/extlinux.conf to have APPEND ${cbootargs} quiet root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyTCU0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0

and I executed the update with the following command:

sudo ./nv_ota_start.sh /dev/mmcblk0 /ota/ota_payload_package.tar.gz

Moreover, even though I switched the /boot/extlinux/extlinux.conf file back to how it was:

APPEND ${cbootargs} quiet root=/dev/nvme0n1p1 rw rootwait rootfstype=ext4 console=ttyTCU0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0

It also failed to be booted after a reboot

I’ve tried several different solutions but still stuck in this issue

force_booting_from_emmc /ota_work
The file /ota_work/cbo.dtb is not found
Failed to run "force_booting_from_emmc /ota_work"

This is the command that I executed:

sudo ./nv_ota_start.sh /dev/mmcblk0 ${OTADIR}/ota_payload_package.tar.gz

And here’s the full log

Command: ./nv_ota_start.sh /dev/mmcblk0 /ota/ota_payload_package.tar.gz
Current rootfs is on /dev/nvme0n1
init_ota_log /ota_log
Create log file at /ota_log/ota_20240219-205419.log
OTA_LOG_FILE=/ota_log/ota_20240219-205419.log
Extract /ota/ota_payload_package.tar.gz
update_nv_boot_control_in_rootfs /ota_work
3668-301---1--jetson-xavier-nx-devkit-emmc-
check_prerequisites
decompress_ota_package ota_package.tar /ota_work
decompress_ota_package: start at Pzt Şub 19 20:55:02 +03 2024
Sha1 checksum for /ota_work/ota_package.tar (5135a3692f9fdf21b88adc960e0c5f3c0e04fa8a) matches
decompress_ota_package: end at Pzt Şub 19 20:55:30 +03 2024
nv_ota_update_with_layout_change.sh /dev/nvme0n1
Command: nv_ota_update_with_layout_change.sh /dev/nvme0n1
duplicate_bct_copy
Copied 65536 bytes from address 0x00000000 in flash to /tmp/bct.bin.tmp
Erased 65536 bytes from address 0x00010000 in flash
Copied 65536 bytes from /tmp/bct.bin.tmp to address 0x00010000 in flash
Duplicating BCT image is done
check_bsp_version /ota_work BASE_VERSION
check_target_board /ota_work TARGET_BOARD
set_msi_emmc_min_size jetson-xavier-nx-devkit-emmc MSI_EMMC_MIN_SIZE
ota_check_rollback /ota_work jetson-xavier-nx-devkit-emmc R32-7
OTA_PACKAGE version: branch:35 revision:4.1 major.minor:4.1
65536+0 records in
65536+0 records out
33554432 bytes (34 MB, 32 MiB) copied, 10,4319 s, 3,2 MB/s
boot_device_size=33554432
VER's offset is 33292288 and size is 65536
VER_b's offset is 33357824 and size is 65536
VER_b version: branch:32 revision:7.3 major.minor:7.3
VER version: branch:32 revision:7.3 major.minor:7.3
Check BCT/MB1/MB1_BCT partiton for fresh OTA
Checking BCT partition
Checking MB1 partition
Checking MB1_BCT partition
ver_check_res=0
ota_choose_images /ota_work
COMPATIBLE_SPEC=3668-301---1--jetson-xavier-nx-devkit-emmc-
TEGRA_CHIPID=0x19
_BOARD_SPEC_NAME=3668-301--
Copy files from ./images-R32i/3668-301--/ to ./images-R32i/
Copy files from ./images-R32x-R35i/3668-301--/ to ./images-R32x-R35i/
Copy files from ./images-R35A-R35i/3668-301--/ to ./images-R35A-R35i/
Copy files from ./images-R35-ToT/3668-301--/ to ./images-R35-ToT/
ota_check_free_space_on_emmc
There is enough free space(523336192 bytes > 241172480 bytes) on eMMC
ota_check_partitions /ota_work
65536+0 records in
65536+0 records out
33554432 bytes (34 MB, 32 MiB) copied, 9,23746 s, 3,6 MB/s
boot_device_size=33554432
Checking partitions on the boot device through secondary GPT
Checking partition BCT in the ota index file
The start and end offset for BCT partition matches
Checking partition mb1 in the ota index file
The start and end offset for mb1 partition matches
Checking partition mb1_b in the ota index file
The start and end offset for mb1_b partition matches
Checking partition MB1_BCT in the ota index file
The start and end offset for MB1_BCT partition matches
Checking partition MB1_BCT_b in the ota index file
The start and end offset for MB1_BCT_b partition matches
Checking partition MEM_BCT in the ota index file
The start and end offset for MEM_BCT partition matches
Checking partition MEM_BCT_b in the ota index file
The start and end offset for MEM_BCT_b partition matches
Checking partition spe-fw in the ota index file
The start and end offset for spe-fw partition matches
Checking partition spe-fw_b in the ota index file
The start and end offset for spe-fw_b partition matches
Checking partition mb2 in the ota index file
The start and end offset for mb2 partition matches
Checking partition mb2_b in the ota index file
The start and end offset for mb2_b partition matches
Checking partition mts-preboot in the ota index file
The start and end offset for mts-preboot partition matches
Checking partition mts-preboot_b in the ota index file
The start and end offset for mts-preboot_b partition matches
Checking partition mts-mce in the ota index file
The start and end offset for mts-mce partition matches
Checking partition mts-mce_b in the ota index file
The start and end offset for mts-mce_b partition matches
Checking partition mts-proper in the ota index file
The start and end offset for mts-proper partition matches
Checking partition mts-proper_b in the ota index file
The start and end offset for mts-proper_b partition matches
Checking partition sc7 in the ota index file
The start and end offset for sc7 partition matches
Checking partition sc7_b in the ota index file
The start and end offset for sc7_b partition matches
Checking partition SMD in the ota index file
The start and end offset for SMD partition matches
Checking partition SMD_b in the ota index file
The start and end offset for SMD_b partition matches
Checking partition xusb-fw in the ota index file
The start and end offset for xusb-fw partition matches
Checking partition xusb-fw_b in the ota index file
The start and end offset for xusb-fw_b partition matches
Checking partition cpu-bootloader in the ota index file
The start and end offset for cpu-bootloader_rsv partition matches
Checking partition cpu-bootloader_b in the ota index file
The start and end offset for cpu-bootloader_b partition matches
Checking partition bootloader-dtb in the ota index file
The start and end offset for bootloader-dtb_rsv partition matches
Checking partition bootloader-dtb_b in the ota index file
The start and end offset for bootloader-dtb_b partition matches
Checking partition BMP in the ota index file
The start and end offset for BMP_rsv partition matches
Checking partition BMP_b in the ota index file
The start and end offset for BMP_b partition matches
Checking partition secure-os in the ota index file
The start and end offset for secure-os_rsv partition matches
Checking partition secure-os_b in the ota index file
The start and end offset for secure-os_b partition matches
Checking partition eks in the ota index file
The start and end offset for eks_rsv partition matches
Checking partition eks_b in the ota index file
The start and end offset for eks_b partition matches
Checking partition adsp-fw in the ota index file
The start and end offset for adsp-fw_rsv partition matches
Checking partition adsp-fw_b in the ota index file
The start and end offset for adsp-fw_b partition matches
Checking partition rce-fw in the ota index file
The start and end offset for rce-fw_rsv partition matches
Checking partition rce-fw_b in the ota index file
The start and end offset for rce-fw_b partition matches
Checking partition sce-fw in the ota index file
The start and end offset for sce-fw_rsv partition matches
Checking partition sce-fw_b in the ota index file
The start and end offset for sce-fw_b partition matches
Checking partition bpmp-fw in the ota index file
The start and end offset for bpmp-fw_rsv partition matches
Checking partition bpmp-fw_b in the ota index file
The start and end offset for bpmp-fw_b partition matches
Checking partition bpmp-fw-dtb in the ota index file
The start and end offset for bpmp-fw-dtb_rsv partition matches
Checking partition bpmp-fw-dtb_b in the ota index file
The start and end offset for bpmp-fw-dtb_b partition matches
Checking partition CPUBL-CFG in the ota index file
The start and end offset for CPUBL-CFG_rsv partition matches
Checking partition CPUBL-CFG_b in the ota index file
The start and end offset for CPUBL-CFG_b partition matches
Checking partition VER in the ota index file
The start and end offset for VER partition matches
Checking partition VER_b in the ota index file
The start and end offset for VER_b partition matches
Checking partitions on the user device through primary GPT
Checking partition APP in the ota index file
The start and end offset for APP partition matches
Checking partition kernel in the ota index file
The start and end offset for kernel partition matches
Checking partition kernel_b in the ota index file
The start and end offset for kernel_b partition matches
Checking partition kernel-dtb in the ota index file
The start and end offset for kernel-dtb partition matches
Checking partition kernel-dtb_b in the ota index file
The start and end offset for kernel-dtb_b partition matches
Checking partition recovery in the ota index file
The start and end offset for recovery partition matches
Checking partition recovery-dtb in the ota index file
The start and end offset for recovery-dtb partition matches
Checking partition kernel-bootctrl in the ota index file
The start and end offset for kernel-bootctrl partition matches
Checking partition kernel-bootctrl_b in the ota index file
The start and end offset for kernel-bootctrl_b partition matches
enable_a_b_redundancy
both_slots_valid
write_base_recovery /ota_work
Verifying image /ota_work/recovery.img.R32x with sha1 chksum file /ota_work/recovery.img.R32x.sha1sum
Sha1 checksum for /ota_work/recovery.img.R32x (c6486c424b360df243489f502c55114fcb56ce4c) matches
Verifying image /ota_work/recovery.dtb.R32x with sha1 chksum file /ota_work/recovery.dtb.R32x.sha1sum
Sha1 checksum for /ota_work/recovery.dtb.R32x (6f4d81d4bf6ca74924fd16dcc7d3824d8bba1474) matches
Backed up recovery and recovery-dtb partition under /ota_work before writing them
Writing base recovery image into /dev/mmcblk0p6
Read back base recovery image into /ota_work/image.tmp and verify it
Reading 47554560 bytes from /dev/mmcblk0p6: 1KB block=46440 remainder=0 offset=47554560
Verifying image /ota_work/image.tmp with sha1 chksum file /ota_work/recovery.img.R32x.sha1sum
Sha1 checksum for /ota_work/image.tmp (c6486c424b360df243489f502c55114fcb56ce4c) matches
Writing base recovery dtb into /dev/mmcblk0p7
Read back base recovery dtb into /ota_work/image.tmp and verify it
Reading 208736 bytes from /dev/mmcblk0p7: 1KB block=203 remainder=864 offset=207872
Verifying image /ota_work/image.tmp with sha1 chksum file /ota_work/recovery.dtb.R32x.sha1sum
Sha1 checksum for /ota_work/image.tmp (6f4d81d4bf6ca74924fd16dcc7d3824d8bba1474) matches
write_kernel_bootctrl /ota_work
512+0 records in
512+0 records out
262144 bytes (262 kB, 256 KiB) copied, 0,00814408 s, 32,2 MB/s
Backed up kernel-bootctrl partition under /ota_work before writing them
Writing bootctrl update file into /dev/mmcblk0p8
Read back bootctrl update file into /ota_work/image.tmp and verify it
Reading 20 bytes from /dev/mmcblk0p8: 1KB block=0 remainder=20 offset=0
force_booting_from_emmc /ota_work
The file /ota_work/cbo.dtb is not found
Failed to run "force_booting_from_emmc /ota_work"

If anyone can advise or provide me a proper cbo.dtb file, it’ll be highly appreciated.

@greivin.fallas any advice about the above cbo.dtb issue will be really appreciated.