mirror of
https://github.com/flatcar/scripts.git
synced 2025-09-27 16:41:11 +02:00
commit
975894ee1a
@ -12,7 +12,7 @@ import uuid
|
||||
from optparse import OptionParser
|
||||
|
||||
# First sector we can use.
|
||||
START_SECTOR = 64
|
||||
GPT_RESERVED_SECTORS = 34
|
||||
|
||||
class ConfigNotFound(Exception):
|
||||
pass
|
||||
@ -36,7 +36,7 @@ def LoadPartitionConfig(filename):
|
||||
valid_keys = set(('_comment', 'metadata', 'layouts'))
|
||||
valid_layout_keys = set((
|
||||
'_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):
|
||||
raise ConfigNotFound('Partition config %s was not found!' % filename)
|
||||
@ -45,9 +45,14 @@ def LoadPartitionConfig(filename):
|
||||
|
||||
try:
|
||||
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])
|
||||
|
||||
# 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
|
||||
if unknown_keys:
|
||||
raise InvalidLayout('Unknown items: %r' % unknown_keys)
|
||||
@ -67,6 +72,7 @@ def LoadPartitionConfig(filename):
|
||||
if not s in part:
|
||||
raise InvalidLayout('Layout "%s" missing "%s"' % (layout_name, s))
|
||||
|
||||
part['alignment'] = int(part.get('alignment', metadata['alignment']))
|
||||
part['blocks'] = int(part['blocks'])
|
||||
part['bytes'] = part['blocks'] * metadata['block_size']
|
||||
|
||||
@ -220,17 +226,30 @@ def WritePartitionTable(options, image_type, layout_filename, disk_filename):
|
||||
def Cgpt(*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)
|
||||
metadata = config['metadata']
|
||||
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:
|
||||
disk_block_count = Align(disk_block_count, partition['alignment'])
|
||||
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)
|
||||
|
||||
sector = GPT_RESERVED_SECTORS
|
||||
for partition in partitions:
|
||||
sector = Align(sector, partition['alignment'])
|
||||
if partition['type'] != 'blank':
|
||||
Cgpt('add', '-i', partition['num'],
|
||||
'-b', sector,
|
||||
|
@ -1,6 +1,7 @@
|
||||
{
|
||||
"_comment": "See http://www.chromium.org/chromium-os/building-chromium-os/disk-layout-format",
|
||||
"metadata":{
|
||||
"alignment": 2048,
|
||||
"block_size": 512,
|
||||
"fs_block_size": 4096
|
||||
},
|
||||
@ -38,8 +39,8 @@
|
||||
"num": 5,
|
||||
"label":"ROOT-C",
|
||||
"uuid":"d82521b4-07ac-4f1c-8840-ddefedc332f3",
|
||||
"type":"coreos-rootfs",
|
||||
"blocks":"1"
|
||||
"type":"blank",
|
||||
"blocks":"0"
|
||||
},
|
||||
{
|
||||
"num": 6,
|
||||
@ -49,15 +50,15 @@
|
||||
},
|
||||
{
|
||||
"num": 7,
|
||||
"type":"coreos-reserved",
|
||||
"type":"blank",
|
||||
"label":"coreos-reserved",
|
||||
"blocks":"1"
|
||||
"blocks":"0"
|
||||
},
|
||||
{
|
||||
"num": 8,
|
||||
"type":"coreos-reserved",
|
||||
"type":"blank",
|
||||
"label":"coreos-reserved",
|
||||
"blocks":"1"
|
||||
"blocks":"0"
|
||||
},
|
||||
{
|
||||
"num": 9,
|
||||
|
Loading…
x
Reference in New Issue
Block a user