[OE-core] [PATCH] wic: add --reserved-size wks option
Maciej Borzęcki
maciej.borzecki at rndity.com
Mon Oct 17 14:46:00 UTC 2016
On Mon, Oct 17, 2016 at 3:22 PM, Ed Bartosh <ed.bartosh at linux.intel.com> wrote:
> Hi Maciej,
>
> There is already --size and --extra-space options.
> Can we get the same or similar result by just using them? Do we really
> need new option for similar purpose?
--reserved-size serves a different purpose, it establishes an upper
bound on the size of a partition during layout. Unlike
--size/--extra-space does not depend on the size of the filesystem
image.
For instance, assume I'm creating an image for SD card/eMMC with a
fixed partition layout (something simple: boot partition, primary &
secondary rootfs partitions, some data partition). Because future
system updates are delivered as filesystem image, I want to make sure
that there is exactly xxx MBs for my current and future rootfs images
(regardless of current image size). Neither --size nor --extra-space
can do that. I could use, say `--size 200 --overhead-factor 1`, but
this will needlessly create a 200MB rootfs image and if I happen to
cross the 200MB boundary I will not get an error.
I had a private patch that added --fixed-size to enforce --size, but
that would still end up creating filesystem image to fill the whole
space.
Another workaround we used until now was to create a filesystem image
manually and use fsimage source plugin. To get a fixed layout with
rootfs image that may grow/shrink between builds, you still need to
fiddle with --align (for instance, set it to 215040 to have the
partition start at 210MB offset).
>
>
> On Mon, Oct 17, 2016 at 03:06:18PM +0200, Maciej Borzecki wrote:
>> Added new option --reserved-size to wks. The option can be used to
>> indicate how much space should be reserved for a partition. This is
>> useful if the disk will be a subject to full filesystem image updates
>> and puts an upper limit of the size of filesystem images.
>>
>> The actual filesystem image may be smaller than the reserved space, thus
>> leaving some room for growth. If it is larger, an error will be raised.
>>
>> Signed-off-by: Maciej Borzecki <maciej.borzecki at rndity.com>
>> ---
>> scripts/lib/wic/help.py | 11 ++++++++++
>> scripts/lib/wic/imager/direct.py | 3 ++-
>> scripts/lib/wic/ksparser.py | 1 +
>> scripts/lib/wic/partition.py | 1 +
>> scripts/lib/wic/utils/partitionedfs.py | 37 +++++++++++++++++++++++++---------
>> 5 files changed, 43 insertions(+), 10 deletions(-)
>>
>> diff --git a/scripts/lib/wic/help.py b/scripts/lib/wic/help.py
>> index e5347ec4b7c900c68fc64351a5293e75de0672b3..1a5c7020ba0cdc5ef2e477a2b14360e09098a896 100644
>> --- a/scripts/lib/wic/help.py
>> +++ b/scripts/lib/wic/help.py
>> @@ -646,6 +646,17 @@ DESCRIPTION
>> not specified, the size is in MB.
>> You do not need this option if you use --source.
>>
>> + --reserved-size: This option specifies that there should be
>> + at least that many bytes reserved for
>> + the partition during layout. This is useful
>> + when the target disk will be a subject
>> + to full system image updates in the future.
>> + Specifying --reserved-size ensures that
>> + there is extra space in the partition allowing
>> + for future growth of the file system stored
>> + inside. Value format is the same as for
>> + --size option.
>> +
>> --source: This option is a wic-specific option that names the
>> source of the data that will populate the
>> partition. The most common value for this option
>> diff --git a/scripts/lib/wic/imager/direct.py b/scripts/lib/wic/imager/direct.py
>> index edf5e5d2214f8e78b6c2a98d7f6cd45fcc0065c4..02e293b9d744b760fcdf17610505dafef3e164ad 100644
>> --- a/scripts/lib/wic/imager/direct.py
>> +++ b/scripts/lib/wic/imager/direct.py
>> @@ -301,7 +301,8 @@ class DirectImageCreator(BaseImageCreator):
>> no_table=part.no_table,
>> part_type=part.part_type,
>> uuid=part.uuid,
>> - system_id=part.system_id)
>> + system_id=part.system_id,
>> + reserved_size=part.reserved_size)
>>
>> if fstab_path:
>> shutil.move(fstab_path + ".orig", fstab_path)
>> diff --git a/scripts/lib/wic/ksparser.py b/scripts/lib/wic/ksparser.py
>> index 0894e2b199a299fbbed272f2e1c95e9d692e3ab1..4118bffdf4337f2d2d393d7e096632cd7aa37402 100644
>> --- a/scripts/lib/wic/ksparser.py
>> +++ b/scripts/lib/wic/ksparser.py
>> @@ -137,6 +137,7 @@ class KickStart():
>> part.add_argument('--part-type')
>> part.add_argument('--rootfs-dir')
>> part.add_argument('--size', type=sizetype, default=0)
>> + part.add_argument('--reserved-size', type=sizetype, default=0)
>> part.add_argument('--source')
>> part.add_argument('--sourceparams')
>> part.add_argument('--system-id', type=systemidtype)
>> diff --git a/scripts/lib/wic/partition.py b/scripts/lib/wic/partition.py
>> index 90f65a1e3976a5460cd1b265b238168cce22781f..162a3a289de891ccf81437876c1f7a6f3c797b3b 100644
>> --- a/scripts/lib/wic/partition.py
>> +++ b/scripts/lib/wic/partition.py
>> @@ -54,6 +54,7 @@ class Partition():
>> self.part_type = args.part_type
>> self.rootfs_dir = args.rootfs_dir
>> self.size = args.size
>> + self.reserved_size = args.reserved_size
>> self.source = args.source
>> self.sourceparams = args.sourceparams
>> self.system_id = args.system_id
>> diff --git a/scripts/lib/wic/utils/partitionedfs.py b/scripts/lib/wic/utils/partitionedfs.py
>> index cb03009fc7e3c97305079629ded7d2ff01eba4c4..5d3b1588231459dedf0142f807114736f0bb28ea 100644
>> --- a/scripts/lib/wic/utils/partitionedfs.py
>> +++ b/scripts/lib/wic/utils/partitionedfs.py
>> @@ -91,7 +91,7 @@ class Image():
>>
>> def add_partition(self, size, disk_name, mountpoint, source_file=None, fstype=None,
>> label=None, fsopts=None, boot=False, align=None, no_table=False,
>> - part_type=None, uuid=None, system_id=None):
>> + part_type=None, uuid=None, system_id=None, reserved_size=0):
>> """ Add the next partition. Prtitions have to be added in the
>> first-to-last order. """
>>
>> @@ -99,9 +99,11 @@ class Image():
>>
>> # Converting kB to sectors for parted
>> size = size * 1024 // self.sector_size
>> + reserved_size = reserved_size * 1024 // self.sector_size
>>
>> part = {'ks_pnum': ks_pnum, # Partition number in the KS file
>> 'size': size, # In sectors
>> + 'reserved_size': reserved_size, # space on disk reserved for partition
>> 'mountpoint': mountpoint, # Mount relative to chroot
>> 'source_file': source_file, # partition contents
>> 'fstype': fstype, # Filesystem type
>> @@ -192,7 +194,19 @@ class Image():
>> disk['offset'] += align_sectors
>>
>> part['start'] = disk['offset']
>> - disk['offset'] += part['size']
>> +
>> + if part['reserved_size']:
>> + if part['size'] > part['reserved_size']:
>> + msger.error("Partition %d on disk %s is larger (%s bytes) than its"
>> + " reserved space %s bytes" %
>> + (disk['numpart'], part['disk_name'],
>> + part['size'] * self.sector_size,
>> + part['reserved_size'] * self.sector_size))
>> + # next partition starts after the space reserved for the
>> + # current one
>> + disk['offset'] += part['reserved_size']
>> + else:
>> + disk['offset'] += part['size']
>>
>> part['type'] = 'primary'
>> if not part['no_table']:
>> @@ -207,10 +221,11 @@ class Image():
>>
>> disk['partitions'].append(num)
>> msger.debug("Assigned %s to %s%d, sectors range %d-%d size %d "
>> - "sectors (%d bytes)." \
>> + "sectors (%d bytes), reserved %d bytes." \
>> % (part['mountpoint'], part['disk_name'], part['num'],
>> - part['start'], part['start'] + part['size'] - 1,
>> - part['size'], part['size'] * self.sector_size))
>> + part['start'], disk['offset'] - 1,
>> + part['size'], part['size'] * self.sector_size,
>> + part['reserved_size'] * self.sector_size))
>>
>> # Once all the partitions have been layed out, we can calculate the
>> # minumim disk sizes.
>> @@ -288,17 +303,21 @@ class Image():
>> # Type for ext2/ext3/ext4/btrfs
>> parted_fs_type = "ext2"
>>
>> + psize = part['size']
>> + if part['reserved_size']:
>> + psize = part['reserved_size']
>> +
>> # Boot ROM of OMAP boards require vfat boot partition to have an
>> # even number of sectors.
>> if part['mountpoint'] == "/boot" and part['fstype'] in ["vfat", "msdos"] \
>> - and part['size'] % 2:
>> - msger.debug("Substracting one sector from '%s' partition to " \
>> + and psize % 2:
>> + msger.debug("Subtracting one sector from '%s' partition to " \
>> "get even number of sectors for the partition" % \
>> part['mountpoint'])
>> - part['size'] -= 1
>> + psize -= 1
>>
>> self.__create_partition(disk['disk'].device, part['type'],
>> - parted_fs_type, part['start'], part['size'])
>> + parted_fs_type, part['start'], psize)
>>
>> if part['part_type']:
>> msger.debug("partition %d: set type UID to %s" % \
>> --
>> 2.5.0
>>
>
> --
> Regards,
> Ed
--
Maciej Borzecki
RnDity
More information about the Openembedded-core
mailing list