如何在GRUB2中从.iso文件启动?

有没有一种方法可以做到这一点?

你能澄清一下你想做什么吗? - Takkat
1是的,请详细说明您的意思。这是一个有趣的话题;从.iso文件启动潜在地非常有用。 - loevborg
我想在Grub2菜单中添加一个.iso条目。 - Lincity
ISOBoot:: https://help.ubuntu.com/community/Grub2/ISOBoot - totti
这里讨论了同样的话题:链接 - dma_k
6个回答

可能比你从网上看到的所有详细解释给出的印象要简单得多。我只是在Ubuntu 12.04上执行了以下步骤来引导FreeDOS .iso进行固件更新。
  • 安装grub-imageboot
  • 将你的.iso文件复制到/boot/images/目录下
  • 运行update-grub2命令

或者直接复制/粘贴以下内容:

sudo -s
apt-get install grub-imageboot
mkdir /boot/images/
cp $YOUR_ISO_FILE.iso /boot/images/

update-grub2

就是这样。

有时,在运行update-grub2之前,您可能需要执行另外两个步骤:

如果您以前从未这样做过,则需要编辑/etc/default/grub文件,以便在启动时显示grub菜单:

## To show the menu, disable the hidden_timeout, and set a timeout
#GRUB_HIDDEN_TIMEOUT=0
GRUB_TIMEOUT=10

对于某些.iso镜像文件,您可能需要在/etc/default/grub-imageboot中添加此选项:(我在我的FreeDOS .iso上需要它)
ISOOPTS="iso raw"

如果您编辑了其中一个配置文件,您需要再次运行update-grub2
更新:这是由"dma_k"要求的结果菜单项。
menuentry "Bootable ISO Image: SV100S2_64_128_120229" {
    insmod part_msdos
    insmod ext2
    set root='(hd0,msdos6)'
    search --no-floppy --fs-uuid --set=root 6ca082d0-63d0-48c3-9e5f-2ce5d7a74fe4
    linux16 /boot/memdisk iso raw
    initrd16 /boot/images/SV100S2_64_128_120229.iso
}

这是用于FreeDOS镜像的某个固件更新或类似的东西。

1对我来说,在12.10 iso=>12.10上无法工作。 - totti
@mivk:你能否提供给我给定ISO文件的menuentry结果? - dma_k
@dma_k:请看上面的更新。 - mivk
1谢谢,我明白了。你在这种方法中有发现任何限制吗?我有一种感觉,memdisk只能加载小于1GB的镜像,对于更大的文件(比如Win7 DVD ISO)会出现问题。 - dma_k
只是用来进行各种小型固件更新。 - mivk
不工作的Ubuntu 12.04 iso => 12.04。update-grub确实显示Found iso image: /boot/images/ubuntu-12.04.4-desktop-amd64.iso,但是当我重新启动时,GRUB菜单中没有条目。 - Ciro Santilli OurBigBook.com

我假设你想在GRUB菜单中添加一个.iso条目并启动它?

我在Ubuntu论坛上找到了这个信息


问题是(正如我今天吃了个大亏发现的那样),从 grub 挂载的 iso 安装仍然不可能,因为安装程序在尝试卸载 iso 时会崩溃... *叹气 - turbo

我来到这里是因为我厌倦了烧录无数可引导的ISO 9660镜像,所以想使用GRUB 2来引导一个FreeDOS镜像,以更新Seagate硬盘的固件/微码。作为对mivk答案(使用syslinux的memdisk)的补充或替代,以下是我利用GRUB 2的方法:
1. 安装syslinux-common软件包(用于在其中使用memdisk;grub-imageboot是一个非必需的挂钩软件包) 2. 按下'c'键(命令的助记符)以激活GRUB 2内置的迷你shell命令提示符(更准确地说,是最小的类似BASH的shell) 3. 在GRUB 2的迷你shell中输入以下3行命令:
   linux16 (hd0,gpt2)/usr/lib/syslinux/memdisk iso raw
   initrd16 (hd0,gpt3)/myUserAccount/download/Barracuda-ALL-GRCC4H.iso
   boot
   # where Barracuda-ALL-GRCC4H.iso is a FreeDOS-based ISO 9660 image, and 
   # the mathematical 2-tuples or ordered pairs, (hd0,gpt2) and (hd0,gpt3), 
   # are GRUB 2's respective device notations for my rootfs partition 
   # (e.g., /dev/sda2) and home partition (e.g., /dev/sda3).
   # NOTE: This procedure also applies to Seagate's SeaTools (based on 
   #       FreeDOS as well); just substitute the file SeaToolsDOS223ALL.iso 
   #       for Barracuda-ALL-GRCC4H.iso.

memdisk的相关信息可以在http://www.syslinux.org/wiki/index.php/MEMDISK上找到。

通过直接在迷你shell中操纵命令,此过程比大多数前述方法更灵活简单,因为您不必每次尝试不同的Linux发行版或基于BSD的Live CD时都要费心调整和更新那些GRUB 2的配置。

目前,这四行命令是可以作为GRUB 2迷你shell中通用模式的,即loopback-linux-initrd-boot序列加上一些传递给给定内核的参数,例如引导尽可能多的流行Linux ISO映像(在这种情况下是带有System Rescue CD的3个内核命令行参数):

   loopback lb (hd0,gpt3)/myUserAccount/download/systemrescuecd-x86-3.7.0.iso
   linux (lb)/isolinux/rescue64 isoloop=systemrescuecd-x86-3.7.0.iso setkmap=us docache
   initrd (lb)/isolinux/initram.igz
   boot

注意:严格来说,在Linux上安装类似Debian衍生版的Linux发行版时,并不一定需要使用通用模式中的“loopback”部分,这样可以避免浪费光盘。

http://ansi.interblc.com/2010/02/06/howto-boot-iso-images-via-grub2-with-ubuntu/

切换到`/etc/grub.d`目录。 在这里添加以`50`开头的ISO镜像。例如,我的Ubuntu正常ISO镜像的条目(50_ubuntu)如下所示: ``` echo "Adding $(egrep menu[e]ntry $0 | cut -d'"' -f2)" >&2 cat << EOF menuentry "Ubuntu 10.04 Daily Build" { loopback loop (hd0,3)/ansi/software_and_config/ISOs/ubuntu/lucid-desktop-i386.iso linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/ansi/software_and_config/ISOs/ubuntu/lucid-desktop-i386.iso file=(loop)/preseed/ubuntu.seed quiet splash bootkbd=sg -- initrd (loop)/casper/initrd.lz } ``` 我的ISO文件存储在`sda3`下的`/ansi/software_and_config/ISOs/ubuntu/`目录中。为了根据您的需求进行更改,有三个元素需要更改。`loopback`行包含了您的硬盘(以grub样式表示,hdx,y x=0->sda x=1->sdb等)和路径。第三个要更改的元素位于`linux`行中。将此文件保存为“50_ubuntu”,放在“/etc/grub.d”目录中,并使用“chmod a+x 50_ubuntu”命令使其可执行,并使用“update-grub”命令激活更改。重新启动后,您应该能够使用Shift键激活grub菜单并选择新的条目。
(注:如果有人能正确使用[CODE]格式,那就太好了。我似乎无法使其正常工作。--tyblu)

3这个回答并不是很好。你能否提供更多关于链接的见解,甚至创建步骤或结果的摘要? - Marco Ceppi
在现代版本的GRUB中,你可以直接编辑/boot/grub/custom.cfg并在那里编写菜单项(它们会从41_custom中读取),这样就不会那么麻烦了。 - Colin Watson
仅适用于Ubuntu,其他以修改名称的Linux不适用。 - totti

正如Mark Rooney所说,您可以在Ubuntu论坛上找到一个很棒的指南

这将允许您从ISO文件启动,但仅当ISO支持时。 (所有最近的Ubuntu版本都应该支持,以及其他一些发行版)。

如果您计划从现场ISO安装,您应该将文件放在与您将要安装的不同分区中(因为您不能写入运行的分区)。也有可能安装程序会抱怨。您需要手动编辑/etc/mtab并删除与包含ISO文件的分区对应的条目。


我不明白这个指南如何帮助引导非基于Linux的ISO镜像,例如没有vmlinuz的ISO镜像。有什么想法吗? - dma_k

从USB磁盘/存储器上的ISO文件启动,可能是最用户友好的方式是使用MultiSystemhttp://liveusb.info/dotclear/index.php?pages/install 只需拖放一下,就可以在您的LiveUSB磁盘/存储器的启动菜单中包含大部分ISO映像。

问题是询问如何使用grub2引导一个镜像文件,而不是将其放在U盘上。 - psusi
除非你想要阻止人们回答问题,否则你可能会友好地考虑到人们可能想要在GRUB2中从.iso文件启动,无论是在硬盘上(情况1)还是在USB磁盘/闪存上(情况2,可能更常见)。我认为我的回答提供了第二种情况的一个很好的解决方案,尽管它可能不适用于第一种情况,并且我已经在回答中明确说明了这一点。但是你怎么知道这个问题是指的硬盘而不是USB磁盘/闪存呢?以建设性的精神来看,也许你可以说这是一个部分回答,而不是一个负面的回答;-) - Sadi