Из GRUB2 загрузите ISO-образ в логический том LVM2

Из GRUB2 загрузите ISO-образ в логический том LVM2

tl;dr - Возможно ли загрузиться с файла .iso, который находится в незашифрованном логическом томе lmv2? Как?

Я пытаюсь настроить это в VirtualBox VM, прежде чем я сделаю это на самом деле с моим ноутбуком. У меня есть следующая настройка:

  • 4 раздела gpt
    • gpt1 - 2M ef02 загрузка биоса
    • gpt2 - 5G незашифрованный не-LVM, для различных данных, iso и т. д.
    • gpt3 - незашифрованный lvm 5G для /boot,iso и т. д.
    • gpt4 - оставшийся, lvm, зашифрованный с помощью dm-crypt/luks, для root,swap,home и т. д.
  • в gpt2 у меня есть копии текущих образов Arch и Xubuntu
  • в gpt3 у меня есть lvm2 lv с теми же копиями тех же iso

У меня работает следующее:

  • в gpt4, функционирующие установки Arch и Xubuntu (и хотелось бы добавить другие дистрибутивы в другие логические тома в какой-то момент)
  • grub2 установлен из Arch на /dev/sda
  • используя команду configfile grub2, можно переключаться и загружаться из меню grub2 обоих дистрибутивов
  • можно загрузить iso из меню grub из не-lvm gpt2

Я бы хотел загрузиться с iso-образов в gpt3 lvm (и в конечном итоге вообще не иметь раздела gpt2, отличного от lvm).

Моя запись 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
}

Две строки loopback указывают на две разные копии одного и того же iso. Я проверил в командной строке grub, что обе строки loopback работают.

При загрузке с iso в разделе, отличном от lvm, все работает нормально.

При загрузке с iso в разделе lvm начинается загрузка и в итоге появляется эта ошибка:

(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.


EDIT: Это можно сделать?любойОфициальный .iso-файл текущего дистрибутива Linux? Fedora? Debian? openSUSE? 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
}

рд.авто=1сообщит Linux о необходимости загрузить все LVM иизо-сканищет их.

решение2

Вдохновленэто простое решение для Ubuntu, я использовал следующий код, который подходит для загрузки образов Fedora 27 KDE и Ubuntu 17.10.

Я только что добавил следующие строки в файл/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(графическим интерфейсом для извлечения сжатых архивов) или 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 не настроены на поиск своего исходного iso на LVM; вы, возможно, можете изменить загрузочные скрипты образа, чтобы сделать это, но я не думаю, что какой-либо официальный .iso-файл текущего дистрибутива делает это. Вы можете попробовать связаться с разработчиками вашего любимого дистрибутива, чтобы они интегрировали это, возможно?

решение4

Просто хочу обратить ваше внимание на это:

При загрузке ISO-образ должен быть смонтирован, поэтому нужно знать, как его найти.

Grub2 может видеть ISO с помощью команд insmod..., но это не делает ничего, кроме как позволяет Grub2 читать содержимое ISO, монтировать его в цикле и т. д., но как только Linux внутри ISO запускается, LVM / LUKS / loop / и т. д. отсутствует (не смонтирован), загрузочные скрипты внутри ISO должны знать, как монтировать этот LVM / LUKS / loop; поэтому, если этот Linux не готов к этому, загрузиться с него будет невозможно.

Пример без LVM, LUKS и т. д. Если обычный Linux LiveCD ISO не предназначен для поиска и монтирования цикла в файл .iso во время загрузки, загрузиться в него из Grub2 (с .iso в качестве файла) никогда не получится.

В таких случаях вам понадобится аппаратный эмулятор CD/DVD (если вы используете реальное оборудование) или просто смонтируйте .iso на виртуальном CD/DVD-устройстве виртуальной машины.

Другой вариант, конечно, заключается в «редактировании» такого ISO-образа с целью включения в загрузку некоторых скриптов для поиска и монтирования LVM / LUKS и т. д.

Связанный контент