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

[PATCH] Migrate PPC from Yaboot to Grub2 for Anaconda



---
 pyanaconda/bootloader.py |   69 +++++++++++++++++++++++++++++++++++++++++++++-
 pyanaconda/platform.py   |    4 +-
 2 files changed, 70 insertions(+), 3 deletions(-)

diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py
index 0e759f5..c339e58 100644
--- a/pyanaconda/bootloader.py
+++ b/pyanaconda/bootloader.py
@@ -1794,7 +1794,7 @@ class GRUB2(GRUB):
     def install(self):
         # XXX will installing to multiple drives work as expected with GRUBv2?
         for (stage1dev, stage2dev) in self.install_targets:
-            args = ["--no-floppy", self.grub_device_name(stage1dev)]
+            args = ["--no-floppy", stage1dev.path]
             if stage1dev == stage2dev:
                 # This is hopefully a temporary hack. GRUB2 currently refuses
                 # to install to a partition's boot block without --force.
@@ -2002,6 +2002,73 @@ class IPSeriesYaboot(Yaboot):
             log.info("Updated PPC boot list with the command: nvram --update-config %s" % update_value)
 
 
+class IPSeriesGRUB2(GRUB2):
+
+    # GRUB2 sets /boot bootable and not the PReP partition.  This causes the Open Firmware BIOS not
+    # to present the disk as a bootable target.  If stage2_bootable is False, then the PReP partition
+    # will be marked bootable. Confusing.
+    stage2_bootable = False
+
+    #
+    # installation
+    #
+
+    def install(self):
+        self.updateNVRAMBootList()
+
+        super(IPSeriesGRUB2, self).install()
+
+    # This will update the PowerPC's (ppc) bios boot devive order list
+    def updateNVRAMBootList(self):
+
+        log.debug("updateNVRAMBootList: self.stage1_device.path = %s" % self.stage1_device.path)
+
+        buf = iutil.execWithCapture("nvram",
+                                    ["--print-config=boot-device"],
+                                    stderr="/dev/tty5")
+
+        if len(buf) == 0:
+            log.error ("Failed to determine nvram boot device")
+            return
+
+        boot_list = buf.strip().split()
+        log.debug("updateNVRAMBootList: boot_list = %s" % boot_list)
+
+        buf = iutil.execWithCapture("ofpathname",
+                                    [self.stage1_device.path],
+                                    stderr="/dev/tty5")
+
+        if len(buf) > 0:
+            boot_disk = buf.strip()
+        else:
+            log.error("Failed to translate boot path into device name")
+            return
+
+        # Place the disk containing the PReP partition first.
+        # Remove all other occurances of it.
+        boot_list = [boot_disk] + filter(lambda x: x != boot_disk, boot_list)
+
+        update_value = "boot-device=\"%s\"" % " ".join(boot_list)
+
+        rc = iutil.execWithRedirect("nvram", ["--update-config", update_value],
+                                    stdout="/dev/tty5", stderr="/dev/tty5")
+        if rc:
+            log.error("Failed to update new boot device order")
+
+    #
+    # In addition to the normal grub configuration variable, add one more to set the size of the
+    # console's window to a standard 80x24
+    #
+    def write_defaults(self):
+        super(IPSeriesGRUB2, self).write_defaults()
+
+        defaults_file = "%s%s" % (ROOT_PATH, self.defaults_file)
+        defaults = open(defaults_file, "a+")
+        # The terminfo's X and Y size, and output location could change in the future
+        defaults.write("GRUB_TERMINFO=\"terminfo -g 80x24 console\"\n")
+        defaults.close()
+
+
 class MacYaboot(Yaboot):
     prog = "mkofboot"
     can_dual_boot = True
diff --git a/pyanaconda/platform.py b/pyanaconda/platform.py
index 536a849..cfadbb3 100644
--- a/pyanaconda/platform.py
+++ b/pyanaconda/platform.py
@@ -231,7 +231,7 @@ class MacEFI(EFI):
 
 class PPC(Platform):
     _ppcMachine = iutil.getPPCMachine()
-    _bootloaderClass = bootloader.Yaboot
+    _bootloaderClass = bootloader.GRUB2
     _boot_stage1_device_types = ["partition"]
 
     @property
@@ -239,7 +239,7 @@ class PPC(Platform):
         return self._ppcMachine
 
 class IPSeriesPPC(PPC):
-    _bootloaderClass = bootloader.IPSeriesYaboot
+    _bootloaderClass = bootloader.IPSeriesGRUB2
     _boot_stage1_format_types = ["prepboot"]
     _boot_stage1_max_end_mb = 10
     _boot_prep_description = N_("PReP Boot Partition")
-- 
1.7.7.6


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