如何从非Ubuntu的Live ISO镜像(如Fedora或CentOS)启动?

我发现可以用loopback来实现如下。
menuentry "Lucid ISO" {
loopback loop (hd0,1)/boot/iso/ubuntu-10.04-desktop-i386.iso
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/boot/iso/ubuntu-10.04-desktop-i386.iso noprompt noeject
initrd (loop)/casper/initrd.lz
}

但它只适用于Ubuntu或其衍生版本。如果我想引导其他Live镜像,如Fedora、CentOS、openSUSE等,应该如何编写?
编辑:我找到了一些其他条目,但它们都可能是基于Debian的。
menuentry "Linux Mint 10 Gnome ISO" {
 loopback loop /linuxmint10.iso
 linux (loop)/casper/vmlinuz file=/cdrom/preseed/mint.seed boot=casper initrd=/casper/initrd.lz iso-scan/filename=/linuxmint10.iso noeject noprompt splash --
 initrd (loop)/casper/initrd.lz
}

menuentry "DBAN ISO" {
 loopback loop /dban.iso
 linux (loop)/DBAN.BZI nuke="dwipe" iso-scan/filename=/dban.iso silent --
}


menuentry "Tinycore ISO" {
 loopback loop /tinycore.iso
 linux (loop)/boot/bzImage --
 initrd (loop)/boot/tinycore.gz
}


menuentry "SystemRescueCd" {
 loopback loop /systemrescuecd.iso
 linux (loop)/isolinux/rescuecd isoloop=/systemrescuecd.iso setkmap=us docache dostartx
 initrd (loop)/isolinux/initram.igz
}

编辑2:如何从grub2链式加载grub和syslinux?
编辑3:我想要在没有可移动设备的情况下启动其他实时映像,并使用grub2,因此需要特定于grub2的菜单项。

1这不是离题的,但是Unix和Linux Stack Exchange更好一些。http://unix.stackexchange.com/ - Tachyons
@Rinzwind 怎么做? - Tachyons
2这个问题是关于Fedora、CentOS和OpenSUSE的,不是关于Ubuntu的。@abcd - Rinzwind
问题已经被编辑过了,最初的形式是关于启动Ubuntu Live ISO 10.04的。但我现在认为这已经不是主题了。 - Anwar
2顺便说一下:Fedora无法做到这一点。CentOS基本上是Fedora的变种。dracut中有一个针对此问题的功能请求,需要打补丁修复。您可以在bugzilla.redhat.com上找到此补丁。 - Rinzwind
这是可能的,可以从硬盘上进行操作。我们在这个问题上探索了一些选项,参考链接:http://askubuntu.com/questions/121212/using-a-bootable-live-cd-disk-image-mounted-on-the-hard-drive 。至于 Fedora,你应该去那里询问,参考链接:http://forums.fedoraforum.org/showthread.php?t=253518 - Mateo
2可能是重复的问题吗?http://askubuntu.com/questions/121212/using-a-bootable-live-cd-disk-image-mounted-on-the-hard-drive - fossfreedom
Virpara,如果你对某个答案感到满意的话,请尝试接受它。我认为这会对未来的访问者有所帮助。 - Anwar
@fossfreedom 不同意重复,因为这是关于非Ubuntu镜像的特定问题。 - Ciro Santilli OurBigBook.com
8个回答

从iso启动是一个必须由发行版支持的功能,而iso-scan/filename=选项在Fedora或其他发行版中不起作用。这些发行版可能有其他内核选项来支持此功能,或者根本不支持该功能。
我找到了一种方法来启动Fedora 16 DVD,以下是具体步骤。

从grub启动Fedora 15 DVD iso

menuentry "Fedora 15 (DVD)" {
 insmod loopback
 insmod iso9660
 set isofile="/Fedora-15-x86_64-DVD.iso"
 loopback loop (hd0,2)$isofile
 linux (loop)/isolinux/vmlinuz rootfstype=auto  root=live:UUID=:$isofile ro quiet
 initrd (loop)/isolinux/initrd.img
}
它假设您的iso文件位于内部硬盘的第二个分区的根目录下。

source: this page

您可以在谷歌上搜索其他发行版,因为这不是一个与发行版无关的功能。

注意1:我刚刚测试过,它也适用于Fedora 16。
注意2:当你将iso文件放在fat或ext4分区时,这种方法似乎是有效的。


从grub2引导grml小iso

Grml也可以从grub2引导。请注意,它使用findiso选项而不是iso-scan/filename选项,这表明在不同的发行版中,从iso引导实现为不同的选项。

(menuentry "Grml small 2009.10" {
  loopback loop /boot/iso/grml-small_2009.10.iso
  linux (loop)/boot/grmlsmall/linux26 findiso=/boot/iso/grml-small_2009.10.iso apm=power-off lang=us vga=791 boot=live nomce noeject noprompt --
  initrd (loop)/boot/grmlsmall/initrd.gz
}

此页面有其他发行版从Grub2引导的几个示例。


从iso文件启动openSUSE 13.1 Live

这是唯一有效的解决方案(其他方法都给了我一个“无法找到MBR标识符”的错误并停止了)。在此示例中,iso文件位于第一块磁盘的第三个分区上,目录为/home/username/

menuentry "openSUSE_13.1_GNOME_Live" {
  load_video
  insmod gzio
  insmod part_msdos
  insmod ext2
  set root='(hd0,msdos3)'
  set isofrom_device='/dev/sda3'
  set isofrom_system='/home/username/openSUSE-13.1-GNOME-Live-i686.iso'
  set loader='/boot/i386/loader'
  loopback loop $isofrom_system
  linux   (loop)$loader/linux isofrom_device=$isofrom_device isofrom_system=$isofrom_system ramdisk_size=512000 ramdisk_blocksize=4096 ro quiet splash $vt_handoff preloadlog=/dev/null showopts
  initrd  (loop)$loader/initrd
}

来源为janeppo的评论


Fedora 17 Gnome Live Iso

这是Fedora 17的启动菜单grub.cfg项。ISO文件放置在第一个磁盘的第三个分区。同时文件名也被更改。

menuentry "Fedora Live" {
    loopback loop (hd0,3)/fedora.iso
    linux (loop)/EFI/BOOT/vmlinuz0 root=live:/fedora.iso rootfstype=auto ro liveimg quiet rhgb rd.luks=0 rd.md=0
    initrd (hd0,3)/initrd-fromiso
}

最后说明:我认为这个答案只是一个示例。不应该用更多的例子来详细说明。


我尝试了上面的方法在Fedora 15上,但是没有成功。有什么猜测吗? - Rahul Virpara
我的条目看起来像这样 http://pastebin.com/1ksBVu21 - Rahul Virpara

这是我找到的可以使用grub2引导的iso文件。
我成功地引导了以下ISO文件:
- Ubuntu Precise Pangolin 12.04 ISO - SystemRescueCd - Boot Hardware Detection Tool - Free Dos - Hiren's boot CD - Ultimate Boot CD
我发现,如果你想引导其他ISO文件,比如Hiren's Boot CD等,你可以使用MEMDISK实用程序作为内核。
如何获取MEMDISK?
这里下载Syslinux。将其移动到桌面上。
如何使其工作?
cd ~/Desktop/
tar xvif syslinux-4.05.tar.xz 
cd syslinux-4.05/memdisk/
sudo mkdir /customboot
sudo mv memdisk /customboot/
cd /customboot/
sudo mv memdisk memdisk4.05
gksudo gedit /etc/grub.d/40_custom 

然后将以下条目粘贴到gedit中。您需要更改set isofile="/path/to/iso-file.iso"
然后执行update-grub命令。重新启动并检查。
我的40_custom文件中的条目。
menuentry "Ubuntu Natty Narwhal 11.04 ISO" {
    set isofile="/OS/ubuntu-11.04-desktop-i386.iso"
    loopback loop (hd0,6)$isofile
    linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject --
    initrd (loop)/casper/initrd.lz
}
menuentry "Ubuntu Precise Pangolin 12.04 ISO" {
    set isofile="/OS/ubuntu-12.04-desktop-i386.iso"
    loopback loop (hd0,6)$isofile
    linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject --
    initrd (loop)/casper/initrd.lz
}
menuentry "SystemRescueCd" {
    set isofile="/OS/systemrescuecd-x86-2.7.0.iso"
    loopback loop (hd0,6)$isofile
    linux (loop)/isolinux/rescuecd isoloop=$isofile setkmap=us docache dostartx
    initrd (loop)/isolinux/initram.igz
}
menuentry "Boot Hardware Detection Tool from iso using memdisk 4.05" {
    linux16 /customboot/memdisk4.05 iso
    initrd16 /customboot/hdt.iso
}
menuentry "Free Dos from iso using memdisk 4.05" {
    set isofile="/OS/fdbasecd.iso"
    linux16 /customboot/memdisk4.05 iso
    initrd16 (hd0,6)$isofile
}
menuentry "Hiren's boot CD using memdisk 4.05" {
    set isofile="/OS/Hiren's.BootCD.10.1.iso"
    linux16 /customboot/memdisk4.05 iso
    initrd16 (hd0,6)$isofile
}
menuentry "Ultimate Boot CD iso using memdisk 4.05" {
    set isofile="/OS/ubcd511.iso"
    linux16 /customboot/memdisk4.05 iso
    initrd16 (hd0,6)$isofile
}

所有的ISO都保存在上,而则保存在Ubuntu所安装的分区(根目录下),并重命名为,因此其路径为。
注意:Fedora无法使用其他给出的答案。仍在尝试引导Fedora :(。

注意,使用memdisk和grub initrd16加载ISO文件时,ISO文件的大小必须小于462 MB。相关错误信息:grub: 错误:找不到合适的内存目标,memdisk: MEMDISK:未指定ramdisk镜像。更多详细信息请参见这里这里 - gregn3

很不幸,这些建议都没有帮到我。所以我找到了一种方法,很愿意与你分享。 例如,要启动CentOS,你需要: 将ISO镜像放入目录中。 如果你的根目录挂载在/dev/sda1上,那么创建/iso目录并将ISO文件放在其中。 进入grub控制台(当grub菜单出现时按下'c'键)。
选择适当的设备 - hd0表示sda。你需要选择ISO所在的设备。
loopback loop (hd0,msdos1)/iso/Redhat.iso 
linux (loop)/isolinux/vmlinuz inst.repo=hd:sda1:/iso/Redhat.iso 
initrd (loop)/isolinux/initrd.img 
boot

并启动它!


似乎13.04需要不同的语法来实现这一点。有人成功地从物理磁盘引导了ubuntu-13.04-desktop-amd64.iso,并愿意分享grub的语法吗?
编辑:我自己回答了这个问题。需要将vmlinuz重命名为mvlinuz.efi,然后它就可以工作了。
menuentry "Ubuntu-13.04-desktop-amd64.iso" --class ubuntu {
set isofile="/archives/ubuntu-13.04-desktop-amd64.iso"
loopback loop (hd1,6)$isofile
linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile noeject noprompt --
initrd (loop)/casper/initrd.lz
}

你所问的问题在这里是不相关的,因为它需要对其他系统有一定的了解才能正确设置 grub 条目以启动它们。是的,这是可能的。
然而...你会发现 Multi System 是一个非常有效的工具,可以在一个大型 USB 驱动器上拥有许多不同的发行版 ISO 文件。我发现它运行得非常好,但你需要从 PPA 安装它。

http://www.pendrivelinux.com/multiboot-create-a-multiboot-usb-from-linux/

我使用它是为了能够在一个U盘上拥有Gparted LiveUSB和其他工具,以及Ubuntu的工具,用于安装节。作为额外的好处,它允许自定义菜单的启动画面,我已经设置为澳大利亚LoCo团队的标志。
Chris
正如所述,Multisystem使用Grub2来实现您想要的功能。由于这个与主题无关的帖子被允许,或者至少在这里被容忍,这是我Multisystem Grub2中的Fedora条目:
 menuentry "Fedora-15-i686-Live-Desktop.iso" {
 linux /fedora1/isolinux/vmlinuz0 live_locale=en_AU.UTF-8 live_keytable=us live_dir=/fedora1 root=UUID=493A-D2EF rootfstype=auto ro liveimg quiet rhgb rd_NO_LUKS rd_NO_MD noiswmd
 initrd /fedora1/isolinux/initrd0.img
 }

请注意,您不能直接从ISO启动,因为它不像基于Debian的发行版那样受支持。您需要按以下方式在硬盘上获取ISO中的解压文件:
chris@chris-office:/media/RED8/fedora1$ ls -l
total 563972
drwx------ 2 chris chris      4096 Feb 11  2011 isolinux
-rw-r--r-- 1 chris chris     43503 May 14  2011 livecd-iso-to-disk
-r--r--r-- 1 chris chris      8192 May 14  2011 osmin.img
-r--r--r-- 1 chris chris 577449984 May 14  2011 squashfs.img

你当然需要更改/fedora/目录的位置和引导Fedora的分区的UUID。你可能还需要将挂载模式从ro更改为rw,以及其他适当的设置,比如squashfs的权限。
你也可以设置一个虚拟持久性磁盘,尽管我不明白为什么你不能挂载正常的/home分区。再次强调,我只能建议你安装Multidisk并自己进行配置,以学习如何操作。
Chris

问题是如何在现有的GRUB2中创建条目,而不是如何制作具有不同发行版的可启动U盘或外部硬盘。顺便说一句,这需要比其他发行版更好的GRUB2知识,所以实际上这是与GRUB(因为某些发行版仍在使用GRUB)或GRUB2相关的问题。 - Rahul Virpara
1我觉得为像Fedora、Centos和Suse这样的发行版创建引导项与这些发行版本身有更多关联,而与GRUB关系不大,当然也与Ubuntu毫无关系。 - fabricator4
1@virpara:你也没有说明你是从硬盘引导ISO文件——想要引导各种LiveISO文件的最合理原因是为了拥有一个全能安装设备。我们不是心灵读者,也不是其他发行版的专家。最后,如果你真的安装并使用MultiSystem来制作这样的U盘,它会向你展示如何操作——它使用grub2来实现你想要的结果。 - fabricator4

试试使用Multisystem,安装你想要的liveCD,并将文件复制到你的/目录下并合并grub.cfg文件!(我其实很好奇这样是否会起作用!)。

失败的原因是Fedora的initramfs无法检测到回环设备的UUID、label、partUUID等信息。 你告诉它从LABEL=$label引导,但在/dev/disk/by-label中找不到这样的标签。 UUID也是一样的--在/dev/disk/by-uuid中找不到/dev/loop0的UUID。
所以,我唯一能强制Fedora从.iso文件启动的方法就是告诉内核根目录是live:/dev/loop0。
看起来没有其他办法了。
menuentry "Fedora MATE Compiz Live X86 64 37 1 7" {
  insmod gzio
  if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
  insmod <YOUR PART_TABLE>
  insmod <FS TYPE OF YOUR PARTITION WITH ISO>
  search --no-floppy --fs-uuid --set=root <YOUR UUID HERE>
  iso_path="/iso/Fedora-MATE_Compiz-Live-x86_64-37-1.7.iso"
  export iso_path
  search --set=root --file $iso_path
  if [ "$grub_platform" = "efi" ]; then
    # support booting recent GRUB versions on UEFI systems
    rmmod tpm
  fi
  loopback loop "${iso_path}"
  set root=(loop)
  set gfxpayload=keep
  # Nothing to do with `probe --set iso_label --label (loop)`. It's useless.
  linux (loop)/images/pxeboot/vmlinuz root=live:/dev/loop0 rd.live.image verbose iso-scan/filename=${iso_path}
  initrd (loop)/images/pxeboot/initrd.img
}

这是从.iso文件启动Archlinux的方法:
menuentry "Archlinux 2023 01 01 X86 64" {
  insmod gzio
  if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
  insmod <YOUR PART_TABLE>
  insmod <YOUR FS TYPE>
  search --no-floppy --fs-uuid --set=root <YOUR UUID>
  iso_path="/iso/archlinux-2023.01.01-x86_64.iso"
  export iso_path
  search --set=root --file $iso_path
  kernelopts="   "
  export kernelopts
  if [ "$grub_platform" = "efi" ]; then
    # support booting recent GRUB versions on UEFI systems
    rmmod tpm
  fi
  loopback loop "${iso_path}"
  set root=(loop)
  set gfxpayload=keep
  probe --set isolabel --label (loop)
  set img_dev_path="/dev/disk/by-uuid/<YOUR UUID>"
  linux (loop)/arch/boot/x86_64/vmlinuz-linux archisobasedir=arch archisolabel="${isolabel}" archisodevice=/dev/loop0 img_dev="${img_dev_path}" img_loop="${iso_path}" earlymodules=loop
  initrd (loop)/arch/boot/intel-ucode.img (loop)/arch/boot/amd-ucode.img (loop)/arch/boot/x86_64/initramfs-linux.img
}

(是的,使用3个initrd是正确的。)
Gentoo的方法:
menuentry "Gentoo Install x86_64 Minimal 20230101T164658Z" {
  insmod gzio
  if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
  insmod <YOUR PART_TABLE>
  insmod <YOUR FS_TYPE>
  search --no-floppy --fs-uuid --set=root <YOUR UUID>
  iso_path="/iso/install-amd64-minimal-20230101T164658Z.iso"
  export iso_path
  search --set=root --file $iso_path
  kernelopts="   "
  export kernelopts
  if [ "$grub_platform" = "efi" ]; then
    # support booting recent GRUB versions on UEFI systems
    rmmod tpm
  fi
  loopback loop "${iso_path}"
  set root=(loop)
  set gfxpayload=keep
  set bootoptions="isoboot=${iso_path} root=/dev/ram0 init=/linuxrc dokeymap looptype=squashfs loop=/image.squashfs cdroot vga=791"
  linux  (loop)/boot/gentoo $bootoptions
  initrd (loop)/boot/gentoo.igz
}