summaryrefslogtreecommitdiffstats
path: root/classes
diff options
context:
space:
mode:
Diffstat (limited to 'classes')
-rw-r--r--classes/image_types_ostree.bbclass80
-rw-r--r--classes/image_types_ota.bbclass148
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
3inherit image_types 3inherit image
4 4
5IMAGE_DEPENDS_ostree = "ostree-native:do_populate_sysroot \ 5IMAGE_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
11OSTREE_REPO ?= "${DEPLOY_DIR_IMAGE}/ostree_repo"
12export OSTREE_REPO 9export OSTREE_REPO
13
14# OSTREE_BRANCHNAME can also be redefined
15OSTREE_BRANCHNAME ?= "${IMAGE_BASENAME}"
16export OSTREE_BRANCHNAME 10export OSTREE_BRANCHNAME
17 11
18IMAGE_CMD_ostree () { 12IMAGE_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#
9BOOTFS_EXTRA_SIZE ?= "512" 9
10export BOOTFS_EXTRA_SIZE 10inherit image
11 11
12do_otaimg[depends] += "e2fsprogs-native:do_populate_sysroot \ 12IMAGE_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 \ 15calculate_size () {
16 ${INITRD_IMAGE}:do_image_cpio \ 16 BASE=$1
17 ${PN}:do_image_ext4" 17 SCALE=$2
18 18 MIN=$3
19ROOTFS ?= "${DEPLOY_DIR_IMAGE}/${IMAGE_BASENAME}-${MACHINE}.ext4" 19 MAX=$4
20INITRD_IMAGE ?= "core-image-minimal-initramfs" 20 EXTRA=$5
21INITRD ?= "${DEPLOY_DIR_IMAGE}/${INITRD_IMAGE}-${MACHINE}.cpio.gz" 21 ALIGN=$6
22 22
23build_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
43do_otaimg () { 48export OSTREE_OSNAME
44 BOOTIMG=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.otaboot.ext4 49export OSTREE_BRANCHNAME
45 rm -f $BOOTIMG 50export OSTREE_REPO
46 build_bootfs $BOOTIMG
47 51
48 ROOTIMG=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ext4 52IMAGE_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
76addtask 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
78IMAGE_TYPES += " otaimg" 108IMAGE_TYPEDEP_otaimg = "ostree"
79IMAGE_TYPES_MASKED += "otaimg"
80IMAGE_TYPEDEP_otaimg = "ext4"