应对复杂的装机环境,bios/uefi,windows/linux。

假设已有一台装好grub(2.02)的linux系统。U盘的设备路径/dev/sdb

U盘分区

  1. 使用mbr分区表 只有mbr分区表才能同时支持bios和uefi
  2. 分两个区 /dev/sdb1大一些,日常存储文件用 /dev/sdb2用作esp分区(需要调整分区类型为ESP文件系统,加上boot标记)

挂载U盘

按照该对应方式挂载

1
2
/dev/sdb1 >>> /tmp/data
/dev/sdb2 >>> /tmp/esp

安装grub引导文件

1
grub-install --target=i386-pc --boot-directory=/tmp/data/.boot /dev/sdb

安装uefi引导文件

1
grub-install --target=x86_64-efi --boot-directory=/tmp/data/.boot --efi-directory=/tmp/esp --removable

grub.cfg

如果安装成功,在/tmp/data/.boot下应该有grub目录。创建/tmp/data/.boot/grub.cfg即可。

可通过${grub_platform}变量判断是bios还是uefi,可以用来加载不同的配置文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
if [ "${grub_platform}" == "efi" ]; then
    menuentry "Microsoft Windows Vista/7/8/8.1 UEFI-GPT" {
        insmod part_gpt
        insmod fat
        insmod search_fs_uuid
        insmod chain
        search --fs-uuid --set=root $hints_string $fs_uuid
        chainloader /EFI/Microsoft/Boot/bootmgfw.efi
    }
fi
if [ "${grub_platform}" == "pc" ]; then
  menuentry "Microsoft Windows Vista/7/8/8.1/10 BIOS-MBR" {
    insmod part_msdos
    insmod ntfs
    insmod search_fs_uuid
    insmod ntldr     
    search --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 69B235F6749E84CE
    ntldr /bootmgr
  }
fi

配置文件具体怎么写,我也不会。

参考文章