基于 GRUB2 制作滋瓷 BIOS/UEFI 双模式启动的 Linux/Windows 安装U盘
本教程基于 Linux 系统环境,以 Deepin 15.2 为例
格式化U盘
做这一步之前要先备份好U盘里的文件。
可以使用图形化的 GParted ,也可以使用命令行的 fdisk 或 cfdisk,下面讲 GParted:
- 在右上角选中你的U盘,如果下面有已经挂载的分区,先全部卸载,在要卸载的分区上
单击右键
->卸载
即可 - 单击菜单
设备
->创建分区表
->msdos
->应用
- 单击工具栏
新建
->添加
,按下面的图添加两个分区,第一个分区 NTFS 和 FAT32 都可以,第二个分区只能用 FAT16/FAT32,当然,如果嫌两个分区麻烦,可以只添加一个 FAT32 分区:
- 添加好后记得点
应用
- 在第二个分区上
单击右键
->管理标志
,给它添加上boot
标志:
添加好后是这个样子的,然后就可以关闭 GParted 了:
安装 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.
- 此时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 桌面上的安装器图标不能使用,注销一下重新登录即可,或者直接打开文件管理器->桌面
- 对于 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 放到启动分区
好棒啊,加油!坚持下去。fight!fight!
如何创建一个基于ubuntu17.04的安装启动盘,我试过用U盘烧入 SYSLINUX和系统,点安装后就跳出来(initramfs)unable to find a medium containing a live live system,我想你这个方法应该是可行,但是我不知道这个启动文件怎么写,能否帮忙指导一下,谢谢。
博客中已经写了,把 findiso 换成 iso-scan/filename 就可以。
666
有没有将多个 Window$ 版本以这种方式放在同一个分区上的可能性?似乎 boot 和 sources/boot.wim 会出一些冲突
这个就没有研究了~
学习了,感谢分享啊。
每个版本的grub文件写的都不一样,debian9.3搞了一下午,搞定了。
额额,最近要用这个。找了一圈没找到。突然想起这里。哈哈哈哈。厉害:)