From 22760c76db0843082609efeb62e32f351f02c059 Mon Sep 17 00:00:00 2001 From: Tiago Ilieve Date: Sat, 25 Apr 2015 19:24:55 -0300 Subject: [PATCH] Revert a2cf28b (#213) Looks like we may or may not need to create those uuid links by ourselves. This patch also adds a verification to not create/delete the link if it already exists or not, respectively. --- bootstrapvz/base/fs/partitions/base.py | 31 ++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/bootstrapvz/base/fs/partitions/base.py b/bootstrapvz/base/fs/partitions/base.py index 67234e0..696a92a 100644 --- a/bootstrapvz/base/fs/partitions/base.py +++ b/bootstrapvz/base/fs/partitions/base.py @@ -1,3 +1,4 @@ +import os from abstract import AbstractPartition from bootstrapvz.common.sectors import Sectors @@ -31,6 +32,8 @@ class BasePartition(AbstractPartition): self.previous = previous # List of flags that parted should put on the partition self.flags = [] + # Path to symlink in /dev/disk/by-uuid (manually maintained by this class) + self.disk_by_uuid_path = None super(BasePartition, self).__init__(size, filesystem, format_command) def create(self, volume): @@ -71,6 +74,25 @@ class BasePartition(AbstractPartition): """ self.fsm.map(device_path=device_path) + def link_uuid(self): + # /lib/udev/rules.d/60-kpartx.rules does not create symlinks in /dev/disk/by-{uuid,label} + # This patch would fix that: http://www.redhat.com/archives/dm-devel/2013-July/msg00080.html + # For now we just do the uuid part ourselves. + # This is mainly to fix a problem in update-grub where /etc/grub.d/10_linux + # checks if the $GRUB_DEVICE_UUID exists in /dev/disk/by-uuid and falls + # back to $GRUB_DEVICE if it doesn't. + # $GRUB_DEVICE is /dev/mapper/xvd{f,g...}# (on ec2), opposed to /dev/xvda# when booting. + # Creating the symlink ensures that grub consistently uses + # $GRUB_DEVICE_UUID when creating /boot/grub/grub.cfg + self.disk_by_uuid_path = os.path.join('/dev/disk/by-uuid', self.get_uuid()) + if not os.path.exists(self.disk_by_uuid_path): + os.symlink(self.device_path, self.disk_by_uuid_path) + + def unlink_uuid(self): + if os.path.isfile(self.disk_by_uuid_path): + os.remove(self.disk_by_uuid_path) + self.disk_by_uuid_path = None + def _before_create(self, e): """Creates the partition """ @@ -92,7 +114,16 @@ class BasePartition(AbstractPartition): def _before_map(self, e): # Set the device path self.device_path = e.device_path + if e.src == 'unmapped_fmt': + # Only link the uuid if the partition is formatted + self.link_uuid() + + def _after_format(self, e): + # We do this after formatting because there otherwise would be no UUID + self.link_uuid() def _before_unmap(self, e): # When unmapped, the device_path information becomes invalid, so we delete it self.device_path = None + if e.src == 'formatted': + self.unlink_uuid()