我正在尝试通过 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
. 我被困在这里。
就像frostschutz 所说,附加
live-media=/dev/mapper/Fedora-root findiso=ISO/kali-linux-2019.1a-amd64.iso
到内核命令行参数是有效的。所以这就是它看起来如何工作的新菜单条目原来kali initramfs 不支持
iso-scan/filename=
参数。你可能因为误解而被卡住了。
Grub 天生无法引导任何 ISO。
是的,(在限制范围内)Grub 可以解密加密设备,了解 RAID 和 LVM,挂载大量文件系统,甚至循环挂载 ISO。但所有这些花哨的功能只有一个目的:
加载内核和 initrd。
归根结底,Grub 仍然只是一个引导加载程序。
一旦你能够加载内核和 initrd,你让 Grub 跳过什么圈子就无关紧要了。结果与将这两个文件直接复制到一个简单的未加密
/boot
分区完全一样。然后像这样启动它:
如果这两个文件(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 文件放在更容易到达的位置(常规分区)。
我确认使用 Grub 2.00 在逻辑卷上启动 ISO 的可能性。就我而言,我有一个 LVM 类型的唯一分区 MBR(整个磁盘)。我只有 2 个 LV(启动和 iso),我可以使用这个 ubuntu-18.04.2-desktop-amd64.iso 启动。不幸的是,由于 casper(ubuntu 的 livecd 机制)的容量不足,我在 initramfs 中修复了一个文件,(但没有修改 iso)。
对于 Kali,是的,最后一个解决方案有效,而且更简单