From c78866f103c554e5e619ecca3103ada8bd88ef29 Mon Sep 17 00:00:00 2001 From: Anders Ingemann Date: Fri, 4 Oct 2013 21:45:19 +0200 Subject: [PATCH] Take partitionmap into consideration in device.map Simplify boot task a little --- providers/virtualbox/tasks/boot.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/providers/virtualbox/tasks/boot.py b/providers/virtualbox/tasks/boot.py index 12694c0..4577e92 100644 --- a/providers/virtualbox/tasks/boot.py +++ b/providers/virtualbox/tasks/boot.py @@ -17,13 +17,14 @@ class ConfigureGrub(Task): grub_dir = os.path.join(boot_dir, 'grub') 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 # so we fake a real harddisk with dmsetup. # Guide here: http://ebroder.net/2009/08/04/installing-grub-onto-a-disk-image/ - volume.unmount_specials() - p_map = volume.partition_map + info.volume.unmount_specials() if hasattr(p_map, 'boot'): boot_dir = p_map.boot.mount_dir p_map.boot.unmount() @@ -34,22 +35,27 @@ class ConfigureGrub(Task): p_map.map() else: fn() - p_map.root.device_path = volume.device_path + p_map.root.device_path = info.volume.device_path p_map.root.mount(info.root) if hasattr(p_map, 'boot'): p_map.boot.mount(boot_dir) - volume.mount_specials() + info.volume.mount_specials() if isinstance(info.volume, LoopbackVolume): - remount(info.volume, info.volume.link_dm_node) + remount(info.volume.link_dm_node) try: [device_path] = log_check_call(['readlink', '-f', info.volume.device_path]) 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: device_map.write('(hd0) {device_path}\n'.format(device_path=device_path)) - for idx, partition in enumerate(info.volume.partition_map.partitions): - [partition_path] = log_check_call(['readlink', '-f', partition.device_path]) - device_map.write('(hd0,gpt{idx}) {device_path}\n'.format(device_path=partition_path, idx=idx+1)) + if not isinstance(p_map, NoPartitions): + for idx, partition in enumerate(info.volume.partition_map.partitions): + [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 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']) except Exception as e: if isinstance(info.volume, LoopbackVolume): - remount(info.volume, info.volume.unlink_dm_node) + remount(info.volume.unlink_dm_node) raise e if isinstance(info.volume, LoopbackVolume):