From: Anton Mikanovich <amikan@ilbers.de>
To: isar-users@googlegroups.com
Cc: Anton Mikanovich <amikan@ilbers.de>
Subject: [PATCH v2 2/4] imager: Migrate from buildchroot to schroot
Date: Fri, 30 Dec 2022 22:08:22 +0300 [thread overview]
Message-ID: <20221230190824.12256-3-amikan@ilbers.de> (raw)
In-Reply-To: <20221230190824.12256-1-amikan@ilbers.de>
Install dependencies and perform all imager actions using one schroot
overlay. This requires to open a session which stays opened until all
the images are ready. This session will be closed then and all the
changes will be lost.
Signed-off-by: Anton Mikanovich <amikan@ilbers.de>
---
meta/classes/image-tools-extension.bbclass | 80 +++++++++++++++++++---
meta/classes/image.bbclass | 1 +
2 files changed, 72 insertions(+), 9 deletions(-)
diff --git a/meta/classes/image-tools-extension.bbclass b/meta/classes/image-tools-extension.bbclass
index 2d3dda4f..85f0d551 100644
--- a/meta/classes/image-tools-extension.bbclass
+++ b/meta/classes/image-tools-extension.bbclass
@@ -5,13 +5,15 @@
#
# This file extends the image.bbclass to supply tools for futher imager functions
-inherit buildchroot
+inherit sbuild
IMAGER_INSTALL ??= ""
IMAGER_BUILD_DEPS ??= ""
DEPENDS += "${IMAGER_BUILD_DEPS}"
-do_install_imager_deps[depends] = "${BUILDCHROOT_DEP} isar-apt:do_cache_config"
+IMAGER_SCHROOT_SESSION_ID = "isar-imager-${SCHROOT_USER}-${PN}-${MACHINE}-${ISAR_BUILD_UUID}"
+
+do_install_imager_deps[depends] = "${SCHROOT_DEP} isar-apt:do_cache_config"
do_install_imager_deps[deptask] = "do_deploy_deb"
do_install_imager_deps[lockfiles] += "${REPO_ISAR_DIR}/isar.lock"
do_install_imager_deps[network] = "${TASK_USE_NETWORK_AND_SUDO}"
@@ -25,11 +27,9 @@ do_install_imager_deps() {
distro="${HOST_BASE_DISTRO}-${BASE_DISTRO_CODENAME}"
fi
- buildchroot_do_mounts
-
E="${@ isar_export_proxies(d)}"
- deb_dl_dir_import ${BUILDCHROOT_DIR} ${distro}
- sudo -E chroot ${BUILDCHROOT_DIR} sh -c ' \
+ deb_dl_dir_import ${SCHROOT_DIR} ${distro}
+ schroot -r -c ${IMAGER_SCHROOT_SESSION_ID} -d / -u root -- sh -c ' \
apt-get update \
-o Dir::Etc::SourceList="sources.list.d/isar-apt.list" \
-o Dir::Etc::SourceParts="-" \
@@ -38,10 +38,72 @@ do_install_imager_deps() {
--allow-unauthenticated --allow-downgrades --download-only install \
${IMAGER_INSTALL}'
- deb_dl_dir_export ${BUILDCHROOT_DIR} ${distro}
- sudo -E chroot ${BUILDCHROOT_DIR} sh -c ' \
+ deb_dl_dir_export ${SCHROOT_DIR} ${distro}
+ schroot -r -c ${IMAGER_SCHROOT_SESSION_ID} -d / -u root -- sh -c ' \
apt-get -o Debug::pkgProblemResolver=yes --no-install-recommends -y \
--allow-unauthenticated --allow-downgrades install \
${IMAGER_INSTALL}'
}
-addtask install_imager_deps before do_image_tools
+addtask install_imager_deps before do_image_tools after do_start_imager_session
+
+SCHROOT_MOUNTS = "${WORKDIR}:${PP_WORK} ${IMAGE_ROOTFS}:${PP_ROOTFS} ${DEPLOY_DIR_IMAGE}:${PP_DEPLOY}"
+
+do_start_imager_session[dirs] = "${WORKDIR} ${IMAGE_ROOTFS} ${DEPLOY_DIR_IMAGE}"
+do_start_imager_session[depends] = "${SCHROOT_DEP} isar-apt:do_cache_config"
+do_start_imager_session[nostamp] = "1"
+do_start_imager_session[network] = "${TASK_USE_SUDO}"
+python do_start_imager_session() {
+ import subprocess
+ bb.build.exec_func("schroot_create_configs", d)
+ bb.build.exec_func("insert_mounts", d)
+ sbuild_chroot = d.getVar("SBUILD_CHROOT", True)
+ session_id = d.getVar("IMAGER_SCHROOT_SESSION_ID", True)
+ try:
+ if subprocess.run("schroot -l --all-sessions | grep %s" % session_id, shell=True).returncode:
+ subprocess.run("schroot -b -c %s -n %s" % (sbuild_chroot, session_id), shell=True, check=True)
+ bb.debug(2, "Open schroot session %s" % session_id)
+ else:
+ subprocess.run("schroot --recover-session -c %s" % session_id, shell=True, check=True)
+ bb.debug(2, "Reuse schroot session %s" % session_id)
+ d.setVar("SCHROOT_OPEN_SESSION_ID", session_id)
+ except subprocess.CalledProcessError as err:
+ subprocess.run("schroot -e -c %s" % session_id, shell=True)
+ bb.build.exec_func("remove_mounts", d)
+ bb.build.exec_func("schroot_delete_configs", d)
+ bb.fatal("Could not create schroot session: %s" % err.output.decode('utf-8') if err.output else "")
+}
+addtask start_imager_session before do_stop_imager_session after do_rootfs_finalize
+
+do_stop_imager_session[depends] = "${SCHROOT_DEP}"
+do_stop_imager_session[nostamp] = "1"
+do_stop_imager_session[network] = "${TASK_USE_SUDO}"
+python do_stop_imager_session() {
+ import subprocess
+ session_id = d.getVar("IMAGER_SCHROOT_SESSION_ID", True)
+ try:
+ id = subprocess.run("schroot -d / -r -c %s -- printenv -0 SCHROOT_ALIAS_NAME" % session_id,
+ shell=True, check=True, stdout=subprocess.PIPE).stdout.decode('utf-8')
+ bb.debug(2, "Close schroot session %s (%s)" % (session_id, id))
+ subprocess.run("schroot -e -c %s" % session_id, shell=True, check=True)
+ except subprocess.CalledProcessError as err:
+ bb.error("Could not close schroot session %s: %s" % (session_id, err.output.decode('utf-8')) if err.output else "")
+ finally:
+ if 'id' in locals():
+ d.setVar("SBUILD_CHROOT", id)
+ bb.build.exec_func("remove_mounts", d)
+ bb.build.exec_func("schroot_delete_configs", d)
+}
+addtask stop_imager_session before do_deploy after do_image
+
+imager_run() {
+ imager_cleanup() {
+ if id="$(schroot -d / -r -c ${IMAGER_SCHROOT_SESSION_ID} -- printenv -0 SCHROOT_ALIAS_NAME)"; then
+ schroot -e -c ${IMAGER_SCHROOT_SESSION_ID}
+ remove_mounts $id
+ schroot_delete_configs $id
+ fi
+ }
+ trap 'exit 1' INT HUP QUIT TERM ALRM USR1
+ trap 'imager_cleanup' EXIT
+ schroot -r -c ${IMAGER_SCHROOT_SESSION_ID} "$@"
+}
diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass
index ba0fd6ef..5851b94d 100644
--- a/meta/classes/image.bbclass
+++ b/meta/classes/image.bbclass
@@ -296,6 +296,7 @@ python() {
d.appendVarFlag(task, 'vardeps', ' ' + ' '.join(vardeps))
d.appendVarFlag(task, 'vardepsexclude', ' ' + ' '.join(vardepsexclude))
d.appendVarFlag(task, 'dirs', localdata.expand(' ${DEPLOY_DIR_IMAGE}'))
+ d.appendVarFlag(task, 'deptask', ' do_start_imager_session')
if task_deps:
d.appendVarFlag(task, 'depends', task_deps)
bb.build.addtask(task, 'do_image', after, d)
--
2.17.1
next prev parent reply other threads:[~2022-12-30 19:08 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-30 19:08 [PATCH v2 0/4] Imager schroot migration Anton Mikanovich
2022-12-30 19:08 ` [PATCH v2 1/4] sbuild: Allow setting custom config paths Anton Mikanovich
2022-12-30 19:08 ` Anton Mikanovich [this message]
2022-12-30 19:08 ` [PATCH v2 3/4] imager: Move image types to schroot Anton Mikanovich
2022-12-30 19:08 ` [PATCH v2 4/4] events: Cleanup lost schroot sessions if any Anton Mikanovich
2023-01-03 9:55 ` Roberto A. Foglietta
2023-01-04 11:19 ` Roberto A. Foglietta
2022-12-30 19:13 ` [PATCH v2 0/4] Imager schroot migration 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=20221230190824.12256-3-amikan@ilbers.de \
--to=amikan@ilbers.de \
--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