From mboxrd@z Thu Jan 1 00:00:00 1970 X-GM-THRID: 6953625691033174016 X-Received: by 2002:a1c:7c13:: with SMTP id x19mr10316071wmc.189.1619017152280; Wed, 21 Apr 2021 07:59:12 -0700 (PDT) X-BeenThere: isar-users@googlegroups.com Received: by 2002:a05:6000:1287:: with SMTP id f7ls3368774wrx.3.gmail; Wed, 21 Apr 2021 07:59:11 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzwFCW9a02PTa/jvHmZabDcPM0XK2Hh4h17Pr6l8DZaaeoe6YxbtbwJ/LJRta7RmfGVbB1x X-Received: by 2002:a05:6000:1091:: with SMTP id y17mr26683854wrw.270.1619017151481; Wed, 21 Apr 2021 07:59:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619017151; cv=none; d=google.com; s=arc-20160816; b=d/LQX5MeCEKvZEHKlwnML8DI+37/HJfxiMIATEn52DzeEz6lZspl2C+uo+hLiEh6kN /cVaVYeFTlztanMOq7rc8S1lFh+9tHF4tUb1TBUyJxvIO4Roi/50TOK/wGKXUfK6wbyd b/evFpgiA8U8bUgqwPOkAwhRvz5wqCGPTaxxFGCXbkLNDL1fJFLulo+MYD78PwOx7OsY fxlNmJS1vvFJFzx7oBLOG0uN9mPddGZz3ac7pw53AmfNOZ8OAepX3en2n9+7ScTgr0QJ 5VGALEdX/27h9sPsdQByuzCgtrKCKbuVuZTp/BN3tTVdB+HwPamP7Q9D9Ewqbp7kUVWQ 3Aqw== 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=KFM7MdGnjvjQXoJG2d7cDXn7kAX9LjBkvAEDGcYU610=; b=cGQ3hxgLT38UZOCPvAvi4GF82hBgke4eFbB4DAbnd3fka6Z0Mu7mVcM7HfMiYE40/3 vlC3cCg/nDIS11s1piMl6I5cPhsQQdThsEO6BOmGVrqqqspoVmGEhHM5hgbIAXeDsTDJ 7+GkVSRpqNYk6QWEeqD++O74VNpMaOV2z5qVhFDIauJM8ytrDD0CAf9NNVAfp1+cxVgv lkJABVKEO3yoOWH6N80uIPKDAjL1q03aOEmUOJw6wwDjPRtTIWO6B2y37E/9r8eHLziV NuHAmQY6xrCyZsM45lKuv/S5A+6ixCtq1o7jnzLlKFom0fDVelhsEA1So51VF0HCegHp iG6Q== 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 187si171050wmb.0.2021.04.21.07.59.11 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 21 Apr 2021 07:59:11 -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-153-39-214-37.mgts.dynamic.pppoe.byfly.by [37.214.39.153] (may be forged)) (authenticated bits=0) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8) with ESMTPSA id 13LEx27e027015 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 21 Apr 2021 16:59:10 +0200 From: Anton Mikanovich To: isar-users@googlegroups.com Cc: Anton Mikanovich Subject: [PATCH v2 3/5] rootfs: Unmount rootfs mounts if not needed Date: Wed, 21 Apr 2021 17:58:53 +0300 Message-Id: <20210421145855.66257-4-amikan@ilbers.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210421145855.66257-1-amikan@ilbers.de> References: <20210421145855.66257-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: 8zb0tBEpdR0g 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 | 68 +++++++++++++++++-- .../buildchroot/buildchroot.inc | 7 ++ 4 files changed, 70 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..7bb04e5 100644 --- a/meta/classes/rootfs.bbclass +++ b/meta/classes/rootfs.bbclass @@ -26,8 +26,41 @@ export LANG = "C" export LANGUAGE = "C" export LC_ALL = "C" +ROOTFS_CNT_LOCKFILE = "${ROOTFSDIR}.mount_lock" + +rootfs_mount_cnt_inc() { + sudo -s <<'EOSUDO' + ( flock 9 + set -e + count="1" + if [ -f '${ROOTFSDIR}/.mount' ]; then + count=$(($(< '${ROOTFSDIR}/.mount') + 1)) + fi + echo $count | tee '${ROOTFSDIR}/.mount' + ) 9>'${ROOTFS_CNT_LOCKFILE}' +EOSUDO +} + +rootfs_mount_cnt_dec() { + sudo -s <<'EOSUDO' + ( flock 9 + set -e + if [ -f '${ROOTFSDIR}/.mount' ]; then + count=$(($(< '${ROOTFSDIR}/.mount') - 1)) + echo $count | tee '${ROOTFSDIR}/.mount' + else + exit 1 + fi + ) 9>'${ROOTFS_CNT_LOCKFILE}' +EOSUDO +} + + rootfs_do_mounts[weight] = "3" rootfs_do_mounts() { + if [ $(rootfs_mount_cnt_inc) -gt 1 ]; then + return + fi sudo -s <<'EOSUDO' mountpoint -q '${ROOTFSDIR}/dev' || \ mount --rbind /dev '${ROOTFSDIR}/dev' @@ -59,6 +92,26 @@ rootfs_do_mounts() { EOSUDO } +rootfs_undo_mounts() { + if [ $(rootfs_mount_cnt_dec) -gt 0 ]; then + return + fi + sudo -s <<'EOSUDO' + 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 ${ROOTFSDIR}/proc + mountpoint -q '${ROOTFSDIR}/dev' && \ + umount -R ${ROOTFSDIR}/dev +EOSUDO +} + rootfs_do_qemu() { if [ '${@repr(d.getVar('ROOTFS_ARCH') == d.getVar('HOST_ARCH'))}' = 'False' ] then @@ -159,7 +212,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 +294,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 diff --git a/meta/recipes-devtools/buildchroot/buildchroot.inc b/meta/recipes-devtools/buildchroot/buildchroot.inc index 5a2befb..b80e703 100644 --- a/meta/recipes-devtools/buildchroot/buildchroot.inc +++ b/meta/recipes-devtools/buildchroot/buildchroot.inc @@ -49,6 +49,13 @@ rootfs_do_mounts_append() { EOSUDO } +rootfs_undo_mounts_append() { + sudo -s <<'EOSUDO' + mountpoint -q '${BUILDCHROOT_DIR}/downloads' && \ + umount ${BUILDCHROOT_DIR}/downloads +EOSUDO +} + ROOTFS_POSTPROCESS_COMMAND =+ "buildchroot_install_files" buildchroot_install_files() { sudo mkdir -p "${BUILDCHROOT_DIR}/home/builder" -- 2.25.1