基于 GRUB2 制作滋瓷 BIOS/UEFI 双模式启动的 Linux/Windows 安装U盘

本教程基于 Linux 系统环境,以 Deepin 15.2 为例

格式化U盘

做这一步之前要先备份好U盘里的文件。

可以使用图形化的 GParted ,也可以使用命令行的 fdisk 或 cfdisk,下面讲 GParted:

GParted_01.png

  • 在右上角选中你的U盘,如果下面有已经挂载的分区,先全部卸载,在要卸载的分区上单击右键->卸载即可
  • 单击菜单设备->创建分区表->msdos->应用
  • 单击工具栏新建->添加,按下面的图添加两个分区,第一个分区 NTFS 和 FAT32 都可以,第二个分区只能用 FAT16/FAT32,当然,如果嫌两个分区麻烦,可以只添加一个 FAT32 分区:

GParted_02.png

GParted_03.png

  • 添加好后记得点应用
  • 在第二个分区上单击右键->管理标志,给它添加上boot标志:

GParted_04.png

添加好后是这个样子的,然后就可以关闭 GParted 了:

GParted_05.png

安装 GRUB2 到U盘

  • 挂载启动分区(前面添加 boot 标志的 FAT16/FAT32 分区)
mkdir /tmp/sdb2
sudo mount /dev/sdb2 /tmp/sdb2
  • 安装必要软件包
sudo apt-get install grub-efi-amd64-bin grub-pc-bin
  • 安装 BIOS 模式 GURB2
sudo grub-install --target=i386-pc --recheck --boot-directory=/tmp/sdb2/boot /dev/sdb
  • 如无误,则提示如下:
$ sudo grub-install --target=i386-pc --recheck --boot-directory=/tmp/sdb2/boot /dev/sdb
Installing for i386-pc platform.
Installation finished. No error reported.
  • 安装 UEFI 模式 GURB2
sudo grub-install --target=x86_64-efi --efi-directory=/tmp/sdb2 --boot-directory=/tmp/sdb2/boot --removable
  • 如无误,则提示如下:
$ sudo grub-install --target=x86_64-efi --efi-directory=/tmp/sdb2 --boot-directory=/tmp/sdb2/boot --removable
Installing for x86_64-efi platform.
Installation finished. No error reported.

grub-install.png

  • 此时U盘的目录结构如下:
/tmp/sdb2$ tree -L 3
.
├── boot
│   └── grub
│       ├── fonts
│       ├── grubenv
│       ├── i386-pc
│       ├── locale
│       └── x86_64-efi
└── EFI
    └── BOOT
        └── BOOTX64.EFI

8 directories, 2 files

创建 GRUB 配置文件(引导菜单)

  • GRUB 配置文件置于/boot/grub/grub.cfg,如下:
insmod all_video

menuentry "GRUB4DOS" {
    linux /boot/grub/grub.exe
}

menuentry "Deepin 15.2" {
    set iso=/iso/deepin-15.2-amd64.iso
    insmod part_msdos
    insmod ntfs
    search --file --set=root --no-floppy $iso
    loopback loop $iso
    linux (loop)/live/vmlinuz boot=live findiso=$iso quiet splash locales=zh_CN.UTF-8
    initrd (loop)/live/initrd.lz
}

menuentry "Deepin 15.2 UEFI" {
    set iso=/iso/deepin-15.2-amd64.iso
    insmod part_msdos
    insmod ntfs
    search --file --set=root --no-floppy $iso
    loopback loop $iso
    linux (loop)/live/vmlinuz.efi boot=live findiso=$iso quiet splash locales=zh_CN.UTF-8
    initrd (loop)/live/initrd.lz
}

menuentry "Microsoft Windows 7/8/10" {
    if [ x$grub_platform = xefi ];then
        chainloader /bootmgfw.efi
    elif [ x$grub_platform = xpc ];then
        insmod ntldr
        ntldr /bootmgr
    fi
}
  • 第一个启动项是我额外添加的 GRUB4DOS,可以从这里下载:http://grub4dos.chenall.net/,将 grub.exe 置于启动分区即可,我的路径是/boot/grub/grub.exe
  • 第二、三项是搜索 Deepin Live iso 并直接引导启动进入 Live CD 环境,iso 文件可以置于U盘的任意可识别分区,我的路径是/iso/deepin-15.2-amd64.iso,并且置于U盘第一个分区(NTFS),Deepin 15.2 可以从这里下载:deepin-15.2-amd64.iso
  • 第三、四项是 Windows 原版安装镜像的引导,bootmgr、bootmgfw.efi 均可从光盘镜像中提取,但是要注意 bootmgfw.efi 不可使用光盘镜像中的 bootmgr.efi 代替,其位置在 \Source\install.wim\1\Windows\Boot\EFI, 也就是说 bootmgfw.efi 要从 boot.wim 或 install.wim 中的 \Windows\Boot\EFI 提取。
  • bootmgr 和 bootmgfw.efi 也可以不放在根目录,只要在 grub.cfg 中写对路径即可

拷贝 Linux/Windows 安装文件

  • 对于 Deepin/Debian,iso 无需解压,放到U盘的任意不含中文路径的位置都可以,只要在 grub.cfg 中按上述示例写对路径,GRUB会自动搜索并引导,其他发行版启动参数可能会不一样,例如 Ubuntu 的话 findiso 要换成 iso-scan/filename
  • tips:目前 Deepin 将 locales 设为中文后进 Live 桌面上的安装器图标不能使用,注销一下重新登录即可,或者直接打开文件管理器->桌面

deepin_live.png

  • 对于 Windows,下面提到文件路径必须与光盘中的原路径相同
  • 其中 BIOS 模式启动的 Windows,启动分区中除 bootmgr 外必需的文件如下:
boot
├── bcd
└── boot.sdi
sources
└── boot.wim
  • 当然,我建议将光盘镜像中的整个 boot 目录拷贝至启动分区
  • 而 UEFI 启动模式,则需将光盘镜像中 efi/microsoft 目录拷贝至启动分区 efi 目录,当然 sources/boot.wim 仍是必须的
  • 此外无论哪种启动模式,都需要将整个(除 boot.wim 外) sources 目录拷贝至U盘某个分区的根目录,比如第一个 NTFS 分区,如果你只有一个分区或者启动分区够大,也可以和前面的 boot.wim 放到一起
  • boot.wim 和 install.wim 都是必须的文件,并且 boot.wim 放到启动分区

以下是启动界面

grub_menu.png

标签: Linux, GRUB

已有 8 条评论

  1. 哈哈 哈哈

    好棒啊,加油!坚持下去。fight!fight!

  2. kkk kkk

    如何创建一个基于ubuntu17.04的安装启动盘,我试过用U盘烧入 SYSLINUX和系统,点安装后就跳出来(initramfs)unable to find a medium containing a live live system,我想你这个方法应该是可行,但是我不知道这个启动文件怎么写,能否帮忙指导一下,谢谢。

    1. 博客中已经写了,把 findiso 换成 iso-scan/filename 就可以。

  3. sbw sbw

    666

  4. Geno1024 Geno1024

    有没有将多个 Window$ 版本以这种方式放在同一个分区上的可能性?似乎 boot 和 sources/boot.wim 会出一些冲突

    1. 这个就没有研究了~

  5. 学习了,感谢分享啊。
    每个版本的grub文件写的都不一样,debian9.3搞了一下午,搞定了。

  6. 西门吹牛 西门吹牛

    额额,最近要用这个。找了一圈没找到。突然想起这里。哈哈哈哈。厉害:)

添加新评论