从 GRUB2 启动 LVM2 逻辑卷中的 ISO

从 GRUB2 启动 LVM2 逻辑卷中的 ISO

tl;dr - 是否可以从未加密的 lmv2 逻辑卷中的 .iso 文件启动?如何操作?

在使用笔记本电脑实际操作之前,我尝试在 VirtualBox VM 中进行设置。我的设置如下:

  • 4 个 gpt 分区
    • gpt1 - 2M ef02 bios 启动
    • gpt2——5G未加密的非lvm,用于杂项数据、iso等。
    • gpt3 – 5G 未加密的 lvm,用于 /boot、iso 等。
    • gpt4-剩余,lvm,用 dm-crypt/luks 加密,用于 root、swap、home 等。
  • 在 gpt2 中,我有当前 Arch 和 Xubuntu iso 的副本
  • 在 gpt3 中,我有一个 lvm2 lv,里面有相同 iso 的相同副本

我有以下工作:

  • 在 gpt4 中,Arch 和 Xubuntu 的正常运行(并且希望在某些时候在其他逻辑卷中添加其他发行版)
  • 从 Arch 在 /dev/sda 上安装 grub2
  • 使用 grub2 的 configfile 命令,可以从两个发行版的 grub2 菜单切换和启动
  • 可以从非 lvm gpt2 的 grub 菜单启动 iso

我想要做的是从 gpt3 lvm 中的 iso 启动(最终甚至根本没有非 lvm gpt2 分区)。

我的 grub 条目是:

menuentry "Xubuntu ISO" {
  set isofile="/xubuntu-12.04.1-desktop-amd64.iso"
  # from non-lvm
  loopback loop (hd0,gpt2)$isofile
  # from lvm
  #loopback loop (vgboot-iso)$isofile
  linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
  initrd (loop)/casper/initrd.lz
}

2 个环回线路指向同一个 iso 的两个不同副本。我在 grub 命令行上验证了这 2 个环回线路均有效。

从非 lvm 分区中的 iso 启动时,一切正常。

从 lvm 分区中的 iso 启动时,启动开始,最终出现此错误:

(initramfs) /scripts/casper-premount/20iso_scan: line 46: can't open /dev/sr0: No medium found

对于拱门入口:

menuentry "Arch ISO" {
  set isofile="/archlinux-2012.09.07-dual.iso"
  loopback loop (hd0,gpt2)$isofile
  #loopback loop (vgboot-iso)$isofile
  linux (loop)/arch/boot/x86_64/vmlinuz archisolabel=ARCH_201209 img_dev=/dev/sda2 img_loop=$isofile earlymodules=loop
  initrd (loop)/arch/boot/x86_64/archiso.img
}

从 gpt2 iso 启动可以,但我不知道该将“/dev/sda2”更改为 lvm 启动。


编辑:这能做到吗?对于任何当前 Linux 发行版的官方 .iso 文件?Fedora?Debian?openSUSE?CentOS?

这不可能吗?还是说之前没人想过要尝试?


编辑 2:我的赏金早已过期,9 个月后,我假设这在任何 Linux 发行版中都不可能实现。我将这个问题保留下来,但我怀疑近期是否会有可行的解决方案。

答案1

使用 Fedora 21 ISO,我刚刚成功尝试了以下操作:

menuentry "Fedora 21 Live M6600" --class fedora {
    insmod part_gpt
    insmod lvm
    insmod ext2
    set vg='m6600'
    set lv='F21Live'
    set root="lvm/${vg}-${lv}"
    search --no-floppy --fs-uuid --set=root --hint=${root} 95e4eec8-c1de-4802-b821-5753de990cbe
    set isofile="/Fedora-Live-Workstation-x86_64-21-5.iso"
    echo "Using ${isofile}..."
    loopback loop $isofile
    linux (loop)/isolinux/vmlinuz0 iso-scan/filename=${isofile} root=live:CDLABEL=Fedora-Live-WS-x86_64-21-5 rootfstype=auto ro rd.live.image quiet rhgb rd.luks=0 rd.md=0 rd.dm=0 rd.auto=1
    initrd (loop)/isolinux/initrd0.img
}

rd.自动=1将告诉 Linux 加载所有 LVM 和等扫描搜索它们。

答案2

灵感来自这个简单的 Ubuntu 解决方案,我使用了以下命令,用于加载 Fedora 27 KDE iso 和 Ubuntu 17.10 iso。

我刚刚在文件中添加了以下几行/etc/grub.d/40_custom

menuentry "Live Fedora KDE 27" --class fedora {
  insmod part_msdos
  insmod lvm
  set iso_path="/erik/Downloads/transmission/Fedora-KDE-Live-x86_64-27/Fedora-KDE-Live-x86_64-27-1.6.iso"
  search --no-floppy --fs-uuid --set=root 6340d364-fc09-44d1-914f-b902a6394a55
  loopback loop ($root)$iso_path
  linux (loop)/isolinux/vmlinuz iso-scan/filename=${iso_path} root=live:CDLABEL=Fedora-KDE-Live-27-1-6 rootfstype=auto rd.live.image quiet
  initrd (loop)/isolinux/initrd.img
}

menuentry "Ubuntu 17.10.1" --class ubuntu {
  insmod part_msdos
  insmod lvm
  set iso_path="/erik/Downloads/transmission/ubuntu-17.10.1-desktop-amd64.iso"
  search --no-floppy --fs-uuid --set=root 6340d364-fc09-44d1-914f-b902a6394a55
  loopback loop ($root)$iso_path
  linux (loop)/casper/vmlinuz.efi  file=/cdrom/preseed/ubuntu.seed boot=casper iso-scan/filename=${iso_path} quiet splash ---
  initrd (loop)/casper/initrd.lz
}

解释

  • 以 开头的行set iso_path定义了 iso 文件在逻辑卷上的路径。当我启动系统时,它位于/home/erik/Downloads/transmission/Fedora-KDE-Live-x86_64-27/Fedora-KDE-Live-x86_64-27-1.6.iso",但这/home是已安装的逻辑卷,因此我省略了这一行,并以 开头/erik/Downloads/…
  • 以 开头的行search末尾有一个奇怪的字母数字变量(即所谓的 UUID),以 开头6340。我从命令中获取了这个数字

    sudo blkid
    

    这让我和其他人得到了以下一行

    /dev/mapper/fedora_pluto-home: UUID="6340d364-fc09-44d1-914f-b902a6394a55" TYPE="ext4"
    
  • 然后,如果你想启动其他 iso 文件,另一个重要的事情是那些以linux和开头的行initrd。我通过打开 iso 文件使用file-roller(用于提取压缩档案的 GUI)或mc(控制台文件管理器)。

    • Fedora 及类似产品:进入目录/isolinux,你会发现一个名为的文件isolinux.cfg。我在那里发现了一些以 开头的行label,下面是以下重要的行

      kernel vmlinuz
      append initrd=initrd.img root=live:CDLABEL=Fedora-KDE-Live-27-1-6 rd.live.image quiet
      

      您将使用它来填充我的 grub2 的最后两行menuentry

    • Ubuntu 及类似版本:在那里,您将进入目录/boot/grub,在其中找到一个名为的文件grub.cfg。在这里,您将找到一些以开头的行menuentry,在它们下面是以下重要的行

      linux   /casper/vmlinuz.efi  file=/cdrom/preseed/ubuntu.seed boot=casper quiet splash ---
      initrd  /casper/initrd.lz
      

      您可以直接复制。

答案3

我认为大多数发行版的官方 iso 文件都是不可能的。

您收到的错误:

 (initramfs) /scripts/casper-premount/20iso_scan: line 46: can't open /dev/sr0: No medium found

意味着在启动时,您启动的实时系统正在搜索 cd/dvd 驱动器但未找到任何驱动器。

Live CD 未配置为在 LVM 上搜索其源 iso;您也许可以修改映像的启动脚本来执行此操作,但我认为任何当前发行版的官方 .iso 文件都不会这样做。您可以尝试联系您最喜欢的发行版的开发人员以将其集成?

答案4

仅谈一点:

启动时ISO必须挂载,所以必须知道如何找到它。

Grub2 可以使用 insmod... 命令查看 ISO,但是这只不过是让 Grub2 读取 ISO 内部内容、进行循环挂载等而已​​,但是一旦 ISO 中的 Linux 启动,LVM/LUKS/loop/等就不存在了(没有挂载),ISO 中的启动脚本必须知道如何挂载该 LVM/LUKS/loop;因此,如果该 Linux 没有准备好这样做,就无法从中启动。

没有 LVM、LUKS 等的示例...如果普通的 Linux LiveCD ISO 没有设计为在启动时搜索并循环挂载到 .iso 文件,那么就永远不可能从 Grub2(以 .iso 作为文件)启动它。

对于这种情况,您需要一个硬件 CD/DVD 模拟器(如果在真实硬件上),或者只需将 .iso 安装到虚拟机的虚拟 CD/DVD 单元上。

当然,另一个选择是“编辑”此类 ISO,以在启动时合并一些脚本来搜索和挂载 LVM/LUKS/等。

相关内容