LINUX.ORG.RU

Мультизагрузочная флешка и непонимание grub.cfg

 ,


1

3

Здравствуйте, коллеги! Встала задача сделать загрузочную флешку с live образом и rw областью для данных.

Задача есть, но я решил ее расширить и углубить.

Нужно, что бы на ней был загрузочный live iso, еще несколько установочных дистрибутивов Linux в формате iso и облать для данных.

Практически, то что дает Ventoy, но своими золотыми руками. Собственно, с подготовкой флешки проблем нет. Флешка разбита на 3 раздела:

MBR
boot/efi (fat32) 256Mb
iso (exfat) 8G
data (exfat) 7G

С последними двумя разделами могут быть изменения, как в размере, так и в fs. Установлены grub (legacy), efi32, efi64. Сам grub грузится хоть в efi, хоть в legacy.

Проблемы с загрузкой образов…

menuentry "Debian 11" {
loopback loop (hd0,2)/debian-11.5.0-amd64-netinst.iso
# Да-да! Тот самый обычный образ для установки Debian
linux (loop)/install.amd/vmlinuz iso-scan/filename=(hd0,2)/debian-11.5.0-amd64-netinst.iso root=UUID=ADC2-5F11
initrd (loop)/install.amd/initrd.gz
}

root=UUID=ADC2-5F11 - UUID раздела, где лежат образы.

Образ начинает загрузку, но отважно не находит установочной media. Т.е. отрабатывают vmlinuz, initgrd, но не понимает где находятся остальные данные.

С моим live образом, на базе того же, debian все крайне похоже, только там в параметрах ядра добавляется boot=live. И та же беда.

Отрабатывает initrd и не понимает во что ему чрутнуться.

Как я понимаю, grub свою работу уже сделал, загрузив ядро и initrd. Больше от него ни чего не зависит. Все параметры, передаваемые ядру, на grub ни как не влияют. Ему, вообще плевать на них.

iso-scan/filename=(hd0,2)/debian-11.5.0-amd64-netinst.iso

Это информация только для ядра? root я сам придумал передавать ядру, но все равно ни черта не выходит.

Я не понимаю, как работает grub.

Он просто вытаскивает ядро и initrd из iso образа и их запускает, или он куда-то монтирует iso и запускает там?

Кстати, меня вполне устроит нахождение на флешке распакованных iso, разложенных по разным директориям. Чего мне не хочется, так это переписывать initrd для образов :) Мой live образ и debian прекрасно загружаются из Ventoy в grub mode.

Подскажите, плз, как грамотно прописать grub.cfg



Последнее исправление: HighMan (всего исправлений: 3)

Как я понимаю, grub свою работу уже сделал, загрузив ядро и initrd. Больше от него ни чего не зависит. Все параметры, передаваемые ядру, на grub ни как не влияют. Ему, вообще плевать на них.

Да, так и есть.

Он просто вытаскивает ядро и initrd из iso образа и их запускает, или он куда-то монтирует iso и запускает там?

Первое. Поиском рут-раздела занимается уже initrd.

Кстати, меня вполне устроит нахождение на флешке распакованных iso, разложенных по разным директориям.

Я не пробовал такими штуками заниматься, но, возможно, будет удобнее раскидывать по разным разделам и давать ядру их uuid.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Я не пробовал такими штуками заниматься, но, возможно, будет удобнее раскидывать по разным разделам и давать ядру их uuid.

Мне, на самом деле, удобнее даже с рапакованными образами, но лежащими в одном разделе, только в разных директориях. Но снова та же беда. не могу сообразить как все это корректно прописать в grub.cfg

HighMan
() автор топика

В одном ты прав, груб свое дело сделал. Ты передал ему неверную информацию, он неверно отработал.

С разбиением на разделы всегда есть неопределенность. Никогда не знаешь, на каком разделе первом не хватит места. Поэтому, чем меньше количество разделов, тем лучше. В идеале - один раздел.

iso (exfat) 8G

Здесь главное, чтобы система умела найти свой исо-образ на этой файловой системе. Ты уверен, что все системы знают exfat. Даже на родной ext4 не всякая система найдет себя. Вот ты записал на этот раздел один образ 4гб, а второй 4гб уже не поместится, бездарно транжирится место. Аналогично с разделом дата. Почему-бы не объединить их в один раздел.

boot/efi (fat32) 256Mb

Если здесь будут только загрузчики, то слишком много. Если здесь будут хотя-бы ядра (не говоря уже об образах), то слишком мало. Почему-бы не объединить с другими разделами. Единственное ограничение, размер файла 4гб. Пусть для огромных файлов будет другая флешка. Итого, один раздел fat32. Например, я делаю флешку так. Здесь довольно много по конфигу груб. Писал и на этом форуме по загрузке Дебиана и некоторых других «живых систем».

(hd0,2)

Первая потенциальная точка отказа. Почему ты решил, что твоя флешка всегда и везде будет первым диском? Пусть груб сам ищет, где находится образ.

/install.amd/initrd.gz

Давненько не заглядывал в исо-образ дебиан. Ядро-инитрд действительно находятся в этом каталоге? Инитрд действительно так называется?

iso-scan/filename=(hd0,2)/debian-11.5.0-amd64-netinst.iso

Еще одно потенциальное место отказа. А конкретно этот образ системы понимает, что в этом параметре может быть имя устройства, причем в том виде, которое принято только в грубе, но никак не в ядре линукса. А вообще, «нетинст-система» умеет грузиться из исо-образа?

root=UUID=ADC2-5F11

Этот параметр только для установленной системы. Для загрузки из исо-образа он как минимум бесполезен.

вытаскивает ядро и initrd из iso образа и их запускает…

Не вытаскивает точно. Команда loopback монтирует исо-образ как файловую систему. Груб находит в этой файловой системе ядро и запускает его. Дальше все должно сделать ядро, использую ту информацию, что передана ему в параметрах. Если данное конкретное ядро не умеет запустить систему из исо-образа, то ничто не поможет.

andytux ★★★★★
()
Ответ на: комментарий от andytux

Один раздел не поделить на read-only и read-write зону, вполне понятное и разумное желание.

Не вытаскивает точно. Команда loopback монтирует исо-образ как файловую систему. Груб находит в этой файловой системе ядро и запускает его.

То, что ты описал - и есть «вытаскивает». А вот слово «монтирует» тут не к месту и запутывающее. Все монтирования начинаются строго после загрузки ядра, а то, что тут - это просто указание grub-у откуда брать нужные ему два файла.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

Проще всего загрузиться из исо-образа если он поддерживает «loopback-bootable». Кратко об этом писал здесь.

andytux ★★★★★
()
Ответ на: комментарий от firkax

Именно монтирует как лооп-устройство. После загрузки ядра уже действует ядро, и что оно там делает, ведомо только ему. Если любопытно, то можно посмотреть, распаковав инитрд.

andytux ★★★★★
()
Ответ на: комментарий от andytux

С разбиением на разделы всегда есть неопределенность. Никогда не знаешь, на каком разделе первом не хватит места. Поэтому, чем меньше количество разделов, тем лучше. В идеале - один раздел.

Наверное вы правы. Хотелось избежать каши из данных.

Здесь главное, чтобы система умела найти свой исо-образ на этой файловой системе. Ты уверен, что все системы знают exfat. Даже на родной ext4 не всякая система найдет себя. Вот ты записал на этот раздел один образ 4гб, а второй 4гб уже не поместится, бездарно транжирится место. Аналогично с разделом дата. Почему-бы не объединить их в один раздел.

В то-то и проблемма - научить искать свои данные. Не могу сообразить как. С exfat, вроде, проблем нет. В (iniramfs) сам монтировал диск с исошками, сам их монтировал.

Если здесь будут только загрузчики, то слишком много. Если здесь будут хотя-бы ядра (не говоря уже об образах), то слишком мало. Почему-бы не объединить с другими разделами. Единственное ограничение, размер файла 4гб. Пусть для огромных файлов будет другая флешка. Итого, один раздел fat32. Например, я делаю флешку так. Здесь довольно много по конфигу груб. Писал и на этом форуме по загрузке Дебиана и некоторых других «живых систем».

Ну 256Мб под загрузчик, конечно многовато, да и хрен с ним! Что мне с лишних 200Мб? Тем более, что в ближайшем будущем убогую и тормозную флешку заменит SSD на 120 Gb.

Первая потенциальная точка отказа. Почему ты решил, что твоя флешка всегда и везде будет первым диском? Пусть груб сам ищет, где находится образ.

Да, очередность может поменятся. А как правильно задать где искать?

Давненько не заглядывал в исо-образ дебиан. Ядро-инитрд действительно находятся в этом каталоге? Инитрд действительно так называется?

ls /mnt/install.amd/
gtk  initrd.gz  install.bat  vmlinuz  xen

Еще одно потенциальное место отказа. А конкретно этот образ системы понимает, что в этом параметре может быть имя устройства, причем в том виде, которое принято только в грубе, но никак не в ядре линукса. А вообще, «нетинст-система» умеет грузиться из исо-образа?

Умеет. В Ventoy без вопросов.

Этот параметр только для установленной системы. Для загрузки из исо-образа он как минимум бесполезен.

Он и не помог :)

Не вытаскивает точно. Команда loopback монтирует исо-образ как файловую систему. Груб находит в этой файловой системе ядро и запускает его. Дальше все должно сделать ядро, использую ту информацию, что передана ему в параметрах. Если данное конкретное ядро не умеет запустить систему из исо-образа, то ничто не поможет.

Вот тут есть сомнения. Я в (initramfs) облазил все что только нельзя. Нет там смонтированного образа.

HighMan
() автор топика
Ответ на: комментарий от andytux

Слова «монтирует» и «устройство» вне ядра не особо имеют смысл. В грубе может быть и есть сущности, которые так называются (внутри груба), но заострять на них внимание совершенно ни к чему. Всё, что делает груб, сводится к «достать два файла и запустить», никаких следов каких-то «устройств» и «монтирований» от него не остаётся.

А применение этих слов к грубу только создаёт путаницу, выше наглядный пример:

Вот тут есть сомнения. Я в (initramfs) облазил все что только нельзя. Нет там смонтированного образа.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от andytux

Именно монтирует как лооп-устройство. После загрузки ядра уже действует ядро, и что оно там делает, ведомо только ему. Если любопытно, то можно посмотреть, распаковав инитрд.

Таки распаковывал! Хрен там поймешь, что к чему. Разбили /init на туеву хучу файлов и прыгай по ним до посинения. Проще заново самому init скрипт написать, чем разбираться с чужим твАрением. Но, как раз, этим заниматься мне не хочется.

HighMan
() автор топика
Ответ на: комментарий от HighMan

Вот тут есть сомнения. Я в (initramfs) облазил все что только нельзя. Нет там смонтированного образа.

И не могло быть. Все монтирования начинаются только после загрузки ядра, потому что управляет ими ядро и груб тут ни при чём. Просто у груба какие-то свои «монтирования» (неудачно назвали), не обращай на них внимания, если груб уже запустил ядро то всё, что было до - не влияет.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от andytux

Например, я делаю флешку так. Здесь

Посмотрел. Ужаснулся.

key='elevator=noop ignore_uuid'
menuentry '*buntu iso' {
 iso_path='/opt/ubuntu-10.04.4-desktop-i386.iso'
 iso_path='/opt/ubuntu-16.04.3-desktop-amd64.iso'; version='.efi'
 key="boot=casper cdrom-detect/try-usb=true file=/cdrom/preseed/ubuntu.seed iso-scan/filename=$iso_path noprompt nosplash quiet --"
 avload='configfile'
 root='x'
 insmod part_gpt
 export iso_path
 search -f ${iso_path} -n -s
 if [ $root = x ]
  then msg="$iso_path not exist!"; src="${prefix}/grub.cfg"
  else msg="Load $iso_path from $root"
   loopback loop ${iso_path}
   root=(loop)
   if [ -e /boot/grub/loopback.cfg ]
    then src='/boot/grub/loopback.cfg'
    else avload='linux'; avinit='initrd /casper/initrd.lz'
     if [ -e /casper/vmlinuz${version} ]; then src="/casper/vmlinuz${version} ${key}"; else src="/casper/vmlinuz ${key}"; fi
   fi
 fi
 echo "$msg"; sleep 4
 ${avload} ${src}
 ${avinit}
}

Это какой-то лютый трэш. Автор задался целью всех запутать?

root='x'
.....
if [ $root = x ]

Наверное, что-то полезное есть в этой строке:

search -f ${iso_path} -n -s

Но что это за команда search и куда она выдает результат?

HighMan
() автор топика
Ответ на: комментарий от HighMan

Попалась тема по запуску дебиан.

А как правильно задать где искать?

Например, так:

iso_path='/opt/ubuntu-16.04.3-desktop-amd64.iso'; search -f ${iso_path} -n -s

Искать будет по всем дискам. Если найдет, в переменной груба «root» (не путай в параметром ядра «root», это две совершенно разные веши) будет указано где нашел.

Умеет. В Ventoy без вопросов

Возможно умеет потому, что вся «нет-инсталл система» состоит только из двух файлов: ядра и инитрд. Ну или посмотри в ventoy, как он это делает.

тут есть сомнения. Я в (initramfs) облазил все что только нельзя. Нет там смонтированного образа.

Никаких сомнений, монтирует. Но, все это в контексте груба. У ядра свой контекст, поэтому грубовского монтирования там не видно и ядру приходится все монтировать самому. Для этого ты ядру передаешь параметр «iso-scan».

andytux ★★★★★
()
Ответ на: комментарий от andytux

Искать будет по всем дискам. Если найдет, в переменной груба «root» (не путай в параметром ядра «root», это две совершенно разные веши) будет указано где нашел.

Не понимаю… Я могу понять

set root=(hd0,2)

Тут ясное и понятное прсвоение.

iso_path='/opt/ubuntu-16.04.3-desktop-amd64.iso'; search -f ${iso_path} -n -s

Тут я виже лишь присвоение переменной iso_path Каким образом происходит инициализация root?

И, да. Я понял, что root в grub и ядре - разные вещи)

HighMan
() автор топика
Ответ на: комментарий от HighMan

iso_path=‘/opt/ubuntu-16.04.3-desktop-amd64.iso’; search -f ${iso_path} -n -s

Тут я виже лишь присвоение переменной iso_path Каким образом происходит инициализация root?

А почитать описание команды search в доке на grub не пробовал? Как ты собираешься «повторять руками» ventoy не читая документацию на grub?
Может так станет более понятно search -f ${iso_path} --set root

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 3)
Ответ на: комментарий от sigurd
set     timeout=4
set     default=0
set     fallback=1
set     color_normal=light-green/black
set     menu_color_normal=light-green/black
set     menu_color_highlight=light-green/blue

key='elevator=noop ignore_uuid'

echo "root = $root, iso_path = $iso_path"

    menuentry "Debian 11" {
    export iso_path
    iso_path='/debian.iso'
    search -f ${iso_path} -n -s

    loopback loop ${iso_path}
    linux (loop)/install.amd/vmlinuz iso-path/filename=${iso_path}
    initrd (loop)/install.amd/initrd.gz
}

Все то же самое. Не находит отткуда устанавливаться. Что же касается Ventoy, то там grub.cfg ограменный. Разобраться в коде - убиться веником.

HighMan
() автор топика
Ответ на: комментарий от firkax

Почему ты в конфиге груба ищешь проблему, если проблема уже на этапе initrd?

Я не в конфиге grub ищу проблему.

Он свою работу прекрасно выполняет.

Проблема, на мой взгляд, в параметрах, которые передаются ядру.

HighMan
() автор топика
Ответ на: комментарий от HighMan

Проблема, на мой взгляд, в параметрах, которые передаются ядру.

ну тут ядро ни причем - дело в параметрах, которые передаются для initrd. Ядро их не понимает и не трогает. Их читают скрипты внутри initrd. При это у каждой разновидности Линукса свои параметры для initrd.
А ты думал, почему у ventoy такой большой конфиг?

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 1)

Как уже написали, то что прописывать в grub.cfg определяется тем, какие параметры понимает initrd. Не всякий iso-файл содержит initrd, способоный загрузить систему не только с физического CD/DVD, но и из этого iso-файла.

Вот здесь https://unix.stackexchange.com/questions/410281/manually-create-grub-entry-fo... показывают, как можно прописать ″iso-scan/filename=″.

А здесь https://www.pvsm.ru/linux/35743 для netinstall берут не iso-образ (который скачивается debian-cd/current/amd64/iso-cd/...), а файлы из hd-media (/debian/dists/.../main/installer-amd64/current/images/hd-media/)

mky ★★★★★
()
Ответ на: комментарий от HighMan
search -f ${iso_path} -n -s
loopback loop ${iso_path}
linux (loop)/install.amd/vmlinuz iso-path/filename=${iso_path}

Просто. Ищем, не обращая внимания на результат, нашли не нашли, начинаем «вслепую» загружать.

...
root='x'
search -f ${iso_path} -n -s
 if [ $root = x ]
  then msg="$iso_path not exist!"; src="${prefix}/grub.cfg"
  else msg="Load $iso_path from $root"
   loopback loop ${iso_path}
...

Что было и что будет в переменной «root» - неизвестно, поэтому записываем в нее определенное значение.

Ищем.

Проверяем значение «root».

Если не изменилось, то формируем сообщение, что образ не найден, выходим.

Если изменилось, то «root» указывает на раздел, где находится образ. Показываем сообщение, начинаем загрузку.

Ориентируясь по сообщениям, можно точнее и быстрее реагировать. Можно изменять паузу, чтобы успеть прочитать, что выведено на экран.

andytux ★★★★★
()
Ответ на: комментарий от mky

А здесь https://www.pvsm.ru/linux/35743 для netinstall берут не iso-образ (который скачивается debian-cd/current/amd64/iso-cd/…), а файлы из hd-media (/debian/dists/…/main/installer-amd64/current/images/hd-media/)

Неужели в Debian не предусмотрели «прямую» работу с ISO образом? Тут есть еще некоторая странность. У меня получалось грузить этот образ Debian. К сожалению, я вводил команды в терминале и не прописывал в grub.cfg. Получилось все достаточно просто, и я отложил «рабочий» вариант, разбираясь со своим live образом, который вставал на initrd. Еще один момент: т.к. крайне геморройно постоянно перегружать комп и грузиться с флешки, я для этого приспособил виртуалку (qemu/kvm). Это, как ни странно, оказалось ошибкой. После недолгих мытарств мой образ начал нормально загружаться! В виртуалке. А вот на реальной машине, при прочих одинаковых действиях, загрузка моего образа, так же, встает на initrd. Какой-то слой абстракции виртуальной машины упрощает восприятие initrd основного образа. Разумеется, флешку я «пробрасывал» в VM. Ну и я не поленился и разобрал initrd.gz инсталляционного образа Debian. Разобрал и запутался в разветленном скрипте. Тем более, что у меня нет времени особо разбираться с ним. Если я правильно понимаю, то сам инсталлятор Debian зашит в initrd, а все данные он тянет из примонтированного образа. Тем не мение, я вручную нормально монтирую в (initrd) iso обрвз. Т.е. Debian имеет все необходимое для загрузки, просто не понимает, что с этим делать.

HighMan
() автор топика
Ответ на: комментарий от HighMan

Что значит: «…встает на initrd». Вчера я запустил эту систему из исо-образа в графическом режиме, из «набора файлов» в текстовом режиме. Инсталлятор начал задавать вопросы, про раскладку и т.д. Застопорился на поиске «диска установки», но это уже проблемы полностью интсаллятора. Понимаешь верно, вся система, в том числе инсталлятор находятся в инитрд. По хорошему, он должнен работать без всей остальной требухи, что там есть. Раз называется «нет-инсталл», то подключиться к сети и все остальное взять оттуда.

andytux ★★★★★
()
Ответ на: комментарий от HighMan

Решил пройтись этим путем. Скачал…

… файлы из hd-media (/debian/dists/…/main/installer-amd64/current/images/hd-media/)

Внешне, инитрд тут на пару мегабайт больше. Загрузился из этого «набора файлов». После вопросов о выборе языка, инсталлятор сразу нашел свой «установочный диск» и продолжил работу… Дальше не проверял, прервал.

andytux ★★★★★
()
Ответ на: комментарий от HighMan

Продолжаем разговор…

На текущий момент у меня такой код загрузки Дебианов:

function avboot {
  if [ "${msg}" = '0' ]; then msg=''; fi
  if [ "${msg}" = '1' ]; then msg='Non EFI-mode!'; fi
  if [ "${msg}" = '2' ]; then msg='Non CSM-mode!'; fi
  if [ "${msg}" = '3' ]; then msg="Load $iso_path from $root"; fi
  if [ "${root}" = 'x' ]; then if [ -z "${msg}" ]; then msg="$src not exist!"; fi; else if [ -z "${msg}" ]; then msg="Load $src from $root"; fi; fi
  if [ -n "${1}" ]; then echo "$msg"; sleep -v ${1}; fi
  if [ -n "${avload}" ]; then ${avload} ${src}; if [ -n "${avinit}" ]; then ${avinit}; fi; fi
}

  submenu 'Debian live (login/pass: user/live)' {
	src='/opt'; key="boot=live noprompt quiet --"
	iso_path="${src}/kali-linux-2021.2-live-amd64.iso"
	iso_path='debian-live-500-i386-standard.iso'; version='1'
	iso_path='debian-live-6.0.10-i386-lxde-desktop.iso'
	iso_path="${src}/debian-live-7.11.0-i386-lxde-desktop.iso"; version='1'
	iso_path="${src}/debian-live-8.11.0-i386-lxde-desktop.iso"; version='1'
	iso_path="${src}/debian-live-9.0.0-i386-lxde.iso"; version='-4.9.0-3-686'
	iso_path="${src}/debian-live-9.12.0-i386-lxde.iso"; version='-4.9.0-12-686'
	iso_path="${src}/debian-live-10.4.0-i386-lxde.iso"; version='-4.19.0-9-686'
	iso_path="${src}/debian-11.5.0-amd64-netinst.iso"; version=''
	#version='1'
	#insmod regexp; insmod part_gpt
	root='x'; search --no-floppy --set --file "${iso_path}"
	if [ "${root}" = 'x' ]
	  then	src="${src}/debian"
		if regexp "amd64-netinst" "${iso_path}"; then search -n -s -f "${src}/install.amd/vmlinuz${version}"; fi
		if regexp "an-live-" "${iso_path}"; then search -n -s -f "${src}/live/vmlinuz${version}"; fi
		if [ "${root}" = 'x' ]
		  then	src='Debian live'
		  else	if [ -e "${src}/live-rw" ]; then key="persistent persistent-path=${src} ${key}"; fi
			key="elevator=noop ignore_uuid live-media-path=${src} ${key}"
	if regexp "amd64-netinst" "${iso_path}"; then src="${src}/install.amd"; fi
	if regexp "an-live-" "${iso_path}"; then src="${src}/live"; fi
			if regexp "bian-live-10" "${iso_path}"; then key="components ${key}"; fi
			if regexp "bian-live-[89]" "${iso_path}"; then key="components ${key}"; fi
			if regexp "bian-live-[67]" "${iso_path}"; then key="config ${key}"; fi
			if regexp "bian-live-5" "${iso_path}"; then key="union=aufs ${key}"; fi
			if regexp "kali-linux-2016" "${iso_path}"; then key="hostname=kali live-media=removable-usb noconfig=sudo username=root ${key}"; fi
	if regexp "amd64-net" "${iso_path}"
	  then if [ -e "${src}/initrd.img${version}" ]; then avinit="initrd ${src}/initrd.img${version}"; else avinit="initrd ${src}/initrd${version}.gz"; fi
	  else if [ -e "${src}/initrd.img${version}" ]; then avinit="initrd ${src}/initrd.img${version}"; else avinit="initrd ${src}/initrd${version}.img"; fi
	fi
			avload='linux'; src="${src}/vmlinuz${version} ${key}"
		fi
	  else	msg="Load $iso_path from $root"
		export iso_path; loopback loop ${iso_path}
		root=(loop)
	if regexp "amd64-netinst" "${iso_path}"; then src='/boot/grub/grub.cfg'; fi
	if regexp "an-live-" "${iso_path}"; then src='/boot/grub/loopback.cfg'; fi
		if [ -e "${src}" ]
		  then	avload='configfile'
			if regexp "debian-live-9.[09]" "${iso_path}"; then src='/boot/grub/grub.cfg'; fi
		  else	key="findiso=${iso_path} ${key}"; src='/live'
	if regexp "amd64-netinst" "${iso_path}"; then src='/install.amd'; fi
			if regexp "debian-live-10" "${iso_path}"; then key="components ${key}"; fi
			if regexp "debian-live-[89]" "${iso_path}"; then key="components ${key}"; fi
			if regexp "debian-live-[67]" "${iso_path}"; then key="config ${key}"; fi
			if [ -e "${src}/initrd${version}.img" ]; then avinit="initrd ${src}/initrd${version}.img"; else avinit="initrd ${src}/initrd.gz"; fi
			avload='linux'; src="${src}/vmlinuz${version} ${key}"
		fi
	fi
	avboot 4
  }

Краткое описание. Сначала ищет исо-образ, указанный в «iso_path».

Если находит, то ищет в нем конфиг груба, если находит, то показывает это меню.

Если конфиг не находит, то загружается из исо-образа, с параметрами из переменной «key».

Если исо-образ не находит, то ищет «набор файлов» в каталоге указанном в переменной «src» (/opt/debian).

Если находит ядро, то запускает систему с параметрами из переменной «key».

Если не находит, то выводит сообщение, что система не найдена и возвращается в меню.

При загрузке из исо-образа, не находит «установочный диск». Попытка задать его вручную, отвечая на вопросы инсталлятора не приводит к успеху. При загрузке из «набора файлов аналогично». «Набор файлов» - это содержимое исо-образа, скопированное в каталог.

В «наборе файлов», взятом из исо-образа, подменил инитрд, взяв его «из hd-media (/debian/dists/…/main/installer-amd64/current/images/hd-media/)». С этим инитрд инсталлятор сам нашел «установочный диск» и продолжил установку… На этом я установку прервал.

andytux ★★★★★
()
Ответ на: комментарий от HighMan

Заодно, решил посмотреть debian-live-11.5.0-amd64-lxde.iso.

Ближе к параметрам. Этот исо-образ «loopback-bootable». Эту технику придумали для упрощения загрузки из исо-образа. Суть в том, что в образе есть файл loopback.cfg. Это конфиг для загрузки именно из исо-образа. Собственно, груб передает управление этому файлу. Если нужны параметры, то смотри в этом файле. Например, никаких «iso-path/filename=», используется «findiso=».

Код нашел этот файл, показал меню. Выбрал запуск «живой системы» - система загрузилась. Выбрал «Graphical Debian Installer». Установщик не смог найти «установчный диск», как и в случае с образом «нет-инсталл».

Распаковал содержимое образа в каталог /opt/debian, чтобы проверить загрузку из «набора файлов». По опыту, сразу заменил инитрд в каталоге d-i файлом из «нет-инсталл hdmedia».

«Живая система» не запустилась, застопорилась на каком-то баге в i915, намекал на фирмварь, не стал углубляться.

Из «набора файлов» выбрал загрузку «Debian Installer». Система запустилась, инсталлер нашел «установочный диск», продолжил задавать вопросы, на этом установку прервал.

Основное следствие. Дебиановский образ, расчитанный на загрузку из исо-образа, использующий конфиг из этого самого образа не смог найти «установочный диск».

andytux ★★★★★
()
Последнее исправление: andytux (всего исправлений: 1)
Ответ на: комментарий от andytux

Большое спасибо!

Отличный пример содержательной беседы и развернутого ответа.

У меня так же, все получилось!

Сейчас пытаюсь подружить инсталлятор altlinux 10 со своей флешкой…

Кстати, заметил удивительный глюк.

Установка grub на флешку - процесс обкатанный… Был!

Взял более скоростную флешку и grub в efi не грузится. Вообще!

Как буд-то и нет там ни хрена, касающегося efi.

grub-install --force --removable --no-floppy --target=x86_64-efi --boot-directory=/mnt/USB/ --efi-directory=/mnt/
sync
grub-install --force --removable --no-floppy --target=i386-efi --boot-directory=/mnt/ --efi-directory=/mnt/
sync
grub-install --force --removable --no-floppy --target=i386-pc --boot-directory=/mnt/ /dev/sda
sync

В legacy еще как-то грузится.

Установку grub проводил из Debian 11 со всеми обновлениями.

Хоть тресни!

Проверил все пути и файлы. Все в порядке, но не грузится grub в efi.

Ладно. Были смутные подозрения.

Установил grub из altlinux 8 SP.

Работает!

grub2 из под Centos 7 - работает.

Честно. Хрен его знает, почему из под Debian 11 grub встает как-то криво. Причем, на старую и тормозную флешку, встает нормально, а на новую быструю - ни в какую.

HighMan
() автор топика
Ответ на: комментарий от HighMan

опс… Вкралась ачерпятка в код.

grub-install --force --removable --no-floppy --target=x86_64-efi --boot-directory=/mnt/ --efi-directory=/mnt/
sync

Тут нельзы редактировать ранее написанное сообщение?

UPD Можно ли как-то в переменную root (grub) установить не только раздел, а еще и кусок пути? типа такого, только данный способ не работает :)

set root=(hd0,1)'/sfs'

Просто, подобная установка root решила бы проблемы с путями и можно было бы использовать configfile для указаний на grub.cfg в распакованных образах

HighMan
() автор топика
Ответ на: комментарий от HighMan

Это обычная переменная, на нее распространяются все правила для переменных. Но изменять ее не очень хорошая идея. Скорей всего, одной переменной на все все равно не хватит.

Например, есть еше «prefix», пример из конфига груб, который обычно на ЕФИ-разделе:

set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

можно было бы использовать configfile для указаний на grub.cfg в распакованных образах

Здесь с Дебианом не стал реализовывать, но вот с CentOS есть такой вариант. Правда там использую свою переменную «src». Но даже с дополнительной переменной пришлось тонко маневрировать.

andytux ★★★★★
()
Последнее исправление: andytux (всего исправлений: 1)
21 апреля 2024 г.
Ответ на: комментарий от anonymous

Попробуй в grub2 mode

зачем ты, анон, ковырялся в анналах истории?

TPPPbIHDELj
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.