LINUX.ORG.RU

GRUB на RHEL: никак не победить

 ,


0

1

Здравствуйте бывалые линуксоиды.

Столкнулся я с тем что как мне казалось простая вещь GRUB на деле оказалась куда сложней.

Захотел я настроить загрузчик так что бы по умолчанию грузилась консоль, а уже за тем я мог стартовать иксы по необходимости. И так при старте руками получается добавить systemd.unit=multi-user.target и все работает, казалось бы делов-то. Добавить в конфиг эту строку и готово. Однако танцы с бубном еще даже не начались...

Итак что было сделано.

Первое, правка /etc/default/grub: добавляю в конец строки GRUB_CMDLINE_LINUX то что нужно еще удаляю rhgb, сохраняю, пересобираю:

grub2-mkconfig -o /boot/grub2/grub.cfg
(за тем и в /boot/efi/EFI/redhat/grub.cfg #на всякий случай)

при перезагрузке результата нет. хотя в конфиге строчка добавилась, а rhgb во всем конфиге нет, но при перезагрузке все по старому. Затем начались мучительные поиски того что еще можно сделать...

И пересоздавал initramfs: dracut -f и удалял grubenv, менял переменные окружения, все бестолку. Конфиг при чем правильный (в смысле именно тот который использует система, во всяком случае прямые правки которые я вносил для других ОС, сохранялись и были видны при загрузке) Жаль только первый пункт в меню (запуск RHEL) формируется по каким то условиям, я пока так и не понял как именно...

--

 
# DO NOT EDIT THIS FILE

# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
set pager=1

if [ -f ${config_directory}/grubenv ]; then
  load_env -f ${config_directory}/grubenv
elif [ -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="${saved_entry}"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}

function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

terminal_output console
if [ x$feature_timeout_style = xy ] ; then
  set timeout_style=menu
  set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
  set timeout=5
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/00_tuned ###
set tuned_params=""
set tuned_initrd=""
### END /etc/grub.d/00_tuned ###

### BEGIN /etc/grub.d/01_users ###
if [ -f ${prefix}/user.cfg ]; then
  source ${prefix}/user.cfg
  if [ -n "${GRUB2_PASSWORD}" ]; then
    set superusers="root"
    export superusers
    password_pbkdf2 root ${GRUB2_PASSWORD}
  fi
fi
### END /etc/grub.d/01_users ###

### BEGIN /etc/grub.d/08_fallback_counting ###
insmod increment
# Check if boot_counter exists and boot_success=0 to activate this behaviour.
if [ -n "${boot_counter}" -a "${boot_success}" = "0" ]; then
  # if countdown has ended, choose to boot rollback deployment,
  # i.e. default=1 on OSTree-based systems.
  if  [ "${boot_counter}" = "0" -o "${boot_counter}" = "-1" ]; then
    set default=1
    set boot_counter=-1
  # otherwise decrement boot_counter
  else
    decrement boot_counter
  fi
  save_env boot_counter
fi
### END /etc/grub.d/08_fallback_counting ###

### BEGIN /etc/grub.d/10_linux ###
insmod part_msdos
insmod xfs
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint-bios=hd2,msdos1 --hint-efi=hd2,msdos1 --hint-baremetal=ahci2,msdos1 --hint='hd0,msdos1'  44336e10-2529-463c-a211-0d7b950aca98
else
  search --no-floppy --fs-uuid --set=root 44336e10-2529-463c-a211-0d7b950aca98
fi
insmod part_msdos
insmod xfs
set boot='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=boot --hint-bios=hd2,msdos1 --hint-efi=hd2,msdos1 --hint-baremetal=ahci2,msdos1 --hint='hd0,msdos1'  44336e10-2529-463c-a211-0d7b950aca98
else
  search --no-floppy --fs-uuid --set=boot 44336e10-2529-463c-a211-0d7b950aca98
fi

# This section was generated by a script. Do not modify the generated file - all changes
# will be lost the next time file is regenerated. Instead edit the BootLoaderSpec files.
#
# The blscfg command parses the BootLoaderSpec files stored in /boot/loader/entries and
# populates the boot menu. Please refer to the Boot Loader Specification documentation
# for the files format: https://systemd.io/BOOT_LOADER_SPECIFICATION/.

# The kernelopts variable should be defined in the grubenv file. But to ensure that menu
# entries populated from BootLoaderSpec files that use this variable work correctly even
# without a grubenv file, define a fallback kernelopts variable if this has not been set.
#
# The kernelopts variable in the grubenv file can be modified using the grubby tool or by
# executing the grub2-mkconfig tool. For the latter, the values of the GRUB_CMDLINE_LINUX
# and GRUB_CMDLINE_LINUX_DEFAULT options from /etc/default/grub file are used to set both
# the kernelopts variable in the grubenv file and the fallback kernelopts variable.
if [ -z "${kernelopts}" ]; then
  set kernelopts="root=/dev/mapper/rootvg_rhel-rootlv ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=/dev/mapper/rootvg_rhel-swaplv rd.lvm.lv=rootvg_rhel/rootlv rd.lvm.lv=rootvg_rhel/swaplv quiet systemd.unit=multiuser.target "
fi

insmod blscfg
blscfg
### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/10_reset_boot_success ###
# Hiding the menu is ok if last boot was ok or if this is a first boot attempt to boot the entry
if [ "${boot_success}" = "1" -o "${boot_indeterminate}" = "1" ]; then
  set menu_hide_ok=1
else
  set menu_hide_ok=0 
fi
# Reset boot_indeterminate after a successful boot
if [ "${boot_success}" = "1" ] ; then
  set boot_indeterminate=0
# Avoid boot_indeterminate causing the menu to be hidden more than once
elif [ "${boot_indeterminate}" = "1" ]; then
  set boot_indeterminate=2
fi
# Reset boot_success for current boot 
set boot_success=0
save_env boot_success boot_indeterminate
### END /etc/grub.d/10_reset_boot_success ###

### BEGIN /etc/grub.d/12_menu_auto_hide ###
if [ x$feature_timeout_style = xy ] ; then
  if [ "${menu_show_once}" ]; then
    unset menu_show_once
    save_env menu_show_once
    set timeout_style=menu
    set timeout=60
  elif [ "${menu_auto_hide}" -a "${menu_hide_ok}" = "1" ]; then
    set orig_timeout_style=${timeout_style}
    set orig_timeout=${timeout}
    if [ "${fastboot}" = "1" ]; then
      # timeout_style=menu + timeout=0 avoids the countdown code keypress check
      set timeout_style=menu
      set timeout=0
    else
      set timeout_style=hidden
      set timeout=1
    fi
  fi
fi
### END /etc/grub.d/12_menu_auto_hide ###

### BEGIN /etc/grub.d/14_menu_show_once ###
if [ x$feature_timeout_style = xy ]; then
  if [ "${menu_show_once_timeout}" ]; then
    set timeout_style=menu
    set timeout="${menu_show_once_timeout}"
    unset menu_show_once_timeout
    save_env menu_show_once_timeout
  fi
fi
### END /etc/grub.d/14_menu_show_once ###

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_ppc_terminfo ###
### END /etc/grub.d/20_ppc_terminfo ###

### BEGIN /etc/grub.d/30_os-prober ###
menuentry 'Windows 10 (on /dev/sda1)' --class windows --class os $menuentry_id_option 'osprober-chain-DC368F71368F4C08' {
	insmod part_msdos
	insmod ntfs
	set root='hd0,msdos1'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  DC368F71368F4C08
	else
	  search --no-floppy --fs-uuid --set=root DC368F71368F4C08
	fi
	parttool ${root} hidden-
	drivemap -s (hd0) ${root}
	chainloader +1
}
	menuentry 'Debian GNU/Linux (on /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-6.6.15-amd64--2a8e17d9-6ea8-44dc-99f9-fa28719bcab9' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  2a8e17d9-6ea8-44dc-99f9-fa28719bcab9
		else
		  search --no-floppy --fs-uuid --set=root 2a8e17d9-6ea8-44dc-99f9-fa28719bcab9
		fi
		linux /boot/vmlinuz-6.6.15-amd64 root=UUID=2a8e17d9-6ea8-44dc-99f9-fa28719bcab9 ro quiet
		initrd /boot/initrd.img-6.6.15-amd64
	}
	menuentry 'CMD_Debian GNU/Linux, with Linux 6.6.15 (on /dev/sdb1)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-6.6.15-amd64--2a8e17d9-6ea8-44dc-99f9-fa28719bcab9' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos1'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  2a8e17d9-6ea8-44dc-99f9-fa28719bcab9
		else
		  search --no-floppy --fs-uuid --set=root 2a8e17d9-6ea8-44dc-99f9-fa28719bcab9
		fi
		linux /boot/vmlinuz-6.6.15-amd64 root=UUID=2a8e17d9-6ea8-44dc-99f9-fa28719bcab9 ro quiet systemd.unit=multi-user.target
		initrd /boot/initrd.img-6.6.15-amd64
	}
cut...
END
[/cut]

 :/



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

sudo systemctl set-default multi-user.target

Нахрена в GRUB2 было лезть — непонятно.

И ты банально опечатался:

set kernelopts="root=/dev/mapper/rootvg_rhel-rootlv ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=/dev/mapper/rootvg_rhel-swaplv rd.lvm.lv=rootvg_rhel/rootlv rd.lvm.lv=rootvg_rhel/swaplv quiet systemd.unit=multiuser.target

multi-user, а не multiuser

Vsevolod-linuxoid ★★★★★
()

первый пункт в меню (запуск RHEL) формируется по каким то условиям, я пока так и не понял как именно…

По условиям скрипта 10_linux. И не надо их понимать, для тебя есть 40_custom, создай там свой пункт.

andytux ★★★★★
()

Ты пытаешься формировать абзацы переносами, но при этом почему-то разметку выбрал LORCODE, который на них внимание не обращает.

Чуток поправил тебе форматирование, но в следующий раз рекомендую взглянуть на Markdown…

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

Нахрена в GRUB2 было лезть — непонятно.

Это и впрямь не лучшее решение пожалуй. Но сейчас уже не важно. Я теперь хочу разобраться с загрузчиком, принципиально. Потому что если не пойму в чем дело спать не смогу :)

/etc/default/grub

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=/dev/mapper/rootvg_rhel-swaplv rd.lvm.lv=rootvg_rhel/rootlv rd.lvm.lv=rootvg_rhel/swaplv quiet systemd.unit=multi-user.target"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true

и при сборке вроде, все это попадает в конфиг. Но как во время загрузки получается вот это?

GRUB version 2.06

load_video
set gfxpayload=keep
insmod gzio
linux ($root)/vmlinuz-5.14.0-427.18.1.el9_4.x86_64 root=/dev/mapper/rootvg_rhel-rootlv ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=/dev/mapper/rootvg_rhel-swaplv rd.lvm.lv=rootvg_rhel/rootlv rd.lvm.lv=rootvg_rhel/swaplv rhgb quiet
initrd ($root)/initramfs-5.14.0-427.18.1.el9_4.x86_64.img $tuned_initrd

в конфиге ведь отсутствует параметр rhgb… От куда загрузчик его берет?

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

в grub.d я вообще не лез. Ведь вроде по гайдам, настройки полагается вносить в /etc/default/grub. Хотя пожалуй изучение этих скриптов должно стать моим следующим шагом…

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

А надо именно туда лезть.

«Default» - говорит само за себя, это настройки по умолчанию, которые потом любой перекраивает на свой лад. Если-бы хоть раз заглянул в grub.cfg, то увидел, «Default» использует скрипт «05_*». Дальше эти значения могут изменяться несколько раз. По этой причине, в редких случаях, удаётся изменить таймаут. «40_*» - последний, его никто не переправит. «40_custom» - специально для настроек пользователя.

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

загрузчик не отвечает за твои иксы накой ты его вообще трогаешь, он грузит ядро. грузит запускает и выходит из чатика.

systemd.unit=multi-user.target

да где ты это выкапываешь то? ты пытаешся запустить линукс в аналоге «безопасный режим» вендоз. Тебе нужен graphical.target. и он правится в системд а не в загрузчике. Ты бы еще в биосе эту опцию искал.

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

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

Конечно есть не единственный способ использовать консоль тем более что linux это прежде всего консоль. Так предложи свой более удобный метод (с сохранением иксов).

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

systemctl status graphical.target ● graphical.target - Graphical Interface Loaded: loaded (/usr/lib/systemd/system/graphical.target; static) Active: active since Thu 2024-05-23 18:22:31 MSK; 1 week 1 day ago Docs: man:systemd.special(7)

мая 23 18:22:31 xdg12 systemd[1]: Reached target Graphical Interface.

дальше сообразишь? это не мой способ. специально для хотелок как у тебя придумали.

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

И какую полезную информацию я должен извлечь из того что у тебя уже неделю активен graphical.target? Или полезная информация это ссылка на мануал? Ну тогда написал бы коротко RTFM… А то ведь я не знаю что

линукс в аналоге «безопасный режим» вендоз

это скорее emergency.target.

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

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

boot/loader/entries/

после правки этих конфигов можно не пересобирать «основной» конфиг.

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