从MBR磁盘通过bootmgr/grub4dos链式加载GPT磁盘Linux系统报错求助
从MBR磁盘通过bootmgr/grub4dos链式加载GPT磁盘Linux系统报错求助
兄弟,你这个问题本质是BIOS/CSM启动模式和UEFI启动模式的二进制文件不兼容导致的——你的MBR磁盘是用BIOS模式启动的,而GPT磁盘里的BOOTx64.EFI是UEFI专用的启动文件,两种模式的执行格式完全不一样,直接加载肯定会报“不兼容二进制镜像”的错。下面给你针对grub4dos和bootmgr分别梳理可行的解决办法:
一、用grub4dos引导的方案
grub4dos是BIOS模式下的引导工具,没法直接跑UEFI的EFI文件,但可以直接引导Linux内核,或者引导GPT磁盘上的BIOS兼容引导程序:
方案1:直接引导Linux内核(最稳妥)
- 启动grub4dos后,先定位到Disk#2的Linux分区:
输入命令find --set-root /vmlinuz,如果你的Linux有多个内核版本,也可以指定具体文件名,比如find --set-root /vmlinuz-5.15.0-78-generic - 然后执行引导命令(注意替换成你实际的分区路径或UUID):
linux /vmlinuz root=/dev/sdb1 ro quiet splash initrd /initrd.img boot- 这里的
/dev/sdb1是Disk#2的Linux分区,你可以根据实际磁盘序号调整(比如第三块盘就是/dev/sdc1); - 用UUID更不容易出错,先在Linux里用
blkid命令查到分区UUID,然后把root=/dev/sdb1换成root=UUID=xxxxxx-xxxx-xxxx-xxxx-xxxxxx。
- 这里的
方案2:链式引导GPT磁盘的BIOS Boot分区
如果你的Disk#2在安装Linux时创建了BIOS Boot分区(那个1MB左右、无文件系统的小分区),可以直接链式引导它:
输入命令 chainloader (hd1,0)+1,这里的(hd1,0)对应Disk#2的BIOS Boot分区,需要你确认分区序号(grub4dos里hd0是第一块盘,hd1是第二块)。
二、用bootmgr引导的方案
Windows的bootmgr同样是BIOS模式下的工具,没法直接加载UEFI文件,需要给它添加Linux的BIOS引导项:
方法1:手动配置BCD引导项
- 进入MBR磁盘上的Windows系统,以管理员身份打开命令提示符;
- 创建一个新的Boot Sector类型引导条目,执行后会返回一个GUID(记下来替换下面的
{GUID}):bcdedit /create /d "Disk#2 Linux" /application bootsector - 设置这个条目指向Disk#2的Linux分区(先在Windows里挂载这个分区,比如盘符是S:):
bcdedit /set {GUID} device partition=S: bcdedit /set {GUID} path \boot\grub\i386-pc\core.img- 如果你的Linux用的是grub2,
core.img的路径通常是\boot\grub\i386-pc\core.img;如果找不到,也可以直接指向分区引导扇区:bcdedit /set {GUID} path \
- 如果你的Linux用的是grub2,
- 把这个条目添加到启动菜单末尾:
bcdedit /displayorder {GUID} /addlast
方法2:通过bootmgr引导grub4dos再加载Linux
把grub4dos的grldr或grldr.mbr复制到MBR磁盘的某个分区(比如C盘根目录),然后用bcdedit添加指向grub4dos的引导项,之后就可以用grub4dos的方法引导Disk#2的Linux了,这种方式更灵活。
关键注意事项
- 确保你的电脑BIOS里开启了CSM兼容模式,因为MBR磁盘启动依赖CSM,GPT磁盘的Linux要在BIOS模式下启动也需要这个开关打开;
- 如果你的Disk#2原本是UEFI模式安装的Linux,没有BIOS引导相关文件,需要进入Linux系统,重新安装grub的BIOS版本:
这里的sudo grub-install --target=i386-pc /dev/sdb/dev/sdb是Disk#2的磁盘设备(不是分区),执行后会自动在GPT磁盘上创建BIOS Boot分区并安装BIOS版grub。
备注:内容来源于stack exchange,提问作者ZEE




