On Mon, Oct 17, 2016 at 04:46:00PM +0200, Maciej Borzęcki wrote:
> On Mon, Oct 17, 2016 at 3:22 PM, Ed Bartosh <ed.bart...@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.
I didn't get the difference between enforcing partition size and below
implementation. Can you elaborate a bit?

> 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).
> 

Thanks for the explanations. I'm almost convinced.

See my comments below.

> >
> >
> > 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.borze...@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
According to the code if partition size > reserved size wic will throw
an error. This somehow conflicts with 'at least that many bytes' part of the
description in my opinion.

As far as I uderstood your code this parameter specifies hard upper
limit for partition size, right?

> >> +                          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))
This will produce incorrect output about partition size as in reality partition 
size will
be set to part['reserved_size'].

"reserved 0 bytes" message will be produced if --reserved-size option
is not used. It's a bit confusing as 'reserved' is too generic word. Can
we use 'reserved size' instead?

> >>
> >>          # 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']
> >> +
Here I'm getting confused. How this new parameters differs from --size if it 
behaves
the same way, i.e. partition size is set to its value. The only
difference I see is that if rootfs size is greater than reserved size
wic will fail to create partition. Would it make sense to name it
--max-size in this case?

> >>              # 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" % \

Can you cover this functionality(and may be other size-related
functionality too) with tests? You can add testcases to existing
oe-selftest wic module.

--
Regards,
Ed
-- 
_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core

Reply via email to