从GRUB2引导LVM2逻辑卷中的ISO


8

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的安装(并希望在某些时候在其他逻辑卷中添加其他发行版)
  • 从/ dev / sda上的Arch安装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的2个不同副本。我已经在grub命令行上验证了两个回送线都可以工作。

从非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文件?软呢帽?Debian?openSUSE?CentOS的?

这不可能吗?还是有人没有想过尝试过的东西?


EDIT2:我的赏金已经过期很久了,而在9个月后,我认为这对任何Linux发行版都是根本不可能的。我将保留这个问题,但我怀疑在不久的将来随时都有可行的解决方案。

Answers:


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.auto = 1将告诉Linux加载所有LVM,并进行iso-scan搜索。


以开头的行中的UUIDsearch是包含iso文件的逻辑卷之一,对吗?要获得它,您必须做sudo blkid
erik

这可以轻松得多,请参阅我关于从LVM引导Fedora和Ubuntu的答案。
erik

1

适用于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。我通过使用(用于提取压缩档案的gui)或(控制台文件管理器)打开iso文件file-roller来获取它们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
      

      您可以复制。


0

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

您收到的错误:

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

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

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


可能的,看到我的答案很简单,在那里我在Fedora 27和Ubuntu 17.10启动。
erik

0

您可以尝试以下方法:

在菜单项的开头添加以下内容:

insmod lvm

然后,使用以下命令指定您的LVM分区:

set lvmpart=lvm/<lvm_group_name>-<lvm_logical_partition_name>

因此,您的Xubuntu ISO条目将如下所示:

menuentry "Xubuntu ISO" {
  insmod lvm
  set lvmpart=lvm/<lvm_group_name>-<lvm_logical_partition_name>
  set isofile="/xubuntu-12.04.1-desktop-amd64.iso"
  loopback loop $lvmpart$isofile
  linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
  initrd (loop)/casper/initrd.lz
}

请根据需要进行更正。

这样可以使GRUB识别lvm2卷,从而可以读取其中的ISO文件。但是,可能仍然找不到ISO ...


我尝试了您的建议,但正如您所说,仍然找不到iso。
snapshoe

0

只是一点:

引导时,ISO必须挂载iso,因此必须知道如何找到它。

Grub2可以使用insmod ...命令查看ISO,但这无非是让Grub2在ISO内读取,循环挂载等,但是只要ISO内的Linux启动LVM / LUKS / loop / etc,不存在(未挂载),ISO内的启动脚本必须知道如何挂载该LVM / LUKS /循环;因此,如果Linux不准备这样做,将无法从中启动。

没有LVM,LUKS等的示例...如果在启动时没有设计普通的Linux LiveCD ISO来搜索循环并将其挂载到.iso文件,则将永远无法从Grub2(将.iso作为文件)。

在这种情况下,您需要硬件CD / DVD仿真器(如果在实际硬件上),或者仅将.iso挂载在虚拟机的虚拟CD / DVD单元上。

当然,另一个选择是“编辑”这样的ISO,以便在启动时并入一些脚本来搜索和挂载LVM / LUKS / etc。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.