diff options
author | Anton Gerasimov <anton@advancedtelematic.com> | 2016-09-26 15:44:53 +0200 |
---|---|---|
committer | Anton Gerasimov <anton@advancedtelematic.com> | 2016-09-26 15:44:53 +0200 |
commit | 844ddcf4496edfdb9b682f712ab1ae1cd16f1f97 (patch) | |
tree | 5cb9794fb8630c32797b9687cd847d7b954b55cd /classes | |
parent | 0983092cf61779b70cb41741bd4913b0f0f0fbac (diff) | |
download | meta-updater-844ddcf4496edfdb9b682f712ab1ae1cd16f1f97.tar.gz |
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 <anton@advancedtelematic.com>
Diffstat (limited to 'classes')
-rw-r--r-- | classes/image_types_ostree.bbclass | 80 | ||||
-rw-r--r-- | classes/image_types_ota.bbclass | 148 |
2 files changed, 145 insertions, 83 deletions
diff --git a/classes/image_types_ostree.bbclass b/classes/image_types_ostree.bbclass index 5b9ac97..a180721 100644 --- a/classes/image_types_ostree.bbclass +++ b/classes/image_types_ostree.bbclass | |||
@@ -1,33 +1,40 @@ | |||
1 | # OSTree deployment | 1 | # OSTree deployment |
2 | 2 | ||
3 | inherit image_types | 3 | inherit image |
4 | 4 | ||
5 | IMAGE_DEPENDS_ostree = "ostree-native:do_populate_sysroot \ | 5 | IMAGE_DEPENDS_ostree = "ostree-native:do_populate_sysroot \ |
6 | virtual/kernel:do_deploy \ | 6 | virtual/kernel:do_deploy \ |
7 | ${INITRAMFS_IMAGE}:do_image_cpio" | 7 | ${OSTREE_INITRAMFS_IMAGE}:do_image_cpio" |
8 | 8 | ||
9 | # Please redefine OSTREE_REPO in your local.conf in order to have a persistent | ||
10 | # OSTree repo | ||
11 | OSTREE_REPO ?= "${DEPLOY_DIR_IMAGE}/ostree_repo" | ||
12 | export OSTREE_REPO | 9 | export OSTREE_REPO |
13 | |||
14 | # OSTREE_BRANCHNAME can also be redefined | ||
15 | OSTREE_BRANCHNAME ?= "${IMAGE_BASENAME}" | ||
16 | export OSTREE_BRANCHNAME | 10 | export OSTREE_BRANCHNAME |
17 | 11 | ||
18 | IMAGE_CMD_ostree () { | 12 | IMAGE_CMD_ostree () { |
19 | OSTREE_ROOTFS=`mktemp -d ${WORKDIR}/ostree-root-XXXXX` | 13 | if [ -z "$OSTREE_REPO" ]; then |
20 | cp -rp ${IMAGE_ROOTFS}/* ${OSTREE_ROOTFS} | 14 | bbfatal "OSTREE_REPO should be set in your local.conf" |
15 | fi | ||
16 | |||
17 | if [ -z "$OSTREE_BRANCHNAME" ]; then | ||
18 | bbfatal "OSTREE_BRANCHNAME should be set in your local.conf" | ||
19 | fi | ||
20 | |||
21 | OSTREE_ROOTFS=`mktemp -du ${WORKDIR}/ostree-root-XXXXX` | ||
22 | cp -a ${IMAGE_ROOTFS} ${OSTREE_ROOTFS} | ||
23 | chmod a+rx ${OSTREE_ROOTFS} | ||
24 | sync | ||
25 | |||
21 | cd ${OSTREE_ROOTFS} | 26 | cd ${OSTREE_ROOTFS} |
22 | 27 | ||
23 | # Create sysroot directory to which physical sysroot will be mounted | 28 | # Create sysroot directory to which physical sysroot will be mounted |
24 | mkdir sysroot | 29 | mkdir sysroot |
25 | ln -sf /sysroot/ostree ostree | 30 | ln -sf sysroot/ostree ostree |
26 | ln -sf /sysroot/tmp tmp | 31 | |
32 | rm -rf tmp/* | ||
33 | ln -sf sysroot/tmp tmp | ||
27 | 34 | ||
28 | mkdir -p usr/rootdirs | 35 | mkdir -p usr/rootdirs |
29 | mkdir -p var/rootdirs | ||
30 | 36 | ||
37 | mv etc usr/ | ||
31 | # Implement UsrMove | 38 | # Implement UsrMove |
32 | dirs="bin sbin lib" | 39 | dirs="bin sbin lib" |
33 | 40 | ||
@@ -35,23 +42,46 @@ IMAGE_CMD_ostree () { | |||
35 | if [ -d ${dir} ] && [ ! -L ${dir} ] ; then | 42 | if [ -d ${dir} ] && [ ! -L ${dir} ] ; then |
36 | mv ${dir} usr/rootdirs/ | 43 | mv ${dir} usr/rootdirs/ |
37 | rm -rf ${dir} | 44 | rm -rf ${dir} |
38 | ln -sf /usr/rootdirs/${dir} ${dir} | 45 | ln -sf usr/rootdirs/${dir} ${dir} |
39 | fi | 46 | fi |
40 | done | 47 | done |
48 | |||
49 | if [ ! -d "usr/etc/tmpfiles.d" ]; then | ||
50 | mkdir usr/etc/tmpfiles.d | ||
51 | fi | ||
52 | tmpfiles_conf=usr/etc/tmpfiles.d/00ostree-tmpfiles.conf | ||
53 | |||
54 | echo "d /var/rootdirs 0755 root root -" >>${tmpfiles_conf} | ||
55 | echo "L /var/rootdirs/home - - - - /sysroot/home" >>${tmpfiles_conf} | ||
56 | # Preserve data in /home to be later copied to /sysroot/home by | ||
57 | # sysroot generating procedure | ||
58 | mkdir -p usr/homedirs | ||
59 | if [ -d "home" ] && [ ! -L "home" ]; then | ||
60 | mv home usr/homedirs/home | ||
61 | ln -sf var/rootdirs/home home | ||
62 | fi | ||
41 | 63 | ||
42 | # Move persistent directories to /var | 64 | # Move persistent directories to /var |
43 | dirs="home opt mnt media srv" | 65 | dirs="opt mnt media srv" |
44 | 66 | ||
45 | for dir in ${dirs}; do | 67 | for dir in ${dirs}; do |
46 | if [ -d ${dir} ] && [ ! -L ${dir} ]; then | 68 | if [ -d ${dir} ] && [ ! -L ${dir} ]; then |
47 | mv ${dir} var/rootdirs/ | 69 | if [ "$(ls -A $dir)" ]; then |
48 | ln -sf /var/rootdirs/${dir} ${dir} | 70 | bbwarn "Data in /$dir directory is not preserved by OSTree. Consider moving it under /usr" |
71 | fi | ||
72 | echo "d /var/rootdirs/${dir} 0755 root root -" >>${tmpfiles_conf} | ||
73 | rm -rf ${dir} | ||
74 | ln -sf var/rootdirs/${dir} ${dir} | ||
49 | fi | 75 | fi |
50 | done | 76 | done |
51 | 77 | ||
52 | if [ -d root ] && [ ! -L root ]; then | 78 | if [ -d root ] && [ ! -L root ]; then |
53 | mv root var/roothome | 79 | if [ "$(ls -A root)" ]; then |
54 | ln -sf /var/roothome root | 80 | bberror "Data in /root directory is not preserved by OSTree." |
81 | fi | ||
82 | echo "d /var/roothome 0755 root root -" >>${tmpfiles_conf} | ||
83 | rm -rf root | ||
84 | ln -sf var/roothome root | ||
55 | fi | 85 | fi |
56 | 86 | ||
57 | # Creating boot directories is required for "ostree admin deploy" | 87 | # Creating boot directories is required for "ostree admin deploy" |
@@ -63,14 +93,17 @@ IMAGE_CMD_ostree () { | |||
63 | checksum=`sha256sum ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} | cut -f 1 -d " "` | 93 | checksum=`sha256sum ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} | cut -f 1 -d " "` |
64 | 94 | ||
65 | cp ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} boot/vmlinuz-${checksum} | 95 | cp ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} boot/vmlinuz-${checksum} |
66 | cp ${DEPLOY_DIR_IMAGE}/${INITRD_IMAGE}-${MACHINE}.cpio.gz boot/initramfs-${checksum} | 96 | cp ${DEPLOY_DIR_IMAGE}/${OSTREE_INITRAMFS_IMAGE}-${MACHINE}.cpio.gz boot/initramfs-${checksum} |
67 | 97 | ||
68 | cd ${WORKDIR} | 98 | cd ${WORKDIR} |
69 | 99 | ||
70 | # Create a tarball that can be then commited to OSTree repo | 100 | # Create a tarball that can be then commited to OSTree repo |
71 | OSTREE_TAR=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ostree.tar.bz2 | 101 | OSTREE_TAR=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ostree.tar.bz2 |
72 | tar -C ${OSTREE_ROOTFS} -cjf ${OSTREE_TAR} . | 102 | tar -C ${OSTREE_ROOTFS} --xattrs --xattrs-include='*' -cjf ${OSTREE_TAR} . |
73 | rm -rf ${OSTREE_ROOTFS} | 103 | sync |
104 | |||
105 | rm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.rootfs.ostree.tar.bz2 | ||
106 | ln -s ${IMAGE_NAME}.rootfs.ostree.tar.bz2 ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.rootfs.ostree.tar.bz2 | ||
74 | 107 | ||
75 | if [ ! -d ${OSTREE_REPO} ]; then | 108 | if [ ! -d ${OSTREE_REPO} ]; then |
76 | ostree --repo=${OSTREE_REPO} init --mode=archive-z2 | 109 | ostree --repo=${OSTREE_REPO} init --mode=archive-z2 |
@@ -78,10 +111,11 @@ IMAGE_CMD_ostree () { | |||
78 | 111 | ||
79 | # Commit the result | 112 | # Commit the result |
80 | ostree --repo=${OSTREE_REPO} commit \ | 113 | ostree --repo=${OSTREE_REPO} commit \ |
81 | --tree=tar=${OSTREE_TAR} \ | 114 | --tree=dir=${OSTREE_ROOTFS} \ |
82 | --skip-if-unchanged \ | 115 | --skip-if-unchanged \ |
83 | --branch=${OSTREE_BRANCHNAME} \ | 116 | --branch=${OSTREE_BRANCHNAME} \ |
84 | --subject="Commit-id: ${IMAGE_NAME}" | 117 | --subject="Commit-id: ${IMAGE_NAME}" |
85 | 118 | ||
119 | rm -rf ${OSTREE_ROOTFS} | ||
86 | } | 120 | } |
87 | 121 | ||
diff --git a/classes/image_types_ota.bbclass b/classes/image_types_ota.bbclass index bb55e61..b9126ec 100644 --- a/classes/image_types_ota.bbclass +++ b/classes/image_types_ota.bbclass | |||
@@ -6,75 +6,103 @@ | |||
6 | # OSTree updates may require some space on boot file system for | 6 | # OSTree updates may require some space on boot file system for |
7 | # boot scripts, kernel and initramfs images | 7 | # boot scripts, kernel and initramfs images |
8 | # | 8 | # |
9 | BOOTFS_EXTRA_SIZE ?= "512" | 9 | |
10 | export BOOTFS_EXTRA_SIZE | 10 | inherit image |
11 | 11 | ||
12 | do_otaimg[depends] += "e2fsprogs-native:do_populate_sysroot \ | 12 | IMAGE_DEPENDS_otaimg = "e2fsprogs-native:do_populate_sysroot \ |
13 | parted-native:do_populate_sysroot \ | 13 | virtual/bootloader:do_deploy" |
14 | virtual/kernel:do_deploy \ | 14 | |
15 | virtual/bootloader:do_deploy \ | 15 | calculate_size () { |
16 | ${INITRD_IMAGE}:do_image_cpio \ | 16 | BASE=$1 |
17 | ${PN}:do_image_ext4" | 17 | SCALE=$2 |
18 | 18 | MIN=$3 | |
19 | ROOTFS ?= "${DEPLOY_DIR_IMAGE}/${IMAGE_BASENAME}-${MACHINE}.ext4" | 19 | MAX=$4 |
20 | INITRD_IMAGE ?= "core-image-minimal-initramfs" | 20 | EXTRA=$5 |
21 | INITRD ?= "${DEPLOY_DIR_IMAGE}/${INITRD_IMAGE}-${MACHINE}.cpio.gz" | 21 | ALIGN=$6 |
22 | 22 | ||
23 | build_bootfs () { | 23 | SIZE=`echo "$BASE * $SCALE" | bc -l` |
24 | KERNEL_FILE=${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} | 24 | REM=`echo $SIZE | cut -d "." -f 2` |
25 | KERNEL_SIZE=`du -Lbs ${KERNEL_FILE} | cut -f 1` | 25 | SIZE=`echo $SIZE | cut -d "." -f 1` |
26 | 26 | ||
27 | RAMDISK_FILE=${DEPLOY_DIR_IMAGE}/${INITRD_IMAGE}-${MACHINE}.cpio.gz | 27 | if [ -n "$REM" -o ! "$REM" -eq 0 ]; then |
28 | RAMDISK_SIZE=`du -Lbs ${RAMDISK_FILE} | cut -f 1` | 28 | SIZE=`expr $SIZE \+ 1` |
29 | 29 | fi | |
30 | EXTRA_BYTES=$(expr $BOOTFS_EXTRA_SIZE \* 1024 \* 1024) | 30 | |
31 | 31 | if [ "$SIZE" -lt "$MIN" ]; then | |
32 | TOTAL_SIZE=$(expr ${KERNEL_SIZE} \+ ${RAMDISK_SIZE} \+ ${EXTRA_BYTES}) | 32 | $SIZE=$MIN |
33 | TOTAL_BLOCKS=$(expr 1 \+ $TOTAL_SIZE / 1024) | 33 | fi |
34 | 34 | ||
35 | dd if=/dev/zero of=$1 bs=1024 count=${TOTAL_BLOCKS} | 35 | SIZE=`expr $SIZE \+ $EXTRA` |
36 | BOOTTMP=$(mktemp -d mkotaboot-XXX) | 36 | SIZE=`expr $SIZE \+ $ALIGN \- 1` |
37 | cp ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} ${BOOTTMP} | 37 | SIZE=`expr $SIZE \- $SIZE \% $ALIGN` |
38 | cp ${DEPLOY_DIR_IMAGE}/${INITRD_IMAGE}-${MACHINE}.cpio.gz ${BOOTTMP} | 38 | |
39 | mkfs.ext4 $1 -d ${BOOTTMP} | 39 | if [ -n "$MAX" ]; then |
40 | rm -rf $BOOTTMP | 40 | if [ "$SIZE" -gt "$MAX" ]; then |
41 | return -1 | ||
42 | fi | ||
43 | fi | ||
44 | |||
45 | echo "${SIZE}" | ||
41 | } | 46 | } |
42 | 47 | ||
43 | do_otaimg () { | 48 | export OSTREE_OSNAME |
44 | BOOTIMG=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.otaboot.ext4 | 49 | export OSTREE_BRANCHNAME |
45 | rm -f $BOOTIMG | 50 | export OSTREE_REPO |
46 | build_bootfs $BOOTIMG | ||
47 | 51 | ||
48 | ROOTIMG=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ext4 | 52 | IMAGE_CMD_otaimg () { |
53 | if ${@bb.utils.contains('IMAGE_FSTYPES', 'otaimg', 'true', 'false', d)}; then | ||
54 | if [ -z "$OSTREE_REPO" ]; then | ||
55 | bbfatal "OSTREE_REPO should be set in your local.conf" | ||
56 | fi | ||
49 | 57 | ||
50 | BOOTFSBLOCKS=`du -bks ${BOOTIMG} | cut -f 1` | 58 | if [ -z "$OSTREE_OSNAME" ]; then |
59 | bbfatal "OSTREE_OSNAME should be set in your local.conf" | ||
60 | fi | ||
51 | 61 | ||
52 | ROOTFSBLOCKS=`du -bks ${ROOTIMG} | cut -f 1` | 62 | if [ -z "$OSTREE_BRANCHNAME" ]; then |
53 | TOTALSIZE=`expr $BOOTFSBLOCKS \+ $ROOTFSBLOCKS` | 63 | bbfatal "OSTREE_BRANCHNAME should be set in your local.conf" |
54 | END1=`expr $BOOTFSBLOCKS \* 1024` | 64 | fi |
55 | END2=`expr $END1 + 512` | ||
56 | END3=`expr \( $ROOTFSBLOCKS \* 1024 \) + $END1` | ||
57 | 65 | ||
58 | FULLIMG=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.otaimg | ||
59 | rm -rf ${FULLIMG} | ||
60 | 66 | ||
61 | dd if=/dev/zero of=${FULLIMG} bs=1024 seek=${TOTALSIZE} count=1 | 67 | PHYS_SYSROOT=`mktemp -d ${WORKDIR}/ota-sysroot-XXXXX` |
62 | parted ${FULLIMG} mklabel msdos | ||
63 | parted ${FULLIMG} mkpart primary ext4 0 ${END1}B | ||
64 | parted ${FULLIMG} unit B mkpart primary ext4 ${END2}B ${END3}B | ||
65 | 68 | ||
66 | OFFSET=`expr $END2 / 512` | 69 | ostree admin --sysroot=${PHYS_SYSROOT} init-fs ${PHYS_SYSROOT} |
70 | ostree admin --sysroot=${PHYS_SYSROOT} os-init ${OSTREE_OSNAME} | ||
67 | 71 | ||
68 | dd if=${BOOTIMG} of=${FULLIMG} conv=notrunc seek=1 bs=512 | 72 | mkdir -p ${PHYS_SYSROOT}/boot/loader.0 |
69 | dd if=${ROOTIMG} of=${FULLIMG} conv=notrunc seek=$OFFSET bs=512 | 73 | ln -s loader.0 ${PHYS_SYSROOT}/boot/loader |
70 | 74 | ||
71 | cd ${DEPLOY_DIR_IMAGE} | 75 | touch ${PHYS_SYSROOT}/boot/loader/uEnv.txt |
72 | rm -f ${IMAGE_LINK_NAME}.otaimg | 76 | |
73 | ln -s ${IMAGE_NAME}.otaimg ${IMAGE_LINK_NAME}.otaimg | 77 | ostree --repo=${PHYS_SYSROOT}/ostree/repo pull-local --remote=${OSTREE_OSNAME} ${OSTREE_REPO} ${OSTREE_BRANCHNAME} |
74 | } | 78 | ostree admin --sysroot=${PHYS_SYSROOT} deploy --os=${OSTREE_OSNAME} ${OSTREE_OSNAME}:${OSTREE_BRANCHNAME} |
79 | |||
80 | # Copy deployment /home to sysroot | ||
81 | HOME_TMP=`mktemp -d ${WORKDIR}/home-tmp-XXXXX` | ||
82 | tar --xattrs --xattrs-include='*' -C ${HOME_TMP} -xf ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.rootfs.ostree.tar.bz2 ./usr/homedirs | ||
83 | mv ${HOME_TMP}/usr/homedirs/home ${PHYS_SYSROOT}/ | ||
84 | rm -rf ${HOME_TMP} | ||
85 | |||
86 | OTA_ROOTFS_SIZE=$(calculate_size `du -ks $PHYS_SYSROOT | cut -f 1` "${IMAGE_OVERHEAD_FACTOR}" "${IMAGE_ROOTFS_SIZE}" "${IMAGE_ROOTFS_MAXSIZE}" `expr ${IMAGE_ROOTFS_EXTRA_SPACE}` "${IMAGE_ROOTFS_ALIGNMENT}") | ||
75 | 87 | ||
76 | addtask otaimg before do_build | 88 | if [ $OTA_ROOTFS_SIZE -lt 0 ]; then |
89 | exit -1 | ||
90 | fi | ||
91 | eval local COUNT=\"0\" | ||
92 | eval local MIN_COUNT=\"60\" | ||
93 | if [ $OTA_ROOTFS_SIZE -lt $MIN_COUNT ]; then | ||
94 | eval COUNT=\"$MIN_COUNT\" | ||
95 | fi | ||
96 | |||
97 | rm -rf ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.otaimg | ||
98 | sync | ||
99 | dd if=/dev/zero of=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.otaimg seek=$OTA_ROOTFS_SIZE count=$COUNT bs=1024 | ||
100 | mkfs.ext4 ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.otaimg -d ${PHYS_SYSROOT} | ||
101 | rm -rf ${PHYS_SYSROOT} | ||
102 | |||
103 | rm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.otaimg | ||
104 | ln -s ${IMAGE_NAME}.otaimg ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.otaimg | ||
105 | fi | ||
106 | } | ||
77 | 107 | ||
78 | IMAGE_TYPES += " otaimg" | 108 | IMAGE_TYPEDEP_otaimg = "ostree" |
79 | IMAGE_TYPES_MASKED += "otaimg" | ||
80 | IMAGE_TYPEDEP_otaimg = "ext4" | ||