====== Using OTA feature ====== OTA feature is enabled with agl-ota parameter added to agl-setup (see [[agl-distro:source-code|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 ===== [[https://github.com/ostreedev/ostree|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 - archive-z2 repository stores all data in compressed format. When user checks out the data from it, they are just extracted to some location and can be treated independently from the data in repository. This type of repository is intended to be used on servers, from which data is distributed to target devices. - bare repository stores the data in uncompressed form. Checkout from this repository just creates hardlinks to the stored files. This repository type suits best for target devices. 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 [[http://ostree.readthedocs.io/en/latest/|OSTree documentation]]. ===== SOTA client ===== Work in progress. ==== Download Master Branch ==== 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 ===== Building ===== 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. * **OSTREE_REPO** sets //local// OSTree repository, to which your resulting image will be committed. It is set to //deploy_dir///ostree_repo by default. * **OSTREE_BRANCHNAME** is the ref name in your //local// repository. Default value is "agl-ota". * **OSTREE_OSNAME** is the OS name in OSTree repository on your //target// device. Is equal to "agl" by default. See [[https://ostree.readthedocs.io/en/latest/manual/deployment/|OSTree documentation]] for the details. 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: - The whole root file system together with the kernel and initramfs commited to OSTree repository set in OSTREE_REPO on a branch set in OSTREE_BRANCHNAME - Archived exact copy of the commited tree ('*.rootfs.ostree.tar.bz2' file) - Live bootstrap image with the commited tree as the only [[https://ostree.readthedocs.io/en/latest/manual/deployment/|OSTree deployment]] ('*.otaimg' file). 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. ===== Non-secure update ===== 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 [[http://www.openembedded.org/wiki/Devshell|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 ===== Secure update ===== Work in progress