Git Repositories

Always try to mount /boot in any Linux partition. Chroot not used anymore.
authorCyrille Pontvieux <cyrille.pontvieux@april-waf.com>
Wed, 11 Dec 2013 00:07:09 +0000 (01:07 +0100)
committerCyrille Pontvieux <cyrille.pontvieux@april-waf.com>
Wed, 11 Dec 2013 00:07:09 +0000 (01:07 +0100)
Does not try to mount an already mounted partition.

src/lib/lilo.py

index 50a3c8d..879be17 100644 (file)
@@ -26,7 +26,7 @@ class Lilo:
   _mbrDevice = None
   _bootPartition = None
   _partitions = None
-  _bootInBootMounted = False
+  _bootsMounted = []
   _cfgTemplate = """# LILO configuration file
 # Generated by BootSetup
 #
@@ -128,20 +128,28 @@ vga = {vga}
     self.__debug("bootPartition = " + self._bootPartition)
     if sltl.isMounted(self._bootPartition):
       self.__debug("bootPartition already mounted")
-      return sltl.getMountPoint(self._bootPartition)
+      mp = sltl.getMountPoint(self._bootPartition)
     else:
       self.__debug("bootPartition not mounted")
-      return sltl.mountDevice(self._bootPartition)
+      mp = sltl.mountDevice(self._bootPartition)
+    if mp:
+      self._mountBootInPartition(mp)
+    return mp
 
-  def _mountBootInBootPartition(self, mountPoint):
+  def _mountBootInPartition(self, mountPoint):
     # assume that if the mount_point is /, any /boot directory is already accessible/mounted
-    if mountPoint != '/' and os.path.exists(os.path.join(mountPoint, 'etc/fstab')):
-      self.__debug("mp != / and etc/fstab exists, will try to mount /boot by chrooting")
+    fstab = os.path.join(mountPoint, 'etc/fstab')
+    bootdir = os.path.join(mountPoint, 'boot')
+    if mountPoint != '/' and os.path.exists(fstab) and os.path.exists(bootdir):
+      self.__debug("mp != / and etc/fstab + boot exists, will try to mount /boot by reading fstab")
       try:
-        self.__debug("grep -q /boot {mp}/etc/fstab && chroot {mp} /sbin/mount /boot".format(mp = mountPoint))
-        if sltl.execCall("grep -q /boot {mp}/etc/fstab && chroot {mp} /sbin/mount /boot".format(mp = mountPoint)):
-          self.__debug("/boot mounted in " + mp)
-          self._bootInBootMounted = True
+        self.__debug('set -- $(grep /boot {fstab}) && echo "$1,$3"'.format(fstab = fstab))
+        (bootDev, bootType) = sltl.execGetOutput('set -- $(grep /boot {fstab}) && echo "$1,$3"'.format(fstab = fstab), shell = True)[0].split(',')
+        if bootDev and not os.path.ismount(bootdir):
+          mp = sltl.mountDevice(bootDev, fsType = bootType, mountPoint = bootdir)
+          if mp:
+            self._bootsMounted.append(mp)
+            self.__debug("/boot mounted in " + mp)
       except:
         pass
 
@@ -155,24 +163,29 @@ vga = {vga}
       for p in partitionsToMount:
         dev = os.path.join("/dev", p[0])
         self.__debug("mount partition " + dev)
-        mp = sltl.mountDevice(dev)
+        if sltl.isMounted(dev):
+          mp = sltl.getMountPoint(dev)
+        else:
+          mp = sltl.mountDevice(dev)
         self.__debug("mount partition " + dev + " => " + unicode(mp))
         if mp:
           mountPointList[p[0]] = mp
+          self._mountBootInPartition(mp)
         else:
           raise Exception("Cannot mount {d}".format(d = dev))
 
   def _umountAll(self, mountPoint, mountPointList):
     self.__debug("umountAll")
     if mountPoint:
-      self.__debug("umounting main mount point " + mountPoint)
-      if self._bootInBootMounted:
-        self.__debut("/boot mounted in " + mountPoint + ", so umount it")
-        sltl.execCall("chroot {mp} /sbin/umount /boot".format(mp = mountPoint))
-        self._bootInBootMounted = False
+      for mp in self._bootsMounted:
+        self.__debug("umounting " + unicode(mp))
+        sltl.umountDevice(mp, deleteMountPoint = False)
+      self._bootsMounted = []
       if mountPointList:
         self.__debug("umount other mount points: " + unicode(mountPointList))
         for mp in mountPointList.values():
+          if mp == mountPoint:
+            continue # skip it, will be unmounted just next
           self.__debug("umount " + unicode(mp))
           sltl.umountDevice(mp)
       if mountPoint != '/':
@@ -405,6 +418,7 @@ vga = {vga}
     self._mbrDevice = os.path.join("/dev", mbrDevice)
     self._bootPartition = os.path.join("/dev", bootPartition)
     self._partitions = partitions
+    self._bootsMounted = []
     self.__debug("partitions: " + unicode(self._partitions))
     mp = None
     mpList = None
@@ -413,7 +427,6 @@ vga = {vga}
       if not mp:
         raise Exception("Cannot mount the main boot partition.")
       self.__debug("mp = " + unicode(mp))
-      self._mountBootInBootPartition(mp)
       mpList = {}
       self._mountPartitions(mpList)
       self.__debug("mount point lists: " + unicode(mpList))
@@ -435,7 +448,7 @@ vga = {vga}
     Assuming that last configuration editing didn't modified mount point.
     """
     if self._mbrDevice:
-      self._bootInBootMounted = False
+      self._bootsMounted = []
       mp = None
       mpList = None
       try:
@@ -443,12 +456,6 @@ vga = {vga}
         if not mp:
           raise Exception("Cannot mount the main boot partition.")
         self.__debug("mp = " + unicode(mp))
-        self._mountBootInBootPartition(mp)
-        if mp != "/":
-          self.__debug("mount point ≠ / so mount /dev and /proc in it")
-          # bind /dev and /proc in boot_partition
-          sltl.execCall('mount -o bind /dev {mp}/dev'.format(mp = mp))
-          sltl.execCall('mount -o bind /proc {mp}/proc'.format(mp = mp))
         mpList = {}
         self._mountPartitions(mpList)
         self.__debug("mount point lists: " + unicode(mpList))
@@ -467,8 +474,4 @@ vga = {vga}
         else:
           sltl.execCall('/sbin/lilo -C {mp}/etc/bootsetup/lilo.conf'.format(mp = mp))
       finally:
-        if mp and mp != "/":
-          self.__debug("mount point ≠ / so umount /dev and /proc in it")
-          sltl.execCall('umount {mp}/proc'.format(mp = mp))
-          sltl.execCall('umount {mp}/dev'.format(mp = mp))
         self._umountAll(mp, mpList)