Hello,
to solve the problem for me, i have copied a few lines from grub2 version 1.99
to the old squeeze version 1.98+20100804-14 and applied the patch
(hostdisk.diff) from Vladimir 'φ-coder/phcoder' Serbinenko to it. With the
attached patch applied, the grub-probe command returns:
# grub-probe -t abstraction --device /dev/xvda1 -v
grub-probe: info: Cannot stat `/dev/xvda', skipping.
grub-probe: info: /dev/xvda1 starts from 0.
grub-probe: info: opening the device /dev/xvda.
grub-probe: warn: disk does not exist, so falling back to partition device
/dev/xvda1.
grub-probe: info: opening /dev/xvda1.
grub-probe: info: the size of /dev/xvda1 is 12582912.
and update-grub works without error.
--- a/kern/emu/hostdisk.c 2010-08-04 05:40:55.000000000 +0200
+++ b/kern/emu/hostdisk.c 2011-06-01 17:26:04.429479379 +0200
@@ -1353,12 +1353,16 @@
#endif /* defined(__NetBSD__) */
static int
-find_system_device (const char *os_dev, struct stat *st)
+find_system_device (const char *os_dev, struct stat *st, int convert)
{
unsigned int i;
char *os_disk;
os_disk = convert_system_partition_to_system_disk (os_dev, st);
+ if (convert)
+ os_disk = convert_system_partition_to_system_disk (os_dev, st);
+ else
+ os_disk = xstrdup (os_dev);
if (! os_disk)
return -1;
@@ -1392,7 +1396,7 @@
return 0;
}
- drive = find_system_device (os_dev, &st);
+ drive = find_system_device (os_dev, &st, 1);
if (drive < 0)
{
grub_error (GRUB_ERR_UNKNOWN_DEVICE,
@@ -1498,7 +1502,33 @@
free (name);
if (! disk)
- return 0;
+ {
+ /* We already know that the partition exists. Given that we already
+ checked the device map above, we can only get GRUB_ERR_UNKNOWN_DEVICE
+ or GRUB_ERR_BAD_DEVICE at this point if the disk does not exist.
+ This can happen on Xen, where disk images in the host can be
+ assigned to devices that have partition-like names in the guest
+ but are really more like disks. */
+ if (grub_errno == GRUB_ERR_UNKNOWN_DEVICE ||
+ grub_errno == GRUB_ERR_BAD_DEVICE)
+ {
+ grub_util_warn
+ ("disk does not exist, so falling back to partition device %s",
+ os_dev);
+
+ drive = find_system_device (os_dev, &st, 0);
+ if (drive < 0)
+ {
+ grub_error (GRUB_ERR_UNKNOWN_DEVICE,
+ "no mapping exists for `%s'", os_dev);
+ return 0;
+ }
+
+ return make_device_name (drive, -1, -1);
+ }
+ else
+ return 0;
+ }
partname = NULL;
grub_partition_iterate (disk, find_partition);