grub2 fails to boot from hdd, throwing error 'pv5: no such device'. This has
forced me to boot from an external flash drive, as grub is completely unusable
as installed.
Some further information on this problem:
System uses mdraid + lvm. When this problem first appeared, I created a
separate boot lv, and moved it to a different pv from / (previously, /boot
was a part of /). The same error persists, which leads me to believe grub's
problem is with the pv that / resides on.
There are three md mirrors on this system:
md0: version 0.90
md1: version 1.2
md2: version 1.2
/ lives on md2:
# lvs -o+devices balrog/root-squeeze
LV VG Attr LSize Origin Snap% Move Log Copy% Convert Devices
root-squeeze balrog -wi-ao 10.00g /dev/md2(144)
grub-probe can locate md0 and md1, but NOT md2:
# grub-probe -vv -t abstraction -d /dev/md0 2>&1 | grep md0
disk/raid.c:629: Found array md0 (mdraid)
kern/disk.c:245: Opening `md0'...
disk/raid.c:134: md0: total_devs=2, disk_size=488391808
disk/raid.c:163: md0: level=1, total_sectors=488391808
kern/disk.c:245: Opening `md0'...
disk/raid.c:134: md0: total_devs=2, disk_size=488391808
disk/raid.c:163: md0: level=1, total_sectors=488391808
kern/disk.c:334: Closing `md0'.
kern/disk.c:245: Opening `md0'...
disk/raid.c:134: md0: total_devs=2, disk_size=488391808
disk/raid.c:163: md0: level=1, total_sectors=488391808
kern/disk.c:334: Closing `md0'.
grub-probe: info: opening md0.
kern/disk.c:245: Opening `md0'...
disk/raid.c:134: md0: total_devs=2, disk_size=488391808
disk/raid.c:163: md0: level=1, total_sectors=488391808
kern/disk.c:334: Closing `md0'.
# grub-probe -vv -t abstraction -d /dev/md1 2>&1 | grep md/1
disk/raid.c:629: Found array md/1 (mdraid)
kern/disk.c:245: Opening `md/1'...
disk/raid.c:134: md/1: total_devs=2, disk_size=1953517682
disk/raid.c:163: md/1: level=1, total_sectors=1953517682
kern/disk.c:245: Opening `md/1'...
disk/raid.c:134: md/1: total_devs=2, disk_size=1953517682
disk/raid.c:163: md/1: level=1, total_sectors=1953517682
kern/disk.c:334: Closing `md/1'.
kern/disk.c:245: Opening `md/1'...
disk/raid.c:134: md/1: total_devs=2, disk_size=1953517682
disk/raid.c:163: md/1: level=1, total_sectors=1953517682
kern/disk.c:334: Closing `md/1'.
grub-probe: info: opening md/1.
kern/disk.c:245: Opening `md/1'...
disk/raid.c:134: md/1: total_devs=2, disk_size=1953517682
disk/raid.c:163: md/1: level=1, total_sectors=1953517682
kern/disk.c:334: Closing `md/1'.
# grub-probe -vv -t abstraction -d /dev/md2 2>&1 | grep md/2
grub-probe: info: opening md/2.
kern/disk.c:245: Opening `md/2'...
kern/disk.c:320: Opening `md/2' failed.
kern/disk.c:334: Closing `md/2'.
Using gdb to examine what grub-probe is doing:
# gdb --args grub-probe -vv -t abstraction -d /dev/md2
(gdb) break grub_raid_open if name = "md/2"
Breakpoint 1 at 0x4255f0: file ../../disk/raid.c, line 114.
(gdb) run
...
gdb shows something interesting here:
/usr/sbin/grub-probe: info: opening md/2.
kern/disk.c:245: Opening `md/2'...
Breakpoint 1, grub_raid_open (name=0x6d3d60 "md/2", disk=0x66aa90)
at ../../disk/raid.c:114
114 {
(gdb) n
118 for (array = array_list; array != NULL; array = array->next)
(gdb)
120 if (!grub_strcmp (array->name, name))
(gdb) print array->name
$2 = 0x66a370 "md/1"
(gdb) print array[0]
$3 = {number = 1073741824, level = 1, layout = 0, total_devs = 2,
chunk_size = 64, disk_size = 1953517682, index = 1, uuid_len = 16,
uuid = 0x66a530 "G\256\215\372Y\377Ͱ\274\062K\302\374\263\ap",
name = 0x66a370 "md/1", nr_devs = 2, allocated_devs = 32,
members = 0x66a160, next = 0x669820}
(gdb) print array[1]
$4 = {number = 1953517682, level = 0, layout = 529, total_devs = 0,
chunk_size = 6726784, disk_size = 2048, index = 6725200, uuid_len = 0,
uuid = 0x800 <Address 0x800 out of bounds>, name = 0x0, nr_devs = 0,
allocated_devs = 0, members = 0x0, next = 0x0}
It appears that grub is incorrectly getting 'md/1' for device md/2, which
further appears to cause grub-probe to fail. This may also be related to
grub's inability to find the device at boot time.