[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[PATCH] handle upgrades on systems whose rootfs is on an encrypted logical volume (471288)



Another upgrade case I didn't catch earlier: root on encrypted LV. Since
it's an LV, we use the device in fstab, not a UUID. So, fsset.readFstab
doesn't know how to get from /dev/mapper/luks-$lvname
to /dev/mapper/$lvname. This patch adds a new function to retrieve a
backing device from /etc/crypttab so we can create a usable Device
instance and thus successfully upgrade.

diff --git a/fsset.py b/fsset.py
index 40eb0d2..31c623e 100644
--- a/fsset.py
+++ b/fsset.py
@@ -2695,6 +2695,21 @@ def makeDevice(dev):
         device = PartitionDevice(dev, encryption=cryptoDev)
     return device
 
+def findBackingDevInCrypttab(mappingName):
+    backingDev = None
+    try:
+        lines = open("/mnt/sysimage/etc/crypttab").readlines()
+    except IOError, e:
+        pass
+    else:
+        for line in lines:
+            fields = line.split()
+            if fields[0] == mappingName:
+                backingDev = fields[1]
+                break
+
+    return backingDev
+
 # XXX fix RAID
 def readFstab (anaconda):
     def createMapping(dict):
@@ -2833,6 +2848,39 @@ def readFstab (anaconda):
             if loopIndex.has_key(device):
                 (dev, fs) = loopIndex[device]
                 device = LoopbackDevice(dev, fs)
+        elif fields[0].startswith("/dev/mapper/luks-"):
+            backingDev = findBackingDevInCrypttab(fields[0][12:])
+            log.debug("device %s has backing device %s" % (fields[0],
+                                                           backingDev))
+            if backingDev is None:
+                log.error("unable to resolve backing device for %s" %
fields[0]
+                continue
+            elif backingDev.startswith('LABEL='):
+                label = backingDev[6:]
+                if label in labelDupes:
+                    showError(label, intf)
+
+                if labelToDevice.has_key(label):
+                    device = makeDevice(labelToDevice[label])
     def createMapping(dict):
@@ -2833,6 +2848,39 @@ def readFstab (anaconda):
             if loopIndex.has_key(device):
                 (dev, fs) = loopIndex[device]
                 device = LoopbackDevice(dev, fs)
+        elif fields[0].startswith("/dev/mapper/luks-"):
+            backingDev = findBackingDevInCrypttab(fields[0][12:])
+            log.debug("device %s has backing device %s" % (fields[0],
+                                                           backingDev))
+            if backingDev is None:
+                log.error("unable to resolve backing device for %s" %
fields[0]
+                continue
+            elif backingDev.startswith('LABEL='):
+                label = backingDev[6:]
+                if label in labelDupes:
+                    showError(label, intf)
+
+                if labelToDevice.has_key(label):
+                    device = makeDevice(labelToDevice[label])
+                else:
+                    log.warning ("crypttab file has LABEL=%s, but this
label "
+                                 "could not be found on any file
system", label
+                    # bad luck, skip this entry.
+                    continue
+            elif backingDev.startswith('UUID='):
+                uuid = backingDev[5:]
+                if uuid in uuidDupes:
+                    showError(uuid, intf)
+
+                if uuidToDevice.has_key(uuid):
+                    device = makeDevice(uuidToDevice[uuid])
+                else:
+                    log.warning ("crypttab file has UUID=%s, but this
UUID"
+                                 "could not be found on any file
system", uuid)
+                    # bad luck, skip this entry.
+                    continue
+            else:
+                device = makeDevice(backingDev[5:])
         elif fields[0].startswith('/dev/'):
             # Older installs may have lines starting with things
like /dev/proc
             # so watch out for that on upgrade.


Dave


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]