From mboxrd@z Thu Jan 1 00:00:00 1970 X-GM-THRID: 6979144214095331328 X-Received: by 2002:a05:6402:22ab:: with SMTP id cx11mr3450678edb.240.1628864401097; Fri, 13 Aug 2021 07:20:01 -0700 (PDT) X-BeenThere: isar-users@googlegroups.com Received: by 2002:a17:906:d1d6:: with SMTP id bs22ls752607ejb.3.gmail; Fri, 13 Aug 2021 07:20:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyHrZwCBqZuJVPuzgyWeqVzDnVjF0IXarUYh6bxRDPo5AH/SP17YPlYFgInnot56zCSuW6G X-Received: by 2002:a17:907:a06c:: with SMTP id ia12mr2648968ejc.377.1628864400027; Fri, 13 Aug 2021 07:20:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628864400; cv=none; d=google.com; s=arc-20160816; b=HjzJG0vsg3myp21L3N5xwhAfDewvURI3z81pF1Ge+KLvtQJeiiRBFTPhmX797d64L/ Rr/ecxrdaRmiQpgZyr0Md4rwue0gPxO0xIPadWuYdHKPjCNjLb8Fa2gxyzMfdh2GrjI0 16TA3zxlGSLAnuRgf7AZvvjn2Avn3ljdYusweMqG7Y56THh7yt+UgA8+9ze9yiN+WPAK doUZGtHM5cuMXnILk1JxqqCmHNWh2NdV84PX02Li2lfzylec4DljirtVh/A52dS8G51o tXYkXvtUGCkU2X7F/C38cTfCOPCn4xQ0cKG7YD/Hmmn+Mcq9vVwhVVHlc5conf2D+2qj VusA== 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:subject:cc:to:from:date; bh=4kL8FiSFtDTi1dSdZvA5PUPJ2HiU3MCtGnw+MBLnB28=; b=gIw79inrkPT2n9TwhsjZoxLCTltoJ0XbnuWgCE00PLVsMfQM1y2HQTCbntsxDjd69K YfmyNJW0wwbRHiPhQnOl0ecxmqLaTZn1epz+FkXBzgT5TdPmdyGtTREG3IHiNZxdRC4A IpNwnqIfnd1yZQ1RGNzj/Nvs7kguJ3e77BpnYFrV2ON2/uKCGTXGL4TPO9PwFK2djzlE kDEdlF66cpaNuuKNtXrdHxORtPg6p2+YqeADGUp455U6q3TDyTOmm7jeCA7vkFbqs/0G o9msRkdObS6oGi9iM2ofegIokWD9ZdLHjmsQM+jcUGxwLZenfY3exKC8bs9D0LH/oii6 n+mg== ARC-Authentication-Results: i=1; gmr-mx.google.com; spf=pass (google.com: domain of henning.schild@siemens.com designates 194.138.37.40 as permitted sender) smtp.mailfrom=henning.schild@siemens.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Return-Path: Received: from gecko.sbs.de (gecko.sbs.de. [194.138.37.40]) by gmr-mx.google.com with ESMTPS id h14si135705edr.3.2021.08.13.07.19.59 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 13 Aug 2021 07:20:00 -0700 (PDT) Received-SPF: pass (google.com: domain of henning.schild@siemens.com designates 194.138.37.40 as permitted sender) client-ip=194.138.37.40; Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of henning.schild@siemens.com designates 194.138.37.40 as permitted sender) smtp.mailfrom=henning.schild@siemens.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Received: from mail1.sbs.de (mail1.sbs.de [192.129.41.35]) by gecko.sbs.de (8.15.2/8.15.2) with ESMTPS id 17DEJxUr005199 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 13 Aug 2021 16:19:59 +0200 Received: from md1za8fc.ad001.siemens.net ([139.25.0.59]) by mail1.sbs.de (8.15.2/8.15.2) with ESMTP id 17DEJxlA009705; Fri, 13 Aug 2021 16:19:59 +0200 Date: Fri, 13 Aug 2021 16:19:58 +0200 From: Henning Schild To: Uladzimir Bely Cc: isar-users Subject: Re: [PATCH v2 2/3] wic: Update to the latest revision Message-ID: <20210813161958.0eb32e42@md1za8fc.ad001.siemens.net> In-Reply-To: <19fd3397-05b9-4063-b267-a80c7b0ad5bcn@googlegroups.com> References: <20210629092225.18415-1-ubely@ilbers.de> <20210629092225.18415-3-ubely@ilbers.de> <20210809155341.355ff03b@md1za8fc.ad001.siemens.net> <19fd3397-05b9-4063-b267-a80c7b0ad5bcn@googlegroups.com> X-Mailer: Claws Mail 3.17.8 (GTK+ 2.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-TUID: JxuigLUCdj3Z Am Fri, 13 Aug 2021 02:35:08 -0700 (PDT) schrieb Uladzimir Bely : > Original file (scripts/lib/wic/plugins/source/bootimg-efi.py) with > latest update switched from IMAGE_BOOT_FILES usage to > IMAGE_EFI_BOOT_FILES. None of these variables is used in forked > plugin, so that it didn't get updates The fork should follow the original and the diff should only be isar-stuff, not lazy out-of-sync stuff mixed in as well. In fact these forked files cause enough pain that we should look into mainlining the changes. It would be about adding some variables to the originals where isar would use different defaults. The forking and renaming causes more forking ... just because the names are different. i.e. wks files Henning > On Monday, August 9, 2021 at 4:53:43 PM UTC+3 Henning Schild wrote: > > > Am Tue, 29 Jun 2021 11:22:24 +0200 > > schrieb Uladzimir Bely : > > > > > From: Anton Mikanovich > > > > > > Update to the latest wic from OE-core. > > > > > > OE-core Revision: b85a09ea450a5e8f49418f4a930805fbb88dc83b > > > > > > Signed-off-by: Anton Mikanovich > > > Signed-off-by: Uladzimir Bely > > > --- > > > scripts/lib/wic/canned-wks/common.wks.inc | 2 +- > > > scripts/lib/wic/canned-wks/directdisk-gpt.wks | 2 +- > > > scripts/lib/wic/canned-wks/mkefidisk.wks | 2 +- > > > scripts/lib/wic/ksparser.py | 17 ++++ > > > scripts/lib/wic/misc.py | 8 +- > > > scripts/lib/wic/partition.py | 96 > > > ++++++++++++++++--- scripts/lib/wic/plugins/imager/direct.py | > > > 61 ++++++------ scripts/lib/wic/plugins/source/bootimg-efi.py | 8 > > > +- > > > > Our fork of that plugin now needs to sync up again to only differ in > > the parts we need it to differ in. > > > > meta/scripts/wic/plugins/source/bootimg-efi-isar.py > > > > Henning > > > > > scripts/lib/wic/plugins/source/empty.py | 32 +++++++ > > > .../wic/plugins/source/isoimage-isohybrid.py | 14 +++ > > > scripts/lib/wic/plugins/source/rootfs.py | 33 +++++-- > > > scripts/wic | 2 + > > > 12 files changed, 217 insertions(+), 60 deletions(-) > > > create mode 100644 scripts/lib/wic/plugins/source/empty.py > > > > > > diff --git a/scripts/lib/wic/canned-wks/common.wks.inc > > > b/scripts/lib/wic/canned-wks/common.wks.inc index 89880b4..4fd29fa > > > 100644 --- a/scripts/lib/wic/canned-wks/common.wks.inc > > > +++ b/scripts/lib/wic/canned-wks/common.wks.inc > > > @@ -1,3 +1,3 @@ > > > # This file is included into 3 canned wks files from this > > > directory part /boot --source bootimg-pcbios --ondisk sda --label > > > boot --active --align 1024 -part / --source rootfs --use-uuid > > > --fstype=ext4 --label platform --align 1024 +part / --source > > > rootfs --use-uuid --fstype=ext4 --mkfs-extraopts "-T default" > > > --label platform --align 1024 diff --git > > > a/scripts/lib/wic/canned-wks/directdisk-gpt.wks > > > b/scripts/lib/wic/canned-wks/directdisk-gpt.wks index > > > 8d7d8de..cf16c0c 100644 --- > > > a/scripts/lib/wic/canned-wks/directdisk-gpt.wks +++ > > > b/scripts/lib/wic/canned-wks/directdisk-gpt.wks @@ -4,7 +4,7 @@ > > > part /boot --source bootimg-pcbios --ondisk sda --label boot > > > --active --align 1024 -part / --source rootfs --ondisk sda > > > --fstype=ext4 --label platform --align 1024 --use-uuid +part / > > > --source rootfs --ondisk sda --fstype=ext4 --mkfs-extraopts "-T > > > default" --label platform --align 1024 --use-uuid bootloader > > > --ptable gpt --timeout=0 --append="rootwait rootfstype=ext4 > > > video=vesafb vga=0x318 console=tty0 console=ttyS0,115200n8" diff > > > --git a/scripts/lib/wic/canned-wks/mkefidisk.wks > > > b/scripts/lib/wic/canned-wks/mkefidisk.wks index 9f534fe..d1878e2 > > > 100644 --- a/scripts/lib/wic/canned-wks/mkefidisk.wks +++ > > > b/scripts/lib/wic/canned-wks/mkefidisk.wks @@ -4,7 +4,7 @@ > > > > > > part /boot --source bootimg-efi --sourceparams="loader=grub-efi" > > > --ondisk sda --label msdos --active --align 1024 > > > -part / --source rootfs --ondisk sda --fstype=ext4 --label > > > platform --align 1024 --use-uuid +part / --source rootfs --ondisk > > > sda --fstype=ext4 --mkfs-extraopts "-T default" --label platform > > > --align 1024 --use-uuid part swap --ondisk sda --size 44 --label > > > swap1 --fstype=swap > > > diff --git a/scripts/lib/wic/ksparser.py > > > b/scripts/lib/wic/ksparser.py index 913e328..3eb669d 100644 > > > --- a/scripts/lib/wic/ksparser.py > > > +++ b/scripts/lib/wic/ksparser.py > > > @@ -229,6 +229,23 @@ class KickStart(): > > > err = "%s:%d: SquashFS does not > > > support LABEL" \ % (confpath, lineno) > > > raise KickStartError(err) > > > + if parsed.fstype == 'msdos' or parsed.fstype > > > == 'vfat': > > > + if parsed.fsuuid: > > > + if > > > parsed.fsuuid.upper().startswith('0X'): > > > + if len(parsed.fsuuid) > 10: > > > + err = "%s:%d: fsuuid %s > > > given in wks kickstart file " \ > > > + "exceeds the length > > > limit for %s filesystem. " \ > > > + "It should be in the > > > form of a 32 bit hexadecimal" \ > > > + "number (for example, > > > 0xABCD1234)." \ > > > + % (confpath, lineno, > > > parsed.fsuuid, parsed.fstype) > > > + raise KickStartError(err) > > > + elif len(parsed.fsuuid) > 8: > > > + err = "%s:%d: fsuuid %s given in > > > wks kickstart file " \ > > > + "exceeds the length limit > > > for %s filesystem. " \ > > > + "It should be in the form > > > of a 32 bit hexadecimal" \ > > > + "number (for example, > > > 0xABCD1234)." \ > > > + % (confpath, lineno, > > > parsed.fsuuid, parsed.fstype) > > > + raise KickStartError(err) > > > if parsed.use_label and not parsed.label: > > > err = "%s:%d: Must set the label with > > > --label" \ % (confpath, lineno) > > > diff --git a/scripts/lib/wic/misc.py b/scripts/lib/wic/misc.py > > > index 4b08d64..57c042c 100644 > > > --- a/scripts/lib/wic/misc.py > > > +++ b/scripts/lib/wic/misc.py > > > @@ -26,6 +26,7 @@ logger = logging.getLogger('wic') > > > > > > # executable -> recipe pairs for exec_native_cmd > > > NATIVE_RECIPES = {"bmaptool": "bmap-tools", > > > + "dumpe2fs": "e2fsprogs", > > > "grub-mkimage": "grub-efi", > > > "isohybrid": "syslinux", > > > "mcopy": "mtools", > > > @@ -138,9 +139,12 @@ def exec_native_cmd(cmd_and_args, > > > native_sysroot, pseudo=""): if pseudo: > > > cmd_and_args = pseudo + cmd_and_args > > > > > > - native_paths = "%s/sbin:%s/usr/sbin:%s/usr/bin:%s/bin" % \ > > > + hosttools_dir = get_bitbake_var("HOSTTOOLS_DIR") > > > + > > > + native_paths = "%s/sbin:%s/usr/sbin:%s/usr/bin:%s/bin:%s" % \ > > > (native_sysroot, native_sysroot, > > > - native_sysroot, native_sysroot) > > > + native_sysroot, native_sysroot, > > > + hosttools_dir) > > > > > > native_cmd_and_args = "export PATH=%s:$PATH;%s" % \ > > > (native_paths, cmd_and_args) > > > diff --git a/scripts/lib/wic/partition.py > > > b/scripts/lib/wic/partition.py index 85eb15c..76d144d 100644 > > > --- a/scripts/lib/wic/partition.py > > > +++ b/scripts/lib/wic/partition.py > > > @@ -54,6 +54,9 @@ class Partition(): > > > self.uuid = args.uuid > > > self.fsuuid = args.fsuuid > > > self.type = args.type > > > + self.updated_fstab_path = None > > > + self.has_fstab = False > > > + self.update_fstab_in_rootfs = False > > > > > > self.lineno = lineno > > > self.source_file = "" > > > @@ -118,11 +121,15 @@ class Partition(): > > > return self.fixed_size if self.fixed_size else self.size > > > > > > def prepare(self, creator, cr_workdir, oe_builddir, rootfs_dir, > > > - bootimg_dir, kernel_dir, native_sysroot): > > > + bootimg_dir, kernel_dir, native_sysroot, > > > updated_fstab_path): """ > > > Prepare content for individual partitions, depending on > > > partition command parameters. > > > """ > > > + self.updated_fstab_path = updated_fstab_path > > > + if self.updated_fstab_path and not > > > (self.fstype.startswith("ext") or self.fstype == "msdos"): > > > + self.update_fstab_in_rootfs = True > > > + > > > if not self.source: > > > if not self.size and not self.fixed_size: > > > raise WicError("The %s partition has a size of zero. > > > Please " @@ -199,21 +206,33 @@ class Partition(): > > > > > > Currently handles ext2/3/4, btrfs, vfat and squashfs. > > > """ > > > + > > > + rootfs = "%s/rootfs_%s.%s.%s" % (cr_workdir, self.label, > > > + self.lineno, self.fstype) > > > + if os.path.isfile(rootfs): > > > + os.remove(rootfs) > > > + > > > p_prefix = os.environ.get("PSEUDO_PREFIX", "%s/usr" % > > > native_sysroot) if (pseudo_dir): > > > + # Canonicalize the ignore paths. This corresponds to > > > + # calling oe.path.canonicalize(), which is used in > > > bitbake.conf. > > > + ignore_paths = [rootfs] + > > > (get_bitbake_var("PSEUDO_IGNORE_PATHS") or "").split(",") > > > + canonical_paths = [] > > > + for path in ignore_paths: > > > + if "$" not in path: > > > + trailing_slash = path.endswith("/") and "/" or "" > > > + canonical_paths.append(os.path.realpath(path) + > > > trailing_slash) > > > + ignore_paths = ",".join(canonical_paths) > > > + > > > pseudo = "export PSEUDO_PREFIX=%s;" % p_prefix > > > pseudo += "export PSEUDO_LOCALSTATEDIR=%s;" % pseudo_dir > > > pseudo += "export PSEUDO_PASSWD=%s;" % rootfs_dir > > > pseudo += "export PSEUDO_NOSYMLINKEXP=1;" > > > + pseudo += "export PSEUDO_IGNORE_PATHS=%s;" % ignore_paths > > > pseudo += "%s " % get_bitbake_var("FAKEROOTCMD") > > > else: > > > pseudo = None > > > > > > - rootfs = "%s/rootfs_%s.%s.%s" % (cr_workdir, self.label, > > > - self.lineno, self.fstype) > > > - if os.path.isfile(rootfs): > > > - os.remove(rootfs) > > > - > > > if not self.size and real_rootfs: > > > # The rootfs size is not set in .ks file so try to get it > > > # from bitbake variable > > > @@ -235,7 +254,7 @@ class Partition(): > > > > > > prefix = "ext" if self.fstype.startswith("ext") else > > > self.fstype method = getattr(self, "prepare_rootfs_" + prefix) > > > - method(rootfs, oe_builddir, rootfs_dir, native_sysroot, > > > pseudo) > > > + method(rootfs, cr_workdir, oe_builddir, rootfs_dir, > > > native_sysroot, pseudo) self.source_file = rootfs > > > > > > # get the rootfs size in the right units for kickstart (kB) > > > @@ -243,7 +262,7 @@ class Partition(): > > > out = exec_cmd(du_cmd) > > > self.size = int(out.split()[0]) > > > > > > - def prepare_rootfs_ext(self, rootfs, oe_builddir, rootfs_dir, > > > + def prepare_rootfs_ext(self, rootfs, cr_workdir, oe_builddir, > > > rootfs_dir, native_sysroot, pseudo): > > > """ > > > Prepare content for an ext2/3/4 rootfs partition. > > > @@ -267,10 +286,21 @@ class Partition(): > > > (self.fstype, extraopts, rootfs, label_str, self.fsuuid, > > > rootfs_dir) exec_native_cmd(mkfs_cmd, native_sysroot, > > > pseudo=pseudo) > > > > > > + if self.updated_fstab_path and self.has_fstab: > > > + debugfs_script_path = os.path.join(cr_workdir, > > > "debugfs_script") > > > + with open(debugfs_script_path, "w") as f: > > > + f.write("cd etc\n") > > > + f.write("rm fstab\n") > > > + f.write("write %s fstab\n" % > > > (self.updated_fstab_path)) > > > + debugfs_cmd = "debugfs -w -f %s %s" % > > > (debugfs_script_path, rootfs) > > > + exec_native_cmd(debugfs_cmd, native_sysroot) > > > + > > > mkfs_cmd = "fsck.%s -pvfD %s" % (self.fstype, rootfs) > > > exec_native_cmd(mkfs_cmd, native_sysroot, pseudo=pseudo) > > > > > > - def prepare_rootfs_btrfs(self, rootfs, oe_builddir, rootfs_dir, > > > + self.check_for_Y2038_problem(rootfs, native_sysroot) > > > + > > > + def prepare_rootfs_btrfs(self, rootfs, cr_workdir, oe_builddir, > > > rootfs_dir, native_sysroot, pseudo): > > > """ > > > Prepare content for a btrfs rootfs partition. > > > @@ -293,7 +323,7 @@ class Partition(): > > > self.mkfs_extraopts, self.fsuuid, rootfs) > > > exec_native_cmd(mkfs_cmd, native_sysroot, pseudo=pseudo) > > > > > > - def prepare_rootfs_msdos(self, rootfs, oe_builddir, rootfs_dir, > > > + def prepare_rootfs_msdos(self, rootfs, cr_workdir, oe_builddir, > > > rootfs_dir, native_sysroot, pseudo): > > > """ > > > Prepare content for a msdos/vfat rootfs partition. > > > @@ -309,8 +339,6 @@ class Partition(): > > > label_str = "-n %s" % self.label > > > > > > size_str = "" > > > - if self.fstype == 'msdos': > > > - size_str = "-F 16" # FAT 16 > > > > > > extraopts = self.mkfs_extraopts or '-S 512' > > > > > > @@ -322,12 +350,16 @@ class Partition(): > > > mcopy_cmd = "mcopy -i %s -s %s/* ::/" % (rootfs, rootfs_dir) > > > exec_native_cmd(mcopy_cmd, native_sysroot) > > > > > > + if self.updated_fstab_path and self.has_fstab: > > > + mcopy_cmd = "mcopy -i %s %s ::/etc/fstab" % (rootfs, > > > self.updated_fstab_path) > > > + exec_native_cmd(mcopy_cmd, native_sysroot) > > > + > > > chmod_cmd = "chmod 644 %s" % rootfs > > > exec_cmd(chmod_cmd) > > > > > > prepare_rootfs_vfat = prepare_rootfs_msdos > > > > > > - def prepare_rootfs_squashfs(self, rootfs, oe_builddir, > > > rootfs_dir, > > > + def prepare_rootfs_squashfs(self, rootfs, cr_workdir, > > > oe_builddir, rootfs_dir, native_sysroot, pseudo): > > > """ > > > Prepare content for a squashfs rootfs partition. > > > @@ -356,6 +388,8 @@ class Partition(): > > > (self.fstype, extraopts, label_str, self.fsuuid, rootfs) > > > exec_native_cmd(mkfs_cmd, native_sysroot) > > > > > > + self.check_for_Y2038_problem(rootfs, native_sysroot) > > > + > > > def prepare_empty_partition_btrfs(self, rootfs, oe_builddir, > > > native_sysroot): > > > """ > > > @@ -386,8 +420,6 @@ class Partition(): > > > label_str = "-n %s" % self.label > > > > > > size_str = "" > > > - if self.fstype == 'msdos': > > > - size_str = "-F 16" # FAT 16 > > > > > > extraopts = self.mkfs_extraopts or '-S 512' > > > > > > @@ -417,3 +449,37 @@ class Partition(): > > > > > > mkswap_cmd = "mkswap %s -U %s %s" % (label_str, self.fsuuid, > > > path) exec_native_cmd(mkswap_cmd, native_sysroot) > > > + > > > + def check_for_Y2038_problem(self, rootfs, native_sysroot): > > > + """ > > > + Check if the filesystem is affected by the Y2038 problem > > > + (Y2038 problem = 32 bit time_t overflow in January 2038) > > > + """ > > > + def get_err_str(part): > > > + err = "The {} filesystem {} has no Y2038 support." > > > + if part.mountpoint: > > > + args = [part.fstype, "mounted at %s" % > > > part.mountpoint] > > > + elif part.label: > > > + args = [part.fstype, "labeled '%s'" % part.label] > > > + elif part.part_name: > > > + args = [part.fstype, "in partition '%s'" % > > > part.part_name] > > > + else: > > > + args = [part.fstype, "in partition %s" % part.num] > > > + return err.format(*args) > > > + > > > + # ext2 and ext3 are always affected by the Y2038 problem > > > + if self.fstype in ["ext2", "ext3"]: > > > + logger.warn(get_err_str(self)) > > > + return > > > + > > > + ret, out = exec_native_cmd("dumpe2fs %s" % rootfs, > > > native_sysroot) + > > > + # if ext4 is affected by the Y2038 problem depends on the > > > inode size > > > + for line in out.splitlines(): > > > + if line.startswith("Inode size:"): > > > + size = int(line.split(":")[1].strip()) > > > + if size < 256: > > > + logger.warn("%s Inodes (of size %d) are too > > > small." % > > > + (get_err_str(self), size)) > > > + break > > > + > > > diff --git a/scripts/lib/wic/plugins/imager/direct.py > > > b/scripts/lib/wic/plugins/imager/direct.py index 55db826..ea709e8 > > > 100644 --- a/scripts/lib/wic/plugins/imager/direct.py > > > +++ b/scripts/lib/wic/plugins/imager/direct.py > > > @@ -54,15 +54,16 @@ class DirectPlugin(ImagerPlugin): > > > self.native_sysroot = native_sysroot > > > self.oe_builddir = oe_builddir > > > > > > + self.debug = options.debug > > > self.outdir = options.outdir > > > self.compressor = options.compressor > > > self.bmap = options.bmap > > > self.no_fstab_update = options.no_fstab_update > > > - self.original_fstab = None > > > + self.updated_fstab_path = None > > > > > > self.name = "%s-%s" % > > > (os.path.splitext(os.path.basename(wks_file))[0], > > > strftime("%Y%m%d%H%M")) > > > - self.workdir = tempfile.mkdtemp(dir=self.outdir, > > > prefix='tmp.wic.') > > > + self.workdir = self.setup_workdir(options.workdir) > > > self._image = None > > > self.ptable_format = self.ks.bootloader.ptable > > > self.parts = self.ks.partitions > > > @@ -78,6 +79,16 @@ class DirectPlugin(ImagerPlugin): > > > self._image = PartitionedImage(image_path, > > > self.ptable_format, self.parts, self.native_sysroot) > > > > > > + def setup_workdir(self, workdir): > > > + if workdir: > > > + if os.path.exists(workdir): > > > + raise WicError("Internal workdir '%s' specified in > > > wic arguments already exists!" % (workdir)) + > > > + os.makedirs(workdir) > > > + return workdir > > > + else: > > > + return tempfile.mkdtemp(dir=self.outdir, > > > prefix='tmp.wic.') + > > > def do_create(self): > > > """ > > > Plugin entry point. > > > @@ -90,11 +101,8 @@ class DirectPlugin(ImagerPlugin): > > > finally: > > > self.cleanup() > > > > > > - def _write_fstab(self, image_rootfs): > > > - """overriden to generate fstab (temporarily) in rootfs. This > > > is called > > > - from _create, make sure it doesn't get called from > > > - BaseImage.create() > > > - """ > > > + def update_fstab(self, image_rootfs): > > > + """Assume partition order same as in wks""" > > > if not image_rootfs: > > > return > > > > > > @@ -104,18 +112,9 @@ class DirectPlugin(ImagerPlugin): > > > > > > with open(fstab_path) as fstab: > > > fstab_lines = fstab.readlines() > > > - self.original_fstab = fstab_lines.copy() > > > - > > > - if self._update_fstab(fstab_lines, self.parts): > > > - with open(fstab_path, "w") as fstab: > > > - fstab.writelines(fstab_lines) > > > - else: > > > - self.original_fstab = None > > > > > > - def _update_fstab(self, fstab_lines, parts): > > > - """Assume partition order same as in wks""" > > > updated = False > > > - for part in parts: > > > + for part in self.parts: > > > if not part.realnum or not part.mountpoint \ > > > or part.mountpoint == "/": > > > continue > > > @@ -144,7 +143,10 @@ class DirectPlugin(ImagerPlugin): > > > fstab_lines.append(line) > > > updated = True > > > > > > - return updated > > > + if updated: > > > + self.updated_fstab_path = os.path.join(self.workdir, > > > "fstab") > > > + with open(self.updated_fstab_path, "w") as f: > > > + f.writelines(fstab_lines) > > > > > > def _full_path(self, path, name, extention): > > > """ Construct full file path to a file we generate. """ > > > @@ -160,7 +162,7 @@ class DirectPlugin(ImagerPlugin): > > > a partitioned image. > > > """ > > > if not self.no_fstab_update: > > > - self._write_fstab(self.rootfs_dir.get("ROOTFS_DIR")) > > > + self.update_fstab(self.rootfs_dir.get("ROOTFS_DIR")) > > > > > > for part in self.parts: > > > # get rootfs size from bitbake variable if it's not set > > > in .ks file @@ -273,14 +275,9 @@ class DirectPlugin(ImagerPlugin): > > > if os.path.isfile(path): > > > shutil.move(path, os.path.join(self.outdir, fname)) > > > > > > - #Restore original fstab > > > - if self.original_fstab: > > > - fstab_path = self.rootfs_dir.get("ROOTFS_DIR") + > > > "/etc/fstab" > > > - with open(fstab_path, "w") as fstab: > > > - fstab.writelines(self.original_fstab) > > > - > > > - # remove work directory > > > - shutil.rmtree(self.workdir, ignore_errors=True) > > > + # remove work directory when it is not in debugging mode > > > + if not self.debug: > > > + shutil.rmtree(self.workdir, ignore_errors=True) > > > > > > # Overhead of the MBR partitioning scheme (just one sector) > > > MBR_OVERHEAD = 1 > > > @@ -343,6 +340,13 @@ class PartitionedImage(): > > > part.fsuuid = '0x' + > > > str(uuid.uuid4())[:8].upper() else: > > > part.fsuuid = str(uuid.uuid4()) > > > + else: > > > + #make sure the fsuuid for vfat/msdos align with > > > format 0xYYYYYYYY > > > + if part.fstype == 'vfat' or part.fstype == 'msdos': > > > + if part.fsuuid.upper().startswith("0X"): > > > + part.fsuuid = '0x' + > > > part.fsuuid.upper()[2:].rjust(8,"0") > > > + else: > > > + part.fsuuid = '0x' + > > > part.fsuuid.upper().rjust(8,"0") > > > def prepare(self, imager): > > > """Prepare an image. Call prepare method of all image > > > partitions.""" @@ -351,7 +355,8 @@ class PartitionedImage(): > > > # sizes before we can add them and do the layout. > > > part.prepare(imager, imager.workdir, imager.oe_builddir, > > > imager.rootfs_dir, imager.bootimg_dir, > > > - imager.kernel_dir, imager.native_sysroot) > > > + imager.kernel_dir, imager.native_sysroot, > > > + imager.updated_fstab_path) > > > > > > # Converting kB to sectors for parted > > > part.size_sec = part.disk_size * 1024 // self.sector_size > > > diff --git a/scripts/lib/wic/plugins/source/bootimg-efi.py > > > b/scripts/lib/wic/plugins/source/bootimg-efi.py index > > > 14c1723..cdc7254 100644 --- > > > a/scripts/lib/wic/plugins/source/bootimg-efi.py +++ > > > b/scripts/lib/wic/plugins/source/bootimg-efi.py @@ -212,8 +212,8 > > > @@ class BootimgEFIPlugin(SourcePlugin): except KeyError: > > > raise WicError("bootimg-efi requires a loader, none > > > specified") > > > - if get_bitbake_var("IMAGE_BOOT_FILES") is None: > > > - logger.debug('No boot files defined in IMAGE_BOOT_FILES') > > > + if get_bitbake_var("IMAGE_EFI_BOOT_FILES") is None: > > > + logger.debug('No boot files defined in > > > IMAGE_EFI_BOOT_FILES') else: > > > boot_files = None > > > for (fmt, id) in (("_uuid-%s", part.uuid), ("_label-%s", > > > part.label), (None, None)): @@ -222,7 +222,7 @@ class > > > BootimgEFIPlugin(SourcePlugin): else: > > > var = "" > > > > > > - boot_files = get_bitbake_var("IMAGE_BOOT_FILES" + > > > var) > > > + boot_files = get_bitbake_var("IMAGE_EFI_BOOT_FILES" > > > + var) if boot_files: > > > break > > > > > > @@ -292,7 +292,7 @@ class BootimgEFIPlugin(SourcePlugin): > > > (staging_kernel_dir, kernel, hdddir, kernel) > > > exec_cmd(install_cmd) > > > > > > - if get_bitbake_var("IMAGE_BOOT_FILES"): > > > + if get_bitbake_var("IMAGE_EFI_BOOT_FILES"): > > > for src_path, dst_path in cls.install_task: > > > install_cmd = "install -m 0644 -D %s %s" \ > > > % (os.path.join(kernel_dir, src_path), > > > diff --git a/scripts/lib/wic/plugins/source/empty.py > > > b/scripts/lib/wic/plugins/source/empty.py new file mode 100644 > > > index 0000000..041617d > > > --- /dev/null > > > +++ b/scripts/lib/wic/plugins/source/empty.py > > > @@ -0,0 +1,32 @@ > > > +# > > > +# SPDX-License-Identifier: MIT > > > +# > > > + > > > +# The empty wic plugin is used to create unformatted empty > > > partitions for wic +# images. > > > +# To use it you must pass "empty" as argument for the "--source" > > > parameter in +# the wks file. For example: > > > +# part foo --source empty --ondisk sda --size="1024" --align 1024 > > > + > > > +import logging > > > + > > > +from wic.pluginbase import SourcePlugin > > > + > > > +logger = logging.getLogger('wic') > > > + > > > +class EmptyPartitionPlugin(SourcePlugin): > > > + """ > > > + Populate unformatted empty partition. > > > + """ > > > + > > > + name = 'empty' > > > + > > > + @classmethod > > > + def do_prepare_partition(cls, part, source_params, cr, > > > cr_workdir, > > > + oe_builddir, bootimg_dir, kernel_dir, > > > + rootfs_dir, native_sysroot): > > > + """ > > > + Called to do the actual content population for a partition > > > i.e. it > > > + 'prepares' the partition to be incorporated into the image. > > > + """ > > > + return > > > diff --git a/scripts/lib/wic/plugins/source/isoimage-isohybrid.py > > > b/scripts/lib/wic/plugins/source/isoimage-isohybrid.py index > > > 11326a2..afc9ea0 100644 --- > > > a/scripts/lib/wic/plugins/source/isoimage-isohybrid.py +++ > > > b/scripts/lib/wic/plugins/source/isoimage-isohybrid.py @@ -216,6 > > > +216,18 @@ class IsoImagePlugin(SourcePlugin): creator.name = > > > source_params['image_name'].strip() logger.debug("The name of the > > > image is: %s", creator.name) > > > + @staticmethod > > > + def _install_payload(source_params, iso_dir): > > > + """ > > > + Copies contents of payload directory (as specified in > > > 'payload_dir' param) into iso_dir > > > + """ > > > + > > > + if source_params.get('payload_dir'): > > > + payload_dir = source_params['payload_dir'] > > > + > > > + logger.debug("Payload directory: %s", payload_dir) > > > + shutil.copytree(payload_dir, iso_dir, symlinks=True, > > > dirs_exist_ok=True) + > > > @classmethod > > > def do_prepare_partition(cls, part, source_params, creator, > > > cr_workdir, oe_builddir, bootimg_dir, kernel_dir, > > > @@ -228,6 +240,8 @@ class IsoImagePlugin(SourcePlugin): > > > > > > isodir = "%s/ISO" % cr_workdir > > > > > > + cls._install_payload(source_params, isodir) > > > + > > > if part.rootfs_dir is None: > > > if not 'ROOTFS_DIR' in rootfs_dir: > > > raise WicError("Couldn't find --rootfs-dir, > > > exiting.") diff --git a/scripts/lib/wic/plugins/source/rootfs.py > > > b/scripts/lib/wic/plugins/source/rootfs.py index f1db83f..96d940a > > > 100644 --- a/scripts/lib/wic/plugins/source/rootfs.py > > > +++ b/scripts/lib/wic/plugins/source/rootfs.py > > > @@ -94,6 +94,7 @@ class RootfsPlugin(SourcePlugin): > > > "it is not a valid path, exiting" % > > > part.rootfs_dir) > > > part.rootfs_dir = cls.__get_rootfs_dir(rootfs_dir) > > > + part.has_fstab = > > > os.path.exists(os.path.join(part.rootfs_dir, "etc/fstab")) > > > pseudo_dir = os.path.join(part.rootfs_dir, "../pseudo") if not > > > os.path.lexists(pseudo_dir): logger.warn("%s folder does not > > > exist. " @@ -103,9 +104,9 @@ class RootfsPlugin(SourcePlugin): > > > new_rootfs = None > > > new_pseudo = None > > > # Handle excluded paths. > > > - if part.exclude_path or part.include_path or > > > part.change_directory: > > > - # We need a new rootfs directory we can delete files > > > from. Copy to > > > - # workdir. > > > + if part.exclude_path or part.include_path or > > > part.change_directory or part.update_fstab_in_rootfs: > > > + # We need a new rootfs directory we can safely modify > > > without > > > + # interfering with other tasks. Copy to workdir. > > > new_rootfs = os.path.realpath(os.path.join(cr_workdir, > > > "rootfs%d" % part.lineno)) > > > if os.path.lexists(new_rootfs): > > > @@ -199,17 +200,33 @@ class RootfsPlugin(SourcePlugin): > > > if not os.path.lexists(full_path): > > > continue > > > > > > + if new_pseudo: > > > + pseudo = cls.__get_pseudo(native_sysroot, > > > new_rootfs, new_pseudo) > > > + else: > > > + pseudo = None > > > if path.endswith(os.sep): > > > # Delete content only. > > > for entry in os.listdir(full_path): > > > full_entry = os.path.join(full_path, entry) > > > - if os.path.isdir(full_entry) and not > > > os.path.islink(full_entry): > > > - shutil.rmtree(full_entry) > > > - else: > > > - os.remove(full_entry) > > > + rm_cmd = "rm -rf %s" % (full_entry) > > > + exec_native_cmd(rm_cmd, native_sysroot, > > > pseudo) else: > > > # Delete whole directory. > > > - shutil.rmtree(full_path) > > > + rm_cmd = "rm -rf %s" % (full_path) > > > + exec_native_cmd(rm_cmd, native_sysroot, pseudo) > > > + > > > + # Update part.has_fstab here as fstab may have been > > > added or > > > + # removed by the above modifications. > > > + part.has_fstab = os.path.exists(os.path.join(new_rootfs, > > > "etc/fstab")) > > > + if part.update_fstab_in_rootfs and part.has_fstab: > > > + fstab_path = os.path.join(new_rootfs, "etc/fstab") > > > + # Assume that fstab should always be owned by root > > > with fixed permissions > > > + install_cmd = "install -m 0644 %s %s" % > > > (part.updated_fstab_path, fstab_path) > > > + if new_pseudo: > > > + pseudo = cls.__get_pseudo(native_sysroot, > > > new_rootfs, new_pseudo) > > > + else: > > > + pseudo = None > > > + exec_native_cmd(install_cmd, native_sysroot, pseudo) > > > > > > part.prepare_rootfs(cr_workdir, oe_builddir, > > > new_rootfs or part.rootfs_dir, > > > native_sysroot, diff --git a/scripts/wic b/scripts/wic > > > index 24700f3..a741aed 100755 > > > --- a/scripts/wic > > > +++ b/scripts/wic > > > @@ -312,6 +312,8 @@ def wic_init_parser_create(subparser): > > > > > > subparser.add_argument("-o", "--outdir", dest="outdir", > > > default='.', help="name of directory to create image in") > > > + subparser.add_argument("-w", "--workdir", > > > + help="temporary workdir to use for > > > intermediate files") subparser.add_argument("-e", "--image-name", > > > dest="image_name", help="name of the image to use the artifacts > > > from " "e.g. core-image-sato") > > > > >