更新2
好的,我已经成功地通过 Grub2 获得了一个可以正常工作的 USB。
首先,我使用 GParted 创建了一个gpt
分区表并创建了以下分区:
exfat
- [剩余空间] Live CD ISO 和文件。 (使用 gnome-disk-utility 创建,因为 GParted 不支持它。)ntfs
- [5.50 GiB] 提取的 Windows 10 恢复 ISO 文件。fat16
- [100 MiB] Grub2。
我跟着这回答如何更改分区编号顺序以使它们处于正确的顺序。我使用 fat16 希望我的 PS4 看不到它,这样它就可以自动挂载 exfat 分区,而不会被询问要挂载哪个分区 - 但它不起作用。我只知道 fat16 和 fat32 是唯一兼容 Grub2 UEFI 可启动分区。
然后安装Grub2。我安装了想要安装 Grub2 的分区,“GRUB2”是 GParted 下给出的标签,“user”是我的 Xubuntu 帐户名。
sudo grub-install --removable --boot-directory=/media/user/GRUB2/boot --efi-directory=/media/user/GRUB2
/media/user/GRUB2/boot/grub/grub.cfg
然后我使用以下条目创建 grub.cfg 。
menuentry "Lubuntu Boot Recovery Live CD (AMD64)" {
insmod part_gpt
insmod exfat
insmod search_fs_uuid
set iso=/iso/boot-repair-disk-64bit.iso
search --no-floppy --set=root --fs-uuid 92AE-07D5
loopback loop ($root)$iso
linux (loop)/casper/vmlinuz.efi boot=casper file=/preseed/lubuntu.seed iso-scan/filename=$iso noprompt noeject
initrd (loop)/casper/initrd.lz
}
menuentry "Windows 10 Installer on SDB2 (AMD64)" {
insmod part_gpt
insmod ntfs
insmod search_fs_uuid
insmod chain
search --no-floppy --set=root --fs-uuid 13B187F260B1ACD6
chainloader ($root)/efi/boot/bootx64.efi
}
menuentry "Xubuntu Live CD (AMD64)" {
insmod part_gpt
insmod exfat
insmod search_fs_uuid
set iso=/iso/xubuntu-18.04.4-desktop-amd64.iso
search --no-floppy --set=root --fs-uuid 92AE-07D5
loopback loop ($root)$iso
linux (loop)/casper/vmlinuz boot=casper file=/preseed/lubuntu.seed iso-scan/filename=$iso noprompt noeject
initrd (loop)/casper/initrd
}
花了一段时间研究,但根据我的理解。
insmod
- 这用于加载以下模块。据推测,我认为 2.02> 中不需要这些,但我添加了它们以防万一。我找到了一个方便的清单这里。set
- 用于设置变量。search
- 这会搜索某些条件,例如匹配目录、分区的 UUID、分区名称等,并将其存储在 --set 下的变量中。
我不完全确定环回、linux、initrd、preseed 和 chainloader 的实际功能如何或是什么。但我复制了文件路径,但扩展名可能不同或可能没有扩展名。
到目前为止,我已经完成了我想要的所有工作,但我认为如果没有更复杂的脚本,就不可能从 ISO 文件运行 Windows 10 ISO。这是我到目前为止为菜单项编写的代码片段,但它不起作用。
menuentry "Windows 10 Installer (AMD64) (ISO) (Doesn't work)" --class windows --class os {
# Load module to be able to read GPT partition table.
insmod part_gpt
# Load module to read the partition that ISO is stored.
insmod exfat
# Load module to find partition with UUID.
insmod search_fs_uuid
# Load module to chain load to another EFI.
insmod chain
# Set UUID of partition that has ISO image and store it in variable.
set uuid="92AE-07D5"
search --no-floppy --set=root --fs-uuid $uuid
# Set ISO Directory.
set iso=/iso/win10-1909-english-x64.iso
# Mount ISO.
loopback loop ($root)$iso
# Boot ISO.
#chainloader (loop)/efi/microsoft/boot/cdboot.efi
chainloader (loop)+1
}
#chainloader (loop)/efi/microsoft/boot/cdboot.efi
我之前尝试过不加注释chainloader (loop)+1
,但没有成功。
剩下的问题是:如何启动 Windows 10 安装程序 ISO 以从 ISO 文件启动?