grub:如何启动到 ISO 分区

grub:如何启动到 ISO 分区

我已将 ISO 文件复制到分区中 (即 dd if=isofile of=/dev/sdb1)。如何通过 GRUB 启动到该分区?

当我尝试使用 chainloader (hd1,0)+1 时,它显示未知的可执行格式。

答案1

请参阅我的回答关于从 ISO 文件启动的问题以此为起点,我用一个旧硬盘进行了一些测试。我以前配置 Grub2启动多 ISO闪存驱动器,所以我所做的是:

  1. 在旧硬盘上创建几个分区。这是使用 USB-IDE 适配器完成的,因此驱动器显示为 /dev/sdb。

    • 分区 1:FAT32,大小约为 2GB
    • 分区 2:未格式化


  2. 将第一个分区挂载到 /mnt,并将我的系统中的 Grub 副本安装到该驱动器上:

    sudo grub-install --no-floppy --root-directory=/mnt /dev/sdb
    


  3. 将 ISO “刻录”到第二个分区:

    sudo dd if=avg.iso /dev/sdb2
    


  4. 这是 AVG 病毒扫描程序 ISO;在我的多 ISO 闪存驱动器上,我使用它直接启动 ISO:

    menuentry "AVG Rescue CD" {
       loopback loop /iso/avg.iso
       linux (loop)/isolinux/vmlinuz max_loop=255 vga=791 init=linuxrc iso-scan/filename=/iso/avg.iso
       initrd (loop)/isolinux/initrd.lzm
    }
    

    为了使这个从硬盘分区工作,我们需要删除回送命令并设置根设备等。我尝试让 Grub2 自动发现根设备,但都失败了,所以我直接将其指向分区。这有效,但要注意 Grub 的设备枚举;您尝试从中启动的驱动器可能不是 (hd0)。这是 ISO 分区的工作条目:

    menuentry "AVG Rescue CD" {
       linux (hd0,2)/isolinux/vmlinuz max_loop=255 vga=791 init=linuxrc
       initrd (hd0,2)/isolinux/initrd.lzm
    }
    

    这会在分区上产生一个可启动的 ISO。

这是可行的,因为 Grub2 可以读取 ISO9660 文件系统,因为这个特定的 ISO 正在加载一个可以处理分区上的 ISO 的操作系统,而且因为内核加载的几乎所有东西都在初始化文件


如果你使用的是 Grub4DOS 或 Grub 1,你可以使用 chainloader 来做类似的操作。假设这可以直接启动 Win7 ISO(来源):

title Windows 7
  map (hd0,0)/win7.iso (hd32)
  map --hook
  chainloader (hd32)

您可能希望通过此修改获得成功(假设您将 ISO “刻录”到第二个主分区 (hd0,1);否则请替换正确的分区):

title Windows 7
  map (hd0,1) (hd32)
  map --hook
  chainloader (hd32)

你也可以这样做:

title Windows 7
  chainloader (hd0,1)

但是,ISO 实际上并未配置为从驱动器启动,因此您可能会遇到其他问题。

答案2

以下是我使用的方法Grub4DOS(上次正式版本):

Grub4DOS 可以启动 iso 映像,因此它应该能够对分区执行此操作。
我们希望将 iso 分区映射到新驱动器,然后使用以下命令从该驱动器启动:

title Boot ISO Partition
    map (hd0,7) (0xff)
    map --hook
    chainloader (0xff)

但这不起作用,整个磁盘都被映射了。

幸运的是map可以将“文件或黑列表”作为第一个参数。

  1. 找出你的分区占用了多少个块:

    $ sudo fdisk -l /dev/sda
    ...
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda8            5948        6087     1124518+   b  W95 FAT32
    

    我创建了一个 1.1Gb 的分区,所以我需要1124518 * 2 = 2249036在这里使用。
    (技术上它是 2249037,但没关系)

  2. 现在将黑名单传递给 grub:

    title Boot ISO Partition
        map --heads=0 --sectors-per-track=0 (hd0,7)0+2249036 (0xff)
        map --hook
        chainloader (0xff)
    

    并且它有效!

笔记:

  • 如果大小错误,grub 会发现它(map 命令会在分区边界之外失败)。
    如果大小太小,则可能无法启动。
  • (hd32)也可以代替使用(0xff)
  • 还没有尝试过 4.5b 版本,问题可能已在那里修复。

要从 Grub2 链式加载 Grub4DOS:

menuentry "Boot ISO Partition" {
        root (hd0,1)
        set opts='map --heads=0 --sectors-per-track=0 (hd0,7)0+2249036 (0xff);
                  map --hook;
                  chainloader (0xff) '
        linux16 /boot/grub4dos/grub.exe --config-file=$opts
}

将其添加到/boot/grub/grub.cfg(或者可能更好/etc/grub.d/40_custom)。
(假设grub.exe/boot/grub4dos第一个分区上)


结论:事实上它非常酷。

  • 链式加载到 isolinux / 映像正在使用的任何引导加载程序,
    因此引导体验与 cd 或 usb 记忆棒完全相同。
  • 要尝试新的 iso,您只需将其添加到分区并重新启动。
  • 比 usb 更快(尤其是使用 ssd 时),而且比循环安装 iso(基于 ubuntu 的 iso)。
  • 图像不必像记忆磁盘

这应该适用于任何混合 iso。与 ubuntu live 映像和其他 linux iso 配合使用效果很好,因为它们设法在 iso9660 分区中找到它们的文件。任何实模式 (DOS) 也应该没问题。Windows iso 将无法应对。

古今顺便说一下也可以这样做。

答案3

使用内部驱动器中的 grub 启动 Live USB

如果您在启动使用 balenaEtcher、dd 或其他使用 ISO9660 文件的方法制作的 Live USB 时遇到问题,您可能能够使用内部驱动器 grub 进行启动。

尝试将以下菜单项添加到内置驱动器的 grub 菜单

menuentry "Ubuntu - flash drive" {
 search --set=root --fs-uuid xxxx-xx-xx-xx-xx-xx-xx
    set gfxpayload=keep
    linux   ($root)/casper/vmlinuz$casper_flavour  file=/cdrom/preseed/ubuntu.seed quiet splash  ---
    initrd  ($root)/casper/initrd$casper_flavour
}

其中 xxxx-xx-xx-xx-xx-xx-xx 是 Live USB 的 UUID。

此方法适用于任何启动 ISO9660 文件的实际 USB 或持久 USB。

相关内容