diff options
Diffstat (limited to 'import-layers/yocto-poky/scripts/lib/wic/imager')
-rw-r--r-- | import-layers/yocto-poky/scripts/lib/wic/imager/baseimager.py | 5 | ||||
-rw-r--r-- | import-layers/yocto-poky/scripts/lib/wic/imager/direct.py | 67 |
2 files changed, 55 insertions, 17 deletions
diff --git a/import-layers/yocto-poky/scripts/lib/wic/imager/baseimager.py b/import-layers/yocto-poky/scripts/lib/wic/imager/baseimager.py index 760cf8a58..1a52dd8b4 100644 --- a/import-layers/yocto-poky/scripts/lib/wic/imager/baseimager.py +++ b/import-layers/yocto-poky/scripts/lib/wic/imager/baseimager.py @@ -16,7 +16,6 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # Temple Place - Suite 330, Boston, MA 02111-1307, USA. -from __future__ import with_statement import os import tempfile import shutil @@ -25,7 +24,7 @@ from wic import msger from wic.utils.errors import CreatorError from wic.utils import runner -class BaseImageCreator(object): +class BaseImageCreator(): """Base class for image creation. BaseImageCreator is the simplest creator class available; it will @@ -68,7 +67,7 @@ class BaseImageCreator(object): } # update setting from createopts - for key in createopts.keys(): + for key in createopts: if key in optmap: option = optmap[key] else: diff --git a/import-layers/yocto-poky/scripts/lib/wic/imager/direct.py b/import-layers/yocto-poky/scripts/lib/wic/imager/direct.py index a1b424965..edf5e5d22 100644 --- a/import-layers/yocto-poky/scripts/lib/wic/imager/direct.py +++ b/import-layers/yocto-poky/scripts/lib/wic/imager/direct.py @@ -26,20 +26,40 @@ import os import shutil +import uuid from wic import msger -from wic.utils import fs_related from wic.utils.oe.misc import get_bitbake_var from wic.utils.partitionedfs import Image from wic.utils.errors import CreatorError, ImageError from wic.imager.baseimager import BaseImageCreator from wic.plugin import pluginmgr -from wic.utils.oe.misc import exec_cmd +from wic.utils.oe.misc import exec_cmd, exec_native_cmd disk_methods = { "do_install_disk":None, } +class DiskImage(): + """ + A Disk backed by a file. + """ + def __init__(self, device, size): + self.size = size + self.device = device + self.created = False + + def exists(self): + return os.path.exists(self.device) + + def create(self): + if self.created: + return + # create sparse disk image + cmd = "truncate %s -s %s" % (self.device, self.size) + exec_cmd(cmd) + self.created = True + class DirectImageCreator(BaseImageCreator): """ Installs a system into a file containing a partitioned disk image. @@ -52,7 +72,8 @@ class DirectImageCreator(BaseImageCreator): """ def __init__(self, oe_builddir, image_output_dir, rootfs_dir, bootimg_dir, - kernel_dir, native_sysroot, compressor, creatoropts=None): + kernel_dir, native_sysroot, compressor, creatoropts=None, + bmap=False): """ Initialize a DirectImageCreator instance. @@ -74,6 +95,7 @@ class DirectImageCreator(BaseImageCreator): self.kernel_dir = kernel_dir self.native_sysroot = native_sysroot self.compressor = compressor + self.bmap = bmap def __get_part_num(self, num, parts): """calculate the real partition number, accounting for partitions not @@ -221,12 +243,23 @@ class DirectImageCreator(BaseImageCreator): self.__image = Image(self.native_sysroot) - for part in parts: + disk_ids = {} + for num, part in enumerate(parts, 1): # as a convenience, set source to the boot partition source # instead of forcing it to be set via bootloader --source if not self.ks.bootloader.source and part.mountpoint == "/boot": self.ks.bootloader.source = part.source + # generate parition UUIDs + if not part.uuid and part.use_uuid: + if self.ptable_format == 'gpt': + part.uuid = str(uuid.uuid4()) + else: # msdos partition table + if part.disk not in disk_ids: + disk_ids[part.disk] = int.from_bytes(os.urandom(4), 'little') + disk_id = disk_ids[part.disk] + part.uuid = '%0x-%02d' % (disk_id, self.__get_part_num(num, parts)) + fstab_path = self._write_fstab(self.rootfs_dir.get("ROOTFS_DIR")) shutil.rmtree(self.workdir) @@ -267,7 +300,8 @@ class DirectImageCreator(BaseImageCreator): align=part.align, no_table=part.no_table, part_type=part.part_type, - uuid=part.uuid) + uuid=part.uuid, + system_id=part.system_id) if fstab_path: shutil.move(fstab_path + ".orig", fstab_path) @@ -279,9 +313,9 @@ class DirectImageCreator(BaseImageCreator): full_path = self._full_path(self.__imgdir, disk_name, "direct") msger.debug("Adding disk %s as %s with size %s bytes" \ % (disk_name, full_path, disk['min_size'])) - disk_obj = fs_related.DiskImage(full_path, disk['min_size']) + disk_obj = DiskImage(full_path, disk['min_size']) self.__disks[disk_name] = disk_obj - self.__image.add_disk(disk_name, disk_obj) + self.__image.add_disk(disk_name, disk_obj, disk_ids.get(disk_name)) self.__image.create() @@ -313,12 +347,17 @@ class DirectImageCreator(BaseImageCreator): self.bootimg_dir, self.kernel_dir, self.native_sysroot) - # Compress the image - if self.compressor: - for disk_name, disk in self.__image.disks.items(): - full_path = self._full_path(self.__imgdir, disk_name, "direct") - msger.debug("Compressing disk %s with %s" % \ - (disk_name, self.compressor)) + + for disk_name, disk in self.__image.disks.items(): + full_path = self._full_path(self.__imgdir, disk_name, "direct") + # Generate .bmap + if self.bmap: + msger.debug("Generating bmap file for %s" % disk_name) + exec_native_cmd("bmaptool create %s -o %s.bmap" % (full_path, full_path), + self.native_sysroot) + # Compress the image + if self.compressor: + msger.debug("Compressing disk %s with %s" % (disk_name, self.compressor)) exec_cmd("%s %s" % (self.compressor, full_path)) def print_outimage_info(self): @@ -375,6 +414,6 @@ class DirectImageCreator(BaseImageCreator): if not self.__image is None: try: self.__image.cleanup() - except ImageError, err: + except ImageError as err: msger.warning("%s" % err) |