I am implementing A/B update pattern. I have found that sometimes, my updates will report as successful but the boot partition will not get updated. When this happens, I re-run the update a second time and it succeeds and updates the boot partition correctly.
It surprises that SWUpdate is reporting the update as successful, but not updating the boot partition and I am seeking advice how to debug what the issue here.
Here is my SW description.
software = {
version = "@@MY_IMAGE_VERSION@@";
development : {
copy1 : {
images: (
{
filename = "@@MY_IMAGE_NAME@@-@@MACHINE@@.ext4.gz";
device = "/dev/mmcblk2p1";
type = "raw";
compressed = "zlib";
}
);
uboot: (
{
name = "mmcpart";
value = "1";
}
);
};
copy2 : {
images: (
{
filename = "@@MY_IMAGE_NAME@@-@@MACHINE@@.ext4.gz";
device = "/dev/mmcblk2p2";
type = "raw";
compressed = "zlib";
}
);
uboot: (
{
name = "mmcpart";
value = "2";
}
);
};
};
}
I run SWUpdate directly, using the following command. Where I use copy1/2 based on the output of the swupdate -g command.
swupdate -v -i /mnt/update/<imagename>.swu -e development,copy1
I have some observations to share. When the update succeeds (but doesn't update boot partition), the verbose output looks like this.
[INFO ] : SWUPDATE running : [print_registered_bootloaders] : Registered bootloaders:
[INFO ] : SWUPDATE running : [print_registered_bootloaders] : uboot loaded.
[INFO ] : SWUPDATE running : [main] : Using default bootloader interface: uboot
[INFO ] : SWUPDATE running : [print_registered_handlers] : Registered handlers:
[INFO ] : SWUPDATE running : [print_registered_handlers] : dummy
[INFO ] : SWUPDATE running : [print_registered_handlers] : archive
[INFO ] : SWUPDATE running : [print_registered_handlers] : tar
[INFO ] : SWUPDATE running : [print_registered_handlers] : uboot
[INFO ] : SWUPDATE running : [print_registered_handlers] : bootloader
[INFO ] : SWUPDATE running : [print_registered_handlers] : raw
[INFO ] : SWUPDATE running : [print_registered_handlers] : rawfile
[INFO ] : SWUPDATE running : [print_registered_handlers] : rawcopy
[INFO ] : SWUPDATE running : [main] : software set: development mode: copy1
[TRACE] : SWUPDATE running : [network_initializer] : Main loop daemon
[TRACE] : SWUPDATE running : [listener_create] : creating socket at /tmp/swupdateprog
[TRACE] : SWUPDATE running : [listener_create] : creating socket at /tmp/sockinstctrl
[TRACE] : SWUPDATE running : [network_thread] : Incoming network request: processing...
[INFO ] : SWUPDATE started : Software Update started !
[TRACE] : SWUPDATE running : [network_initializer] : Software update started
[TRACE] : SWUPDATE running : [extract_file_to_tmp] : Found file
[TRACE] : SWUPDATE running : [extract_file_to_tmp] : filename sw-description
[TRACE] : SWUPDATE running : [extract_file_to_tmp] : size 582
[TRACE] : SWUPDATE running : [get_common_fields] : Version 0.0.2
[TRACE] : SWUPDATE running : [_parse_images] : Found compressed Image: <imagename>.ext4.gz in device : /dev/mmcblk2p1 for handler raw
[TRACE] : SWUPDATE running : [_parse_bootloader] : Bootloader var: mmcpart = 1
[TRACE] : SWUPDATE running : [extract_files] : Found file
[TRACE] : SWUPDATE running : [extract_files] : filename <imagename>.ext4.gz
[TRACE] : SWUPDATE running : [extract_files] : size 382965715 required
[TRACE] : SWUPDATE running : [extract_padding] : Expecting 432 padding bytes at end-of-file
[TRACE] : SWUPDATE running : [network_initializer] : Valid image found: copying to FLASH
[INFO ] : SWUPDATE running : Installation in progress
[TRACE] : SWUPDATE running : [install_single_image] : Found installer for stream b2qt-embedded-qt6-image-imx8mp-var-dart.ext4.gz raw
[INFO ] : SWUPDATE running : [endupdate] : SWUpdate was successful !
Let's compare this with output of the re-run of the update (immediately done after the run shown above). This is the update that actually succeeds and updates the boot partition.
[INFO ] : SWUPDATE running : [print_registered_bootloaders] : Registered bootloaders:
[INFO ] : SWUPDATE running : [print_registered_bootloaders] : uboot loaded.
[INFO ] : SWUPDATE running : [main] : Using default bootloader interface: uboot
[INFO ] : SWUPDATE running : [print_registered_handlers] : Registered handlers:
[INFO ] : SWUPDATE running : [print_registered_handlers] : dummy
[INFO ] : SWUPDATE running : [print_registered_handlers] : archive
[INFO ] : SWUPDATE running : [print_registered_handlers] : tar
[INFO ] : SWUPDATE running : [print_registered_handlers] : uboot
[INFO ] : SWUPDATE running : [print_registered_handlers] : bootloader
[INFO ] : SWUPDATE running : [print_registered_handlers] : raw
[INFO ] : SWUPDATE running : [print_registered_handlers] : rawfile
[INFO ] : SWUPDATE running : [print_registered_handlers] : rawcopy
[INFO ] : SWUPDATE running : [main] : software set: development mode: copy1
[TRACE] : SWUPDATE running : [listener_create] : creating socket at /tmp/swupdateprog
[TRACE] : SWUPDATE running : [network_initializer] : Main loop daemon
[TRACE] : SWUPDATE running : [listener_create] : creating socket at /tmp/sockinstctrl
[TRACE] : SWUPDATE running : [network_thread] : Incoming network request: processing...
[INFO ] : SWUPDATE started : Software Update started !
[TRACE] : SWUPDATE running : [network_initializer] : Software update started
[WARN ] : SWUPDATE running : [swupdate_create_directory] : Directory scripts/ cannot be created due to : File exists
[WARN ] : SWUPDATE running : [swupdate_create_directory] : Directory datadst/ cannot be created due to : File exists
[TRACE] : SWUPDATE running : [extract_file_to_tmp] : Found file
[TRACE] : SWUPDATE running : [extract_file_to_tmp] : filename sw-description
[TRACE] : SWUPDATE running : [extract_file_to_tmp] : size 582
[TRACE] : SWUPDATE running : [get_common_fields] : Version 0.0.2
[TRACE] : SWUPDATE running : [_parse_images] : Found compressed Image: b2qt-embedded-qt6-image-imx8mp-var-dart.ext4.gz in device : /dev/mmcblk2p1 for handler raw
[TRACE] : SWUPDATE running : [_parse_bootloader] : Bootloader var: mmcpart = 1
[TRACE] : SWUPDATE running : [extract_files] : Found file
[TRACE] : SWUPDATE running : [extract_files] : filename b2qt-embedded-qt6-image-imx8mp-var-dart.ext4.gz
[TRACE] : SWUPDATE running : [extract_files] : size 382965715 required
[TRACE] : SWUPDATE running : [extract_padding] : Expecting 432 padding bytes at end-of-file
[TRACE] : SWUPDATE running : [network_initializer] : Valid image found: copying to FLASH
[INFO ] : SWUPDATE running : Installation in progress
[TRACE] : SWUPDATE running : [install_single_image] : Found installer for stream b2qt-embedded-qt6-image-imx8mp-var-dart.ext4.gz raw
[INFO ] : SWUPDATE successful ! SWUPDATE successful !
[TRACE] : SWUPDATE running : [network_initializer] : Main thread sleep again !
[INFO ] : No SWUPDATE running : Waiting for requests...
[INFO ] : SWUPDATE running : [endupdate] : SWUpdate was successful !
There are some differences to observe. First off, the warnings on the second run.
[WARN ] : SWUPDATE running : [swupdate_create_directory] : Directory scripts/ cannot be created due to : File exists
[WARN ] : SWUPDATE running : [swupdate_create_directory] : Directory datadst/ cannot be created due to : File exists
Secondly, we see that the successful update contains some info/traces that aren't present in the update that succeeded but failed to change the boot partition.
[INFO ] : SWUPDATE successful ! SWUPDATE successful !
[TRACE] : SWUPDATE running : [network_initializer] : Main thread sleep again !
Lastly, I am noticing that certain images I create (boot2qt) fail more frequently than others (a custom extended version of core-image-minimal).
Any idea what is going on here?
- Shakta