Package: grub2
Version: 1.96+20090709-1
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);