從 GRUB2 啟動 LVM2 邏輯磁碟區中的 ISO

從 GRUB2 啟動 LVM2 邏輯磁碟區中的 ISO

tl;dr - 是否可以從位於未加密的 lmv2 邏輯磁碟區中的 .iso 檔案啟動?如何?

在使用我的筆記型電腦進行實際操作之前,我嘗試在 VirtualBox 虛擬機器中進行設定。我進行了以下設定:

  • 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 的功能安裝(並希望在某個時候在其他邏輯卷中添加其他發行版)
  • grub2 從 Arch 安裝在 /dev/sda 上
  • 使用 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 檔案是什麼?軟呢帽?德班?開放SUSE? CentOS?

這不可能嗎?還是這是以前沒有人想過嘗試的事情?


EDIT2:我的賞金早已過期,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.auto=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 文件,另一個重要的事情是以 和 開頭的linuxinitrd。我得到了他們開啟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
      

      您可以複製它。

答案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啟動時必須掛載iso,所以必須知道如何找到它。

Grub2 可以使用 insmod... 指令查看 ISO,但這只能讓 Grub2 讀取 ISO 內部、循環掛載它等,但一旦 ISO 內的 Linux 啟動 LVM / LUKS / Loop / 等不存在(未安裝),ISO內的引導腳本必須知道如何安裝該LVM / LUKS / 循環;因此,如果 Linux 不准備這樣做,則將無法從它啟動。

沒有 LVM、LUKS 等的範例...如果普通的 Linux LiveCD ISO 沒有設計為在引導時搜尋並將循環掛載到 .iso 文件,則永遠不可能從 Grub2 引導到它(使用 .iso 作為文件)。

對於這種情況,您需要一個硬體 CD/DVD 模擬器(如果在真實硬體上),或者只需將 .iso 安裝在虛擬機器的虛擬 CD/DVD 單元上。

當然,另一個選項是「編輯」此類 ISO,以便在啟動時合併一些腳本來搜尋和掛載 LVM/LUKS/等。

相關內容