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)
Ответ на: комментарий от 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
() автор топика
Ответ на: комментарий от HighMan

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

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

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от 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)
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от 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)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.