date: 2015-12-15

mbr 结构混合了分区表和启动代码, https://en.wikipedia.org/wiki/Master_boot_record#Sector_layout .

磁盘信息和分区表区间为 [218-224), [440-512), 6 + 72 = 78 字节. 字节下标从 0 开始. 代码字节为 218 + 216 = 434 字节.

hanyong@han-yoga:~/var/vm/win$ tail -c +$(( 1 + 0 )) sda-grub.mbr | head -c 218 | ./overwrite win-sda.raw 0 hanyong@han-yoga:~/var/vm/win$ tail -c +$(( 1 + 224 )) sda-grub.mbr | head -c 216 | ./overwrite win-sda.raw 224 hanyong@han-yoga:~/var/vm/win$ tail -c +$(( 1 + 218 )) sda-grub.mbr | head -c 6 | ./overwrite win-sda.raw 218

经测试 grub2 对 [218-22) 这 6 个字节也使用了, 即第一个扇区总共使用了前 440 个字节.

grub2 安装到 sda, boot 为 sda1

第2个扇区为 diskboot.img, 倒数第4个字节从 '\0' 修改为 'c', 下标为 508/1020 .

tail -c +$(( 1 + 1024)) win-sda.raw | head -c 16 > ptn.bin && grep -F -f ptn.bin -R i386-pc/

第 3 个扇区没找到, 后面又好像是 lzma_decompress.img. 猜测这应该是 grub-install 时动态拼凑的一段, 没有固定的镜像文件.

head -c 1M win-sda.raw | od -t x1

前 1 MiB 有效数据到 51712 ('0o0145000'), 共 101 扇区 (50.5 KiB).

truncate -s 0 win-sda.raw && truncate -s 2G win-sda.raw && head -c $(( 25 * 1024 + 512 )) sda-grub.mbr | ./overwrite win-sda.raw 0

经测试最少需要 25.5 KiB (1 + 50扇区) 即可启动到 "grub rescue" 模式.

od -t x1 win-sda.raw

包含 sda1 分区及数据, 有效字节共 76548512 (70多MiB),

g2ldr.mbr, g2ldr.img, grldr.img 写到 MBR, 启动时显示逐个搜索了一下分区然后提示 grldr 没找到, grub4dos 的 grldr 放到根目录 (改名g2ldr?) 是可以加载的, ntfs 分区都可以, 但是 grub2 的 g2ldr 镜像文件不知道在哪可以找到. 不想用 grub4dos 了, 有点绕. grub4dos 可以加载 grub2 的 kernel.img, 但加载成功后 grub2 内核默认不支持 ntfs 的, 所以要使用 grub2 硬盘还是要专门保留一个 fat32 启动分区. windows 下这个启动分区平时不要分配盘符就可以了.

cat grub2/i386-pc/{boot,core}.img | ./overwrite win-sda.raw 0

试了下 grub2win 二进制包提供的 boot.img, core.img, 一起写到 mbr 可以启动到 "grub rescure". 合起来大小也是 25K 左右. 但尝试加载 grub 内核时发现各种文件系统都无法识别, FAT32, FAT16, FAT12 都不行 (winpe 未成功创建 ext2 未测试). 想到安装时要指定 --boot-directory, grub rescue 识别的文件系统可能是 grub-install 自动根据 boot-directory 所在文件系统来产生的. 那么在将 boot 文件夹设在 ntfs 分区, grub rescure 是不是就可以识别 ntfs. 新建一个测试磁盘, 第一分区前留空与主盘一样, 总计留 65 扇区, 65 扇区开始创建一个 ntfs 分区. 用 ubuntu 光盘启动后, 安装 grub 到测试磁盘, boot 文件夹为第一个 ntfs 分区, 安装完成后取前 65 扇区数据 (grub 安装不能超过这个界限) 作为 MBR 写回主盘, 注意不要覆盖主盘 MBR 分区表. 主盘果然可以启动 grub rescure, 并且可以识别 ntfs 分区, 成功! 将测试盘 boot 分区下的 grub 文件夹复制到主盘第一分区, 两个盘结构相同, 主盘果然能直接启动 grub 完整功能界面, 测试盘 grub 引导信息迁移到主盘完全成功! 至此可知, 获取 grub2 mbr 镜像文件的方法为先在一个同构的测试盘上完成安装, 再从测试盘提取.