summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta/lib/oeqa/selftest/cases/wic.py24
-rw-r--r--scripts/lib/wic/ksparser.py20
-rw-r--r--scripts/lib/wic/plugins/imager/direct.py8
3 files changed, 42 insertions, 10 deletions
diff --git a/meta/lib/oeqa/selftest/cases/wic.py b/meta/lib/oeqa/selftest/cases/wic.py
index a166d3f614..13b6a0cc72 100644
--- a/meta/lib/oeqa/selftest/cases/wic.py
+++ b/meta/lib/oeqa/selftest/cases/wic.py
@@ -739,6 +739,30 @@ class Wic2(WicTestCase):
739 ]) 739 ])
740 740
741 with NamedTemporaryFile("w", suffix=".wks") as tempf: 741 with NamedTemporaryFile("w", suffix=".wks") as tempf:
742 # Test that partitions can be placed on a 512 byte sector boundary
743 tempf.write("bootloader --ptable gpt\n" \
744 "part / --source rootfs --ondisk hda --offset 65s --fixed-size 99M --fstype=ext4\n" \
745 "part /bar --ondisk hda --offset 102432 --fixed-size 100M --fstype=ext4\n")
746 tempf.flush()
747
748 _, partlns = self._get_wic_partitions(tempf.name, native_sysroot)
749 self.assertEqual(partlns, [
750 "1:32.5kiB:101408kiB:101376kiB:ext4:primary:;",
751 "2:102432kiB:204832kiB:102400kiB:ext4:primary:;",
752 ])
753
754 with NamedTemporaryFile("w", suffix=".wks") as tempf:
755 # Test that a partition can be placed immediately after a MSDOS partition table
756 tempf.write("bootloader --ptable msdos\n" \
757 "part / --source rootfs --ondisk hda --offset 1s --fixed-size 100M --fstype=ext4\n")
758 tempf.flush()
759
760 _, partlns = self._get_wic_partitions(tempf.name, native_sysroot)
761 self.assertEqual(partlns, [
762 "1:0.50kiB:102400kiB:102400kiB:ext4::;",
763 ])
764
765 with NamedTemporaryFile("w", suffix=".wks") as tempf:
742 # Test that image creation fails if the partitions would overlap 766 # Test that image creation fails if the partitions would overlap
743 tempf.write("bootloader --ptable gpt\n" \ 767 tempf.write("bootloader --ptable gpt\n" \
744 "part / --source rootfs --ondisk hda --offset 32 --fixed-size 100M --fstype=ext4\n" \ 768 "part / --source rootfs --ondisk hda --offset 32 --fixed-size 100M --fstype=ext4\n" \
diff --git a/scripts/lib/wic/ksparser.py b/scripts/lib/wic/ksparser.py
index ac6f427564..76cc55b848 100644
--- a/scripts/lib/wic/ksparser.py
+++ b/scripts/lib/wic/ksparser.py
@@ -51,11 +51,11 @@ class KickStartParser(ArgumentParser):
51 def error(self, message): 51 def error(self, message):
52 raise ArgumentError(None, message) 52 raise ArgumentError(None, message)
53 53
54def sizetype(default): 54def sizetype(default, size_in_bytes=False):
55 def f(arg): 55 def f(arg):
56 """ 56 """
57 Custom type for ArgumentParser 57 Custom type for ArgumentParser
58 Converts size string in <num>[K|k|M|G] format into the integer value 58 Converts size string in <num>[S|s|K|k|M|G] format into the integer value
59 """ 59 """
60 try: 60 try:
61 suffix = default 61 suffix = default
@@ -67,12 +67,20 @@ def sizetype(default):
67 except ValueError: 67 except ValueError:
68 raise ArgumentTypeError("Invalid size: %r" % arg) 68 raise ArgumentTypeError("Invalid size: %r" % arg)
69 69
70
71 if size_in_bytes:
72 if suffix == 's' or suffix == 'S':
73 return size * 512
74 mult = 1024
75 else:
76 mult = 1
77
70 if suffix == "k" or suffix == "K": 78 if suffix == "k" or suffix == "K":
71 return size 79 return size * mult
72 if suffix == "M": 80 if suffix == "M":
73 return size * 1024 81 return size * mult * 1024
74 if suffix == "G": 82 if suffix == "G":
75 return size * 1024 * 1024 83 return size * mult * 1024 * 1024
76 84
77 raise ArgumentTypeError("Invalid size: %r" % arg) 85 raise ArgumentTypeError("Invalid size: %r" % arg)
78 return f 86 return f
@@ -141,7 +149,7 @@ class KickStart():
141 part.add_argument('mountpoint', nargs='?') 149 part.add_argument('mountpoint', nargs='?')
142 part.add_argument('--active', action='store_true') 150 part.add_argument('--active', action='store_true')
143 part.add_argument('--align', type=int) 151 part.add_argument('--align', type=int)
144 part.add_argument('--offset', type=sizetype("K")) 152 part.add_argument('--offset', type=sizetype("K", True))
145 part.add_argument('--exclude-path', nargs='+') 153 part.add_argument('--exclude-path', nargs='+')
146 part.add_argument('--include-path', nargs='+') 154 part.add_argument('--include-path', nargs='+')
147 part.add_argument("--extra-space", type=sizetype("M")) 155 part.add_argument("--extra-space", type=sizetype("M"))
diff --git a/scripts/lib/wic/plugins/imager/direct.py b/scripts/lib/wic/plugins/imager/direct.py
index 2f01999405..55db826e93 100644
--- a/scripts/lib/wic/plugins/imager/direct.py
+++ b/scripts/lib/wic/plugins/imager/direct.py
@@ -429,14 +429,14 @@ class PartitionedImage():
429 self.offset += align_sectors 429 self.offset += align_sectors
430 430
431 if part.offset is not None: 431 if part.offset is not None:
432 offset = (part.offset * 1024) // self.sector_size 432 offset = part.offset // self.sector_size
433 433
434 if offset * self.sector_size != part.offset * 1024: 434 if offset * self.sector_size != part.offset:
435 raise WicError("Could not place %s%s at offset %dK with sector size %d" % (part.disk, self.numpart, part.offset, self.sector_size)) 435 raise WicError("Could not place %s%s at offset %d with sector size %d" % (part.disk, self.numpart, part.offset, self.sector_size))
436 436
437 delta = offset - self.offset 437 delta = offset - self.offset
438 if delta < 0: 438 if delta < 0:
439 raise WicError("Could not place %s%s at offset %dK: next free sector is %d (delta: %d)" % (part.disk, self.numpart, part.offset, self.offset, delta)) 439 raise WicError("Could not place %s%s at offset %d: next free sector is %d (delta: %d)" % (part.disk, self.numpart, part.offset, self.offset, delta))
440 440
441 logger.debug("Skipping %d sectors to place %s%s at offset %dK", 441 logger.debug("Skipping %d sectors to place %s%s at offset %dK",
442 delta, part.disk, self.numpart, part.offset) 442 delta, part.disk, self.numpart, part.offset)