diff options
Diffstat (limited to 'scripts/lib/mic/utils/partitionedfs.py')
| -rw-r--r-- | scripts/lib/mic/utils/partitionedfs.py | 58 |
1 files changed, 8 insertions, 50 deletions
diff --git a/scripts/lib/mic/utils/partitionedfs.py b/scripts/lib/mic/utils/partitionedfs.py index 83ce869860..0c4c9ecfa0 100644 --- a/scripts/lib/mic/utils/partitionedfs.py +++ b/scripts/lib/mic/utils/partitionedfs.py | |||
| @@ -24,13 +24,10 @@ from mic import msger | |||
| 24 | from mic.utils import runner | 24 | from mic.utils import runner |
| 25 | from mic.utils.errors import MountError | 25 | from mic.utils.errors import MountError |
| 26 | from mic.utils.fs_related import * | 26 | from mic.utils.fs_related import * |
| 27 | from mic.utils.gpt_parser import GptParser | ||
| 28 | from mic.utils.oe.misc import * | 27 | from mic.utils.oe.misc import * |
| 29 | 28 | ||
| 30 | # Overhead of the MBR partitioning scheme (just one sector) | 29 | # Overhead of the MBR partitioning scheme (just one sector) |
| 31 | MBR_OVERHEAD = 1 | 30 | MBR_OVERHEAD = 1 |
| 32 | # Overhead of the GPT partitioning scheme | ||
| 33 | GPT_OVERHEAD = 34 | ||
| 34 | 31 | ||
| 35 | # Size of a sector in bytes | 32 | # Size of a sector in bytes |
| 36 | SECTOR_SIZE = 512 | 33 | SECTOR_SIZE = 512 |
| @@ -148,21 +145,20 @@ class PartitionedMount(Mount): | |||
| 148 | 'num': None, # Partition number | 145 | 'num': None, # Partition number |
| 149 | 'boot': boot, # Bootable flag | 146 | 'boot': boot, # Bootable flag |
| 150 | 'align': align, # Partition alignment | 147 | 'align': align, # Partition alignment |
| 151 | 'part_type' : part_type, # Partition type | 148 | 'part_type' : part_type } # Partition type |
| 152 | 'partuuid': None } # Partition UUID (GPT-only) | ||
| 153 | 149 | ||
| 154 | self.__add_partition(part) | 150 | self.__add_partition(part) |
| 155 | 151 | ||
| 156 | def layout_partitions(self, ptable_format = "msdos"): | 152 | def layout_partitions(self, ptable_format = "msdos"): |
| 157 | """ Layout the partitions, meaning calculate the position of every | 153 | """ Layout the partitions, meaning calculate the position of every |
| 158 | partition on the disk. The 'ptable_format' parameter defines the | 154 | partition on the disk. The 'ptable_format' parameter defines the |
| 159 | partition table format, and may be either "msdos" or "gpt". """ | 155 | partition table format and may be "msdos". """ |
| 160 | 156 | ||
| 161 | msger.debug("Assigning %s partitions to disks" % ptable_format) | 157 | msger.debug("Assigning %s partitions to disks" % ptable_format) |
| 162 | 158 | ||
| 163 | if ptable_format not in ('msdos', 'gpt'): | 159 | if ptable_format not in ('msdos'): |
| 164 | raise MountError("Unknown partition table format '%s', supported " \ | 160 | raise MountError("Unknown partition table format '%s', supported " \ |
| 165 | "formats are: 'msdos' and 'gpt'" % ptable_format) | 161 | "formats are: 'msdos'" % ptable_format) |
| 166 | 162 | ||
| 167 | if self._partitions_layed_out: | 163 | if self._partitions_layed_out: |
| 168 | return | 164 | return |
| @@ -177,12 +173,12 @@ class PartitionedMount(Mount): | |||
| 177 | raise MountError("No disk %s for partition %s" \ | 173 | raise MountError("No disk %s for partition %s" \ |
| 178 | % (p['disk_name'], p['mountpoint'])) | 174 | % (p['disk_name'], p['mountpoint'])) |
| 179 | 175 | ||
| 180 | if p['part_type'] and ptable_format != 'gpt': | 176 | if p['part_type']: |
| 181 | # The --part-type can also be implemented for MBR partitions, | 177 | # The --part-type can also be implemented for MBR partitions, |
| 182 | # in which case it would map to the 1-byte "partition type" | 178 | # in which case it would map to the 1-byte "partition type" |
| 183 | # filed at offset 3 of the partition entry. | 179 | # filed at offset 3 of the partition entry. |
| 184 | raise MountError("setting custom partition type is only " \ | 180 | raise MountError("setting custom partition type is not " \ |
| 185 | "imlemented for GPT partitions") | 181 | "implemented for msdos partitions") |
| 186 | 182 | ||
| 187 | # Get the disk where the partition is located | 183 | # Get the disk where the partition is located |
| 188 | d = self.disks[p['disk_name']] | 184 | d = self.disks[p['disk_name']] |
| @@ -192,8 +188,6 @@ class PartitionedMount(Mount): | |||
| 192 | if d['numpart'] == 1: | 188 | if d['numpart'] == 1: |
| 193 | if ptable_format == "msdos": | 189 | if ptable_format == "msdos": |
| 194 | overhead = MBR_OVERHEAD | 190 | overhead = MBR_OVERHEAD |
| 195 | else: | ||
| 196 | overhead = GPT_OVERHEAD | ||
| 197 | 191 | ||
| 198 | # Skip one sector required for the partitioning scheme overhead | 192 | # Skip one sector required for the partitioning scheme overhead |
| 199 | d['offset'] += overhead | 193 | d['offset'] += overhead |
| @@ -250,9 +244,6 @@ class PartitionedMount(Mount): | |||
| 250 | # minumim disk sizes. | 244 | # minumim disk sizes. |
| 251 | for disk_name, d in self.disks.items(): | 245 | for disk_name, d in self.disks.items(): |
| 252 | d['min_size'] = d['offset'] | 246 | d['min_size'] = d['offset'] |
| 253 | if d['ptable_format'] == 'gpt': | ||
| 254 | # Account for the backup partition table at the end of the disk | ||
| 255 | d['min_size'] += GPT_OVERHEAD | ||
| 256 | 247 | ||
| 257 | d['min_size'] *= self.sector_size | 248 | d['min_size'] *= self.sector_size |
| 258 | 249 | ||
| @@ -339,10 +330,7 @@ class PartitionedMount(Mount): | |||
| 339 | parted_fs_type, p['start'], p['size']) | 330 | parted_fs_type, p['start'], p['size']) |
| 340 | 331 | ||
| 341 | if p['boot']: | 332 | if p['boot']: |
| 342 | if d['ptable_format'] == 'gpt': | 333 | flag_name = "boot" |
| 343 | flag_name = "legacy_boot" | ||
| 344 | else: | ||
| 345 | flag_name = "boot" | ||
| 346 | msger.debug("Set '%s' flag for partition '%s' on disk '%s'" % \ | 334 | msger.debug("Set '%s' flag for partition '%s' on disk '%s'" % \ |
| 347 | (flag_name, p['num'], d['disk'].device)) | 335 | (flag_name, p['num'], d['disk'].device)) |
| 348 | self.__run_parted(["-s", d['disk'].device, "set", | 336 | self.__run_parted(["-s", d['disk'].device, "set", |
| @@ -358,36 +346,6 @@ class PartitionedMount(Mount): | |||
| 358 | self.__run_parted(["-s", d['disk'].device, "set", | 346 | self.__run_parted(["-s", d['disk'].device, "set", |
| 359 | "%d" % p['num'], "lba", "off"]) | 347 | "%d" % p['num'], "lba", "off"]) |
| 360 | 348 | ||
| 361 | # If the partition table format is "gpt", find out PARTUUIDs for all | ||
| 362 | # the partitions. And if users specified custom parition type UUIDs, | ||
| 363 | # set them. | ||
| 364 | for disk_name, disk in self.disks.items(): | ||
| 365 | if disk['ptable_format'] != 'gpt': | ||
| 366 | continue | ||
| 367 | |||
| 368 | pnum = 0 | ||
| 369 | gpt_parser = GptParser(d['disk'].device, SECTOR_SIZE) | ||
| 370 | # Iterate over all GPT partitions on this disk | ||
| 371 | for entry in gpt_parser.get_partitions(): | ||
| 372 | pnum += 1 | ||
| 373 | # Find the matching partition in the 'self.partitions' list | ||
| 374 | for n in d['partitions']: | ||
| 375 | p = self.partitions[n] | ||
| 376 | if p['num'] == pnum: | ||
| 377 | # Found, fetch PARTUUID (partition's unique ID) | ||
| 378 | p['partuuid'] = entry['part_uuid'] | ||
| 379 | msger.debug("PARTUUID for partition %d on disk '%s' " \ | ||
| 380 | "(mount point '%s') is '%s'" % (pnum, \ | ||
| 381 | disk_name, p['mountpoint'], p['partuuid'])) | ||
| 382 | if p['part_type']: | ||
| 383 | entry['type_uuid'] = p['part_type'] | ||
| 384 | msger.debug("Change type of partition %d on disk " \ | ||
| 385 | "'%s' (mount point '%s') to '%s'" % \ | ||
| 386 | (pnum, disk_name, p['mountpoint'], | ||
| 387 | p['part_type'])) | ||
| 388 | gpt_parser.change_partition(entry) | ||
| 389 | |||
| 390 | del gpt_parser | ||
| 391 | 349 | ||
| 392 | def __map_partitions(self): | 350 | def __map_partitions(self): |
| 393 | """Load it if dm_snapshot isn't loaded. """ | 351 | """Load it if dm_snapshot isn't loaded. """ |
