* [PATCH v3 0/5] Improving base-apt usage PoC @ 2022-03-25 10:32 Uladzimir Bely 2022-03-25 10:32 ` [PATCH v3 1/5] Add debrepo python script handling base-apt Uladzimir Bely ` (4 more replies) 0 siblings, 5 replies; 7+ messages in thread From: Uladzimir Bely @ 2022-03-25 10:32 UTC (permalink / raw) To: isar-users Currently, base-apt is used in the following way: * At first build every deb file that took part in installing is cached in directory $DL_DIR/deb/. Debootstrap is done from remote source. * At second build, `base-apt` repo is created from previously downloaded debs (if ISAR_USE_CACHED_BASE_REPO is set). Debootstrap and installing packages later is done from this local repo The idea of this patchset is to precreate `base-apt` at first build and use it later for all steps that require any package downloads (build dependencies. rootfs populate, etc). So, no second build is required to get ready-to-use base-apt. Currently, only native builds are supported. Architecture related dependencies predownloading is not yet ready, so cross-builds are not working at the moment. In the future, there are plans to switch from debootstrap to mmdebstrap that is able to work without sudo and uses more clean (apt/python-apt) approach in comparison with debootstrap. Changes since v2: - populate base-apt before using at all steps of native build. Changes since v1: - rebased on latest next; - updated patchset description. Uladzimir Bely (5): Add debrepo python script handling base-apt meta: Use cached base-apt repo to debootstrap meta: always use base-apt repo in local mode base-apt: Predownload packages to base-apt before install. draft: make isar-apt repo visible for base-apt meta-isar/conf/distro/ubuntu-focal.conf | 4 + meta-isar/conf/distro/ubuntu.public.key | 53 +++ meta/classes/buildchroot.bbclass | 10 +- meta/classes/dpkg-base.bbclass | 8 + meta/classes/dpkg-gbp.bbclass | 7 + meta/classes/dpkg.bbclass | 7 + meta/classes/image-locales-extension.bbclass | 7 + meta/classes/image-tools-extension.bbclass | 7 + meta/classes/rootfs.bbclass | 30 +- .../isar-bootstrap/isar-bootstrap.inc | 59 ++- scripts/debrepo | 363 ++++++++++++++++++ 11 files changed, 526 insertions(+), 29 deletions(-) create mode 100644 meta-isar/conf/distro/ubuntu.public.key create mode 100755 scripts/debrepo -- 2.20.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 1/5] Add debrepo python script handling base-apt 2022-03-25 10:32 [PATCH v3 0/5] Improving base-apt usage PoC Uladzimir Bely @ 2022-03-25 10:32 ` Uladzimir Bely 2022-03-25 10:32 ` [PATCH v3 2/5] meta: Use cached base-apt repo to debootstrap Uladzimir Bely ` (3 subsequent siblings) 4 siblings, 0 replies; 7+ messages in thread From: Uladzimir Bely @ 2022-03-25 10:32 UTC (permalink / raw) To: isar-users Signed-off-by: Uladzimir Bely <ubely@ilbers.de> --- scripts/debrepo | 361 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 361 insertions(+) create mode 100755 scripts/debrepo diff --git a/scripts/debrepo b/scripts/debrepo new file mode 100755 index 00000000..fba8342e --- /dev/null +++ b/scripts/debrepo @@ -0,0 +1,361 @@ +#!/usr/bin/env python3 + +# This software is a part of ISAR. +# Copyright (C) 2022 ilbers GmbH + +import os +import sys + +import subprocess +import getopt +import pickle + +import apt_pkg +import apt.progress.base + + +class DebRepo(object): + def __init__(self, workdir, cmdline_opts): + self.workdir = workdir + self.optsfile = self.workdir + "/repo.opts" + + # Set default values + self.distro = "debian" + + self.repo = self.workdir + "/repo/apt" + "/" + self.distro + self.repodb = self.workdir + "/repo/db" + "/" + self.distro + self.mirror = "http://deb.debian.org/debian" + self.arch = "amd64" + self.codename = "bullseye" + self.components = "main contrib non-free" + self.keydir = "/etc/apt/trusted.gpg.d" + self.check_gpg = True + + # Load stored opts + opts = self.load_opts() + print("stored opts: " + str(opts)) + + # Overwrite opts by cmdline_opts + for opt, arg in cmdline_opts.items(): + opts[opt] = arg + + print("all opts: " + str(opts)) + + # Replace by values passed in commandline + for opt, arg in opts.items(): + if opt == "repodir": + self.repo = arg + "/" + self.distro + if opt == "repodbdir": + self.repodb = arg + "/" + self.distro + if opt == "mirror": + self.mirror = arg + if opt == "arch": + self.arch = arg + if opt == "distro": + self.distro = arg + if opt == "codename": + self.codename = arg + if opt == "components": + self.components = arg.replace(",", " ") + if opt == "keydir": + self.keydir = arg + if opt == "check_gpg": + self.check_gpg = arg + + self.save_opts(opts) + + print("workdir: " + str(self.workdir)) + print("repo: " + str(self.repo)) + print("repodb: " + str(self.repodb)) + print("mirror: " + str(self.mirror)) + print("arch: " + str(self.arch)) + print("distro: " + str(self.distro)) + print("codename: " + str(self.codename)) + print("components: " + str(self.components)) + print("keydir: " + str(self.keydir)) + print("check_gpg: " + str(self.check_gpg)) + + self.cache = None + self.depcache = None + self.sr = None + + def create_rootfs(self): + if not os.path.exists(self.workdir + "/var/lib/dpkg"): + os.makedirs(self.workdir + "/var/lib/dpkg") + f = open(self.workdir + "/var/lib/dpkg" + "/status", "w") + f.flush + f.close + + if not os.path.exists(self.workdir + "/etc/apt/"): + os.makedirs(self.workdir + "/etc/apt/") + f = open(self.workdir + "/etc/apt/sources.list", "w") + f.write("deb [arch=" + self.arch + "] " + self.mirror + " " + self.codename + " " + self.components + "\n") + f.write("deb-src [arch=" + self.arch + "] " + self.mirror + " " + self.codename + " " + self.components + "\n") + f.flush + f.close + + if not os.path.exists(self.workdir + "/var/cache/apt/archives/partial"): + os.makedirs(self.workdir + "/var/cache/apt/archives/partial") + + def create_repo_dist(self): + if not os.path.exists(self.repo + "/conf"): + os.makedirs(self.repo + "/conf") + f = open(self.repo + "/conf" + "/distributions", "w") + f.write("Codename: " + self.codename + "\n") + f.write("Architectures: i386 armhf arm64 amd64 mipsel riscv64 source" + "\n") + f.write("Components: " + self.components + "\n") + f.flush + f.close + + def apt_config(self): + # Configure apt to work with empty directory + apt_pkg.config.set("APT::Architecture", self.arch) + apt_pkg.config.set("Dir", self.workdir) + apt_pkg.config.set("Dir::Cache", self.workdir + "/var/cache/apt") + apt_pkg.config.set("Dir::State::status", self.workdir + "/var/lib/dpkg/status") + + apt_pkg.config.set("APT::Install-Recommends", "0") + apt_pkg.config.set("APT::Install-Suggests", "0") + + # Use host keys for authentification + # apt_pkg.config.set("Dir::Etc::Trusted", "/etc/apt/trusted.gpg") + # apt_pkg.config.set("Dir::Etc::TrustedParts", "/etc/apt/trusted.gpg.d") + apt_pkg.config.set("Dir::Etc::TrustedParts", self.keydir) + + # Allow using repositories without keys + if not self.check_gpg: + apt_pkg.config.set("Acquire::AllowInsecureRepositories", "1") + + def mark_essential(self): + for pkg in self.cache.packages: + if pkg.essential: + self.depcache.mark_install(pkg) + + def mark_by_prio(self, priority): + for pkg in self.cache.packages: + ver = self.depcache.get_candidate_ver(pkg) + if ver and ver.priority <= priority: + self.depcache.mark_install(pkg) + + def mark_list(self, pkglist): + if pkglist: + for pkgname in pkglist: + if pkgname in self.cache: + pkg = self.cache[pkgname] + self.depcache.mark_install(pkg) + + def handle_deb(self, item): + subprocess.run([ + "reprepro", + "--dbdir", self.repodb, + "--outdir", self.repo, + "--confdir", self.repo + "/conf", + "-C", "main", + "includedeb", + self.codename, + item.destfile + ]) + + def handle_repo(self, fetcher): + fetcher.run() + for item in fetcher.items: + if item.status == item.STAT_ERROR: + print("Some error ocured: '%s'" % item.error_text) + pass + else: + self.handle_deb(item) + + def get_filename(self, url): + fragment_removed = url.split("#")[0] # keep to left of first # + query_string_removed = fragment_removed.split("?")[0] + scheme_removed = query_string_removed.split("://")[-1].split(":")[-1] + if scheme_removed.find("/") == -1: + return "" + return os.path.basename(scheme_removed) + + def download_file(self, uri): + filename = self.get_filename(uri) + subprocess.run([ + "wget", + uri, + "-O", + filename + ]) + + def handle_dsc(self, uri): + filename = self.get_filename(uri) + subprocess.run([ + "reprepro", + "--dbdir", self.repodb, + "--outdir", self.repo, + "--confdir", self.repo + "/conf", + "-C", "main", + "-S", "-", "-P" "source", + "--delete", + "includedsc", + self.codename, + os.path.realpath(filename) + ]) + + def handle_src_list(self, pkgs): + if pkgs: + for pkgname in pkgs: + dsc = "" + self.sr.restart() + if self.sr.lookup(pkgname): + print(self.sr.files) + for sr_file in self.sr.files: + print(self.sr.index.archive_uri(sr_file[2])) + self.download_file(self.sr.index.archive_uri(sr_file[2])) + + dsc_uri = self.sr.index.archive_uri(self.sr.files[0][2]) + self.handle_dsc(dsc_uri) + + def apt_run(self, init, srcmode, pkgs, controlfile): + apt_pkg.init() + + sources = apt_pkg.SourceList() + sources.read_main_list() + + progress = apt.progress.text.AcquireProgress() + + self.cache = apt_pkg.Cache() + self.cache.update(progress, sources) + self.cache = apt_pkg.Cache() + + self.depcache = apt_pkg.DepCache(self.cache) + self.sr = apt_pkg.SourceRecords() + + if init: + self.mark_essential() + # 1(required), 2(important), 3(standard), 4(optional), 5(extra) + self.mark_by_prio(1) + + if srcmode: + self.handle_src_list(pkgs) + else: + self.mark_list(pkgs) + + if controlfile: + fobj = open(controlfile, "r") + try: + Parse = apt_pkg.TagFile(fobj) + while Parse.step() == 1: + for item in apt_pkg.parse_depends(Parse.section.get("Build-Depends", "")): + #self.mark_list([item[0][0]]) + if item[0][0] in self.cache: + pkg = self.cache[item[0][0]] + print("pkg: " + str(pkg)) + self.depcache.mark_install(pkg) + + finally: + fobj.close() + + if init or not srcmode: + fetcher = apt_pkg.Acquire(progress) + pm = apt_pkg.PackageManager(self.depcache) + + recs = apt_pkg.PackageRecords(self.cache) + pm.get_archives(fetcher, sources, recs) + + self.handle_repo(fetcher) + + def load_opts(self): + params = {} + if os.path.isfile(self.optsfile): + with open(self.optsfile, 'rb') as file: + data = file.read() + if data: + params = pickle.loads(data) + + return params + + def save_opts(self, opts): + file = open(self.optsfile, 'wb') + pickle.dump(opts, file) + file.close() + + +class DebRepoArgs(object): + def __init__(self): + self.workdir = "" + self.init = False + self.srcmode = False + self.controlfile = "" + + self.opts = {} + self.pkgs = [] + + try: + opts, args = getopt.getopt(sys.argv[1:], "", [ + "init", + "srcmode", + "workdir=", + "repodir=", + "repodbdir=", + "mirror=", + "arch=", + "distro=", + "codename=", + "components=", + "keydir=", + "no-check-gpg", + "controlfile=", + ]) + except getopt.GetoptError as msg: + print("Error: " + str(msg)) + sys.exit(1) + + for opt, arg in opts: + if opt in ("--workdir"): + self.workdir = arg + if opt in ("--init"): + self.init = True + if opt in ("--srcmode"): + self.srcmode = True + if opt in ("--controlfile"): + self.controlfile = arg + + if opt in ("--repodir", + "--repodbdir", + "--mirror", + "--arch", + "--distro", + "--codename", + "--components", + "--keydir", + "--controlfile", + ): + self.opts[opt[2:]] = arg + if opt in ("--no-check-gpg"): + self.opts['check_gpg'] = False + + if not self.workdir: + print("Error: workdir is not specified") + sys.exit(1) + + self.pkgs = args + + +def main(): + args = DebRepoArgs() + + if not (args.init or args.pkgs or args.controlfile): + print("Nothing to do") + sys.exit(0) + + if not os.path.exists(args.workdir): + os.makedirs(args.workdir) + + debrepo = DebRepo(args.workdir, args.opts) + + if (args.init): + debrepo.create_rootfs() + debrepo.create_repo_dist() + + debrepo.apt_config() + debrepo.apt_run(args.init, args.srcmode, args.pkgs, args.controlfile) + + +if __name__ == "__main__": + main() -- 2.20.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 2/5] meta: Use cached base-apt repo to debootstrap 2022-03-25 10:32 [PATCH v3 0/5] Improving base-apt usage PoC Uladzimir Bely 2022-03-25 10:32 ` [PATCH v3 1/5] Add debrepo python script handling base-apt Uladzimir Bely @ 2022-03-25 10:32 ` Uladzimir Bely 2022-03-25 10:32 ` [PATCH v3 3/5] meta: always use base-apt repo in local mode Uladzimir Bely ` (2 subsequent siblings) 4 siblings, 0 replies; 7+ messages in thread From: Uladzimir Bely @ 2022-03-25 10:32 UTC (permalink / raw) To: isar-users This patch makes local base-apt repo to be created before debootstrap task. So, debootstrap is then done from it. The required packages are downloaded via python-apt and reprepro creates debian-like repository from .deb files. For debian targets host keyring is used while ubuntu/raspbian targets use keys specified by DISTRO_BOOTSTRAP_KEYS variable. The goal is have workable base-apt repo before first build completed. Signed-off-by: Uladzimir Bely <ubely@ilbers.de> --- meta-isar/conf/distro/ubuntu-focal.conf | 4 ++ meta-isar/conf/distro/ubuntu.public.key | 53 +++++++++++++++++++ .../isar-bootstrap/isar-bootstrap.inc | 35 +++++++++++- 3 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 meta-isar/conf/distro/ubuntu.public.key diff --git a/meta-isar/conf/distro/ubuntu-focal.conf b/meta-isar/conf/distro/ubuntu-focal.conf index 4dfa2014..67a59f6c 100644 --- a/meta-isar/conf/distro/ubuntu-focal.conf +++ b/meta-isar/conf/distro/ubuntu-focal.conf @@ -11,6 +11,10 @@ DISTRO_APT_SOURCES ?= "conf/distro/${DISTRO}.list" DISTRO_APT_SOURCES_arm64 ?= "conf/distro/${DISTRO}-ports.list" HOST_DISTRO_APT_SOURCES_append_arm64 = " ${DISTRO_APT_SOURCES}" +BOOTSTRAP_KEY = "file://${LAYERDIR_isar}/conf/distro/ubuntu.public.key;sha256sum=36a38199a4bf4eae1e7f574891f7dfcb79b91b87a33a499383265e1224b5e989" +DISTRO_BOOTSTRAP_KEYS += "${BOOTSTRAP_KEY}" +HOST_DISTRO_BOOTSTRAP_KEYS += "${BOOTSTRAP_KEY}" + BASE_DISTRO_CODENAME = "focal" # that is what debootstrap_1.0.118ubuntu1 does anyways diff --git a/meta-isar/conf/distro/ubuntu.public.key b/meta-isar/conf/distro/ubuntu.public.key new file mode 100644 index 00000000..994f9f19 --- /dev/null +++ b/meta-isar/conf/distro/ubuntu.public.key @@ -0,0 +1,53 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBFufwdoBEADv/Gxytx/LcSXYuM0MwKojbBye81s0G1nEx+lz6VAUpIUZnbkq +dXBHC+dwrGS/CeeLuAjPRLU8AoxE/jjvZVp8xFGEWHYdklqXGZ/gJfP5d3fIUBtZ +HZEJl8B8m9pMHf/AQQdsC+YzizSG5t5Mhnotw044LXtdEEkx2t6Jz0OGrh+5Ioxq +X7pZiq6Cv19BohaUioKMdp7ES6RYfN7ol6HSLFlrMXtVfh/ijpN9j3ZhVGVeRC8k +KHQsJ5PkIbmvxBiUh7SJmfZUx0IQhNMaDHXfdZAGNtnhzzNReb1FqNLSVkrS/Pns +AQzMhG1BDm2VOSF64jebKXffFqM5LXRQTeqTLsjUbbrqR6s/GCO8UF7jfUj6I7ta +LygmsHO/JD4jpKRC0gbpUBfaiJyLvuepx3kWoqL3sN0LhlMI80+fA7GTvoOx4tpq +VlzlE6TajYu+jfW3QpOFS5ewEMdL26hzxsZg/geZvTbArcP+OsJKRmhv4kNo6Ayd +yHQ/3ZV/f3X9mT3/SPLbJaumkgp3Yzd6t5PeBu+ZQk/mN5WNNuaihNEV7llb1Zhv +Y0Fxu9BVd/BNl0rzuxp3rIinB2TX2SCg7wE5xXkwXuQ/2eTDE0v0HlGntkuZjGow +DZkxHZQSxZVOzdZCRVaX/WEFLpKa2AQpw5RJrQ4oZ/OfifXyJzP27o03wQARAQAB +tEJVYnVudHUgQXJjaGl2ZSBBdXRvbWF0aWMgU2lnbmluZyBLZXkgKDIwMTgpIDxm +dHBtYXN0ZXJAdWJ1bnR1LmNvbT6JAjgEEwEKACIFAlufwdoCGwMGCwkIBwMCBhUI +AgkKCwQWAgMBAh4BAheAAAoJEIcZINGZG8k8LHMQAKS2cnxz/5WaoCOWArf5g6UH +beOCgc5DBm0hCuFDZWWv427aGei3CPuLw0DGLCXZdyc5dqE8mvjMlOmmAKKlj1uG +g3TYCbQWjWPeMnBPZbkFgkZoXJ7/6CB7bWRht1sHzpt1LTZ+SYDwOwJ68QRp7DRa +Zl9Y6QiUbeuhq2DUcTofVbBxbhrckN4ZteLvm+/nG9m/ciopc66LwRdkxqfJ32Cy +q+1TS5VaIJDG7DWziG+Kbu6qCDM4QNlg3LH7p14CrRxAbc4lvohRgsV4eQqsIcdF +kuVY5HPPj2K8TqpY6STe8Gh0aprG1RV8ZKay3KSMpnyV1fAKn4fM9byiLzQAovC0 +LZ9MMMsrAS/45AvC3IEKSShjLFn1X1dRCiO6/7jmZEoZtAp53hkf8SMBsi78hVNr +BumZwfIdBA1v22+LY4xQK8q4XCoRcA9G+pvzU9YVW7cRnDZZGl0uwOw7z9PkQBF5 +KFKjWDz4fCk+K6+YtGpovGKekGBb8I7EA6UpvPgqA/QdI0t1IBP0N06RQcs1fUaA +QEtz6DGy5zkRhR4pGSZn+dFET7PdAjEK84y7BdY4t+U1jcSIvBj0F2B7LwRL7xGp +SpIKi/ekAXLs117bvFHaCvmUYN7JVp1GMmVFxhIdx6CFm3fxG8QjNb5tere/YqK+ +uOgcXny1UlwtCUzlrSaPmQINBE+tgXgBEADfiL1KNFHT4H4Dw0OR9LemR8ebsFl+ +b9E44IpGhgWYDufj0gaM/UJ1Ti3bHfRT39VVZ6cv1P4mQy0bnAKFbYz/wo+GhzjB +Wtn6dThYv7n+KL8bptSCXgg1a6en8dCCIA/pwtS2Ut/g4Eu6Z467dvYNlMgCqvg+ +prKIrXf5ibio48j3AFvd1dDJl2cHfyuON35/83vXKXz0FPohQ7N7kPfI+qrlGBYG +WFzC/QEGje360Q2Yo+rfMoyDEXmPsoZVqf7EE8gjfnXiRqmz/Bg5YQb5bgnGbLGi +HWtjS+ACIdLUq/h+jlSp57jw8oQktMh2xVMX4utDM0UENeZnPllVJSlR0b+ZmZz7 +paeSar8Yxn4wsNlL7GZbpW5A/WmcmWfuMYoPhBo5Fq1V2/siKNU3UKuf1KH+X0p1 +oZ4oOcZ2bS0Zh3YEG8IQce9Bferq4QMKsekcG9IKS6WBIU7BwaElI2ILD0gSwu8K +zvNSEeIJhYSsBIEzrWxIBXoN2AC9PCqqXkWlI5Xr/86RWllB3CsoPwEfO8CLJW2L +lXTen/Fkq4wT+apdhHeiWiSsq/J5OEff0rKHBQ3fK7fyVuVNrJFb2CopaBLyCxTu +pvxs162jjUNopt0c7OqNBoPoUoVFAxUSpeEwAw6xrM5vROyLMSeh/YnTuRy8WviR +apZCYo6naTCY5wARAQABtEJVYnVudHUgQXJjaGl2ZSBBdXRvbWF0aWMgU2lnbmlu +ZyBLZXkgKDIwMTIpIDxmdHBtYXN0ZXJAdWJ1bnR1LmNvbT6JAjgEEwECACIFAk+t +gXgCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEDtP5qzAsh8yXX4QAJHU +dK6eYMyJcrFP3yKXtUYQMpaHRM/floqZtOFhlmcLVMgBNOr0eLvBU0JcZyZpHMvZ +ciTDBMWX8ItCYVjRejf0K0lPvHHRGaE7t6JHVUCeznNbDMnOPYVwlVJdZLOa6PmE +5WXVXpk8uTA8vm6RO2rS23vE7U0pQlV+1GVXMWH4ZLjaQs/Tm7wdvRxeqTbtfOEe +HGLjmsoh0erHfzMV4wA/9Zq86WzuJS1HxXR6OYDC3/aQX7CxYT1MQxEw/PObnHtk +l3PRMWdTW7fSQtulEXzpr2/JCev6Mfc8Uy0aD3jng9byVk9GpdNFEjGgaUqjqyZo +svwAZ4/dmRjmMEibXeNUGC8HeWC3WOVV8L/DiA+miJlwPvwPiA1ZuKBI5A8VF0rN +HW7QVsG8kQ+PDHgRdsmhpzSRgykN1PgK6UxScKX8LqNKCtKpuEPApka7FQ1u4BoZ +KjjpBhY1R4TpfFkMIe7qW8XfqoaP99pED3xXch2zFRNHitNJr+yQJH4z/o+2UvnT +A2niUTHlFSCBoU1MvSq1N2J3qU6oR2cOYJ4ZxqWyCoeQR1x8aPnLlcn4le6HU7To +cYbHaImcIt7qnG4Ni0OWP4giEhjOpgxtrWgl36mdufvriwya+EHXzn36EvQ9O+bm +3fyarsnhPe01rlsRxqBiK1JOw/g4GnpX8iLGEX1V +=kRV1 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc b/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc index d6f90f63..24925dbb 100644 --- a/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc +++ b/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc @@ -269,6 +269,37 @@ do_bootstrap[vardeps] += " \ do_bootstrap[dirs] = "${DEPLOY_DIR_BOOTSTRAP}" do_bootstrap[depends] = "base-apt:do_cache isar-apt:do_cache_config" +do_localrepo[lockfiles] = "${TMPDIR}/debrepo/${BASE_DISTRO}-${BASE_DISTRO_CODENAME}/isar.lock" +do_localrepo[depends] = "base-apt:do_cache isar-apt:do_cache_config" +do_localrepo() { + debrepo_args="" + if [ "${BASE_DISTRO}" != "debian" ]; then + if [ "${BASE_DISTRO}" != "raspbian" ] && [ "${BASE_DISTRO}" != "raspios" ] || [ "${BOOTSTRAP_FOR_HOST}" = "0" ]; then + debrepo_args="$debrepo_args --keydir=${WORKDIR}" + fi + fi + if [ "${ISAR_USE_CACHED_BASE_REPO}" = "1" ]; then + debrepo_args="$debrepo_args --no-check-gpg" + fi + if [ "${BOOTSTRAP_FOR_HOST}" = "0" ]; then + arch_param="--arch=${DISTRO_ARCH}" + else + arch_param="--arch=${HOST_ARCH}" + fi + ${SCRIPTSDIR}/debrepo --init \ + --workdir="${TMPDIR}/debrepo/${BASE_DISTRO}-${BASE_DISTRO_CODENAME}" \ + --repodir="${REPO_BASE_DIR}" \ + --repodbdir="${REPO_BASE_DB_DIR}" \ + --mirror="${@get_distro_source(d)}" \ + ${arch_param} \ + --distro="${BASE_DISTRO}" \ + --codename="${BASE_DISTRO_CODENAME}" \ + --components="main,contrib,non-free" \ + ${debrepo_args} \ + gnupg locales + #deb_dl_dir_export "${TMPDIR}/debrepo/${BASE_DISTRO}-${BASE_DISTRO_CODENAME}" "${BOOTSTRAP_DISTRO}" +} + do_bootstrap() { if [ "${ISAR_ENABLE_COMPAT_ARCH}" = "1" ]; then if [ -z "${COMPAT_DISTRO_ARCH}" ]; then @@ -291,6 +322,7 @@ do_bootstrap() { sudo rm -rf --one-file-system "${ROOTFSDIR}" deb_dl_dir_import "${ROOTFSDIR}" "${BOOTSTRAP_DISTRO}" + debootstrap_args="$debootstrap_args --no-check-gpg" sudo -E -s <<'EOSUDO' set -e if [ "${BOOTSTRAP_FOR_HOST}" = "0" ]; then @@ -301,7 +333,7 @@ do_bootstrap() { ${@get_distro_components_argument(d)} \ "${@get_distro_suite(d)}" \ "${ROOTFSDIR}" \ - "${@get_distro_source(d)}" \ + "file://${REPO_BASE_DIR}/${BASE_DISTRO}" \ ${DISTRO_DEBOOTSTRAP_SCRIPT} # Install apt config @@ -393,6 +425,7 @@ EOSUDO } addtask bootstrap before do_build after do_generate_keyrings +addtask localrepo before do_bootstrap after do_generate_keyrings SSTATETASKS += "do_bootstrap" SSTATECREATEFUNCS += "bootstrap_sstate_prepare" -- 2.20.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 3/5] meta: always use base-apt repo in local mode 2022-03-25 10:32 [PATCH v3 0/5] Improving base-apt usage PoC Uladzimir Bely 2022-03-25 10:32 ` [PATCH v3 1/5] Add debrepo python script handling base-apt Uladzimir Bely 2022-03-25 10:32 ` [PATCH v3 2/5] meta: Use cached base-apt repo to debootstrap Uladzimir Bely @ 2022-03-25 10:32 ` Uladzimir Bely 2022-03-25 10:32 ` [PATCH v3 4/5] base-apt: Predownload packages to base-apt before install Uladzimir Bely 2022-03-25 10:32 ` [PATCH v3 5/5] draft: make isar-apt repo visible for base-apt Uladzimir Bely 4 siblings, 0 replies; 7+ messages in thread From: Uladzimir Bely @ 2022-03-25 10:32 UTC (permalink / raw) To: isar-users This means that only local URLs in apt sources.list* is present during the build. Any installation of packages is done from local base-apt. So, base-apt should be always mounted in *_do_mounts since now. Signed-off-by: Uladzimir Bely <ubely@ilbers.de> --- meta/classes/buildchroot.bbclass | 10 +++----- meta/classes/rootfs.bbclass | 10 +++----- .../isar-bootstrap/isar-bootstrap.inc | 24 ++++++++----------- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/meta/classes/buildchroot.bbclass b/meta/classes/buildchroot.bbclass index dd8f4206..23e78c24 100644 --- a/meta/classes/buildchroot.bbclass +++ b/meta/classes/buildchroot.bbclass @@ -50,13 +50,9 @@ buildchroot_do_mounts() { 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 + mkdir -p '${BUILDCHROOT_DIR}/base-apt' + mountpoint -q '${BUILDCHROOT_DIR}/base-apt' || \ + mount --bind '${REPO_BASE_DIR}' '${BUILDCHROOT_DIR}/base-apt' # Refresh or remove /etc/resolv.conf at this chance if [ "${@repr(bb.utils.to_boolean(d.getVar('BB_NO_NETWORK')))}" = 'True' ] diff --git a/meta/classes/rootfs.bbclass b/meta/classes/rootfs.bbclass index ba86c60a..54d1f714 100644 --- a/meta/classes/rootfs.bbclass +++ b/meta/classes/rootfs.bbclass @@ -52,13 +52,9 @@ rootfs_do_mounts() { 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 + mkdir -p '${ROOTFSDIR}/base-apt' + mountpoint -q '${ROOTFSDIR}/base-apt' || \ + mount --bind '${REPO_BASE_DIR}' '${ROOTFSDIR}/base-apt' EOSUDO } diff --git a/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc b/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc index 24925dbb..545bd474 100644 --- a/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc +++ b/meta/recipes-core/isar-bootstrap/isar-bootstrap.inc @@ -341,20 +341,16 @@ do_bootstrap() { install -v -m644 "${APTPREFS}" \ "${ROOTFSDIR}/etc/apt/preferences.d/bootstrap" mkdir -p "${ROOTFSDIR}/etc/apt/sources.list.d" - if [ "${ISAR_USE_CACHED_BASE_REPO}" = "1" ]; then - line="file:///base-apt/${BASE_DISTRO} ${BASE_DISTRO_CODENAME} main" - if [ -z "${BASE_REPO_KEY}" ]; then - line="[trusted=yes] ${line}" - 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" - fi + + line="file:///base-apt/${BASE_DISTRO} ${BASE_DISTRO_CODENAME} main" + [ -z "${BASE_REPO_KEY}" ] && line="[trusted=yes] ${line}" + + 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 + install -v -m644 "${APTSRCS_INIT}" "${ROOTFSDIR}/etc/apt/sources-list" rm -f "${ROOTFSDIR}/etc/apt/sources.list" rm -rf "${ROOTFSDIR}/var/lib/apt/lists/"* -- 2.20.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 4/5] base-apt: Predownload packages to base-apt before install. 2022-03-25 10:32 [PATCH v3 0/5] Improving base-apt usage PoC Uladzimir Bely ` (2 preceding siblings ...) 2022-03-25 10:32 ` [PATCH v3 3/5] meta: always use base-apt repo in local mode Uladzimir Bely @ 2022-03-25 10:32 ` Uladzimir Bely 2022-03-30 13:41 ` Moessbauer, Felix 2022-03-25 10:32 ` [PATCH v3 5/5] draft: make isar-apt repo visible for base-apt Uladzimir Bely 4 siblings, 1 reply; 7+ messages in thread From: Uladzimir Bely @ 2022-03-25 10:32 UTC (permalink / raw) To: isar-users This patch uses debrepo script to predownload packages to base-apt repository before they are installed in buildchroot/rootfs. Signed-off-by: Uladzimir Bely <ubely@ilbers.de> --- meta/classes/dpkg-base.bbclass | 8 ++++++++ meta/classes/dpkg-gbp.bbclass | 7 +++++++ meta/classes/dpkg.bbclass | 7 +++++++ meta/classes/image-locales-extension.bbclass | 7 +++++++ meta/classes/image-tools-extension.bbclass | 7 +++++++ meta/classes/rootfs.bbclass | 20 ++++++++++++++++++++ 6 files changed, 56 insertions(+) diff --git a/meta/classes/dpkg-base.bbclass b/meta/classes/dpkg-base.bbclass index 86933c57..6106ca01 100644 --- a/meta/classes/dpkg-base.bbclass +++ b/meta/classes/dpkg-base.bbclass @@ -102,8 +102,16 @@ python() { } do_apt_fetch() { + ${SCRIPTSDIR}/debrepo \ + --srcmode \ + --workdir="${TMPDIR}/debrepo/${BASE_DISTRO}-${BASE_DISTRO_CODENAME}" \ + ${SRC_APT} 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/base-apt.list" \ + -o Dir::Etc::SourceParts="-" \ + -o APT::Get::List-Cleanup="0" sudo -E chroot ${BUILDCHROOT_DIR} /usr/bin/apt-get update \ -o Dir::Etc::SourceList="sources.list.d/isar-apt.list" \ -o Dir::Etc::SourceParts="-" \ diff --git a/meta/classes/dpkg-gbp.bbclass b/meta/classes/dpkg-gbp.bbclass index d956e8c3..4d583a79 100644 --- a/meta/classes/dpkg-gbp.bbclass +++ b/meta/classes/dpkg-gbp.bbclass @@ -13,7 +13,14 @@ GBP_DEPENDS ?= "git-buildpackage pristine-tar" GBP_EXTRA_OPTIONS ?= "--git-pristine-tar" do_install_builddeps_append() { + ${SCRIPTSDIR}/debrepo \ + --workdir="${TMPDIR}/debrepo/${BASE_DISTRO}-${BASE_DISTRO_CODENAME}" \ + ${GBP_DEPENDS} dpkg_do_mounts + sudo -E chroot '${BUILDCHROOT_DIR}' /usr/bin/apt-get update \ + -o Dir::Etc::SourceList="sources.list.d/base-apt.list" \ + -o Dir::Etc::SourceParts="-" \ + -o APT::Get::List-Cleanup="0" distro="${DISTRO}" if [ ${ISAR_CROSS_COMPILE} -eq 1 ]; then distro="${HOST_DISTRO}" diff --git a/meta/classes/dpkg.bbclass b/meta/classes/dpkg.bbclass index 320102ba..d167a01d 100644 --- a/meta/classes/dpkg.bbclass +++ b/meta/classes/dpkg.bbclass @@ -7,7 +7,14 @@ PACKAGE_ARCH ?= "${DISTRO_ARCH}" # Install build dependencies for package do_install_builddeps() { + ${SCRIPTSDIR}/debrepo \ + --workdir="${TMPDIR}/debrepo/${BASE_DISTRO}-${BASE_DISTRO_CODENAME}" \ + --controlfile="${WORKDIR}/${PPS}/debian/control" dpkg_do_mounts + sudo -E chroot '${BUILDCHROOT_DIR}' /usr/bin/apt-get update \ + -o Dir::Etc::SourceList="sources.list.d/base-apt.list" \ + -o Dir::Etc::SourceParts="-" \ + -o APT::Get::List-Cleanup="0" E="${@ isar_export_proxies(d)}" export DEB_BUILD_OPTIONS="${@ isar_deb_build_options(d)}" export DEB_BUILD_PROFILES="${@ isar_deb_build_profiles(d)}" diff --git a/meta/classes/image-locales-extension.bbclass b/meta/classes/image-locales-extension.bbclass index 25af5407..a05f0917 100644 --- a/meta/classes/image-locales-extension.bbclass +++ b/meta/classes/image-locales-extension.bbclass @@ -28,6 +28,13 @@ def get_nopurge(d): ROOTFS_INSTALL_COMMAND_BEFORE_EXPORT += "image_install_localepurge_download" image_install_localepurge_download[weight] = "40" image_install_localepurge_download() { + ${SCRIPTSDIR}/debrepo \ + --workdir="${TMPDIR}/debrepo/${BASE_DISTRO}-${BASE_DISTRO_CODENAME}" \ + localepurge + sudo -E chroot '${ROOTFSDIR}' /usr/bin/apt-get update \ + -o Dir::Etc::SourceList="sources.list.d/base-apt.list" \ + -o Dir::Etc::SourceParts="-" \ + -o APT::Get::List-Cleanup="0" sudo -E chroot '${ROOTFSDIR}' \ /usr/bin/apt-get ${ROOTFS_APT_ARGS} --download-only localepurge } diff --git a/meta/classes/image-tools-extension.bbclass b/meta/classes/image-tools-extension.bbclass index b9968139..359991e3 100644 --- a/meta/classes/image-tools-extension.bbclass +++ b/meta/classes/image-tools-extension.bbclass @@ -22,10 +22,17 @@ do_install_imager_deps() { exit fi + ${SCRIPTSDIR}/debrepo \ + --workdir="${TMPDIR}/debrepo/${BASE_DISTRO}-${BASE_DISTRO_CODENAME}" \ + ${IMAGER_INSTALL} buildchroot_do_mounts E="${@ isar_export_proxies(d)}" deb_dl_dir_import ${BUILDCHROOT_DIR} ${DISTRO} + sudo -E chroot ${BUILDCHROOT_DIR} /usr/bin/apt-get update \ + -o Dir::Etc::SourceList="sources.list.d/base-apt.list" \ + -o Dir::Etc::SourceParts="-" \ + -o APT::Get::List-Cleanup="0" sudo -E chroot ${BUILDCHROOT_DIR} sh -c ' \ apt-get update \ -o Dir::Etc::SourceList="sources.list.d/isar-apt.list" \ diff --git a/meta/classes/rootfs.bbclass b/meta/classes/rootfs.bbclass index 54d1f714..4019b216 100644 --- a/meta/classes/rootfs.bbclass +++ b/meta/classes/rootfs.bbclass @@ -94,6 +94,23 @@ EOF EOSUDO } +ROOTFS_INSTALL_COMMAND += "rootfs_base_apt_populate" +rootfs_base_apt_populate[weight] = "600" +rootfs_base_apt_populate() { + ${SCRIPTSDIR}/debrepo \ + --workdir="${TMPDIR}/debrepo/${BASE_DISTRO}-${BASE_DISTRO_CODENAME}" \ + ${ROOTFS_PACKAGES} +} + +ROOTFS_INSTALL_COMMAND += "rootfs_base_apt_pkgs_update" +rootfs_base_apt_pkgs_update[weight] = "5" +rootfs_base_apt_pkgs_update() { + sudo -E chroot '${ROOTFSDIR}' /usr/bin/apt-get update \ + -o Dir::Etc::SourceList="sources.list.d/base-apt.list" \ + -o Dir::Etc::SourceParts="-" \ + -o APT::Get::List-Cleanup="0" +} + ROOTFS_CONFIGURE_COMMAND += "rootfs_configure_apt" rootfs_configure_apt[weight] = "2" rootfs_configure_apt() { @@ -139,6 +156,9 @@ ROOTFS_INSTALL_COMMAND += "rootfs_install_pkgs_download" rootfs_install_pkgs_download[weight] = "600" rootfs_install_pkgs_download[isar-apt-lock] = "release-after" rootfs_install_pkgs_download() { + ${SCRIPTSDIR}/debrepo \ + --workdir="${TMPDIR}/debrepo/${BASE_DISTRO}-${BASE_DISTRO_CODENAME}" \ + ${ROOTFS_PACKAGES} sudo -E chroot '${ROOTFSDIR}' \ /usr/bin/apt-get ${ROOTFS_APT_ARGS} --download-only ${ROOTFS_PACKAGES} } -- 2.20.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH v3 4/5] base-apt: Predownload packages to base-apt before install. 2022-03-25 10:32 ` [PATCH v3 4/5] base-apt: Predownload packages to base-apt before install Uladzimir Bely @ 2022-03-30 13:41 ` Moessbauer, Felix 0 siblings, 0 replies; 7+ messages in thread From: Moessbauer, Felix @ 2022-03-30 13:41 UTC (permalink / raw) To: Uladzimir Bely; +Cc: isar-users, jan.kiszka, Schmidt, Adriaan > -----Original Message----- > From: isar-users@googlegroups.com <isar-users@googlegroups.com> On > Behalf Of Uladzimir Bely > Sent: Friday, March 25, 2022 11:32 AM > To: isar-users@googlegroups.com > Subject: [PATCH v3 4/5] base-apt: Predownload packages to base-apt before > install. > > This patch uses debrepo script to predownload packages to base-apt repository > before they are installed in buildchroot/rootfs. > > Signed-off-by: Uladzimir Bely <ubely@ilbers.de> > --- > meta/classes/dpkg-base.bbclass | 8 ++++++++ > meta/classes/dpkg-gbp.bbclass | 7 +++++++ > meta/classes/dpkg.bbclass | 7 +++++++ > meta/classes/image-locales-extension.bbclass | 7 +++++++ > meta/classes/image-tools-extension.bbclass | 7 +++++++ > meta/classes/rootfs.bbclass | 20 ++++++++++++++++++++ > 6 files changed, 56 insertions(+) > > diff --git a/meta/classes/dpkg-base.bbclass b/meta/classes/dpkg-base.bbclass > index 86933c57..6106ca01 100644 > --- a/meta/classes/dpkg-base.bbclass > +++ b/meta/classes/dpkg-base.bbclass > @@ -102,8 +102,16 @@ python() { > } > > do_apt_fetch() { > + ${SCRIPTSDIR}/debrepo \ > + --srcmode \ > + --workdir="${TMPDIR}/debrepo/${BASE_DISTRO}- > ${BASE_DISTRO_CODENAME}" \ > + ${SRC_APT} > 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/base-apt.list" \ > + -o Dir::Etc::SourceParts="-" \ > + -o APT::Get::List-Cleanup="0" Hi, This looks like a lot of code duplication. We already have a bunch of similar calls to apt spread across ISAR. Just to name a few: - buildchroot/files/deps.sh - deb-dl-dir.bbclass - dpkg-base.bbclass - dpkg-gbp.bbclass - image-locales-extension.bbclass - image-tools-extension.bbclass - rootfs.bbclass - isar-bootstrap.inc With sbuilder the situation will get even worse, as the do_install_builddeps task is no longer available. By that, users that have to prepare their sources in advance to building will manually have to fiddle around with apt to install pre-build dependencies. Affected OSS layers I know of are meta-coral (dpkg-bazel.bbclass) and meta-iot2050 (npm.bbclass). Maybe we should re-think our apt handling and add a proper infrastructure. By that, we can handle all options centrally and give the user an easy to use interface to install a package. Also error prone aspects like mounts and locks should be handled by that infrastructure. Finally, this would significantly reduce future maintenance effort in downstream layers. Felix -- Siemens AG, Technology, T CED SES-DE Otto-Hahn-Ring 6, 81739 München, Germany ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 5/5] draft: make isar-apt repo visible for base-apt 2022-03-25 10:32 [PATCH v3 0/5] Improving base-apt usage PoC Uladzimir Bely ` (3 preceding siblings ...) 2022-03-25 10:32 ` [PATCH v3 4/5] base-apt: Predownload packages to base-apt before install Uladzimir Bely @ 2022-03-25 10:32 ` Uladzimir Bely 4 siblings, 0 replies; 7+ messages in thread From: Uladzimir Bely @ 2022-03-25 10:32 UTC (permalink / raw) To: isar-users some packages in isar-apt (like sshd-regen-keys) may depend on debian packages (openssh-server). So, base-apt need access to isar-apt repo to be able to download these deps. TODO: make it work in cross-build mode --- scripts/debrepo | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/debrepo b/scripts/debrepo index fba8342e..f6e95cfe 100755 --- a/scripts/debrepo +++ b/scripts/debrepo @@ -91,6 +91,8 @@ class DebRepo(object): f = open(self.workdir + "/etc/apt/sources.list", "w") f.write("deb [arch=" + self.arch + "] " + self.mirror + " " + self.codename + " " + self.components + "\n") f.write("deb-src [arch=" + self.arch + "] " + self.mirror + " " + self.codename + " " + self.components + "\n") + f.write("deb [trusted=yes] file://" + self.workdir + "/../../deploy/isar-apt/" + self.distro + "-" + self.codename + "-" + self.arch + "/apt/" + self.distro + "-" + self.codename + " isar main\n") + f.flush f.close -- 2.20.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-03-30 13:41 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-03-25 10:32 [PATCH v3 0/5] Improving base-apt usage PoC Uladzimir Bely 2022-03-25 10:32 ` [PATCH v3 1/5] Add debrepo python script handling base-apt Uladzimir Bely 2022-03-25 10:32 ` [PATCH v3 2/5] meta: Use cached base-apt repo to debootstrap Uladzimir Bely 2022-03-25 10:32 ` [PATCH v3 3/5] meta: always use base-apt repo in local mode Uladzimir Bely 2022-03-25 10:32 ` [PATCH v3 4/5] base-apt: Predownload packages to base-apt before install Uladzimir Bely 2022-03-30 13:41 ` Moessbauer, Felix 2022-03-25 10:32 ` [PATCH v3 5/5] draft: make isar-apt repo visible for base-apt Uladzimir Bely
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox