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

