From 4e1566679067975e3e8ee0a9198e4df332e6e32e Mon Sep 17 00:00:00 2001 From: Anton Gerasimov Date: Mon, 26 Sep 2016 15:44:53 +0200 Subject: Added initramfs image and fixed several error to make AGL rootfs bootable as an OSTree deployment Bug-AGL: SPEC-253 Change-Id: If636a282d51a64c73c46ce70a361518c1f70cdd6 Signed-off-by: Anton Gerasimov --- meta-sota/classes/image_types_ostree.bbclass | 80 ++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 23 deletions(-) (limited to 'meta-sota/classes/image_types_ostree.bbclass') diff --git a/meta-sota/classes/image_types_ostree.bbclass b/meta-sota/classes/image_types_ostree.bbclass index 5b9ac97..a180721 100644 --- a/meta-sota/classes/image_types_ostree.bbclass +++ b/meta-sota/classes/image_types_ostree.bbclass @@ -1,33 +1,40 @@ # OSTree deployment -inherit image_types +inherit image IMAGE_DEPENDS_ostree = "ostree-native:do_populate_sysroot \ virtual/kernel:do_deploy \ - ${INITRAMFS_IMAGE}:do_image_cpio" + ${OSTREE_INITRAMFS_IMAGE}:do_image_cpio" -# Please redefine OSTREE_REPO in your local.conf in order to have a persistent -# OSTree repo -OSTREE_REPO ?= "${DEPLOY_DIR_IMAGE}/ostree_repo" export OSTREE_REPO - -# OSTREE_BRANCHNAME can also be redefined -OSTREE_BRANCHNAME ?= "${IMAGE_BASENAME}" export OSTREE_BRANCHNAME IMAGE_CMD_ostree () { - OSTREE_ROOTFS=`mktemp -d ${WORKDIR}/ostree-root-XXXXX` - cp -rp ${IMAGE_ROOTFS}/* ${OSTREE_ROOTFS} + if [ -z "$OSTREE_REPO" ]; then + bbfatal "OSTREE_REPO should be set in your local.conf" + fi + + if [ -z "$OSTREE_BRANCHNAME" ]; then + bbfatal "OSTREE_BRANCHNAME should be set in your local.conf" + fi + + OSTREE_ROOTFS=`mktemp -du ${WORKDIR}/ostree-root-XXXXX` + cp -a ${IMAGE_ROOTFS} ${OSTREE_ROOTFS} + chmod a+rx ${OSTREE_ROOTFS} + sync + cd ${OSTREE_ROOTFS} # Create sysroot directory to which physical sysroot will be mounted mkdir sysroot - ln -sf /sysroot/ostree ostree - ln -sf /sysroot/tmp tmp + ln -sf sysroot/ostree ostree + + rm -rf tmp/* + ln -sf sysroot/tmp tmp mkdir -p usr/rootdirs - mkdir -p var/rootdirs + mv etc usr/ # Implement UsrMove dirs="bin sbin lib" @@ -35,23 +42,46 @@ IMAGE_CMD_ostree () { if [ -d ${dir} ] && [ ! -L ${dir} ] ; then mv ${dir} usr/rootdirs/ rm -rf ${dir} - ln -sf /usr/rootdirs/${dir} ${dir} + ln -sf usr/rootdirs/${dir} ${dir} fi done + + if [ ! -d "usr/etc/tmpfiles.d" ]; then + mkdir usr/etc/tmpfiles.d + fi + tmpfiles_conf=usr/etc/tmpfiles.d/00ostree-tmpfiles.conf + + echo "d /var/rootdirs 0755 root root -" >>${tmpfiles_conf} + echo "L /var/rootdirs/home - - - - /sysroot/home" >>${tmpfiles_conf} + # Preserve data in /home to be later copied to /sysroot/home by + # sysroot generating procedure + mkdir -p usr/homedirs + if [ -d "home" ] && [ ! -L "home" ]; then + mv home usr/homedirs/home + ln -sf var/rootdirs/home home + fi # Move persistent directories to /var - dirs="home opt mnt media srv" + dirs="opt mnt media srv" for dir in ${dirs}; do if [ -d ${dir} ] && [ ! -L ${dir} ]; then - mv ${dir} var/rootdirs/ - ln -sf /var/rootdirs/${dir} ${dir} + if [ "$(ls -A $dir)" ]; then + bbwarn "Data in /$dir directory is not preserved by OSTree. Consider moving it under /usr" + fi + echo "d /var/rootdirs/${dir} 0755 root root -" >>${tmpfiles_conf} + rm -rf ${dir} + ln -sf var/rootdirs/${dir} ${dir} fi done if [ -d root ] && [ ! -L root ]; then - mv root var/roothome - ln -sf /var/roothome root + if [ "$(ls -A root)" ]; then + bberror "Data in /root directory is not preserved by OSTree." + fi + echo "d /var/roothome 0755 root root -" >>${tmpfiles_conf} + rm -rf root + ln -sf var/roothome root fi # Creating boot directories is required for "ostree admin deploy" @@ -63,14 +93,17 @@ IMAGE_CMD_ostree () { checksum=`sha256sum ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} | cut -f 1 -d " "` cp ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} boot/vmlinuz-${checksum} - cp ${DEPLOY_DIR_IMAGE}/${INITRD_IMAGE}-${MACHINE}.cpio.gz boot/initramfs-${checksum} + cp ${DEPLOY_DIR_IMAGE}/${OSTREE_INITRAMFS_IMAGE}-${MACHINE}.cpio.gz boot/initramfs-${checksum} cd ${WORKDIR} # Create a tarball that can be then commited to OSTree repo OSTREE_TAR=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ostree.tar.bz2 - tar -C ${OSTREE_ROOTFS} -cjf ${OSTREE_TAR} . - rm -rf ${OSTREE_ROOTFS} + tar -C ${OSTREE_ROOTFS} --xattrs --xattrs-include='*' -cjf ${OSTREE_TAR} . + sync + + rm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.rootfs.ostree.tar.bz2 + ln -s ${IMAGE_NAME}.rootfs.ostree.tar.bz2 ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.rootfs.ostree.tar.bz2 if [ ! -d ${OSTREE_REPO} ]; then ostree --repo=${OSTREE_REPO} init --mode=archive-z2 @@ -78,10 +111,11 @@ IMAGE_CMD_ostree () { # Commit the result ostree --repo=${OSTREE_REPO} commit \ - --tree=tar=${OSTREE_TAR} \ + --tree=dir=${OSTREE_ROOTFS} \ --skip-if-unchanged \ --branch=${OSTREE_BRANCHNAME} \ --subject="Commit-id: ${IMAGE_NAME}" + rm -rf ${OSTREE_ROOTFS} } -- cgit 1.2.3-korg