We want to use mender for our OTA service. I gone through the references, yocto mender layer and build-root but none of them are close to my requirement
my requirement is similar to discussion in the link
I made modifications in flash layout to fit the mender dual rootfs + kernel on raw ubi volume.
kernel arguments are modified to mount the squashfs( rootfs) stored in /dev/ubiblock0_3, the setup works fine mender recognize the active/inactive partition then one and tries to flash the the mender artifact,it come out with open permission failure message.further in our linux 4.4 kernel driver ‘driver/mnt/ubi/block.c’ driver only read-only support.investigating further on internet I found there are patches available for older version but I did’t see and thing equivalent for newer kernel.
Thanks @mirzak for the support, any idea on what’s going wrong with my mender integration ,also I need clarity on how mender is going to write to /dev/ubiblock0_2 , the lowlevel driver(/driver/mnt/ubi/block.c) support allows only read operation. please correct me if there is any misunderstanding.
The Mender client will do the equivalent to what ubiupdatevol does, you could try with this tool first.
If ubiupdatevol does not work then you might have some non-standard modifications in you Linux kernel that disallows this and in which case I do not know if I can provide any additional guidance.
Thanks @mirzak for you time, really appreciate this.
I think mender integration on my board still have gaps.
My observations
This works on my board,
ubiupdatevol /dev/ubi0_2
Then I created a block device
ubiblock -c /dev/ubi0_2
block ubiblock0_2: created from ubi0:2(ROOTFS0)
This is not working on my board.
ubiupdatevol /dev/ubiblock0_2
libubi: error!: “/dev/ubiblock0_2” is not a character device
ubiupdatevol: error!: error while probing “/dev/ubiblock0_2”
error 22 (Invalid argument)
I have yocto mender build for nor-vexpress-qemu for reference, mender works fine on this syste.
further I created test programme which is equivalent to ‘ubiupdatevol’.
this neither works on my board nor on vexpress-qemu
int main()
{
char buf[] = “0123456789012345678901234567890123456789012345678901234567890123456789”;
int fd = open("/dev/ubi0_2",O_RDWR);
int image_size=sizeof(buf);
ioctl(fd, UBI_IOCVOLUP, &image_size);
if(write(fd, buf, image_size)<0)
perror("");
close(fd);
}
ubiupdatevol /dev/ubiblock0_2
libubi: error!: “/dev/ubiblock0_2” is not a character device
ubiupdatevol: error!: error while probing “/dev/ubiblock0_2”
error 22 (Invalid argument)
I apologize I missed/skipped some information you posted earlier, but UBI blocks are as you pointed out RO so you can not point the Mender client to /dev/ubiblock0_2 devices, it has to be e.g /dev/ubi0_2. /dev/ubi0_2 represents an UBI volume while /dev/ubiblock0_2 is a raw visual representation of the NAND area.
I pointed this out in the other thread,
For this reason I would suggest for you to use UBI volumes in “raw mode” where you store your squashfs images. This will work out of the box pretty much.
Thanks for support, this channel is helping my mender integration effort.
The discussion on fit image in other threads caught my interest, I created a setup on which uboot loads the kernel and squashfs rootfs using FIT image.I believe, this case kernel will mount the rootfs as ramdisk.This approach requires ram space equivalent to rootfs size blocked,which other wise would have been available for application.
Can you please comment on a better way of using the fit images or different approach.
@mirzak
I tried mender on uboot fit images and ramdisk, o/p on console is as below, how to get the right partition ?.
Mender running on partition: /dev/root module=main
etc/mender # mender -debug -install /tmp/release-1.mender
WARN[0000] Could not connect to syslog daemon: Unix syslog delivery error. (use -no-syslog to disable completely) module=main
DEBU[0000] Reading Mender configuration from file /var/lib/mender/mender.conf module=config
INFO[0000] Loaded configuration file: /var/lib/mender/mender.conf module=config
DEBU[0000] Reading Mender configuration from file /etc/mender/mender.conf module=config
INFO[0000] Loaded configuration file: /etc/mender/mender.conf module=config
WARN[0000] No server URL(s) specified in mender configuration. module=config
WARN[0000] Server entry 1 has no associated server URL. module=config
DEBU[0000] Merged configuration = &main.menderConfig{menderConfigFromFile:main.menderConfigFromFile{ClientProtocol:“”, ArtifactVerifyKey:“”, HttpsClient:struct { Certificate string; Key string; SkipVerify bool }{Certificate:“”, Key:“”, SkipVerify:false}, RootfsPartA:“ubi0_2”, RootfsPartB:“ubi0_3”, DeviceTypeFile:“/var/lib/mender/device_type”, UpdatePollIntervalSeconds:0, InventoryPollIntervalSeconds:0, RetryPollIntervalSeconds:0, StateScriptTimeoutSeconds:0, StateScriptRetryTimeoutSeconds:0, StateScriptRetryIntervalSeconds:0, ModuleTimeoutSeconds:0, ServerCertificate:“”, ServerURL:“”, UpdateLogPath:“”, TenantToken:“”, Servers:client.MenderServer{client.MenderServer{ServerURL:“”}}}, ModulesPath:“/usr/share/mender/modules/v3”, ModulesWorkPath:“/var/lib/mender/modules/v3”, ArtifactInfoFile:“/etc/mender/artifact_info”, ArtifactScriptsPath:“/var/lib/mender/scripts”, RootfsScriptsPath:“/etc/mender/scripts”} module=config
WARN[0000] Could not resolve path link: ubi0_2 Attempting to continue module=partitions
WARN[0000] Could not resolve path link: ubi0_3 Attempting to continue module=partitions
DEBU[0000] Have U-Boot variable: mender_check_saveenv_canary=0 module=bootenv
DEBU[0000] List of U-Boot variables:map[mender_check_saveenv_canary:0] module=bootenv
DEBU[0000] Have U-Boot variable: mender_boot_part=3 module=bootenv
DEBU[0000] List of U-Boot variables:map[mender_boot_part:3] module=bootenv
DEBU[0000] Setting active partition from mount candidate: /dev/root module=partitions
INFO[0000] Mender running on partition: /dev/root module=main
DEBU[0000] I/O read error for entry mender-agent.pem: open /var/lib/mender/mender-agent.pem: no such file or directory module=dirstore
DEBU[0000] private key does not exist module=keystore
DEBU[0000] ModuleTimeoutSeconds not set. Defaulting to 14400 seconds module=modules
DEBU[0000] Starting device update. module=standalone
INFO[0000] Start updating from local image file: [/tmp/release-1.mender] module=standalone
DEBU[0000] Fetching update from file results: [&{0x85ef00}], 14299136, module=standalone
Installing Artifact of size 14299136…
DEBU[0000] Read data from device manifest file: device_type=emdev module=device
DEBU[0000] Current manifest data: emdev module=device
DEBU[0000] statescript: timeout for executing scripts is not defined; using default of 1h0m0s seconds module=executor
INFO[0000] no public key was provided for authenticating the artifact module=installer
INFO[0000] Update Module path “/usr/share/mender/modules/v3” could not be opened (open /usr/share/mender/modules/v3: no such file or directory). Update modules will not be available module=modules
DEBU[0000] checking if device [emdev] is on compatible device list: [emdev]
module=installer
DEBU[0000] installer: successfully read artifact [name: release-1; version: 3; compatible devices: [emdev]] module=installer
.DEBU[0000] Trying to install update of size: 14290944 module=dual_rootfs_device
DEBU[0000] Active partition: /dev/root module=partitions
ERRO[0000] Download failed: Payload: can not install Payload: rootfs.squashfs: Active root partition matches neither RootfsPartA nor RootfsPartB. module=standalone
DEBU[0000] statescript: timeout for executing scripts is not defined; using default of 1h0m0s seconds module=executor
ERRO[0000] Payload: can not install Payload: rootfs.squashfs: Active root partition matches neither RootfsPartA nor RootfsPartB. module=main