partitionedfs: enable GPT support
authorArtem Bityutskiy <artem.bityutskiy@intel.com>
Mon, 7 Jan 2013 10:12:41 +0000 (12:12 +0200)
committerArtem Bityutskiy <artem.bityutskiy@intel.com>
Fri, 11 Jan 2013 09:42:54 +0000 (11:42 +0200)
This adds finally GPT support. It works, and Tizen IVI images with GPT
partition table boot fine.

We now need is to use 'root=PARTUUID=<uuid>' in syslinux.conf to boot by
UUID - will be added later as well.

Change-Id: Icfe938e72b96c4092131039a120d6095b3acbbd4
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@intel.com>
mic/imager/raw.py
mic/utils/partitionedfs.py

index 6f414a4..443a642 100644 (file)
@@ -49,6 +49,7 @@ class RawImageCreator(BaseImageCreator):
         self.__disks = {}
         self.__disk_format = "raw"
         self._disk_names = []
+        self._ptable_format = self.ks.handler.bootloader.ptable
         self.vmem = 512
         self.vcpu = 1
         self.checksum = False
@@ -191,7 +192,7 @@ class RawImageCreator(BaseImageCreator):
                                           boot = p.active,
                                           align = p.align)
 
-        self.__instloop.layout_partitions()
+        self.__instloop.layout_partitions(self._ptable_format)
 
         # Create the disks
         self.__imgdir = self._mkdtemp()
@@ -314,18 +315,22 @@ class RawImageCreator(BaseImageCreator):
             loopdev = self.__disks[name].device
             i =i+1
 
-        msger.debug("Installing syslinux bootloader to %s" % loopdev)
-
         (bootdevnum, rootdevnum, rootdev, prefix) = \
                                     self._get_syslinux_boot_config()
 
 
         #Set MBR
-        mbrsize = os.stat("%s/usr/share/syslinux/mbr.bin" \
-                          % self._instroot)[stat.ST_SIZE]
-        rc = runner.show(['dd',
-                          'if=%s/usr/share/syslinux/mbr.bin' % self._instroot,
-                          'of=' + loopdev])
+        mbrfile = "%s/usr/share/syslinux/" % self._instroot
+        if self._ptable_format == 'gpt':
+            mbrfile += "gptmbr.bin"
+        else:
+            mbrfile += "mbr.bin"
+
+        msger.debug("Installing syslinux bootloader '%s' to %s" % \
+                    (mbrfile, loopdev))
+
+        mbrsize = os.stat(mbrfile)[stat.ST_SIZE]
+        rc = runner.show(['dd', 'if=%s' % mbrfile, 'of=' + loopdev])
         if rc != 0:
             raise MountError("Unable to set MBR to %s" % loopdev)
 
index ea335a2..2f4de2b 100644 (file)
@@ -289,7 +289,8 @@ class PartitionedMount(Mount):
             d = self.disks[dev]
             msger.debug("Initializing partition table for %s" % \
                         (d['disk'].device))
-            self.__run_parted([ "-s", d['disk'].device, "mklabel", "msdos" ])
+            self.__run_parted(["-s", d['disk'].device, "mklabel",
+                               d['ptable_format']])
 
         msger.debug("Creating partitions")
 
@@ -322,10 +323,14 @@ class PartitionedMount(Mount):
                                     parted_fs_type, p['start'], p['size'])
 
             if p['boot']:
-                msger.debug("Set boot flag for partition '%s' on disk '%s'" % \
-                            (p['num'], d['disk'].device))
+                if d['ptable_format'] == 'gpt':
+                    flag_name = "legacy_boot"
+                else:
+                    flag_name = "boot"
+                msger.debug("Set '%s' flag for partition '%s' on disk '%s'" % \
+                            (flag_name, p['num'], d['disk'].device))
                 self.__run_parted(["-s", d['disk'].device, "set",
-                                   "%d" % p['num'], "boot", "on"])
+                                   "%d" % p['num'], flag_name, "on"])
 
     def __map_partitions(self):
         """Load it if dm_snapshot isn't loaded. """