Browse Source

buildchroot: Unmount buildchroot mounts if not needed

Count the usage of BUILDCHROOT_DIR mounts and trigger unmount of them
after all tasks using chroot are finished.

Signed-off-by: Anton Mikanovich <amikan@ilbers.de>
Anton Mikanovich 4 years ago
parent
commit
3360b7d9ff

+ 47 - 0
meta/classes/buildchroot.bbclass

@@ -27,8 +27,20 @@ buildchroot_do_mounts() {
     sudo -s <<'EOSUDO'
         ( flock 9
         set -e
+
+        count="1"
+        if [ -f '${BUILDCHROOT_DIR}.mount' ]; then
+            count=$(($(< '${BUILDCHROOT_DIR}.mount') + 1))
+        fi
+        echo $count > '${BUILDCHROOT_DIR}.mount'
+        if [ $count -gt 1 ]; then
+            exit 0
+        fi
+
+        mkdir -p '${BUILDCHROOT_DIR}/isar-apt'
         mountpoint -q '${BUILDCHROOT_DIR}/isar-apt' ||
             mount --bind '${REPO_ISAR_DIR}/${DISTRO}' '${BUILDCHROOT_DIR}/isar-apt'
+        mkdir -p '${BUILDCHROOT_DIR}/downloads'
         mountpoint -q '${BUILDCHROOT_DIR}/downloads' ||
             mount --bind '${DL_DIR}' '${BUILDCHROOT_DIR}/downloads'
         mountpoint -q '${BUILDCHROOT_DIR}/dev' ||
@@ -59,3 +71,38 @@ buildchroot_do_mounts() {
         ) 9>'${MOUNT_LOCKFILE}'
 EOSUDO
 }
+
+buildchroot_undo_mounts() {
+    sudo -s <<'EOSUDO'
+        ( flock 9
+        set -e
+
+        if [ -f '${BUILDCHROOT_DIR}.mount' ]; then
+            count=$(($(< '${BUILDCHROOT_DIR}.mount') - 1))
+            echo $count > '${BUILDCHROOT_DIR}.mount'
+        else
+            exit 1
+        fi
+        if [ $count -gt 0 ]; then
+            exit 0
+        fi
+        rm ${BUILDCHROOT_DIR}.mount
+
+        mountpoint -q '${BUILDCHROOT_DIR}/base-apt' && \
+            umount ${BUILDCHROOT_DIR}/base-apt && \
+            rmdir --ignore-fail-on-non-empty ${BUILDCHROOT_DIR}/base-apt
+        mountpoint -q '${BUILDCHROOT_DIR}/sys' && \
+            umount -R ${BUILDCHROOT_DIR}/sys
+        mountpoint -q '${BUILDCHROOT_DIR}/proc' && \
+            umount -R ${BUILDCHROOT_DIR}/proc
+        mountpoint -q '${BUILDCHROOT_DIR}/dev' && \
+            umount -R ${BUILDCHROOT_DIR}/dev
+        mountpoint -q '${BUILDCHROOT_DIR}/downloads' && \
+            umount ${BUILDCHROOT_DIR}/downloads && \
+            rmdir --ignore-fail-on-non-empty ${BUILDCHROOT_DIR}/downloads
+        mountpoint -q '${BUILDCHROOT_DIR}/isar-apt' && \
+            umount ${BUILDCHROOT_DIR}/isar-apt && \
+            rmdir --ignore-fail-on-non-empty ${BUILDCHROOT_DIR}/isar-apt
+        ) 9>'${MOUNT_LOCKFILE}'
+EOSUDO
+}

+ 1 - 0
meta/classes/dpkg-base.bbclass

@@ -181,6 +181,7 @@ def dpkg_do_mounts(d):
     bb.build.exec_func("buildchroot_do_mounts", d)
 
 def dpkg_undo_mounts(d):
+    bb.build.exec_func("buildchroot_undo_mounts", d)
     buildroot = d.getVar('BUILDROOT', True)
     if not ismount(buildroot):
         bb.warn('Path %s not mounted!' % buildroot)

+ 2 - 0
meta/classes/ext4-img.bbclass

@@ -17,6 +17,8 @@ do_ext4_image() {
 
     sudo chroot ${BUILDCHROOT_DIR} /sbin/mke2fs ${MKE2FS_ARGS} \
                 -F -d '${PP_ROOTFS}' '${PP_DEPLOY}/${EXT4_IMAGE_FILE}'
+
+    image_undo_mounts
 }
 
 addtask ext4_image before do_image after do_image_tools

+ 2 - 0
meta/classes/fit-img.bbclass

@@ -23,5 +23,7 @@ do_fit_image() {
     # Create fit image using buildchroot tools
     sudo chroot ${BUILDCHROOT_DIR} /usr/bin/mkimage ${MKIMAGE_ARGS} \
                 -f '${PP_WORK}/${FIT_IMAGE_SOURCE}' '${PP_DEPLOY}/${FIT_IMAGE_FILE}'
+
+    image_undo_mounts
 }
 addtask fit_image before do_image after do_image_tools do_transform_template

+ 2 - 0
meta/classes/image-tools-extension.bbclass

@@ -40,5 +40,7 @@ do_install_imager_deps() {
         apt-get -o Debug::pkgProblemResolver=yes --no-install-recommends -y \
             --allow-unauthenticated --allow-downgrades install \
             ${IMAGER_INSTALL}'
+
+    buildchroot_undo_mounts
 }
 addtask install_imager_deps before do_image_tools

+ 9 - 0
meta/classes/image.bbclass

@@ -62,6 +62,15 @@ image_do_mounts() {
     buildchroot_do_mounts
 }
 
+image_undo_mounts() {
+    buildchroot_undo_mounts
+    sudo flock ${MOUNT_LOCKFILE} -c ' \
+        umount "${BUILDROOT_DEPLOY}"
+        umount "${BUILDROOT_ROOTFS}"
+        umount "${BUILDROOT_WORK}"
+    '
+}
+
 ROOTFSDIR = "${IMAGE_ROOTFS}"
 ROOTFS_FEATURES += "clean-package-cache generate-manifest export-dpkg-status"
 ROOTFS_PACKAGES += "${IMAGE_PREINSTALL} ${IMAGE_INSTALL}"

+ 2 - 0
meta/classes/ubi-img.bbclass

@@ -26,5 +26,7 @@ do_ubi_image() {
     # Create ubi image using buildchroot tools
     sudo chroot ${BUILDCHROOT_DIR} /usr/sbin/ubinize ${UBINIZE_ARGS} \
                 -o '${PP_DEPLOY}/${UBI_IMAGE_FILE}' '${PP_WORK}/${UBINIZE_CFG}'
+
+    image_undo_mounts
 }
 addtask ubi_image before do_image after do_image_tools do_transform_template

+ 2 - 0
meta/classes/ubifs-img.bbclass

@@ -21,6 +21,8 @@ do_ubifs_image() {
     # Create ubifs image using buildchroot tools
     sudo chroot ${BUILDCHROOT_DIR} /usr/sbin/mkfs.ubifs ${MKUBIFS_ARGS} \
                 -r '${PP_ROOTFS}' '${PP_DEPLOY}/${UBIFS_IMAGE_FILE}'
+
+    image_undo_mounts
 }
 
 addtask ubifs_image before do_image after do_image_tools

+ 1 - 0
meta/classes/wic-img.bbclass

@@ -200,4 +200,5 @@ EOSUDO
     done
     rm -rf ${BUILDCHROOT_DIR}/${WICTMP}
     rm -rf ${IMAGE_ROOTFS}/../pseudo
+    buildchroot_undo_mounts
 }

+ 8 - 0
meta/recipes-devtools/buildchroot/buildchroot.inc

@@ -49,6 +49,14 @@ rootfs_do_mounts_append() {
 EOSUDO
 }
 
+rootfs_undo_mounts_append() {
+    sudo -s <<'EOSUDO'
+    mountpoint -q '${BUILDCHROOT_DIR}/downloads' && \
+        umount ${BUILDCHROOT_DIR}/downloads && \
+        rmdir --ignore-fail-on-non-empty ${BUILDCHROOT_DIR}/downloads
+EOSUDO
+}
+
 ROOTFS_POSTPROCESS_COMMAND =+ "buildchroot_install_files"
 buildchroot_install_files() {
     sudo mkdir -p "${BUILDCHROOT_DIR}/home/builder"