Merge pull request #123 from marineam/align

Align partitions
This commit is contained in:
Michael Marineau 2013-10-17 20:13:43 -07:00
commit 975894ee1a
2 changed files with 31 additions and 11 deletions

View File

@ -12,7 +12,7 @@ import uuid
from optparse import OptionParser from optparse import OptionParser
# First sector we can use. # First sector we can use.
START_SECTOR = 64 GPT_RESERVED_SECTORS = 34
class ConfigNotFound(Exception): class ConfigNotFound(Exception):
pass pass
@ -36,7 +36,7 @@ def LoadPartitionConfig(filename):
valid_keys = set(('_comment', 'metadata', 'layouts')) valid_keys = set(('_comment', 'metadata', 'layouts'))
valid_layout_keys = set(( valid_layout_keys = set((
'_comment', 'type', 'num', 'label', 'blocks', 'block_size', 'fs_blocks', '_comment', 'type', 'num', 'label', 'blocks', 'block_size', 'fs_blocks',
'fs_block_size', 'features', 'uuid')) 'fs_block_size', 'features', 'uuid', 'alignment'))
if not os.path.exists(filename): if not os.path.exists(filename):
raise ConfigNotFound('Partition config %s was not found!' % filename) raise ConfigNotFound('Partition config %s was not found!' % filename)
@ -45,9 +45,14 @@ def LoadPartitionConfig(filename):
try: try:
metadata = config['metadata'] metadata = config['metadata']
for key in ('block_size', 'fs_block_size'): for key in ('alignment', 'block_size', 'fs_block_size'):
metadata[key] = int(metadata[key]) metadata[key] = int(metadata[key])
# Sometimes qemu-img expects disks sizes aligned to 64k
align_bytes = metadata['alignment'] * metadata['block_size']
if align_bytes < 65536 or align_bytes % 65536 != 0:
raise InvalidLayout('Invalid alignment, 64KB or better required')
unknown_keys = set(config.keys()) - valid_keys unknown_keys = set(config.keys()) - valid_keys
if unknown_keys: if unknown_keys:
raise InvalidLayout('Unknown items: %r' % unknown_keys) raise InvalidLayout('Unknown items: %r' % unknown_keys)
@ -67,6 +72,7 @@ def LoadPartitionConfig(filename):
if not s in part: if not s in part:
raise InvalidLayout('Layout "%s" missing "%s"' % (layout_name, s)) raise InvalidLayout('Layout "%s" missing "%s"' % (layout_name, s))
part['alignment'] = int(part.get('alignment', metadata['alignment']))
part['blocks'] = int(part['blocks']) part['blocks'] = int(part['blocks'])
part['bytes'] = part['blocks'] * metadata['block_size'] part['bytes'] = part['blocks'] * metadata['block_size']
@ -220,17 +226,30 @@ def WritePartitionTable(options, image_type, layout_filename, disk_filename):
def Cgpt(*args): def Cgpt(*args):
subprocess.check_call(['cgpt'] + [str(a) for a in args]) subprocess.check_call(['cgpt'] + [str(a) for a in args])
def Align(count, alignment):
offset = count % alignment
if offset:
count += alignment - offset
return count
config = LoadPartitionConfig(layout_filename) config = LoadPartitionConfig(layout_filename)
metadata = config['metadata']
partitions = GetPartitionTable(options, config, image_type) partitions = GetPartitionTable(options, config, image_type)
disk_block_count = START_SECTOR * config['metadata']['block_size'] disk_block_count = GPT_RESERVED_SECTORS
for partition in partitions: for partition in partitions:
disk_block_count = Align(disk_block_count, partition['alignment'])
disk_block_count += partition['blocks'] disk_block_count += partition['blocks']
sector = START_SECTOR disk_block_count += GPT_RESERVED_SECTORS
# Sometimes qemu-img expects disks sizes aligned to 64k
disk_block_count = Align(disk_block_count, config['metadata']['alignment'])
Cgpt('create', '-c', '-s', disk_block_count, disk_filename) Cgpt('create', '-c', '-s', disk_block_count, disk_filename)
sector = GPT_RESERVED_SECTORS
for partition in partitions: for partition in partitions:
sector = Align(sector, partition['alignment'])
if partition['type'] != 'blank': if partition['type'] != 'blank':
Cgpt('add', '-i', partition['num'], Cgpt('add', '-i', partition['num'],
'-b', sector, '-b', sector,

View File

@ -1,6 +1,7 @@
{ {
"_comment": "See http://www.chromium.org/chromium-os/building-chromium-os/disk-layout-format", "_comment": "See http://www.chromium.org/chromium-os/building-chromium-os/disk-layout-format",
"metadata":{ "metadata":{
"alignment": 2048,
"block_size": 512, "block_size": 512,
"fs_block_size": 4096 "fs_block_size": 4096
}, },
@ -38,8 +39,8 @@
"num": 5, "num": 5,
"label":"ROOT-C", "label":"ROOT-C",
"uuid":"d82521b4-07ac-4f1c-8840-ddefedc332f3", "uuid":"d82521b4-07ac-4f1c-8840-ddefedc332f3",
"type":"coreos-rootfs", "type":"blank",
"blocks":"1" "blocks":"0"
}, },
{ {
"num": 6, "num": 6,
@ -49,15 +50,15 @@
}, },
{ {
"num": 7, "num": 7,
"type":"coreos-reserved", "type":"blank",
"label":"coreos-reserved", "label":"coreos-reserved",
"blocks":"1" "blocks":"0"
}, },
{ {
"num": 8, "num": 8,
"type":"coreos-reserved", "type":"blank",
"label":"coreos-reserved", "label":"coreos-reserved",
"blocks":"1" "blocks":"0"
}, },
{ {
"num": 9, "num": 9,