* [PATCH v2] wic: add --extra-part-space option to set unused space
@ 2025-08-08 14:49 pierre-loup.gosse
2025-08-09 12:57 ` [OE-core] " Mathieu Dubois-Briand
2025-08-11 8:52 ` Alexander Kanavin
0 siblings, 2 replies; 3+ messages in thread
From: pierre-loup.gosse @ 2025-08-08 14:49 UTC (permalink / raw)
To: openembedded-core; +Cc: Pierre-Loup GOSSE, Alexander Kanavin
From: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
Currently, the content of the partition is filled by the filesystem
without leaving any unused free space. The --extra-space flag adds
extra space to the filesystem size, not to the partition.
Unused free space after the filesystem can be useful for some cases,
such as encrypting a partition at runtime. With --extra-part-space 32M,
we ensure that the last 32M of the partition is unused: this space does
not contain filesystem data and can store the LUKS2 header.
The implementation sets a difference between the partition and
filesystem size:
- With --fixed-size, the extra part space is removed from the
filesystem size.
- Otherwise (with or without --size flags), the extra part space is
added to the partition size.
Signed-off-by: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
CC: Alexander Kanavin <alex.kanavin@gmail.com>
---
changes in v2:
- renaming the option to --extra-part-space
- adding tests
---
meta/lib/oeqa/selftest/cases/wic.py | 55 +++++++++++++++++++++++++++--
scripts/lib/wic/ksparser.py | 3 ++
scripts/lib/wic/partition.py | 38 ++++++++++++--------
3 files changed, 79 insertions(+), 17 deletions(-)
diff --git a/meta/lib/oeqa/selftest/cases/wic.py b/meta/lib/oeqa/selftest/cases/wic.py
index 680f99d381..9cd1b8b151 100644
--- a/meta/lib/oeqa/selftest/cases/wic.py
+++ b/meta/lib/oeqa/selftest/cases/wic.py
@@ -1125,7 +1125,7 @@ run_wic_cmd() {
return wkspath
- def _get_wic_partitions(self, wkspath, native_sysroot=None, ignore_status=False):
+ def _get_wic(self, wkspath, ignore_status=False):
p = runCmd("wic create %s -e core-image-minimal -o %s" % (wkspath, self.resultdir),
ignore_status=ignore_status)
@@ -1139,7 +1139,10 @@ run_wic_cmd() {
if not wicout:
return (p, None)
- wicimg = wicout[0]
+ return (p, wicout[0])
+
+ def _get_wic_partitions(self, wkspath, native_sysroot=None, ignore_status=False):
+ p, wicimg = self._get_wic(wkspath, ignore_status)
if not native_sysroot:
native_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "wic-tools")
@@ -1279,6 +1282,54 @@ run_wic_cmd() {
size = int(size[:-3])
self.assertGreaterEqual(size, 204800)
+ def test_extra_part_space(self):
+ native_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "wic-tools")
+
+ with NamedTemporaryFile("w", suffix=".wks") as tempf:
+ tempf.write("bootloader --ptable gpt\n" \
+ "part --ondisk hda --size 10M --extra-part-space 10M --fstype=ext4\n" \
+ "part --ondisk hda --fixed-size 20M --extra-part-space 10M --fstype=ext4\n" \
+ "part --source rootfs --ondisk hda --extra-part-space 10M --fstype=ext4\n" \
+ "part --source rootfs --ondisk hda --fixed-size 200M --extra-part-space 10M --fstype=ext4\n")
+ tempf.flush()
+
+ _, wicimg = self._get_wic(tempf.name)
+
+ res = runCmd("parted -m %s unit b p" % wicimg,
+ native_sysroot=native_sysroot, stderr=subprocess.PIPE)
+
+ # parse parted output which looks like this:
+ # BYT;\n
+ # /var/tmp/wic/build/tmpfwvjjkf_-201611101222-hda.direct:200MiB:file:512:512:msdos::;\n
+ # 1:0.00MiB:200MiB:200MiB:ext4::;\n
+ partlns = res.output.splitlines()[2:]
+
+ self.assertEqual(4, len(partlns))
+
+ # Test for each partitions that the extra part space exists
+ for part in range(0, len(partlns)):
+ part_file = os.path.join(self.resultdir, "selftest_img.part%d" % (part + 1))
+ partln = partlns[part].split(":")
+ self.assertEqual(7, len(partln))
+ self.assertRegex(partln[3], r'^[0-9]+B$')
+ part_size = int(partln[3].rstrip("B"))
+ start = int(partln[1].rstrip("B")) / 512
+ length = part_size / 512
+ runCmd("dd if=%s of=%s skip=%d count=%d" %
+ (wicimg, part_file, start, length))
+ res = runCmd("dumpe2fs %s -h | grep \"^Block count\"" % part_file)
+ fs_size = int(res.output.split(":")[1].strip()) * 1024
+ self.assertLessEqual(fs_size + 10485760, part_size, "part file: %s" % part_file)
+
+ with NamedTemporaryFile("w", suffix=".wks") as tempf:
+ # Test that image creation fails if space left is too small for the rootfs
+ tempf.write("bootloader --ptable gpt\n" \
+ "part --source rootfs --ondisk hda --fixed-size 200M --extra-part-space 150M --fstype=ext4\n")
+ tempf.flush()
+
+ p, _ = self._get_wic(tempf.name, ignore_status=True)
+ self.assertNotEqual(p.status, 0, "wic exited successfully when an error was expected:\n%s" % p.output)
+
# TODO this test could also work on aarch64
@skipIfNotArch(['i586', 'i686', 'x86_64'])
@OETestTag("runqemu")
diff --git a/scripts/lib/wic/ksparser.py b/scripts/lib/wic/ksparser.py
index 7ef3dc83dd..527569ab97 100644
--- a/scripts/lib/wic/ksparser.py
+++ b/scripts/lib/wic/ksparser.py
@@ -154,6 +154,7 @@ class KickStart():
part.add_argument('--include-path', nargs='+', action='append')
part.add_argument('--change-directory')
part.add_argument("--extra-space", type=sizetype("M"))
+ part.add_argument('--extra-part-space', type=sizetype("M"))
part.add_argument('--fsoptions', dest='fsopts')
part.add_argument('--fspassno', dest='fspassno')
part.add_argument('--fstype', default='vfat',
@@ -259,6 +260,8 @@ class KickStart():
err = "%s:%d: Must set the label with --label" \
% (confpath, lineno)
raise KickStartError(err)
+ if not parsed.extra_part_space:
+ parsed.extra_part_space = 0
# using ArgumentParser one cannot easily tell if option
# was passed as argument, if said option has a default
# value; --overhead-factor/--extra-space cannot be used
diff --git a/scripts/lib/wic/partition.py b/scripts/lib/wic/partition.py
index b34691d313..b560d6a2be 100644
--- a/scripts/lib/wic/partition.py
+++ b/scripts/lib/wic/partition.py
@@ -32,6 +32,7 @@ class Partition():
self.exclude_path = args.exclude_path
self.include_path = args.include_path
self.change_directory = args.change_directory
+ self.extra_part_space = args.extra_part_space
self.fsopts = args.fsopts
self.fspassno = args.fspassno
self.fstype = args.fstype
@@ -91,17 +92,16 @@ class Partition():
def get_rootfs_size(self, actual_rootfs_size=0):
"""
Calculate the required size of rootfs taking into consideration
- --size/--fixed-size flags as well as overhead and extra space, as
- specified in kickstart file. Raises an error if the
- `actual_rootfs_size` is larger than fixed-size rootfs.
-
+ --size/--fixed-size and --extra-part-space flags as well as overhead
+ and extra space, as specified in kickstart file. Raises an error
+ if the `actual_rootfs_size` is larger than fixed-size rootfs.
"""
if self.fixed_size:
- rootfs_size = self.fixed_size
+ rootfs_size = self.fixed_size - self.extra_part_space
if actual_rootfs_size > rootfs_size:
raise WicError("Actual rootfs size (%d kB) is larger than "
- "allowed size %d kB" %
- (actual_rootfs_size, rootfs_size))
+ "allowed size %d kB (including %d kB extra part space)" %
+ (actual_rootfs_size, rootfs_size, self.extra_part_space))
else:
extra_blocks = self.get_extra_block_count(actual_rootfs_size)
if extra_blocks < self.extra_space:
@@ -119,10 +119,18 @@ class Partition():
def disk_size(self):
"""
Obtain on-disk size of partition taking into consideration
- --size/--fixed-size options.
+ --size/--fixed-size and --extra-part-space options.
+
+ """
+ return self.fixed_size if self.fixed_size else self.size + self.extra_part_space
+ @property
+ def fs_size(self):
+ """
+ Obtain on-disk size of filesystem inside the partition taking into
+ consideration --size/--fixed-size and --extra-part-space options.
"""
- return self.fixed_size if self.fixed_size else self.size
+ return self.fixed_size - self.extra_part_space if self.fixed_size else self.size
def prepare(self, creator, cr_workdir, oe_builddir, rootfs_dir,
bootimg_dir, kernel_dir, native_sysroot, updated_fstab_path):
@@ -202,10 +210,10 @@ class Partition():
"This a bug in source plugin %s and needs to be fixed." %
(self.mountpoint, self.source))
- if self.fixed_size and self.size > self.fixed_size:
+ if self.fixed_size and self.size + self.extra_part_space > self.fixed_size:
raise WicError("File system image of partition %s is "
- "larger (%d kB) than its allowed size %d kB" %
- (self.mountpoint, self.size, self.fixed_size))
+ "larger (%d kB + %d kB extra part space) than its allowed size %d kB" %
+ (self.mountpoint, self.size, self.extra_part_space, self.fixed_size))
def prepare_rootfs(self, cr_workdir, oe_builddir, rootfs_dir,
native_sysroot, real_rootfs = True, pseudo_dir = None):
@@ -440,7 +448,7 @@ class Partition():
"""
Prepare an empty ext2/3/4 partition.
"""
- size = self.disk_size
+ size = self.fs_size
with open(rootfs, 'w') as sparse:
os.ftruncate(sparse.fileno(), size * 1024)
@@ -464,7 +472,7 @@ class Partition():
"""
Prepare an empty btrfs partition.
"""
- size = self.disk_size
+ size = self.fs_size
with open(rootfs, 'w') as sparse:
os.ftruncate(sparse.fileno(), size * 1024)
@@ -482,7 +490,7 @@ class Partition():
"""
Prepare an empty vfat partition.
"""
- blocks = self.disk_size
+ blocks = self.fs_size
label_str = "-n boot"
if self.label:
--
2.34.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [OE-core] [PATCH v2] wic: add --extra-part-space option to set unused space
2025-08-08 14:49 [PATCH v2] wic: add --extra-part-space option to set unused space pierre-loup.gosse
@ 2025-08-09 12:57 ` Mathieu Dubois-Briand
2025-08-11 8:52 ` Alexander Kanavin
1 sibling, 0 replies; 3+ messages in thread
From: Mathieu Dubois-Briand @ 2025-08-09 12:57 UTC (permalink / raw)
To: pierre-loup.gosse, openembedded-core; +Cc: Alexander Kanavin
On Fri Aug 8, 2025 at 4:49 PM CEST, pierre-loup.gosse via lists.openembedded.org wrote:
> From: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
>
> Currently, the content of the partition is filled by the filesystem
> without leaving any unused free space. The --extra-space flag adds
> extra space to the filesystem size, not to the partition.
>
> Unused free space after the filesystem can be useful for some cases,
> such as encrypting a partition at runtime. With --extra-part-space 32M,
> we ensure that the last 32M of the partition is unused: this space does
> not contain filesystem data and can store the LUKS2 header.
>
> The implementation sets a difference between the partition and
> filesystem size:
> - With --fixed-size, the extra part space is removed from the
> filesystem size.
> - Otherwise (with or without --size flags), the extra part space is
> added to the partition size.
>
> Signed-off-by: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
>
> CC: Alexander Kanavin <alex.kanavin@gmail.com>
> ---
Hi Pierre-Loup,
Thanks for the v2.
It looks like this is failing the selftests:
2025-08-09 08:38:22,672 - oe-selftest - INFO - 9: 75/92 535/635 (30.50s) (2 failed) (wic.Wic2.test_fixed_size_error)
2025-08-09 08:38:22,672 - oe-selftest - INFO - testtools.testresult.real._StringException: Traceback (most recent call last):
File "/srv/pokybuild/yocto-worker/oe-selftest-fedora/build/meta/lib/oeqa/selftest/cases/wic.py", line 1221, in test_fixed_size_error
p, _ = self._get_wic_partitions(wkspath, ignore_status=True)
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/srv/pokybuild/yocto-worker/oe-selftest-fedora/build/meta/lib/oeqa/selftest/cases/wic.py", line 1192, in _get_wic_partitions
res = runCmd("parted -m %s unit kib p" % wicimg,
native_sysroot=native_sysroot, stderr=subprocess.PIPE)
File "/srv/pokybuild/yocto-worker/oe-selftest-fedora/build/meta/lib/oeqa/utils/commands.py", line 214, in runCmd
raise AssertionError("Command '%s' returned non-zero exit status %d:\n%s" % (command, result.status, exc_output))
AssertionError: Command 'parted -m None unit kib p' returned non-zero exit status 1:
WARNING: You are not superuser. Watch out for permissions.
Error: Could not stat device None - No such file or directory.
https://autobuilder.yoctoproject.org/valkyrie/#/builders/48/builds/2050
https://autobuilder.yoctoproject.org/valkyrie/#/builders/35/builds/2121
https://autobuilder.yoctoproject.org/valkyrie/#/builders/23/builds/2271
Can you have a look at this issue please?
Best regards,
Mathieu
--
Mathieu Dubois-Briand, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v2] wic: add --extra-part-space option to set unused space
2025-08-08 14:49 [PATCH v2] wic: add --extra-part-space option to set unused space pierre-loup.gosse
2025-08-09 12:57 ` [OE-core] " Mathieu Dubois-Briand
@ 2025-08-11 8:52 ` Alexander Kanavin
1 sibling, 0 replies; 3+ messages in thread
From: Alexander Kanavin @ 2025-08-11 8:52 UTC (permalink / raw)
To: pierre-loup.gosse; +Cc: openembedded-core
On Fri, 8 Aug 2025 at 16:54, <pierre-loup.gosse@smile.fr> wrote:
> part.add_argument("--extra-space", type=sizetype("M"))
> + part.add_argument('--extra-part-space', type=sizetype("M"))
I think we should just go ahead and name these
--extra-filesystem-space, and --extra-partition-space. Rename the
first in a separate commit (grep its usage in poky/ and fix it up).
Alex
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-08-11 8:52 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-08 14:49 [PATCH v2] wic: add --extra-part-space option to set unused space pierre-loup.gosse
2025-08-09 12:57 ` [OE-core] " Mathieu Dubois-Briand
2025-08-11 8:52 ` Alexander Kanavin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox