OTA feature is enabled with agl-ota parameter added to agl-setup (see Download and Build AGL Source Code). It allows you to build image that can later be upgraded over TCP/IP conection using OSTree and SOTA client.
OSTree is a tool for distributing and deploying file system images. It provides atomic upgrades of the whole file system tree, while being effective with respect to disk space, i.e. files with the same contents are shared between managed file systems.
OSTree stores all the data in repositories. They are treated to some degree like git repositories - user can commit data to it checkout commited file system tree to some location in the file system and pull data from one repository to another. All the data is stored in git-like object database, so that data is not duplicated. Basically there are two types of repositories
OSTree also provides atomic deployment functionality built on top of the basic features described above. It lets user atomically switch between commited file systems: file system is deployed (checked out) in a dedicated directory and bootloader configuration file is changed to make it boot in a newly deployed rootfs.
You can find more details in OSTree documentation.
Work in progress.
The OTA feature is currently only available in the master branch of AGL. To fetch this branch run:
$ repo init -u https://gerrit.automotivelinux.org/gerrit/AGL/AGL-repo $ repo sync
To enable OTA feature just add agl-sota to the feature list when setting up your environment.
source meta-agl/scripts/aglsetup.sh -m qemux86-64 agl-demo agl-netboot agl-appfw-smack agl-sota
You can then edit your local.conf
vim conf/local.conf
to tune several parameters.
After that just build your desired image e.g.
bitbake agl-demo-platform
As a result of the building process you will get the following:
To boot into the resulting image, provided you've built it for QEMU run
qemu-system-x86_64 -bios tmp/deploy/images/qemux86-64/u-boot-qemux86-64.rom -drive file=tmp/deploy/images/qemux86-64/agl-demo-platform-qemux86-64.ota-ext4,if=ide,format=raw,snapshot=on -serial stdio -m 2G -object rng-random,id=rng0,filename=/dev/urandom -device virtio-rng-pci,rng=rng0 -net user,hostfwd=tcp:0.0.0.0:2222-:22,restrict=off -net nic,macaddr=ca:fe:85:b2:7b:b9 -usb -device usb-tablet -show-cursor -vnc :0 -cpu host -enable-kvm
runqemu script from poky upstream is not able to work with OTA images at the moment.
OSTree includes its own simple http server. It just exposes the whole OSTree repository to the network so that any remote device can pull data from it to device's local repository. To use OSTree http server you need OSTree installed on your build machine. Alternatively, you could run version built inside Yocto using bitbake's devshell.
To expose your repo run ostree trivial-httpd using any free port.
cd tmp/deploy/images/qemux86-64/ostree_repo && python -m SimpleHTTPServer 57556
You can then run from inside your device or QEMU emulation, provided your network is set up correctly.
# agl-remote identifies the remote server in your local repo ostree remote add --no-gpg-verify agl-remote http://192.168.7.1:57556 agl-ota # agl-otaq-emux86-64 is a branch name in the remote repo, set in OSTREE_BRANCHNAME # default value for OSTREE_BRANCHNAME is "${MACHINE}" ostree pull agl-remote qemux86-64 # agl is OS name as set in OSTREE_OSNAME ostree admin deploy --os=poky agl-remote:qemux86-64
After restart you should boot into the newly deployed OS image.
E.g. for the raspberrypi3 you can try this sequence:
# add remote ostree remote add --no-gpg-verify agl-snapshot https://download.automotivelinux.org/AGL/snapshots/master/latest/raspberrypi3/deploy/images/raspberrypi3/ostree_repo/ agl-ota-raspberrypi3 # pull ostree pull agl-snapshot agl-ota-raspberrypi3 # deploy ostree admin deploy --os=agl agl-snapshot:agl-ota-raspberrypi3
Work in progress