Take partitionmap into consideration in device.map

Simplify boot task a little
This commit is contained in:
Anders Ingemann 2013-10-04 21:45:19 +02:00
parent 977b1f290f
commit c78866f103

View file

@ -17,13 +17,14 @@ class ConfigureGrub(Task):
grub_dir = os.path.join(boot_dir, 'grub') grub_dir = os.path.join(boot_dir, 'grub')
from base.fs.partitionmaps.none import NoPartitions from base.fs.partitionmaps.none import NoPartitions
from base.fs.partitionmaps.gpt import GPTPartitionMap
p_map = info.volume.partition_map
def remount(volume, fn): def remount(fn):
# GRUB cannot deal with installing to loopback devices # GRUB cannot deal with installing to loopback devices
# so we fake a real harddisk with dmsetup. # so we fake a real harddisk with dmsetup.
# Guide here: http://ebroder.net/2009/08/04/installing-grub-onto-a-disk-image/ # Guide here: http://ebroder.net/2009/08/04/installing-grub-onto-a-disk-image/
volume.unmount_specials() info.volume.unmount_specials()
p_map = volume.partition_map
if hasattr(p_map, 'boot'): if hasattr(p_map, 'boot'):
boot_dir = p_map.boot.mount_dir boot_dir = p_map.boot.mount_dir
p_map.boot.unmount() p_map.boot.unmount()
@ -34,22 +35,27 @@ class ConfigureGrub(Task):
p_map.map() p_map.map()
else: else:
fn() fn()
p_map.root.device_path = volume.device_path p_map.root.device_path = info.volume.device_path
p_map.root.mount(info.root) p_map.root.mount(info.root)
if hasattr(p_map, 'boot'): if hasattr(p_map, 'boot'):
p_map.boot.mount(boot_dir) p_map.boot.mount(boot_dir)
volume.mount_specials() info.volume.mount_specials()
if isinstance(info.volume, LoopbackVolume): if isinstance(info.volume, LoopbackVolume):
remount(info.volume, info.volume.link_dm_node) remount(info.volume.link_dm_node)
try: try:
[device_path] = log_check_call(['readlink', '-f', info.volume.device_path]) [device_path] = log_check_call(['readlink', '-f', info.volume.device_path])
device_map_path = os.path.join(grub_dir, 'device.map') device_map_path = os.path.join(grub_dir, 'device.map')
partition_prefix = 'msdos'
if isinstance(p_map, GPTPartitionMap):
partition_prefix = 'gpt'
with open(device_map_path, 'w') as device_map: with open(device_map_path, 'w') as device_map:
device_map.write('(hd0) {device_path}\n'.format(device_path=device_path)) device_map.write('(hd0) {device_path}\n'.format(device_path=device_path))
for idx, partition in enumerate(info.volume.partition_map.partitions): if not isinstance(p_map, NoPartitions):
[partition_path] = log_check_call(['readlink', '-f', partition.device_path]) for idx, partition in enumerate(info.volume.partition_map.partitions):
device_map.write('(hd0,gpt{idx}) {device_path}\n'.format(device_path=partition_path, idx=idx+1)) [partition_path] = log_check_call(['readlink', '-f', partition.device_path])
device_map.write('(hd0,{prefix}{idx}) {device_path}\n'
.format(device_path=partition_path, prefix=partition_prefix, idx=idx+1))
# Install grub # Install grub
log_check_call(['/usr/sbin/chroot', info.root, log_check_call(['/usr/sbin/chroot', info.root,
@ -60,7 +66,7 @@ class ConfigureGrub(Task):
log_check_call(['/usr/sbin/chroot', info.root, '/usr/sbin/update-grub']) log_check_call(['/usr/sbin/chroot', info.root, '/usr/sbin/update-grub'])
except Exception as e: except Exception as e:
if isinstance(info.volume, LoopbackVolume): if isinstance(info.volume, LoopbackVolume):
remount(info.volume, info.volume.unlink_dm_node) remount(info.volume.unlink_dm_node)
raise e raise e
if isinstance(info.volume, LoopbackVolume): if isinstance(info.volume, LoopbackVolume):