Hello Colin, got a bit more time for debugging... Short: it reads the right device but returns data from the wrong device. Long: ... read on :)
I modified ext2.c to read some more blocks around the ext2 superblock to see what's going on (and enough blocks to make sure some of them are not cached yet :)). Attached grub2-ext2-debug.patch not for inclusion but for information to show what I did and where the outputs later come from. This is a cleaned up version of the one where my previous snippets came from, don't try to match the debug output from my previous comment against this code. # strace -o grub-probe.strace grub2-1.98+20100722/build/grub-pc/grub-probe -vv --device-map=/boot/grub/device.map --target=fs --device /dev/md0 >grub-probe.out 2>grub-probe.err # nl grub-probe.strace > grub-probe.strace.nl Here is a grub-probe.out snippet: ... kern/fs.c:54: Detecting nilfs2... kern/emu/hostdisk.c:582: reusing open device `/dev/sda2' kern/fs.c:60: nilfs2 detection failed. kern/fs.c:54: Detecting minix... kern/fs.c:60: minix detection failed. kern/fs.c:54: Detecting jfs... kern/emu/hostdisk.c:582: reusing open device `/dev/sda2' kern/emu/hostdisk.c:582: reusing open device `/dev/sda2' kern/fs.c:60: jfs detection failed. kern/fs.c:54: Detecting udf... kern/fs.c:60: udf detection failed. kern/fs.c:54: Detecting iso9660... kern/fs.c:60: iso9660 detection failed. kern/fs.c:54: Detecting hfsplus... kern/fs.c:60: hfsplus detection failed. kern/fs.c:54: Detecting hfs... kern/fs.c:60: hfs detection failed. kern/fs.c:54: Detecting ext2... fs/ext2.c:548: grub_disk_read(md0, 1 * 2, 0, 336, &data->sblock) fs/ext2.c:555: grub_disk_read(md0, 0, 0, 51200, buf) kern/emu/hostdisk.c:582: reusing open device `/dev/sda2' kern/emu/hostdisk.c:582: reusing open device `/dev/sda2' kern/emu/hostdisk.c:582: reusing open device `/dev/sda2' kern/emu/hostdisk.c:582: reusing open device `/dev/sda2' kern/emu/hostdisk.c:582: reusing open device `/dev/sda2' kern/emu/hostdisk.c:582: reusing open device `/dev/sda2' kern/emu/hostdisk.c:582: reusing open device `/dev/sda2' kern/emu/hostdisk.c:582: reusing open device `/dev/sda2' kern/emu/hostdisk.c:582: reusing open device `/dev/sda2' fs/ext2.c:573: 00000000 4c 55 4b 53 xx xx 00 xx 61 65 73 00 00 00 00 00 |LUKS**..aes.....| fs/ext2.c:573: 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| fs/ext2.c:573: 00000020 00 00 00 00 00 00 00 00 78 74 73 2d 70 6c 61 69 |........xts-plai| fs/ext2.c:573: 00000030 6e 36 34 00 00 00 00 00 00 00 00 00 00 00 00 00 |n64.............| fs/ext2.c:573: 00000040 00 00 00 00 00 00 00 00 73 68 61 32 35 36 00 00 |........sha256..| fs/ext2.c:573: 00000050 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx |****************| fs/ext2.c:573: 00000060 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx |****************| fs/ext2.c:573: 00000070 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx |****************| fs/ext2.c:573: 00000080 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx |****************| fs/ext2.c:573: 00000090 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx |****************| fs/ext2.c:573: 000000a0 xx xx xx xx xx xx xx xx 66 63 31 37 39 39 37 35 |********fc179975| fs/ext2.c:573: 000000b0 2d 64 35 33 32 2d 34 62 66 66 2d 39 39 32 61 2d |-d532-4bff-992a-| fs/ext2.c:573: 000000c0 64 33 31 34 35 34 33 32 38 66 36 64 00 00 00 00 |d31454328f6d....| ... Excuse me that I don't like to disclose the whole LUKS header. Note that /dev/md0, i.e. /dev/sda2 is no LUKS device but an ext2 fs. I found instead of reading /dev/sda2 as member of /dev/md0 as it claims it appears to read /dev/sdf which is a member of /dev/md74. But strace.out shows it doesn't really: here is a grub-probe.strace.nl snippet: ... 580 open("/dev/sda2", O_RDONLY|O_SYNC|O_LARGEFILE) = 10 ... 1651 open("/dev/sdf", O_RDONLY|O_LARGEFILE) = 23 1652 fstat64(23, {st_mode=S_IFBLK|0660, st_rdev=makedev(8, 80), ...}) = 0 1653 ioctl(23, BLKGETSIZE64, 0xbfd4e0b8) = 0 1654 close(23) = 0 ... 1714 read(10, ..., 4096) = 4096 1715 _llseek(10, 51200, [51200], SEEK_SET) = 0 1716 read(10, ..., 4096) = 4096 1717 write(1, "da2'\nkern/fs.c:60: nilfs2 detect"..., 4096) = 4096 1718 write(1, " 00 00 00 00 00 00 00 xx xx 00 "..., 4096) = 4096 1719 write(1, ".....|\nfs/ext2.c:573: 000004a0 "..., 4096) = 4096 From line 1716 I searched backwards for " = 10$" and found line 580 as first hit. Also from line 1716 I searched backwards for sdf and found line 1651 as first hit. It seems like grub_disk_read() really reads /dev/sda2 as it claims but does return data from /dev/sdf ... looks like grub's internal cache is somewhat out of sync. For completeness I also attached /proc/mdstat, /etc/fstab, and /proc/mounts. This still requires a map from raid- to crypto-devices, here is it: /dev/md1 /dev/dm-0 (/dev/mapper/md1) /dev/md2 /dev/dm-1 (/dev/mapper/md2) /dev/md3 /dev/dm-2 (/dev/mapper/md3) /dev/md4 /dev/dm-3 (/dev/mapper/md4) /dev/md5 /dev/dm-4 (/dev/mapper/md5) /dev/md6 /dev/dm-5 (/dev/mapper/md6) /dev/md71 /dev/dm-6 (/dev/mapper/md71) /dev/md72 /dev/dm-7 (/dev/mapper/md72) /dev/md73 /dev/dm-8 (/dev/mapper/md73) /dev/md74 /dev/dm-9 (/dev/mapper/md74) /dev/md8 /dev/dm-10 (/dev/mapper/md8) regards Mario -- The social dynamics of the net are a direct consequence of the fact that nobody has yet developed a Remote Strangulation Protocol. -- Larry Wall
--- grub2-1.98+20100722.orig/fs/ext2.c 2010-06-03 01:13:14.000000000 +0200 +++ grub2-1.98+20100722/fs/ext2.c 2010-07-28 14:18:11.676076695 +0200 @@ -536,17 +536,43 @@ grub_ext2_mount (grub_disk_t disk) { struct grub_ext2_data *data; + unsigned char buf[100 * 512]; + unsigned i; data = grub_malloc (sizeof (struct grub_ext2_data)); if (!data) return 0; /* Read the superblock. */ + grub_dprintf("ext2", "grub_disk_read(%s, 1 * 2, 0, %u, &data->sblock)\n", + disk->name, sizeof(struct grub_ext2_sblock)); grub_disk_read (disk, 1 * 2, 0, sizeof (struct grub_ext2_sblock), &data->sblock); if (grub_errno) goto fail; + grub_dprintf("ext2", "grub_disk_read(%s, 0, 0, %u, buf)\n", + disk->name, sizeof(buf)); + grub_disk_read(disk, 0, 0, sizeof(buf), buf); + if (grub_errno) goto fail; + for(i = 0; i < sizeof(buf); i += 16) { + unsigned u[16]; + unsigned c[16]; + int j; + for(j = 0; j < 16; ++j) { + u[j] = buf[i + j]; + c[j] = buf[i + j]; + if(c[j] < 0x20 || (c[j] > 0x7e && c[j] < 0xa1)) c[j] = '.'; + } + grub_dprintf ("ext2", "%08x %02x %02x %02x %02x %02x %02x %02x %02x " + " %02x %02x %02x %02x %02x %02x %02x %02x " + " |%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c|\n", i, + u[0], u[1], u[2], u[3], u[4], u[5], u[6], u[7], + u[8], u[9], u[10], u[11], u[12], u[13], u[14], u[15], + c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], + c[8], c[9], c[10], c[11], c[12], c[13], c[14], c[15]); + } + /* Make sure this is an ext2 filesystem. */ if (grub_le_to_cpu16 (data->sblock.magic) != EXT2_MAGIC) {
Personalities : [raid1] [raid0] md7 : active raid0 dm-6[0] dm-9[3] dm-8[2] dm-7[1] 5860549632 blocks super 1.2 256k chunks md8 : active raid1 sdb9[0] 1465127865 blocks super 1.2 [2/1] [U_] bitmap: 14/22 pages [56KB], 32768KB chunk md74 : active raid1 sdf[0] 1465138448 blocks super 1.2 [2/1] [U_] bitmap: 22/22 pages [88KB], 32768KB chunk md73 : active raid1 sde[0] 1465138448 blocks super 1.2 [2/1] [U_] bitmap: 22/22 pages [88KB], 32768KB chunk md72 : active raid1 sdd[0] 1465138448 blocks super 1.2 [2/1] [U_] bitmap: 22/22 pages [88KB], 32768KB chunk md71 : active raid1 sdc[0] 1465138448 blocks super 1.2 [2/1] [U_] bitmap: 22/22 pages [88KB], 32768KB chunk md6 : active (auto-read-only) raid1 sda8[0] sdb8[1] 58596992 blocks [3/2] [UU_] bitmap: 14/14 pages [56KB], 2048KB chunk md5 : active raid1 sda7[0] sdb7[1] 312830976 blocks [3/2] [UU_] bitmap: 18/19 pages [72KB], 8192KB chunk md4 : active raid1 sda6[0] sdb6[1] 78132032 blocks [3/2] [UU_] bitmap: 19/19 pages [76KB], 2048KB chunk md3 : active raid1 sda5[0] sdb5[1] 29302464 blocks [3/2] [UU_] bitmap: 14/14 pages [56KB], 1024KB chunk md2 : active (auto-read-only) raid1 sda4[0] sdb4[1] 8302912 blocks [3/2] [UU_] md1 : active raid1 sda3[0] sdb3[1] 979840 blocks [3/2] [UU_] md0 : active raid1 sda2[0] sdb2[1] 240832 blocks [3/2] [UU_] unused devices: <none>
# /etc/fstab: static file system information. # # type ext3,ext2 vs. auto: if kernel has no ext3 support, # type auto fails, since mount detects it as ext3 and # does not try to mount it as ext2, if ext3 isnt there: # # mount -t auto -o loop foo /mnt # mount: fs type ext3 not supported by kernel # # mount -t ext3,ext2 -o loop foo /mnt # # mount | grep foo # /root/foo on /mnt type ext2 (rw,loop=/dev/loop0) # # # # <file system> <mount point> <type> <options> <dump> <pass> /dev/mapper/md1 / ext2 defaults,errors=remount-ro 0 1 /dev/mapper/md2 none swap sw 0 0 tmpfs /tmp tmpfs nosuid,nodev 0 0 /dev/md0 /boot ext2 defaults,nosuid,nodev,noexec 0 2 /dev/mapper/md3 /usr ext3 defaults,nodev 0 3 /dev/mapper/md4 /var ext3 defaults,nosuid,nodev,user_xattr 0 3 /dev/mapper/md5 /home ext3 defaults,nosuid,nodev 0 3 /dev/mapper/md6 /mnt ext2 defaults,noexec,nosuid,nodev,noauto 0 4 /dev/md7 /home/ftp/pub xfs defaults,ro,nosuid,nodev,largeio,attr2 0 0 /dev/mapper/md8 /home/holbe/downloads xfs defaults,nosuid,nodev,attr2 0 0 /dev/cdrom /media/cdrom0 udf,iso9660,auto ro,user,noauto 0 0 /dev/fd0 /media/floppy0 auto user,noatime,noauto 0 0 /dev/stick0 /media/stick0 auto user,noatime,noauto 0 0 /dev/stick1 /media/stick1 auto user,noatime,noauto 0 0 /dev/stick2 /media/stick2 auto user,noatime,noauto 0 0 /dev/stick3 /media/stick3 auto user,noatime,noauto 0 0 /dev/stick4 /media/stick4 auto user,noatime,noauto 0 0 /dev/stick5 /media/stick5 auto user,noatime,noauto 0 0 /dev/stick6 /media/stick6 auto user,noatime,noauto 0 0 /dev/stick7 /media/stick7 auto user,noatime,noauto 0 0 /dev/stick8 /media/stick8 auto user,noatime,noauto 0 0 /dev/stick9 /media/stick9 auto user,noatime,noauto 0 0
rootfs / rootfs rw 0 0 none /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0 none /proc proc rw,nosuid,nodev,noexec,relatime 0 0 none /dev devtmpfs rw,relatime,size=4144368k,nr_inodes=205047,mode=755 0 0 none /dev/pts devpts rw,nosuid,noexec,relatime,mode=600,ptmxmode=000 0 0 /dev/mapper/md1 / ext2 rw,relatime 0 0 tmpfs /lib/init/rw tmpfs rw,nosuid,relatime,mode=755 0 0 tmpfs /dev/shm tmpfs rw,nosuid,nodev,relatime 0 0 tmpfs /tmp tmpfs rw,nosuid,nodev,relatime 0 0 /dev/md0 /boot ext2 rw,nosuid,nodev,noexec,relatime 0 0 /dev/dm-2 /usr ext3 rw,nodev,relatime,barrier=0,data=ordered 0 0 /dev/dm-3 /var ext3 rw,nosuid,nodev,relatime,user_xattr,barrier=0,data=ordered 0 0 /dev/dm-4 /home ext3 rw,nosuid,nodev,relatime,barrier=0,data=ordered 0 0 /dev/md7 /home/ftp/pub xfs ro,nosuid,nodev,relatime,attr2,largeio,logbsize=256k,sunit=512,swidth=2048,noquota 0 0 /dev/dm-10 /home/holbe/downloads xfs rw,nosuid,nodev,relatime,attr2,noquota 0 0 debugfs /sys/kernel/debug debugfs rw,relatime 0 0 fusectl /sys/fs/fuse/connections fusectl rw,relatime 0 0 binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc rw,nosuid,nodev,noexec,relatime 0 0 cgroup /var/run/cgroups/cpu cgroup rw,relatime,cpu 0 0 cgroup /var/run/cgroups/cpuacct cgroup rw,relatime,cpuacct 0 0 cgroup /var/run/cgroups/devices cgroup rw,relatime,devices 0 0
signature.asc
Description: Digital signature