public inbox for isar-users@googlegroups.com
 help / color / mirror / Atom feed
From: Jan Kiszka <jan.kiszka@siemens.com>
To: Adriaan Schmidt <adriaan.schmidt@siemens.com>,
	isar-users@googlegroups.com
Subject: Re: [RFC PATCH 5/5] meta: refactor to use the new mounting mechanism
Date: Wed, 13 Oct 2021 12:42:06 +0200	[thread overview]
Message-ID: <ecfa7a6f-21ca-b978-c658-32e6d997eb48@siemens.com> (raw)
In-Reply-To: <20211012130413.1719424-6-adriaan.schmidt@siemens.com>

-ENOCOMMITMSG

On 12.10.21 15:04, Adriaan Schmidt wrote:
> Signed-off-by: Adriaan Schmidt <adriaan.schmidt@siemens.com>
> ---
>  meta/classes/buildchroot.bbclass              | 52 ++++++++-----------
>  meta/classes/cpiogz-img.bbclass               |  3 +-
>  meta/classes/dpkg-base.bbclass                | 44 +++-------------
>  meta/classes/dpkg-gbp.bbclass                 |  2 -
>  meta/classes/dpkg.bbclass                     |  4 +-
>  meta/classes/ext4-img.bbclass                 |  3 +-
>  meta/classes/fit-img.bbclass                  |  4 +-
>  meta/classes/image-tools-extension.bbclass    |  4 +-
>  meta/classes/image.bbclass                    | 30 +++--------
>  meta/classes/initramfs.bbclass                |  2 +-
>  meta/classes/isar-events.bbclass              |  4 +-
>  meta/classes/rootfs.bbclass                   | 50 ++++++------------
>  meta/classes/ubi-img.bbclass                  |  3 +-
>  meta/classes/ubifs-img.bbclass                |  3 +-
>  meta/classes/vm-img.bbclass                   |  7 +--
>  meta/classes/wic-img.bbclass                  | 31 ++++-------
>  .../isar-bootstrap/isar-bootstrap.inc         | 43 +++++++++------
>  .../buildchroot/buildchroot.inc               |  8 +--
>  18 files changed, 104 insertions(+), 193 deletions(-)
> 
> diff --git a/meta/classes/buildchroot.bbclass b/meta/classes/buildchroot.bbclass
> index e9eb9af..7c34834 100644
> --- a/meta/classes/buildchroot.bbclass
> +++ b/meta/classes/buildchroot.bbclass
> @@ -13,50 +13,42 @@ python __anonymous() {
>         (d.getVar('HOST_DISTRO') == "debian-stretch" and distro_arch == "i386"):
>          dep = "buildchroot-target:do_build"
>          rootfs = d.getVar('BUILDCHROOT_TARGET_DIR', True)
> +        mount_ctx = "buildchroot-target"
>      else:
>          dep = "buildchroot-host:do_build"
>          rootfs = d.getVar('BUILDCHROOT_HOST_DIR', True)
> +        mount_ctx = "buildchroot-host"
>  
>      d.setVar('BUILDCHROOT_DEP', dep)
>      d.setVar('BUILDCHROOT_DIR', rootfs)
> +    d.setVar('MOUNTS_CONTEXT', mount_ctx + "-" + d.getVar('DISTRO') + "-" + d.getVar('DISTRO_ARCH'))
>  }
>  
> -MOUNT_LOCKFILE = "${BUILDCHROOT_DIR}.lock"
> +# mount settings
> +BUILDCHROOT_MOUNTS = " \
> +    bind:${REPO_ISAR_DIR}/${DISTRO}:${BUILDCHROOT_DIR}/isar-apt \
> +    bind:${DL_DIR}:${BUILDCHROOT_DIR}/downloads \
> +    rbind:/dev:${BUILDCHROOT_DIR}/dev \
> +    proc::${BUILDCHROOT_DIR}/proc \
> +    rbind:/sys:${BUILDCHROOT_DIR}/sys \
> +    ${@oe.utils.vartrue("ISAR_USE_CACHED_BASE_REPO", "bind:${REPO_BASE_DIR}:${BUILDCHROOT_DIR}/base-apt", "", d)} \
> +    "
> +
> +python () {
> +    # find all tasks that want to use buildchroot
> +    for task in [t for t in d.keys() if d.getVarFlag(t, 'task') and d.getVarFlag(t, 'buildchroot') == '1']:
> +        d.prependVarFlag(task, 'prefuncs', "buildchroot_task_prefunc ")
> +}
>  
> -buildchroot_do_mounts() {
> +buildchroot_task_prefunc() {
>      sudo -s <<'EOSUDO'
> -        ( flock 9
>          set -e
> -
> -        mountpoint -q '${BUILDCHROOT_DIR}/isar-apt' ||
> -            mount --bind '${REPO_ISAR_DIR}/${DISTRO}' '${BUILDCHROOT_DIR}/isar-apt'
> -        mountpoint -q '${BUILDCHROOT_DIR}/downloads' ||
> -            mount --bind '${DL_DIR}' '${BUILDCHROOT_DIR}/downloads'
> -        mountpoint -q '${BUILDCHROOT_DIR}/dev' ||
> -            mount --rbind /dev '${BUILDCHROOT_DIR}/dev'
> -        mount --make-rslave '${BUILDCHROOT_DIR}/dev'
> -        mountpoint -q '${BUILDCHROOT_DIR}/proc' ||
> -            mount -t proc none '${BUILDCHROOT_DIR}/proc'
> -        mountpoint -q '${BUILDCHROOT_DIR}/sys' ||
> -            mount --rbind /sys '${BUILDCHROOT_DIR}/sys'
> -        mount --make-rslave '${BUILDCHROOT_DIR}/sys'
> -
> -        # Mount base-apt if 'ISAR_USE_CACHED_BASE_REPO' is set
> -        if [ "${@repr(bb.utils.to_boolean(d.getVar('ISAR_USE_CACHED_BASE_REPO')))}" = 'True' ]
> -        then
> -            mkdir -p '${BUILDCHROOT_DIR}/base-apt'
> -            mountpoint -q '${BUILDCHROOT_DIR}/base-apt' || \
> -                mount --bind '${REPO_BASE_DIR}' '${BUILDCHROOT_DIR}/base-apt'
> -        fi
> -
> -        # Refresh or remove /etc/resolv.conf at this chance
> +        # Refresh or remove /etc/resolv.conf
>          if [ "${@repr(bb.utils.to_boolean(d.getVar('BB_NO_NETWORK')))}" = 'True' ]
>          then
> -            rm -rf '${BUILDCHROOT_DIR}/etc/resolv.conf'
> -        else
> +            rm -f '${BUILDCHROOT_DIR}/etc/resolv.conf'
> +        elif [ -d '${BUILDCHROOT_DIR}/etc' ]; then
>              cp -L /etc/resolv.conf '${BUILDCHROOT_DIR}/etc'
>          fi
> -
> -        ) 9>'${MOUNT_LOCKFILE}'

Which lock is protecting the remaining bits? If none, we need a word why
that is fine.

>  EOSUDO
>  }
> diff --git a/meta/classes/cpiogz-img.bbclass b/meta/classes/cpiogz-img.bbclass
> index 940e2fb..095e133 100644
> --- a/meta/classes/cpiogz-img.bbclass
> +++ b/meta/classes/cpiogz-img.bbclass
> @@ -10,12 +10,11 @@ CPIO_IMAGE_FORMAT ?= "newc"
>  
>  do_cpiogz_image() {
>      sudo rm -f ${CPIOGZ_IMAGE_FILE}
> -    image_do_mounts
>      sudo chroot ${BUILDCHROOT_DIR} \
>                  sh -c "cd ${PP_ROOTFS}; /usr/bin/find . | \
>                         /usr/bin/cpio -H ${CPIO_IMAGE_FORMAT} -o | /usr/bin/gzip -9 > \
>                         ${PP_DEPLOY}/${CPIOGZ_FNAME}"
>      sudo chown $(id -u):$(id -g) ${CPIOGZ_IMAGE_FILE}
>  }
> -
> +do_cpiogz_image[mounts] = "${IMAGE_MOUNTS}"
>  addtask cpiogz_image before do_image after do_image_tools
> diff --git a/meta/classes/dpkg-base.bbclass b/meta/classes/dpkg-base.bbclass
> index 8a39a6d..71c1acd 100644
> --- a/meta/classes/dpkg-base.bbclass
> +++ b/meta/classes/dpkg-base.bbclass
> @@ -96,7 +96,6 @@ python() {
>  }
>  
>  do_apt_fetch() {
> -    dpkg_do_mounts
>      E="${@ isar_export_proxies(d)}"
>      sudo -E chroot ${BUILDCHROOT_DIR} /usr/bin/apt-get update \
>          -o Dir::Etc::SourceList="sources.list.d/isar-apt.list" \
> @@ -107,10 +106,9 @@ do_apt_fetch() {
>          sudo -E chroot --userspec=$( id -u ):$( id -g ) ${BUILDCHROOT_DIR} \
>              sh -c 'mkdir -p /downloads/deb-src/"$1"/"$2" && cd /downloads/deb-src/"$1"/"$2" && apt-get -y --download-only --only-source source "$2"' my_script "${DISTRO}" "${uri}"
>      done
> -
> -    dpkg_undo_mounts
>  }
> -
> +do_apt_fetch[mounts] = "${DPKG_MOUNTS}"
> +do_apt_fetch[buildchroot] = "1"
>  addtask apt_fetch after do_unpack before do_apt_unpack
>  do_apt_fetch[lockfiles] += "${REPO_ISAR_DIR}/isar.lock"
>  
> @@ -119,7 +117,6 @@ do_apt_fetch[depends] = "${BUILDCHROOT_DEP}"
>  
>  do_apt_unpack() {
>      rm -rf ${S}
> -    dpkg_do_mounts
>      E="${@ isar_export_proxies(d)}"
>  
>      for uri in "${SRC_APT}"; do
> @@ -132,10 +129,9 @@ do_apt_unpack() {
>                  dpkg-source -x "${dscfile}" "${PPS}"' \
>                      my_script "${DISTRO}" "${uri}"
>      done
> -
> -    dpkg_undo_mounts
>  }
> -
> +do_apt_unpack[mounts] = "${DPKG_MOUNTS}"
> +do_apt_unpack[buildchroot] = "1"
>  addtask apt_unpack after do_apt_fetch before do_patch
>  
>  addtask cleanall_apt before do_cleanall
> @@ -174,27 +170,7 @@ do_prepare_build[deptask] = "do_deploy_deb"
>  
>  BUILDROOT = "${BUILDCHROOT_DIR}/${PP}"
>  
> -dpkg_do_mounts() {
> -    mkdir -p ${BUILDROOT}
> -    sudo mount --bind ${WORKDIR} ${BUILDROOT}
> -
> -    buildchroot_do_mounts
> -}
> -
> -dpkg_undo_mounts() {
> -    i=0
> -    while ! sudo umount ${BUILDROOT}; do
> -        sleep 0.1
> -        if [ `expr $i % 100` -eq 0 ] ; then
> -            bbwarn "${BUILDROOT}: Couldn't unmount ($i), retrying..."
> -        fi
> -        if [ $i -ge 10000 ]; then
> -            bbfatal "${BUILDROOT}: Couldn't unmount after timeout"
> -        fi
> -        i=`expr $i + 1`
> -    done
> -    sudo rmdir ${BUILDROOT}
> -}
> +DPKG_MOUNTS = "bind:${WORKDIR}:${BUILDROOT} ${BUILDCHROOT_MOUNTS}"
>  
>  # Placeholder for actual dpkg_runbuild() implementation
>  dpkg_runbuild() {
> @@ -204,14 +180,13 @@ dpkg_runbuild() {
>  python do_dpkg_build() {
>      lock = bb.utils.lockfile(d.getVar("REPO_ISAR_DIR") + "/isar.lock",
>                               shared=True)
> -    bb.build.exec_func("dpkg_do_mounts", d)
>      try:
>          bb.build.exec_func("dpkg_runbuild", d)
>      finally:
> -        bb.build.exec_func("dpkg_undo_mounts", d)
>          bb.utils.unlockfile(lock)
>  }
>  
> +do_dpkg_build[mounts] = "${DPKG_MOUNTS}"
>  addtask dpkg_build before do_build
>  
>  KEEP_INSTALLED_ON_CLEAN ?= "0"
> @@ -248,18 +223,15 @@ do_deploy_deb[lockfiles] = "${REPO_ISAR_DIR}/isar.lock"
>  do_deploy_deb[dirs] = "${S}"
>  
>  python do_devshell() {
> -    bb.build.exec_func('dpkg_do_mounts', d)
> -
>      isar_export_proxies(d)
>  
>      buildchroot = d.getVar('BUILDCHROOT_DIR')
>      pp_pps = os.path.join(d.getVar('PP'), d.getVar('PPS'))
>      termcmd = "sudo -E chroot {0} sh -c 'cd {1}; $SHELL -i'"
>      oe_terminal(termcmd.format(buildchroot, pp_pps), "Isar devshell", d)
> -
> -    bb.build.exec_func('dpkg_undo_mounts', d)
>  }
> -
> +do_devshell[mounts] = "${DPKG_MOUNTS}"
> +do_devshell[buildchroot] = "1"
>  addtask devshell after do_prepare_build
>  DEVSHELL_STARTDIR ?= "${S}"
>  do_devshell[dirs] = "${DEVSHELL_STARTDIR}"
> diff --git a/meta/classes/dpkg-gbp.bbclass b/meta/classes/dpkg-gbp.bbclass
> index d956e8c..e3bf305 100644
> --- a/meta/classes/dpkg-gbp.bbclass
> +++ b/meta/classes/dpkg-gbp.bbclass
> @@ -13,7 +13,6 @@ GBP_DEPENDS ?= "git-buildpackage pristine-tar"
>  GBP_EXTRA_OPTIONS ?= "--git-pristine-tar"
>  
>  do_install_builddeps_append() {
> -    dpkg_do_mounts
>      distro="${DISTRO}"
>      if [ ${ISAR_CROSS_COMPILE} -eq 1 ]; then
>         distro="${HOST_DISTRO}"
> @@ -26,7 +25,6 @@ do_install_builddeps_append() {
>      sudo -E chroot ${BUILDCHROOT_DIR} \
>          apt-get install -y -o Debug::pkgProblemResolver=yes \
>                          --no-install-recommends ${GBP_DEPENDS}
> -    dpkg_undo_mounts
>  }
>  
>  dpkg_runbuild_prepend() {
> diff --git a/meta/classes/dpkg.bbclass b/meta/classes/dpkg.bbclass
> index 4e7c2f7..96aefba 100644
> --- a/meta/classes/dpkg.bbclass
> +++ b/meta/classes/dpkg.bbclass
> @@ -7,7 +7,6 @@ PACKAGE_ARCH ?= "${DISTRO_ARCH}"
>  
>  # Install build dependencies for package
>  do_install_builddeps() {
> -    dpkg_do_mounts
>      E="${@ isar_export_proxies(d)}"
>      distro="${DISTRO}"
>      if [ ${ISAR_CROSS_COMPILE} -eq 1 ]; then
> @@ -19,12 +18,13 @@ do_install_builddeps() {
>      deb_dl_dir_export "${BUILDCHROOT_DIR}" "${distro}"
>      sudo -E chroot ${BUILDCHROOT_DIR} /isar/deps.sh \
>          ${PP}/${PPS} ${PACKAGE_ARCH}
> -    dpkg_undo_mounts
>  }
>  
>  addtask install_builddeps after do_prepare_build before do_dpkg_build
>  # apt and reprepro may not run in parallel, acquire the Isar lock
>  do_install_builddeps[lockfiles] += "${REPO_ISAR_DIR}/isar.lock"
> +do_install_builddeps[mounts] = "${DPKG_MOUNTS}"
> +do_install_builddeps[buildchroot] = "1"
>  
>  addtask devshell after do_install_builddeps
>  
> diff --git a/meta/classes/ext4-img.bbclass b/meta/classes/ext4-img.bbclass
> index 334dc64..84dd4f2 100644
> --- a/meta/classes/ext4-img.bbclass
> +++ b/meta/classes/ext4-img.bbclass
> @@ -13,11 +13,10 @@ do_ext4_image() {
>  
>      truncate -s ${ROOTFS_SIZE}K '${DEPLOY_DIR_IMAGE}/${EXT4_IMAGE_FILE}'
>  
> -    image_do_mounts
> -
>      sudo chroot ${BUILDCHROOT_DIR} /sbin/mke2fs ${MKE2FS_ARGS} \
>                  -F -d '${PP_ROOTFS}' '${PP_DEPLOY}/${EXT4_IMAGE_FILE}'
>  }
>  
>  addtask ext4_image before do_image after do_image_tools
>  do_ext4_image[prefuncs] = 'set_image_size'
> +do_ext4_image[mounts] = "${IMAGE_MOUNTS}"
> diff --git a/meta/classes/fit-img.bbclass b/meta/classes/fit-img.bbclass
> index 82b96d8..a34517a 100644
> --- a/meta/classes/fit-img.bbclass
> +++ b/meta/classes/fit-img.bbclass
> @@ -18,11 +18,11 @@ do_fit_image() {
>  
>      rm -f '${DEPLOY_DIR_IMAGE}/${FIT_IMAGE_FILE}'
>  
> -    image_do_mounts
> -
>      # 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}'
>      sudo chown $(id -u):$(id -g) '${DEPLOY_DIR_IMAGE}/${FIT_IMAGE_FILE}'
>  }
> +
>  addtask fit_image before do_image after do_image_tools do_transform_template
> +do_fit_image[mounts] = "${IMAGE_MOUNTS}"
> diff --git a/meta/classes/image-tools-extension.bbclass b/meta/classes/image-tools-extension.bbclass
> index 9f28800..265fb0c 100644
> --- a/meta/classes/image-tools-extension.bbclass
> +++ b/meta/classes/image-tools-extension.bbclass
> @@ -17,13 +17,13 @@ DEPENDS += "${IMAGER_BUILD_DEPS}"
>  do_install_imager_deps[depends] = "${BUILDCHROOT_DEP}"
>  do_install_imager_deps[deptask] = "do_deploy_deb"
>  do_install_imager_deps[lockfiles] += "${REPO_ISAR_DIR}/isar.lock"
> +do_install_imager_deps[mounts] = "${BUILDCHROOT_MOUNTS}"
> +do_install_imager_deps[buildchroot] = "1"
>  do_install_imager_deps() {
>      if [ -z "${@d.getVar("IMAGER_INSTALL", True).strip()}" ]; then
>          exit
>      fi
>  
> -    buildchroot_do_mounts
> -
>      E="${@ isar_export_proxies(d)}"
>      deb_dl_dir_import ${BUILDCHROOT_DIR} ${DISTRO}
>      sudo -E chroot ${BUILDCHROOT_DIR} sh -c ' \
> diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass
> index ec93cab..dd934a7 100644
> --- a/meta/classes/image.bbclass
> +++ b/meta/classes/image.bbclass
> @@ -52,15 +52,12 @@ DEPENDS += "${IMAGE_INSTALL}"
>  ISAR_RELEASE_CMD_DEFAULT = "git -C ${LAYERDIR_core} describe --tags --dirty --match 'v[0-9].[0-9]*'"
>  ISAR_RELEASE_CMD ?= "${ISAR_RELEASE_CMD_DEFAULT}"
>  
> -image_do_mounts() {
> -    sudo flock ${MOUNT_LOCKFILE} -c ' \
> -        mkdir -p "${BUILDROOT_DEPLOY}" "${BUILDROOT_ROOTFS}" "${BUILDROOT_WORK}"
> -        mount --bind "${DEPLOY_DIR_IMAGE}" "${BUILDROOT_DEPLOY}"
> -        mount --bind "${IMAGE_ROOTFS}" "${BUILDROOT_ROOTFS}"
> -        mount --bind "${WORKDIR}" "${BUILDROOT_WORK}"
> -    '
> -    buildchroot_do_mounts
> -}
> +IMAGE_MOUNTS = " \
> +    bind:${DEPLOY_DIR_IMAGE}:${BUILDROOT_DEPLOY} \
> +    bind:${IMAGE_ROOTFS}:${BUILDROOT_ROOTFS} \
> +    bind:${WORKDIR}:${BUILDROOT_WORK} \
> +    ${BUILDCHROOT_MOUNTS} \
> +    "
>  
>  ROOTFSDIR = "${IMAGE_ROOTFS}"
>  ROOTFS_FEATURES += "clean-package-cache generate-manifest export-dpkg-status"
> @@ -190,21 +187,6 @@ do_rootfs_finalize() {
>              find "${ROOTFSDIR}/usr/bin" \
>                  -maxdepth 1 -name 'qemu-*-static' -type f -delete
>  
> -        mountpoint -q '${ROOTFSDIR}/isar-apt' && \
> -            umount -l ${ROOTFSDIR}/isar-apt
> -        rmdir --ignore-fail-on-non-empty ${ROOTFSDIR}/isar-apt
> -
> -        mountpoint -q '${ROOTFSDIR}/base-apt' && \
> -            umount -l ${ROOTFSDIR}/base-apt
> -        rmdir --ignore-fail-on-non-empty ${ROOTFSDIR}/base-apt

Who is deleting the empty isar-apt base-apt dirs?

> -
> -        mountpoint -q '${ROOTFSDIR}/dev' && \
> -            umount -l ${ROOTFSDIR}/dev
> -        mountpoint -q '${ROOTFSDIR}/sys' && \
> -            umount -l ${ROOTFSDIR}/proc
> -        mountpoint -q '${ROOTFSDIR}/sys' && \
> -            umount -l ${ROOTFSDIR}/sys
> -
>          rm -f "${ROOTFSDIR}/etc/apt/apt.conf.d/55isar-fallback.conf"
>  
>          rm -f "${ROOTFSDIR}/etc/apt/sources.list.d/isar-apt.list"
> diff --git a/meta/classes/initramfs.bbclass b/meta/classes/initramfs.bbclass
> index 10a642b..b5aba91 100644
> --- a/meta/classes/initramfs.bbclass
> +++ b/meta/classes/initramfs.bbclass
> @@ -25,8 +25,8 @@ ROOTFS_PACKAGES = "initramfs-tools ${INITRAMFS_PREINSTALL} ${INITRAMFS_INSTALL}"
>  inherit rootfs
>  
>  do_generate_initramfs[dirs] = "${DEPLOY_DIR_IMAGE}"
> +do_generate_initramfs[mounts] = "${ROOTFS_MOUNTS}"
>  do_generate_initramfs() {
> -    rootfs_do_mounts
>      rootfs_do_qemu
>  
>      sudo -E chroot "${INITRAMFS_ROOTFS}" \
> diff --git a/meta/classes/isar-events.bbclass b/meta/classes/isar-events.bbclass
> index 92aff20..73419b4 100644
> --- a/meta/classes/isar-events.bbclass
> +++ b/meta/classes/isar-events.bbclass
> @@ -8,8 +8,6 @@ addhandler build_started
>  
>  python build_started() {
>      bb.utils.remove(d.getVar('TMPDIR') + "/work/*/*/*/temp/once.*")
> -    bb.utils.remove(d.getVar('TMPDIR') + "/work/*/*/*/rootfs.mount")
> -    bb.utils.remove(d.getVar('TMPDIR') + "/deploy/buildchroot-*/*.mount")
>  }
>  build_started[eventmask] = "bb.event.BuildStarted"
>  
> @@ -54,7 +52,7 @@ python build_completed() {
>      with open('/proc/mounts') as f:
>          for line in f.readlines():
>              if basepath in line:
> -                bb.debug(1, '%s left mounted, unmounting...' % line.split()[1])
> +                bb.warn('%s left mounted, unmounting...' % line.split()[1])

Ah, you are brave and make this a real warning again. Means you've never
seen it?

>                  subprocess.call(
>                      ["sudo", "umount", "-l", line.split()[1]],
>                      stdout=subprocess.DEVNULL,
> diff --git a/meta/classes/rootfs.bbclass b/meta/classes/rootfs.bbclass
> index f9151c5..7b9fbb1 100644
> --- a/meta/classes/rootfs.bbclass
> +++ b/meta/classes/rootfs.bbclass
> @@ -26,38 +26,17 @@ export LANG = "C"
>  export LANGUAGE = "C"
>  export LC_ALL = "C"
>  
> -rootfs_do_mounts[weight] = "3"
> -rootfs_do_mounts() {
> -    sudo -s <<'EOSUDO'
> -        mountpoint -q '${ROOTFSDIR}/dev' || \
> -            mount --rbind /dev '${ROOTFSDIR}/dev'
> -        mount --make-rslave '${ROOTFSDIR}/dev'
> -        mountpoint -q '${ROOTFSDIR}/proc' || \
> -            mount -t proc none '${ROOTFSDIR}/proc'
> -        mountpoint -q '${ROOTFSDIR}/sys' || \
> -            mount --rbind /sys '${ROOTFSDIR}/sys'
> -        mount --make-rslave '${ROOTFSDIR}/sys'
> -
> -        # Mount isar-apt if the directory does not exist or if it is empty
> -        # This prevents overwriting something that was copied there
> -        if [ ! -e '${ROOTFSDIR}/isar-apt' ] || \
> -           [ "$(find '${ROOTFSDIR}/isar-apt' -maxdepth 1 -mindepth 1 | wc -l)" = "0" ]
> -        then
> -            mkdir -p '${ROOTFSDIR}/isar-apt'
> -            mountpoint -q '${ROOTFSDIR}/isar-apt' || \
> -                mount --bind '${REPO_ISAR_DIR}/${DISTRO}' '${ROOTFSDIR}/isar-apt'
> -        fi
> -
> -        # Mount base-apt if 'ISAR_USE_CACHED_BASE_REPO' is set
> -        if [ "${@repr(bb.utils.to_boolean(d.getVar('ISAR_USE_CACHED_BASE_REPO')))}" = 'True' ]
> -        then
> -            mkdir -p '${ROOTFSDIR}/base-apt'
> -            mountpoint -q '${ROOTFSDIR}/base-apt' || \
> -                mount --bind '${REPO_BASE_DIR}' '${ROOTFSDIR}/base-apt'
> -        fi
> -
> -EOSUDO
> -}
> +MOUNTS_CONTEXT = "${PN}-${DISTRO}-${DISTRO_ARCH}"
> +ROOTFS_MOUNTS = " \
> +    rbind:/dev:${ROOTFSDIR}/dev \
> +    proc::${ROOTFSDIR}/proc \
> +    rbind:/sys:${ROOTFSDIR}/sys \
> +    bind:${REPO_ISAR_DIR}/${DISTRO}:${ROOTFSDIR}/isar-apt \
> +    ${@oe.utils.vartrue("ISAR_USE_CACHED_BASE_REPO", "bind:${REPO_BASE_DIR}:${ROOTFSDIR}/base-apt", "", d)} \
> +    "
> +
> +mounts_task_prefunc[weight] = "3"
> +mounts_task_postfunc[weight] = "3"
>  
>  rootfs_do_qemu() {
>      if [ '${@repr(d.getVar('ROOTFS_ARCH') == d.getVar('HOST_ARCH'))}' = 'False' ]
> @@ -153,13 +132,15 @@ do_rootfs_install[root_cleandirs] = "${ROOTFSDIR}"
>  do_rootfs_install[vardeps] += "${ROOTFS_CONFIGURE_COMMAND} ${ROOTFS_INSTALL_COMMAND}"
>  do_rootfs_install[depends] = "isar-bootstrap-${@'target' if d.getVar('ROOTFS_ARCH') == d.getVar('DISTRO_ARCH') else 'host'}:do_build"
>  do_rootfs_install[deptask] = "do_deploy_deb"
> +do_rootfs_install[mounts] = "${ROOTFS_MOUNTS}"
> +do_rootfs_install[mounts-noauto] = "1"

Why "noauto"? How is it done otherwise?

>  python do_rootfs_install() {
>      configure_cmds = (d.getVar("ROOTFS_CONFIGURE_COMMAND", True) or "").split()
>      install_cmds = (d.getVar("ROOTFS_INSTALL_COMMAND", True) or "").split()
>  
>      # Mount after configure commands, so that they have time to copy
>      # 'isar-apt' (sdkchroot):
> -    cmds = ['rootfs_prepare'] + configure_cmds + ['rootfs_do_mounts'] + install_cmds
> +    cmds = ['rootfs_prepare'] + configure_cmds + ['mounts_task_prefunc'] + install_cmds + ['mounts_task_postfunc']
>  
>      # NOTE: The weights specify how long each task takes in seconds and are used
>      # by the MultiStageProgressReporter to render a progress bar for this task.
> @@ -230,9 +211,8 @@ rootfs_export_dpkg_status() {
>  }
>  
>  do_rootfs_postprocess[vardeps] = "${ROOTFS_POSTPROCESS_COMMAND}"
> +do_rootfs_postprocess[mounts] = "${ROOTFS_MOUNTS}"
>  python do_rootfs_postprocess() {
> -    # Take care that its correctly mounted:
> -    bb.build.exec_func('rootfs_do_mounts', d)
>      # Take care that qemu-*-static is available, since it could have been
>      # removed on a previous execution of this task:
>      bb.build.exec_func('rootfs_do_qemu', d)
> diff --git a/meta/classes/ubi-img.bbclass b/meta/classes/ubi-img.bbclass
> index c69ac4d..87f0187 100644
> --- a/meta/classes/ubi-img.bbclass
> +++ b/meta/classes/ubi-img.bbclass
> @@ -21,11 +21,10 @@ do_ubi_image() {
>  
>      rm -f '${DEPLOY_DIR_IMAGE}/${UBI_IMAGE_FILE}'
>  
> -    image_do_mounts
> -
>      # 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}'
>      sudo chown $(id -u):$(id -g) '${DEPLOY_DIR_IMAGE}/${UBI_IMAGE_FILE}'
>  }
>  addtask ubi_image before do_image after do_image_tools do_transform_template
> +do_ubi_image[mounts] = "${IMAGE_MOUNTS}"
> diff --git a/meta/classes/ubifs-img.bbclass b/meta/classes/ubifs-img.bbclass
> index 5d48c1d..c6775d6 100644
> --- a/meta/classes/ubifs-img.bbclass
> +++ b/meta/classes/ubifs-img.bbclass
> @@ -20,12 +20,11 @@ ISAR_CROSS_COMPILE_armhf = "1"
>  do_ubifs_image() {
>      rm -f '${DEPLOY_DIR_IMAGE}/${UBIFS_IMAGE_FILE}'
>  
> -    image_do_mounts
> -
>      # Create ubifs image using buildchroot tools
>      sudo chroot ${BUILDCHROOT_DIR} /usr/sbin/mkfs.ubifs ${MKUBIFS_ARGS} \
>                  -r '${PP_ROOTFS}' '${PP_DEPLOY}/${UBIFS_IMAGE_FILE}'
>      sudo chown $(id -u):$(id -g) '${DEPLOY_DIR_IMAGE}/${UBIFS_IMAGE_FILE}'
>  }
>  
> +do_ubifs_image[mounts] = "${IMAGE_MOUNTS}"
>  addtask ubifs_image before do_image after do_image_tools
> diff --git a/meta/classes/vm-img.bbclass b/meta/classes/vm-img.bbclass
> index b230af2..c6cfbf9 100644
> --- a/meta/classes/vm-img.bbclass
> +++ b/meta/classes/vm-img.bbclass
> @@ -33,13 +33,12 @@ CONVERSION_OPTIONS = "${@set_convert_options(d)}"
>  
>  do_convert_wic() {
>      rm -f '${DEPLOY_DIR_IMAGE}/${VIRTUAL_MACHINE_IMAGE_FILE}'
> -    image_do_mounts
>      bbnote "Creating ${VIRTUAL_MACHINE_IMAGE_FILE} from ${WIC_IMAGE_FILE}"
>      sudo -E  chroot --userspec=$( id -u ):$( id -g ) ${BUILDCHROOT_DIR} \
>      /usr/bin/qemu-img convert -f raw -O ${VIRTUAL_MACHINE_IMAGE_TYPE} ${CONVERSION_OPTIONS} \
>          '${PP_DEPLOY}/${SOURCE_IMAGE_FILE}' '${PP_DEPLOY}/${VIRTUAL_MACHINE_IMAGE_FILE}'
>  }
> -
> +do_convert_wic[mounts] = "${IMAGE_MOUNTS}"
>  addtask convert_wic before do_build after do_wic_image do_copy_boot_files do_install_imager_deps do_transform_template
>  
>  # User settings for OVA
> @@ -92,8 +91,6 @@ do_create_ova() {
>      export DISK_NAME=$(basename -s .vmdk ${VIRTUAL_MACHINE_DISK})
>      export LAST_CHANGE=$(date -u "+%Y-%m-%dT%H:%M:%SZ")
>  
> -    image_do_mounts
> -
>      sudo -Es chroot --userspec=$( id -u ):$( id -g ) ${BUILDCHROOT_DIR} <<'EOSUDO'
>          export DISK_SIZE_BYTES=$(qemu-img info -f vmdk "${VIRTUAL_MACHINE_DISK}" \
>                                   | gawk 'match($0, /^virtual size:.*\(([0-9]+) bytes\)/, a) {print a[1]}')
> @@ -112,5 +109,5 @@ do_create_ova() {
>          tar -uvf ${PP_DEPLOY}/${OVA_NAME}.ova -C ${PP_DEPLOY} ${VIRTUAL_MACHINE_IMAGE_FILE}
>  EOSUDO
>  }
> -
> +do_create_ova[mounts] = "${IMAGE_MOUNTS}"
>  addtask do_create_ova after do_convert_wic before do_deploy
> diff --git a/meta/classes/wic-img.bbclass b/meta/classes/wic-img.bbclass
> index d849ad9..f8f9c0d 100644
> --- a/meta/classes/wic-img.bbclass
> +++ b/meta/classes/wic-img.bbclass
> @@ -137,6 +137,17 @@ python check_for_wic_warnings() {
>  }
>  
>  do_wic_image[file-checksums] += "${WKS_FILE_CHECKSUM}"
> +do_wic_image[mounts] = "${BUILDCHROOT_MOUNTS}"
> +python() {
> +    buildchroot = d.getVar('BUILDCHROOT_DIR')
> +    dirs = ((d.getVar('BBLAYERS') or '').split() +
> +            (d.getVar('STAGING_DIR') or '').split() +
> +            (d.getVar('SCRIPTSDIR') or '').split() +
> +            (d.getVar('BITBAKEDIR') or '').split())
> +    for dir in dirs:
> +        d.appendVarFlag('do_wic_image', 'mounts', f" pbind:{dir}:{buildchroot}{dir}")
> +}
> +
>  python do_wic_image() {
>      bb.build.exec_func("generate_wic_image", d)
>      bb.build.exec_func("check_for_wic_warnings", d)
> @@ -144,17 +155,6 @@ python do_wic_image() {
>  addtask wic_image before do_image after do_image_tools
>  
>  generate_wic_image() {
> -    buildchroot_do_mounts
> -    sudo -s <<'EOSUDO'
> -        ( flock 9
> -        for dir in ${BBLAYERS} ${STAGING_DIR} ${SCRIPTSDIR} ${BITBAKEDIR}; do
> -            mkdir -p ${BUILDCHROOT_DIR}/$dir
> -            if ! mountpoint ${BUILDCHROOT_DIR}/$dir >/dev/null 2>&1; then
> -                mount --bind --make-private $dir ${BUILDCHROOT_DIR}/$dir
> -            fi
> -        done
> -        ) 9>${MOUNT_LOCKFILE}
> -EOSUDO
>      export FAKEROOTCMD=${FAKEROOTCMD}
>      export BUILDDIR=${BUILDDIR}
>      export MTOOLS_SKIP_CHECK=1
> @@ -200,13 +200,4 @@ EOSUDO
>      done
>      rm -rf ${BUILDCHROOT_DIR}/${WICTMP}
>      rm -rf ${IMAGE_ROOTFS}/../pseudo
> -    sudo -s <<'EOSUDO'
> -        ( flock 9
> -        for dir in ${BBLAYERS} ${STAGING_DIR} ${SCRIPTSDIR} ${BITBAKEDIR}; do
> -            if mountpoint -q ${BUILDCHROOT_DIR}/$dir; then
> -                umount ${BUILDCHROOT_DIR}/$dir
> -            fi
> -        done
> -        ) 9>${MOUNT_LOCKFILE}
> -EOSUDO
>  }
> diff --git a/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc b/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc
> index b8af676..cc6c073 100644
> --- a/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc
> +++ b/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc
> @@ -117,7 +117,6 @@ def get_apt_source_mirror(d, aptsources_entry_list):
>      mirror_list = [entry.split()
>                    for entry in premirrors.split('\\n')
>                    if any(entry)]
> -
>      for regex, replace in mirror_list:
>          match = re.search(regex, aptsources_entry_list[2])
>  
> @@ -318,9 +317,6 @@ do_bootstrap() {
>              fi
>              echo "deb ${line}" >  "${ROOTFSDIR}/etc/apt/sources.list.d/base-apt.list"
>              echo "deb-src ${line}" >>  "${ROOTFSDIR}/etc/apt/sources.list.d/base-apt.list"
> -
> -            mkdir -p ${ROOTFSDIR}/base-apt
> -            mount --bind ${REPO_BASE_DIR} ${ROOTFSDIR}/base-apt
>          else
>              install -v -m644 "${APTSRCS}" \
>                               "${ROOTFSDIR}/etc/apt/sources.list.d/bootstrap.list"
> @@ -364,13 +360,27 @@ do_bootstrap() {
>          install -v -m755 "${WORKDIR}/chroot-setup.sh" "${ROOTFSDIR}/chroot-setup.sh"
>          "${ROOTFSDIR}/chroot-setup.sh" "setup" "${ROOTFSDIR}"
>  
> -        # update APT
> -        mount --rbind /dev ${ROOTFSDIR}/dev
> -        mount --make-rslave ${ROOTFSDIR}/dev
> -        mount -t proc none ${ROOTFSDIR}/proc
> -        mount --rbind /sys ${ROOTFSDIR}/sys
> -        mount --make-rslave ${ROOTFSDIR}/sys
> +EOSUDO
> +    deb_dl_dir_export "${ROOTFSDIR}" "${BOOTSTRAP_DISTRO}"
> +}
>  
> +addtask bootstrap before do_build after do_generate_keyrings
> +do_bootstrap[vardeps] += " \
> +    DISTRO_APT_PREMIRRORS \
> +    ISAR_ENABLE_COMPAT_ARCH \
> +    ${DISTRO_VARS_PREFIX}DISTRO_APT_SOURCES \
> +    "
> +do_bootstrap[dirs] = "${DEPLOY_DIR_BOOTSTRAP}"
> +do_bootstrap[depends] = "base-apt:do_cache isar-apt:do_cache_config"
> +
> +
> +do_bootstrap_finalize() {
> +    E="${@ isar_export_proxies(d)}"
> +    export BOOTSTRAP_FOR_HOST E
> +
> +    deb_dl_dir_import "${ROOTFSDIR}" "${BOOTSTRAP_DISTRO}"
> +
> +    sudo -E -s <<'EOSUDO'
>          export DEBIAN_FRONTEND=noninteractive
>  
>          if [ "${BOOTSTRAP_FOR_HOST}" = "1" ]; then
> @@ -386,18 +396,19 @@ do_bootstrap() {
>          chroot "${ROOTFSDIR}" /usr/bin/apt-get dist-upgrade -y \
>                                  -o Debug::pkgProblemResolver=yes
>  
> -        umount -l "${ROOTFSDIR}/dev"
> -        umount -l "${ROOTFSDIR}/proc"
> -        umount -l "${ROOTFSDIR}/sys"
> -        umount -l "${ROOTFSDIR}/base-apt" || true
> -
>          # Finalize debootstrap by setting the link in deploy
>          ln -Tfsr "${ROOTFSDIR}" "${DEPLOY_ISAR_BOOTSTRAP}"
>  EOSUDO
>      deb_dl_dir_export "${ROOTFSDIR}" "${BOOTSTRAP_DISTRO}"
>  }
>  
> -addtask bootstrap before do_build after do_generate_keyrings
> +addtask bootstrap_finalize after do_bootstrap before do_build
> +do_bootstrap_finalize[mounts] = " \
> +    rbind:/dev:${ROOTFSDIR}/dev \
> +    proc::${ROOTFSDIR}/proc \
> +    rbind:/sys:${ROOTFSDIR}/sys \
> +    ${@oe.utils.vartrue("ISAR_USE_CACHED_BASE_REPO", "bind:${REPO_BASE_DIR}:${ROOTFSDIR}/base-apt", "", d)} \
> +    "
>  
>  CLEANFUNCS = "clean_deploy"
>  clean_deploy() {
> diff --git a/meta/recipes-devtools/buildchroot/buildchroot.inc b/meta/recipes-devtools/buildchroot/buildchroot.inc
> index 31524a1..ea4a3ba 100644
> --- a/meta/recipes-devtools/buildchroot/buildchroot.inc
> +++ b/meta/recipes-devtools/buildchroot/buildchroot.inc
> @@ -41,13 +41,7 @@ BUILDCHROOT_PREINSTALL_COMMON = " \
>      equivs \
>      adduser"
>  
> -rootfs_do_mounts_append() {
> -    sudo -s <<'EOSUDO'
> -    mkdir -p '${BUILDCHROOT_DIR}/downloads'
> -    mountpoint -q '${BUILDCHROOT_DIR}/downloads' || \
> -        mount --bind '${DL_DIR}' '${BUILDCHROOT_DIR}/downloads'
> -EOSUDO
> -}
> +ROOTFS_MOUNTS += "bind:${DL_DIR}:${BUILDCHROOT_DIR}/downloads"
>  
>  ROOTFS_POSTPROCESS_COMMAND =+ "buildchroot_install_files"
>  buildchroot_install_files() {
> 

Maybe split this up into multiple conversions of the same type?

Jan

-- 
Siemens AG, T RDA IOT
Corporate Competence Center Embedded Linux

  reply	other threads:[~2021-10-13 10:42 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-12 13:04 [RFC PATCH 0/5] Refactor mount logic Adriaan Schmidt
2021-10-12 13:04 ` [RFC PATCH 1/5] oe imports in central location Adriaan Schmidt
2021-10-12 13:04 ` [RFC PATCH 2/5] meta: refactor containerization Adriaan Schmidt
2021-10-13 10:17   ` Jan Kiszka
2021-10-12 13:04 ` [RFC PATCH 3/5] meta: add oe.utils Adriaan Schmidt
2021-10-13 10:17   ` Jan Kiszka
2021-10-20  6:49     ` Schmidt, Adriaan
2021-10-12 13:04 ` [RFC PATCH 4/5] meta: add mounts class Adriaan Schmidt
2021-10-13 10:31   ` Jan Kiszka
2021-10-20  7:02     ` Schmidt, Adriaan
2021-10-12 13:04 ` [RFC PATCH 5/5] meta: refactor to use the new mounting mechanism Adriaan Schmidt
2021-10-13 10:42   ` Jan Kiszka [this message]
2021-10-20  9:20     ` Schmidt, Adriaan
2021-11-22 14:45 ` [RFC PATCH 0/5] Refactor mount logic Anton Mikanovich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ecfa7a6f-21ca-b978-c658-32e6d997eb48@siemens.com \
    --to=jan.kiszka@siemens.com \
    --cc=adriaan.schmidt@siemens.com \
    --cc=isar-users@googlegroups.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox