Package: grub2
Version: 1.98+20100804-4
Severity: important

Currently grub2 doesn't reckognize a system that boots from
a partitionable mdraid disk, as I have. So the upgrade I did
from lenny/grub-legacy to squeeze/grub2 failed.

The main block device is called /dev/md_d0 and the partitions
are md_d0p1, md_d0p2 etc.

It turns out that grub2 does have all the code to make this work,
but it looks like it hasn't been tested much and so regressed.

It needs 2 fixes for it to work, attached as patches.

1. grub2-md_d0-osdev.patch
   A problem description and this patch (for a slightly earlier
   grub version) can be found at http://savannah.gnu.org/bugs/?29903
   (Original author as in the bugreport)

2. grub2-md_d0-grubdev.patch
   When grub gets the real mdraid name from "mdadm", the partition
   information is lost. This patch adds it back.
   (Author is me)

With these fixes applied I can grub-install /dev/md_d0 and
have a booting system.

Mike.
diff -ruN x/grub2-1.98+20100804/util/i386/pc/grub-setup.c grub2-1.98+20100804/util/i386/pc/grub-setup.c
--- x/grub2-1.98+20100804/util/i386/pc/grub-setup.c	2010-08-04 05:40:55.000000000 +0200
+++ grub2-1.98+20100804/util/i386/pc/grub-setup.c	2010-08-27 18:37:31.000000000 +0200
@@ -824,7 +824,7 @@
       char **devicelist;
       int i;
 
-      devicelist = grub_util_raid_getmembers (dest_dev);
+      devicelist = grub_util_raid_getmembers (argv[optind]);
 
       for (i = 0; devicelist[i]; i++)
 	{
diff -ruN x/grub2-1.98+20100804/util/raid.c grub2-1.98+20100804/util/raid.c
--- x/grub2-1.98+20100804/util/raid.c	2010-06-03 01:13:14.000000000 +0200
+++ grub2-1.98+20100804/util/raid.c	2010-08-24 23:09:09.000000000 +0200
@@ -59,22 +59,15 @@
 grub_util_raid_getmembers (char *name)
 {
   int fd, ret, i, j;
-  char *devname;
   char **devicelist;
   mdu_version_t version;
   mdu_array_info_t info;
   mdu_disk_info_t disk;
 
-  devname = xmalloc (strlen (name) + 6);
-  strcpy (devname, "/dev/");
-  strcpy (devname+5, name);
-
-  fd = open (devname, O_RDONLY);
+  fd = open (name, O_RDONLY);
 
   if (fd == -1)
-    grub_util_error ("can't open %s: %s", devname, strerror (errno));
-
-  free (devname);
+    grub_util_error ("can't open %s: %s", name, strerror (errno));
 
   ret = ioctl (fd, RAID_VERSION, &version);
   if (ret != 0)
--- x/grub2-1.98+20100804/kern/emu/getroot.c	2010-08-02 21:44:02.000000000 +0200
+++ grub2-1.98+20100804/kern/emu/getroot.c	2010-08-30 15:27:20.000000000 +0200
@@ -657,6 +657,16 @@
 	    }
 	}
 
+        /* restore partition info */
+        if (name &&
+	    !strncmp (os_dev, "/dev/md_d", 9) &&
+	    (buf = strchr (os_dev, 'p')) != NULL)
+          {
+            char *newname = malloc (strlen (name) + strlen (buf + 1) + 2);
+            sprintf (newname, "%s,%s", name, buf + 1);
+            free (name);
+            name = newname;
+          }
 out:
       close (mdadm_pipe[0]);
       waitpid (mdadm_pid, NULL, 0);

Reply via email to