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);