grub:如何引导到 ISO 分区

Alb*_*ert 8 boot iso-image grub

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

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

qua*_*ote 4

请参阅我对您的从 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
    
    Run Code Online (Sandbox Code Playgroud)


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

    sudo dd if=avg.iso /dev/sdb2
    
    Run Code Online (Sandbox Code Playgroud)


  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
    }
    
    Run Code Online (Sandbox Code Playgroud)

    为了使这项工作从硬盘驱动器分区开始,我们需要取消环回命令并设置根设备等。我尝试让 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
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这会生成可启动的分区 ISO。

这是可行的,因为 Grub2 可以读取 ISO9660 文件系统,因为这个特定的 ISO 正在加载一个可以处理分区上 ISO 的操作系统,并且因为实际上内核加载的所有内容都在 initrd


如果您使用 Grub4DOS 或 Grub 1,您也许可以使用 chainloader 实现类似的技巧。假设这可以直接启动 Win7 ISO(来源):

title Windows 7
  map (hd0,0)/win7.iso (hd32)
  map --hook
  chainloader (hd32)
Run Code Online (Sandbox Code Playgroud)

您可能会幸运地进行此修改(假设您将 ISO“刻录”到第二个主分区 (hd0,1);否则替换正确的分区):

title Windows 7
  map (hd0,1) (hd32)
  map --hook
  chainloader (hd32)
Run Code Online (Sandbox Code Playgroud)

你也可以摆脱这个:

title Windows 7
  chainloader (hd0,1)
Run Code Online (Sandbox Code Playgroud)

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