LINUX.ORG.RU

Дифференциация загрузки через grub

 ,


1

1

Привет, ЛОР.

Можно ли как-то загружать разные службы исходя из выбранного пункта меню в grub?

Может быть какой-то параметр можно выставить в grub и прочитать его в процессе загрузки служб?

★★★★★

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

Ответ на: комментарий от master_0K

Ну вот смотри,

Делаем в меню grub два пункта. Надо чтобы если выбрали 1 пункт, грузились такие-то службы. Выбрали второй пункт — грузились те же службы, но одна отличалась.

hibou ★★★★★
() автор топика

параметры ядра выставлять и их отслеживать инитом.
линукс ядро все нераспознанные параметры передает /sbin/init. а вот оно уже может распорядится загрузкой системы.
посмотри как сделан вход в режим recovery

вариант два: файловые флаги.

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

самостоятельно «наколхозить».

Гуглится, что systemd понимает из командой строки ядра (бут параметры) ″systemd.mask=″ и ″systemd.wants=″. Или это не работает?

Тут скорее проблема, как создать меню груба с этим параметрами и без лишних пунктов, сейчас же обновление пересоздаёт конфиг груба...

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

Или это не работает?

Всё-таки умеет… Я знал догадывался )

сейчас же обновление пересоздаёт конфиг груба…

дефолтный? Я «пишу» свой, его не трогает. // Или до меня эта проблема ещё не добралась?

master_0K
()

Начать с того, что груб здесь даже не причем.

Передается параметр ядра. Любой, можешь сам изобрести, какой тебе нравится. Главное, чтобы твоя служба нашла его в строке «cmdline» и знала что с ним делать. Есть и специальные параметры системд. Например, я передаю параметр ядра «systemd.unit=my1.target». А этот таргет запускает нужные службы.

Например, самый простой вариант, не запускать графическую сессию, передать параметр «systemd.unit=multi-user.target».

andytux ★★★★★
()

Да.

У Grub2 есть env переменные, которые хранятся в /boot/grub/grubenv, их можно устанавливать, можно читать, можно заводить новые.

https://www.gnu.org/software/grub/manual/grub/grub.html#Environment

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

Вот, например, мой grub.cfg:

### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="default"
fi



### MENU ###
set timeout=2


menuentry 'Gentoo Linux 6.2.0' {
    linux   /vmlinuz-6.2.0-gentoo root=PARTUUID=0E92B818-EF52-42E1-8C30-D56145032E71 clocksource="tsc" nomodeset
}


menuentry 'Gentoo Linux 6.2.1' --id default {
    linux   /vmlinuz-6.2.1-gentoo root=PARTUUID=0E92B818-EF52-42E1-8C30-D56145032E71 clocksource="tsc" nomodeset
}
soomrack ★★★★
()
Ответ на: комментарий от master_0K

Правда, я нагуглил ещё баго/фичу, не знаю, поправили или нет, но в общем, если при загрузке замаскировать службу systemd, то размаскировать и запустить её руками не получится.

Мой конфиг груба как-то раз пересоздало, после этого я делаю его immutable. Не знаю, можно ли научить систему при обновлении ядра создавать конфиг, но чтобы в нём были только два пункта в меню с разными параметрами ядра, а не всё, что смог найти grub-mkconfig.

mky ★★★★★
()

В общем случае это делается через параметры, передаваемые ядру и потом разбор /proc/cmdline в демоне или стартовой службе. Может в systemd уже придумали удобную обёртку для этого.

vvn_black ★★★★★
()

Более из{ощр|вращ}енный вариант: сделать разные rootfs с разным набором установленных служб, и выбирать при загрузке нужную. Получится нечто, отдаленно напоминающее контейнеры, только вместо контейнера хостовая система.

annulen ★★★★★
()

Любую информацию из загрузчика в ОС можно передать через командную строку ядра (kernel command line). Более того, systemd сам умеет её парсить. На выбор два варианта:

  1. можно указать systemd.unit=mytarget.target, чтобы переопределить цель по умолчанию вместо default.target;
  2. можно передать любой параметр и проверять его в самом юните (см. systemd.unit(5)). TL;DR:
    [Unit]
    ConditionKernelCommandLine=key=value  # checks if key=value
    ConditionKernelCommandLine=key  # checks if key is set
    ConditionKernelCommandLine=-key  # checks if key is NOT set
    
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 4)
Ответ на: комментарий от pfg

Мне не нужны вставки. Мне нужно, чтобы был только один или два пункта, и больше никаких пунктов, а ядер в boot пусть лежит штук 5.

И мне интерестно, в каких дистрибутивах есть способ заблокировать выполнение 'grub-mkconfig' при обновлениях или ещё каких действиях с пакетным менеджером. Причём штатным образом, а не удалением файлов, которые снова появятся при обновлении пакета grub.

Документация по grub так и пишет, что если вам проще руками, то так и делайте, а блокировка mkconfig — это дело диструбутива:

'grub-mkconfig' does have some limitations.
...
In the meantime, those who feel that it would be easier to write 'grub.cfg' directly are encouraged to do so (*note Booting::, and *note Shell-like scripting::), and to disable any system provided by their distribution to automatically run 'grub-mkconfig'.

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

И мне интерестно, в каких дистрибутивах есть способ заблокировать выполнение ‘grub-mkconfig’ при обновлениях или ещё каких действиях с пакетным менеджером. Причём штатным образом, а не удалением файлов, которые снова появятся при обновлении пакета grub.

В gentoo блокировать не надо. Пока сам не вызовешь, ничего не будет. Я всегда сам составлял grub.cfg без утилит, они какую-то простыню формируют, вместо простых команд.

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

в каких дистрибутивах есть способ

В Funtoo конфиг /boot/grub/grub.cfg обновляется вызовом утилиты ego boot update, за основу берётся шаблон из /etc/boot.conf.

Подробнее https://www.funtoo.org/Install/Bootloader

Ну, или просто ручками можно править.

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

линукс ядро все нераспознанные параметры передает /sbin/init. а вот оно уже может распорядится загрузкой системы.

Спасибо за ценную информацию. А в каком виде оно их туда передаёт — как аргументы программы, как переменные окружения, как-то ещё?..

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

хех, думал что только как аргументы запуска, однако таки почитал документацию, а там вообще красивое !!
т.е. если внутри «=» то в окружение (но это не точно).
читайте люди документацию :)

The kernel parses parameters from the kernel command line up to “--“; if it doesn’t recognize a parameter and it doesn’t contain a ‘.’, the parameter gets passed to init: parameters with ‘=’ go into init’s environment, others are passed as command line arguments to init. Everything after “--” is passed as an argument to init.

https://docs.kernel.org/admin-guide/kernel-parameters.html

pfg ★★★★★
()