[OE-core] [PATCH] wic: allow creation of partitions not in table
Alexandre Belloni
alexandre.belloni at free-electrons.com
Thu Feb 5 17:39:24 UTC 2015
Hi,
I found one remaining bug in that patch, I'll send v2 soon.
On 05/02/2015 at 00:03:16 +0100, Alexandre Belloni wrote :
> For some architectures it is necessary to reserve space on disk without
> it being present in the partition table.
>
> For example, u-boot on i.mx is placed at an offset of 1kB on the sdcard.
> While it would be possible to create a partition at that offset and
> place u-boot there, it would then be necessary to update the default
> u-boot environment to use partition 2 on the mmc instead of partition 1.
>
> Signed-off-by: Alexandre Belloni <alexandre.belloni at free-electrons.com>
> ---
> scripts/lib/image/help.py | 6 ++++++
> scripts/lib/wic/imager/direct.py | 1 +
> .../lib/wic/kickstart/custom_commands/partition.py | 6 ++++++
> scripts/lib/wic/utils/partitionedfs.py | 20 +++++++++++++++-----
> 4 files changed, 28 insertions(+), 5 deletions(-)
>
> diff --git a/scripts/lib/image/help.py b/scripts/lib/image/help.py
> index 0d8a6adfaa71..aab0b609afd5 100644
> --- a/scripts/lib/image/help.py
> +++ b/scripts/lib/image/help.py
> @@ -737,6 +737,12 @@ DESCRIPTION
> to start a partition on an x KBytes
> boundary.
>
> + --no-table: This option is specific to wic. Space will be
> + reserved for the partition and it will be
> + populated but it will not be added to the
> + partition table. It may be useful for
> + bootloaders.
> +
> * bootloader
>
> This command allows the user to specify various bootloader
> diff --git a/scripts/lib/wic/imager/direct.py b/scripts/lib/wic/imager/direct.py
> index b1dc3e96f456..c39405feb74a 100644
> --- a/scripts/lib/wic/imager/direct.py
> +++ b/scripts/lib/wic/imager/direct.py
> @@ -262,6 +262,7 @@ class DirectImageCreator(BaseImageCreator):
> fsopts = p.fsopts,
> boot = p.active,
> align = p.align,
> + no_table = p.no_table,
> part_type = p.part_type)
>
> self.__image.layout_partitions(self._ptable_format)
> diff --git a/scripts/lib/wic/kickstart/custom_commands/partition.py b/scripts/lib/wic/kickstart/custom_commands/partition.py
> index 7a307065f289..9be6b0457b48 100644
> --- a/scripts/lib/wic/kickstart/custom_commands/partition.py
> +++ b/scripts/lib/wic/kickstart/custom_commands/partition.py
> @@ -49,6 +49,7 @@ class Wic_PartData(Mic_PartData):
> self.source = kwargs.get("source", None)
> self.sourceparams = kwargs.get("sourceparams", None)
> self.rootfs = kwargs.get("rootfs-dir", None)
> + self.no_table = kwargs.get("no-table", False)
> self.source_file = ""
> self.size = 0
>
> @@ -61,6 +62,8 @@ class Wic_PartData(Mic_PartData):
> retval += " --sourceparams=%s" % self.sourceparams
> if self.rootfs:
> retval += " --rootfs-dir=%s" % self.rootfs
> + if self.no_table:
> + retval += " --no-table"
>
> return retval
>
> @@ -521,4 +524,7 @@ class Wic_Partition(Mic_Partition):
> # use specified rootfs path to fill the partition
> op.add_option("--rootfs-dir", type="string", action="store",
> dest="rootfs", default=None)
> + # wether to add the partition in the partition table
> + op.add_option("--no-table", dest="no_table", action="store_true",
> + default=False)
> return op
> diff --git a/scripts/lib/wic/utils/partitionedfs.py b/scripts/lib/wic/utils/partitionedfs.py
> index f109e2c227c5..745558b090cb 100644
> --- a/scripts/lib/wic/utils/partitionedfs.py
> +++ b/scripts/lib/wic/utils/partitionedfs.py
> @@ -61,6 +61,7 @@ class Image:
> self.disks[disk_name] = \
> { 'disk': None, # Disk object
> 'numpart': 0, # Number of allocate partitions
> + 'realpart': 0, # Number of partitions in the partition table
> 'partitions': [], # Indexes to self.partitions
> 'offset': 0, # Offset of next partition (in sectors)
> # Minimum required disk size to fit all partitions (in bytes)
> @@ -85,7 +86,7 @@ class Image:
> self.__add_disk(part['disk_name'])
>
> def add_partition(self, size, disk_name, mountpoint, source_file = None, fstype = None,
> - label=None, fsopts = None, boot = False, align = None,
> + label=None, fsopts = None, boot = False, align = None, no_table=False,
> part_type = None):
> """ Add the next partition. Prtitions have to be added in the
> first-to-last order. """
> @@ -109,6 +110,7 @@ class Image:
> 'num': None, # Partition number
> 'boot': boot, # Bootable flag
> 'align': align, # Partition alignment
> + 'no_table' : no_table, # Partition does not appear in partition table
> 'part_type' : part_type } # Partition type
>
> self.__add_partition(part)
> @@ -147,6 +149,8 @@ class Image:
> # Get the disk where the partition is located
> d = self.disks[p['disk_name']]
> d['numpart'] += 1
> + if not p['no_table']:
> + d['realpart'] += 1
> d['ptable_format'] = ptable_format
>
> if d['numpart'] == 1:
> @@ -182,10 +186,13 @@ class Image:
> d['offset'] += p['size']
>
> p['type'] = 'primary'
> - p['num'] = d['numpart']
> + if not p['no_table']:
> + p['num'] = d['realpart']
> + else:
> + p['num'] = 0
>
> if d['ptable_format'] == "msdos":
> - if d['numpart'] > 2:
> + if d['realpart'] > 2:
> # Every logical partition requires an additional sector for
> # the EBR, so steal the last sector from the end of each
> # partition starting from the 3rd one for the EBR. This
> @@ -193,9 +200,9 @@ class Image:
> # correctly.
> p['size'] -= 1
>
> - if d['numpart'] > 3:
> + if d['realpart'] > 3:
> p['type'] = 'logical'
> - p['num'] = d['numpart'] + 1
> + p['num'] = d['realpart'] + 1
>
> d['partitions'].append(n)
> msger.debug("Assigned %s to %s%d, sectors range %d-%d size %d "
> @@ -257,6 +264,9 @@ class Image:
> msger.debug("Creating partitions")
>
> for p in self.partitions:
> + if p['num'] == 0:
> + continue
> +
> d = self.disks[p['disk_name']]
> if d['ptable_format'] == "msdos" and p['num'] == 5:
> # The last sector of the 3rd partition was reserved for the EBR
> --
> 2.1.0
>
--
Alexandre Belloni, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com
More information about the Openembedded-core
mailing list