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

Discussion... [PATCH] Migrate PPC from Yaboot to Grub2



I'm working on a patch to switch from yahoot to grub.

I've encountered one problem.  Grub doesn't like '(hd0)' syntax but works with '/dev/sda1'

[anaconda root@(none) /]# cat /mnt/sysimage/boot/grub2/device.map
# this device map was generated by anaconda
(hd0)      /dev/sda
[anaconda root@(none) /]# cat /tmp/program.log
...
18:21:28,809 INFO program: Running... grub2-install --no-floppy (hd0,1)
18:21:29,929 ERR program: /sbin/grub2-probe: error: cannot stat `(hd0,1)'.
18:21:29,930 INFO program: The chosen partition is not a PReP partition.
...
[anaconda root@(none) /]# chroot /mnt/sysimage/
[anaconda root 9-5-90-148 /]# grub2-install --no-floppy '(hd0,1)'
/sbin/grub2-probe: error: cannot stat `(hd0,1)'.
The chosen partition is not a PReP partition.
[anaconda root 9-5-90-148 /]# grub2-install --no-floppy '(hd0)'
/sbin/grub2-probe: error: cannot stat `(hd0)'.
The chosen partition is not a PReP partition.
[anaconda root 9-5-90-148 /]# grub2-install --no-floppy /dev/sda1
183+1 records in
183+1 records out

This also needs patch to grub to accept GRUB_TERMINFO.  The grub patch is appended to anaconda's.


---
 pyanaconda/bootloader.py |   46 +++++++++++++++++++++++++++++++++++-----------
 pyanaconda/platform.py   |    4 ++--
 2 files changed, 37 insertions(+), 13 deletions(-)

diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py
index 45905d1..1ea86d5 100644
--- a/pyanaconda/bootloader.py
+++ b/pyanaconda/bootloader.py
@@ -1920,16 +1920,7 @@ class Yaboot(YabootSILOBase):
             raise BootLoaderError("bootloader installation failed")
 
 
-class IPSeriesYaboot(Yaboot):
-    prog = "mkofboot"
-
-    #
-    # configuration
-    #
-
-    def write_config_variant_header(self, config):
-        config.write("nonvram\n")   # only on pSeries?
-        config.write("fstype=raw\n")
+class IPSeriesGRUB2(GRUB2):
 
     #
     # installation
@@ -1938,7 +1929,7 @@ class IPSeriesYaboot(Yaboot):
     def install(self):
         self.updatePowerPCBootList()
 
-        super(IPSeriesYaboot, self).install()
+        super(IPSeriesGRUB2, self).install()
 
     def updatePowerPCBootList(self):
 
@@ -1981,6 +1972,39 @@ class IPSeriesYaboot(Yaboot):
         else:
             log.info("Updated PPC boot list with the command: nvram --update-config %s" % update_value)
 
+    def write_defaults(self)
+        super(IPSeriesGRUB2, self).write_defaults()
+
+        defaults_file = "%s%s" % (ROOT_PATH, self.defaults_file)
+        defaults = open(defaults_file, "a+")
+        defaults.write("GRUB_TERMINFO=\"%s -g %dx%d %s\"\n" % ("terminfo", 80, 24, "console"))
+        defaults.close()
+
+    #
+    # @BUG
+    #
+    def grub_device_name(self, device):
+        """ Return a grub-friendly representation of device.
+
+            Disks and partitions use the (hdX,Y) notation, while lvm and
+            md devices just use their names.
+        """
+        drive = None
+        name = "(%s)" % device.name
+
+        if device.isDisk:
+            drive = device
+        elif hasattr(device, "disk"):
+            # @FIX
+            name = "/dev/%s" % device.name
+
+        if drive is not None:
+            name = "(hd%d" % self.drives.index(drive)
+            if hasattr(device, "disk"):
+                name += ",%d" % device.partedPartition.number
+            name += ")"
+        return name
+
 
 class MacYaboot(Yaboot):
     prog = "mkofboot"
diff --git a/pyanaconda/platform.py b/pyanaconda/platform.py
index c57c76e..5712221 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

=== modified file 'Makefile.util.def'
--- Makefile.util.def	2012-02-22 04:37:32 +0000
+++ Makefile.util.def	2012-02-22 20:15:37 +0000
@@ -411,6 +411,13 @@
 };
 
 script = {
+  name = '20_ppc_terminfo';
+  common = util/grub.d/20_ppc_terminfo.in;
+  installdir = grubconf;
+  condition = COND_HOST_LINUX;
+};
+
+script = {
   name = '30_os-prober';
   common = util/grub.d/30_os-prober.in;
   installdir = grubconf;

=== added file 'util/grub.d/20_ppc_terminfo.in'
--- util/grub.d/20_ppc_terminfo.in	1970-01-01 00:00:00 +0000
+++ util/grub.d/20_ppc_terminfo.in	2012-02-24 22:16:36 +0000
@@ -0,0 +1,107 @@
+#! /bin/sh
+set -e
+
+# grub-mkconfig helper script.
+# Copyright (C) 2006,2007,2008,2009,2010  Free Software Foundation, Inc.
+#
+# GRUB is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# GRUB is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+
+prefix= prefix@
+exec_prefix= exec_prefix@
+bindir= bindir@
+libdir= libdir@
+. ${libdir}/grub/grub-mkconfig_lib
+
+export TEXTDOMAIN= PACKAGE@
+export TEXTDOMAINDIR= localedir@
+
+X=80
+Y=24
+TERMINAL=console
+
+argument () {
+  opt=$1
+  shift
+
+  if test $# -eq 0; then
+      echo "$0: option requires an argument -- '$opt'" 1>&2
+      exit 1
+  fi
+  echo $1
+}
+
+check_terminfo () {
+
+  while test $# -gt 0
+  do
+    option=$1
+    shift
+
+    case "$option" in
+    terminfo | TERMINFO)
+        ;;
+
+    -g)
+        NEWXY=`argument $option "$@"`
+        NEWX=`echo $NEWXY | cut -d x -f 1`
+        NEWY=`echo $NEWXY | cut -d x -f 2`
+
+        if [ ${NEWX} -ge 80 ] ; then
+          X=${NEWX}
+        else
+          echo "Warning: ${NEWX} is less than the minimum size of 80"
+        fi
+
+        if [ ${NEWY} -ge 24 ] ; then
+          Y=${NEWY}
+        else
+          echo "Warning: ${NEWY} is less than the minimum size of 24"
+        fi
+
+        shift
+        ;;
+
+    *)
+        # accept console or ofconsole
+        if [ "$option" != "console" -a "$option" != "ofconsole" ] ; then
+          echo "Error: GRUB_TERMINFO unknown console: $option"
+          exit 1
+        fi
+        # perfer console
+        TERMINAL=console
+        ;;
+    esac
+
+  done
+
+}
+
+if ! uname -m | grep -q ppc ; then
+  exit 0
+fi
+
+if [ "x${GRUB_TERMINFO}" != "x" ] ; then
+  F1=`echo ${GRUB_TERMINFO} | cut -d " " -f 1`
+
+  if [ "${F1}" != "terminfo" ] ; then
+    echo "Error: GRUB_TERMINFO is set to \"${GRUB_TERMINFO}\" The first word should be terminfo."
+    exit 1
+  fi
+
+  check_terminfo ${GRUB_TERMINFO}
+fi
+
+cat << EOF
+  echo terminfo -g ${X}x${Y} ${TERMINAL}
+EOF


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