从 GRUB2 启动位于 LVM 上的 ISO 文件

从 GRUB2 启动位于 LVM 上的 ISO 文件

我正在尝试通过 grub 从位于 LVM 分区上的 Live iso 文件(特别是 Kali Linux)启动。

我已经设法从 iso 文件加载内核和 initrd,但不知道如何挂载根分区。这就是我目前在 grub.cfg 中的内容

menuentry "Kali Live ISO" --class gnu-linux {
  insmod lvm
  insmod ext2
  set root="lvm/Fedora-root"
  search --no-floppy --fs-uuid --set=root --hint=${root} 29e2f518-5fad-49c9-90ef-966b0c033c5e
  set isofile="/ISO/kali-linux-2019.1a-amd64.iso"
  loopback loop $isofile
  linux (loop)/live/vmlinuz boot=live iso-scan/filename=${isofile} noconfig=sudo username=root hostname=kali
  initrd (loop)/live/initrd.img
}

上面的 uuid 是 ISO 文件所在分区的 uuid 号,从blkid.我被困在这里了。

答案1

正如弗罗斯特舒茨所说,附加live-media=/dev/mapper/Fedora-root findiso=ISO/kali-linux-2019.1a-amd64.iso到内核命令行参数是有效的。这就是新菜单项的工作原理

menuentry "Kali Live ISO - findiso" --class gnu-linux {
  insmod lvm
  insmod ext2
  set root="lvm/Fedora-root"
  search --no-floppy --fs-uuid --set=root --hint=${root} 29e2f518-5fad-49c9-90ef-966b0c033c5e
  set isofile="/ISO/kali-linux-2019.1a-amd64.iso"
  loopback loop $isofile
  linux (loop)/live/vmlinuz boot=live live-media=/dev/mapper/Fedora-root findiso=ISO/kali-linux-2019.1a-amd64.iso noconfig=sudo username=root hostname=kali
  initrd (loop)/live/initrd.img
}

原来kali initramfs不支持iso-scan/filename=参数。

答案2

您可能因误解而陷入困境。

Grub 本质上无法引导任何 ISO。

是的,(在限制范围内)Grub 可以解密加密设备、理解 RAID 和 LVM、挂载大量文件系统,甚至循环挂载 ISO。但所有这些奇特的功能只有一个目的:

加载内核和 initrd。

归根结底,Grub 仍然只是一个引导加载程序。

一旦您能够加载内核和 initrd,Grub 跳过什么环节就不再重要了。结果与将这两个文件直接复制到简单的未加密分区完全一样/boot

mount -o loop kali-linux-2019.1a-amd64.iso /mnt/iso
cp /mnt/iso/live/{vmlinuz,initrd.img} /boot/kali

然后像这样启动它:

menuentry "Kali Live ISO" {
    linux kali/vmlinuz ...parameters...
    initrd kali/initrd.img
}

与上面的相同,前提是这两个文件(vmlinuz 和 initrd.img)是从相应的 ISO 文件中获取的。


确实是同一件事。不管怎样,Grub 只想要这两个文件。您可以使用任何可以加载内核和 initrd 的引导加载程序来引导 ISO,这一切都不依赖于 Grub 的奇特功能(尽管它可能只是更方便)。

因此,Grub 仅加载内核,向其传递一些内核参数和 initrd,仅此而已。一旦内核被加载,就没有LVM,没有(循环),也没有ISO。 Grub 所做的一切都消失了,并被内核本身所取代。


那么,ISO 是如何启动的呢?

它会自行启动。这就是为什么您必须将 ISO 的文件名作为内核参数传递,以便它知道要查找哪个文件。好吧,如果默认文件名被硬编码在 ISO initramfs 中,那么即使这也是可选的。

然后 ISO 的 initramfs 中有一些代码,它会遍历所有存储设备、挂载所有文件系统并搜索该文件。当它找到该文件时,它会循环安装它。

这就是它的工作原理,实现该功能的不是 Grub,而是 ISO 本身,并且根据此实现(如果有实现 - 否则它将无法工作),它可能支持也可能不支持将此文件定位在LVM逻辑卷,甚至支持RAID和加密。


特别是对于 Kali,我不知道这是否可能。我尝试稍微阅读一下 Kali 的 initramfs 代码,但iso-scan/filename=似乎根本不存在,相反,它应该是findiso=,并在其前面加上/dev/mapper/路径或单独提供live-media=可能启用 LVM 支持。

但我自己实际上并没有尝试过,而且 initramfs 很难破译,所以你必须自己进行实验/调查,或者将这个问题带到 Kali 社区。

或者,只需将 ISO 文件放在更容易访问的位置(常规分区)即可。

答案3

我确认可以使用 Grub 2.00 在逻辑卷上启动 ISO。就我而言,我有一个 LVM 类型的唯一分区 MBR(整个磁盘)。我只有 2 个 LV(启动和 iso),我可以使用这个 ubuntu-18.04.2-desktop-amd64.iso 启动。不幸的是,由于casper(ubuntu的livecd机制)容量不足,我在initramfs中修复了一个文件(但没有修改iso)。

对于 Kali,是的,最后一个解决方案有效,而且更简单

相关内容