If we are booting from multipath, efibootmgr needs to be called on
all constituent devices, much like RAID1 boot would be for it's
mirrored /boot partitions.
---
booty/bootloaderInfo.py | 24 +++++++++++++++++-------
1 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/booty/bootloaderInfo.py b/booty/bootloaderInfo.py
index 9011886..c1486bf 100644
--- a/booty/bootloaderInfo.py
+++ b/booty/bootloaderInfo.py
@@ -678,13 +678,23 @@ class efiBootloaderInfo(bootloaderInfo):
log.error("bootdev not found for '%s'" % (bootdisk,))
return 1
- argv = [ "efibootmgr", "-c" , "-w", "-L",
- productName, "-d", "%s" % (bootdev.path,),
- "-p", "%s" % (bootpart,),
- "-l", "\\EFI\\redhat\\" + self.bootloader ]
- rc = iutil.execWithRedirect(argv[0], argv[1:], root = instRoot,
- stdout = "/dev/tty5",
- stderr = "/dev/tty5")
+ # if the bootdev is multipath, we need to call efibootmgr on all it's
+ # member devices
+ if isinstance(bootdev, MultipathDevice):
+ bootdevlist = bootdev.parents
+ else:
+ bootdevlist = [bootdev]
+
+ for d in bootdevlist:
+ argv = [ "efibootmgr", "-c" , "-w", "-L",
+ productName, "-d", "%s" % (d.path,),
+ "-p", "%s" % (bootpart,),
+ "-l", "\\EFI\\redhat\\" + self.bootloader ]
+ rc = iutil.execWithRedirect(argv[0], argv[1:], root = instRoot,
+ stdout = "/dev/tty5",
+ stderr = "/dev/tty5")
+
+ # return last rc, the API doesn't provide anything better than this
return rc
def getEfiProductPath(self, productName, force=False):
--
1.7.4.4