From mboxrd@z Thu Jan 1 00:00:00 1970 X-GM-THRID: 6959801776553852928 X-Received: by 2002:adf:ef45:: with SMTP id c5mr16970289wrp.78.1620455134442; Fri, 07 May 2021 23:25:34 -0700 (PDT) X-BeenThere: isar-users@googlegroups.com Received: by 2002:a1c:64c2:: with SMTP id y185ls7024348wmb.2.canary-gmail; Fri, 07 May 2021 23:25:33 -0700 (PDT) X-Google-Smtp-Source: ABdhPJysvO1pZqYzX3eYF2MQ7WYBOiCaDgfYiEaBzPy38XitBl79MCfub0GO2ngtOtdeR705QVfK X-Received: by 2002:a1c:7c15:: with SMTP id x21mr14398375wmc.186.1620455133611; Fri, 07 May 2021 23:25:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620455133; cv=none; d=google.com; s=arc-20160816; b=dVk/exIBc6TJKonb4YDyCkhuT9QVPj4AwqvZ1oa2IG3zl/K/mHEHaCI62ehh0v7opC rxC/500IKTiduTyc+He5wzIlPsHa9HrLw4neQkWzmoySjn5uFE2wwLlzd5elMsUqgw0r 5IxtvmP6T+m3M0JXaUNtullLFivvRpWdeiwraMqonS/Tpy3Xo8/Gli81e+3qYo/hJkxU 7vR+m02iZfE1OeCGecIEbKBYgri5gSD3uzdYUUkKqyFMAwYplUlprqwx542j/CZdYrYQ COdgvBnovjnW4MyqYFjEZR18bcmFvd6Ez9I4bk7nzMo1ja10ByiAnrd59jaxZJATYi1V bRMA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=y0PvPg0ID9Gx6dPF+YiXhzerTQRIVsYy14gTGqHCRKs=; b=HPG1bwMZ3VCFmLJwKFff6Mhaw3SdUg5KfnsAehBUYBIytv1t3TdC/KXabIZSgyXLQG dc4BcbF3N7PHc/K987rkPFzO5Equf1pSJCl7QlUO+JkSOo8+uOa0YXYWyLk4MM+WQ1/X hh6d0aukc/JeLqsmOY+Wp7s2E1IDbJb6U1YBGUeRNDROGnK/kXazz7vahU66De5IEd0L k7oxQVSnIpEHZHf58hDrJflalB3hedtE2vkgI8oPVipA4qcMNhrU20mR6Vfu+V6zX6nm Aq4x8z/W9GHvpz6dPMhzY467Ny2varXsqta20KSijORO2zumwo0w2jNYYvjFma3Fy0qQ fGlA== ARC-Authentication-Results: i=1; gmr-mx.google.com; spf=pass (google.com: domain of amikan@ilbers.de designates 85.214.156.166 as permitted sender) smtp.mailfrom=amikan@ilbers.de Return-Path: Received: from shymkent.ilbers.de (shymkent.ilbers.de. [85.214.156.166]) by gmr-mx.google.com with ESMTPS id p65si541092wmp.0.2021.05.07.23.25.33 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Fri, 07 May 2021 23:25:33 -0700 (PDT) Received-SPF: pass (google.com: domain of amikan@ilbers.de designates 85.214.156.166 as permitted sender) client-ip=85.214.156.166; Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of amikan@ilbers.de designates 85.214.156.166 as permitted sender) smtp.mailfrom=amikan@ilbers.de Received: from localhost.localdomain (mm-99-50-214-37.mgts.dynamic.pppoe.byfly.by [37.214.50.99] (may be forged)) (authenticated bits=0) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8) with ESMTPSA id 1486PPYk003793 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sat, 8 May 2021 08:25:32 +0200 From: Anton Mikanovich To: isar-users@googlegroups.com Cc: Anton Mikanovich Subject: [PATCH v3 3/5] rootfs: Unmount rootfs mounts if not needed Date: Sat, 8 May 2021 09:25:16 +0300 Message-Id: <20210508062518.83852-4-amikan@ilbers.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210508062518.83852-1-amikan@ilbers.de> References: <20210508062518.83852-1-amikan@ilbers.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED autolearn=unavailable autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on shymkent.ilbers.de X-TUID: rwJuxwWqyZYN Count the usage of rootfs mounts and trigger unmount only after all corresponded tasks are finished. Signed-off-by: Anton Mikanovich --- meta/classes/image.bbclass | 15 -------- meta/classes/initramfs.bbclass | 2 ++ meta/classes/rootfs.bbclass | 62 ++++++++++++++++++++++++++++++---- 3 files changed, 57 insertions(+), 22 deletions(-) diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass index 9f9b3f8..12d1616 100644 --- a/meta/classes/image.bbclass +++ b/meta/classes/image.bbclass @@ -199,21 +199,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 - - 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..e895afa 100644 --- a/meta/classes/initramfs.bbclass +++ b/meta/classes/initramfs.bbclass @@ -38,5 +38,7 @@ do_generate_initramfs() { rm -rf "${INITRAMFS_IMAGE_FILE}" cp "${INITRAMFS_ROOTFS}/initrd.img" "${INITRAMFS_IMAGE_FILE}" + + rootfs_undo_mounts } addtask generate_initramfs after do_rootfs before do_build diff --git a/meta/classes/rootfs.bbclass b/meta/classes/rootfs.bbclass index f9151c5..0458c7c 100644 --- a/meta/classes/rootfs.bbclass +++ b/meta/classes/rootfs.bbclass @@ -26,9 +26,23 @@ export LANG = "C" export LANGUAGE = "C" export LC_ALL = "C" +MOUNT_LOCKFILE = "${ROOTFSDIR}.lock" + rootfs_do_mounts[weight] = "3" rootfs_do_mounts() { sudo -s <<'EOSUDO' + ( flock 9 + set -e + + count="1" + if [ -f '${ROOTFSDIR}.mount' ]; then + count=$(($(< '${ROOTFSDIR}.mount') + 1)) + fi + echo $count > '${ROOTFSDIR}.mount' + if [ $count -gt 1 ]; then + exit 0 + fi + mountpoint -q '${ROOTFSDIR}/dev' || \ mount --rbind /dev '${ROOTFSDIR}/dev' mount --make-rslave '${ROOTFSDIR}/dev' @@ -56,6 +70,39 @@ rootfs_do_mounts() { mount --bind '${REPO_BASE_DIR}' '${ROOTFSDIR}/base-apt' fi + ) 9>'${MOUNT_LOCKFILE}' +EOSUDO +} + +rootfs_undo_mounts() { + sudo -s <<'EOSUDO' + ( flock 9 + set -e + + if [ -f '${ROOTFSDIR}.mount' ]; then + count=$(($(< '${ROOTFSDIR}.mount') - 1)) + echo $count > '${ROOTFSDIR}.mount' + else + exit 1 + fi + if [ $count -gt 0 ]; then + exit 0 + fi + rm ${ROOTFSDIR}.mount + + mountpoint -q '${ROOTFSDIR}/base-apt' && \ + umount ${ROOTFSDIR}/base-apt && \ + rmdir --ignore-fail-on-non-empty ${ROOTFSDIR}/base-apt + mountpoint -q '${ROOTFSDIR}/isar-apt' && \ + umount ${ROOTFSDIR}/isar-apt && \ + rmdir --ignore-fail-on-non-empty ${ROOTFSDIR}/isar-apt + mountpoint -q '${ROOTFSDIR}/sys' && \ + umount -R ${ROOTFSDIR}/sys + mountpoint -q '${ROOTFSDIR}/proc' && \ + umount -R ${ROOTFSDIR}/proc + mountpoint -q '${ROOTFSDIR}/dev' && \ + umount -R ${ROOTFSDIR}/dev + ) 9>'${MOUNT_LOCKFILE}' EOSUDO } @@ -159,7 +206,7 @@ python do_rootfs_install() { # 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 + ['rootfs_do_mounts'] + install_cmds + ['rootfs_undo_mounts'] # 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. @@ -241,12 +288,13 @@ python do_rootfs_postprocess() { progress_reporter.update(0) cmds = d.getVar("ROOTFS_POSTPROCESS_COMMAND") - if cmds is None or not cmds.strip(): - return - cmds = cmds.split() - for i, cmd in enumerate(cmds): - bb.build.exec_func(cmd, d) - progress_reporter.update(int(i / len(cmds) * 100)) + if cmds is not None and cmds.strip(): + cmds = cmds.split() + for i, cmd in enumerate(cmds): + bb.build.exec_func(cmd, d) + progress_reporter.update(int(i / len(cmds) * 100)) + + bb.build.exec_func('rootfs_undo_mounts', d) } addtask rootfs_postprocess before do_rootfs -- 2.25.1