从grub2引导Windows 7 iso

我想这样做是因为我想安装Windows 7,但我的BIOS菜单没有显示出来;它直接跳过到grub2菜单,但那是另外一个故事...有没有办法从grub2直接启动Windows 7的安装iso文件?

1我的BIOS菜单没有显示出来。但是你尝试进入BIOS了吗? - Mitch
如果我格式化硬盘,Windows 会启动吗? :) - user351688
4个回答

使用grub4dos引导Windows XP

使用grub legacy或grub2引导实际的ISO文件无法成功,但对于较旧的Windows版本(例如XP),可以将ISO中的i386文件夹解压到USB闪存驱动器上,然后使用grub4dos调用引导加载程序:

title windows installer via setupldr.bin
find --set-root /i386/setupldr.bin
chainloader /i386/setupldr.bin

或者

title windows installer via /bootsect.bin
find --set-root /i386/setupldr.bin
chainloader /bootsect.bin

这可能在较新的Windows版本或较新的硬件上无法正常工作,但也有另一种选择...
使用grub2启动Windows 7
据说,对于Windows 7,类似以下方式可能有效:
menuentry "Windows 7 (bootmgr)" --class windows --class os {
    insmod part_msdos
    insmod ntfs
    insmod ntldr
    ### A: either use this line or the next one, but not both
    set root='(hd0,msdos1)' 
    ### B: 
    ### search --no-floppy --set=root --fs-uuid ____INSERT_PARTITION_UUID_HERE___
    ntldr ($root)/bootmgr
}

选项A假设您的可引导USB驱动器/硬盘是第一个设备,并具有msdos样式的分区表。根据您的配置进行调整。如果您的引导设备具有GPT分区表,那么很可能需要使用(hd0,gpt1)(总体上,设置GPT较为棘手)。
选项B使用驱动器的唯一UUID,在Linux中可以通过sudo blkid查看,在OSX中可以使用例如diskutil info disk0s1(或Disk Utility > Info)来查看。
最终条目可能如下所示:
menuentry "Windows 7 installer" --class windows --class os {
    insmod part_msdos
    insmod ntfs
    insmod ntldr
    search --no-floppy --set=root --fs-uuid 0E239BC6-F960-3107-89CF-1C97F78BB46B
    ntldr /bootmgr
}

1不错。虽然我使用了--set=root --fs-uuid UUIDHERE(改变了顺序),但是无法确定是否必需。谢谢。 - Jan Kyu Peblik
1@JanKyuPeblik 你能从ISO启动吗? - Anwar
那是我记得的,没错。我对其他的东西不感兴趣。 - Jan Kyu Peblik

是的,你会觉得这样的东西会起作用。

menuentry "Boot Windoze" {
  search -f "--set-root /Winblows.iso"
  drivemap "/Winblows.iso" '(hd32)'
  drivemap '--hook' ''
  set root='(hd32)'
  chainloader +1
}

但是Windows会对此感到困惑。

如果您至少有4GB的RAM,您可以选择将整个DVD ISO加载到memdisk中,并从该磁盘引导。要做到这一点,下载SysLinux并将memdisk文件提取到您的boot目录中。然后,您需要向Grub2添加类似于此的代码


menuentry "Boot Windoze" {
  search -f "--set-root /Winblows.iso"
  insmod memdisk
  linux16 /boot/memdisk iso
  initrd16 /Winblows.iso
}

然而,我不会测试这段代码,因为将3GB以上的数据放入RAM中是完全错误的(从理念的角度来看)。不,我真的想要你想要的东西,但最后我将Windows安装到了一个USB分区上,使用Windows 7 USB/DVD下载工具加载并链接到那个分区。很抱歉,我没有看到其他的方式。


2首先的代码会启动Windows,但是一段时间后会失败,因为Windows不知道ISO被挂载在哪里。 - totti
第二个代码可能无法运行,因为它与Ubuntu的iso文件不兼容。 - totti
OP指的是Windows 7。你有测试过吗? - Warpspace
2你可能不喜欢Windows,但在这里发布“Winblows”和“Windoze”是相当不专业的。-1。 - 0xC0000022L
1由于我不是专业的引导程序员,所以我可以接受“不专业”。我想你可能是指“不尊重”。是的,那个评论是6年前的事了。自那时以来,我已经改变了很多(Windows也是如此)。 - Warpspace
从linux16命令来看,我认为memdisk在UEFI中不起作用(https://unix.stackexchange.com/a/690607/77353)。我们真的需要一个UEFI memdisk:D - Wang

从技术上讲,无法从Windows的.iso文件进行安装。你可以通过grub引导来启动.iso文件,但之后Windows将失去与挂载位置的联系,或者说它无法支持这种操作。所以grub和Windows都需要意识到挂载和引导的过程。目前Windows不支持这样的功能。
因此,你需要将.iso文件的内容提取/复制到一个分区的根目录,并使用grub进行链式加载。

3分享知识是个好主意,但你可以直接以技术方式回答问题。也就是说,将当前文本作为免责声明,然后将"你可以从 .iso 启动"扩展为菜单项或其他内容。这样,你就能明确阐述你想实现被问到的方法(们),尽管你知道它们并不适用于预期的目的。这还可以消除你考虑过的解决方案数量的歧义。 - n611x007

你可以创建NTFS分区或将USB驱动器格式化为NTFS,将Windows 7/8/10/11 ISO文件提取到该分区或USB驱动器中,确保所有文件都被提取出来,然后运行sudo update-grub并重新启动,就能看到特定的Windows引导菜单项,用于安装Windows。
你可以在USB驱动器上安装Grub2,并使用Ubuntu制作多重启动的USB,无需任何特殊工具即可安装Ubuntu和Windows。