LINUX.ORG.RU

Почему запускается произвольный раздел с Linux?

 , ,


0

2

Для некоторых экспериментов с Debian с целью экономии времени создал 1-й общий загрузочный раздел (т.е. в котором и /boot, и /root и все остальное), а с него с помощью parted сделал резервный 2-й раздел, т.е. идентичный клон.
Итого два одинаковых раздела - учебно-тренировочный и резервный.

Тренируюсь «на кошечках» на 1-м разделе, и если что-то в нем пошло не так, тем же parted быстренько восстанавливаю его из 2-го раздела.

Все в этой схеме работает как надо, кроме одного:
- оказалось, что иногда запускается 1-й раздел, а иногда 2-й, что лишает всего смысла экспериментов.

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

Тогда дополнительно поместил 2-й раздел во внутрь Extended раздела - то же не сработало.

Откуда же берется эта непредсказуемость запуска, и как ее предотвратить?

★★★★★

А что в опциях загрузки ядра про корень написано?

Не может быть такого, что там корень указан по PARTUUID (который при клонировании раздела остается таким же), ммм?

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

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

Что это?

200


paddlewan
blkid выдает такое:

/dev/sda1: LABEL="DEBIAN" UUID="4e10-bla-bla........574" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="2a9574e1-01"
/dev/sda2: LABEL="BACKUP" UUID="4f910b23-62de-4e14-9cb8-ac044f92564e" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="2a9574e1-02"

Насчет других ваших вопросов, если растолкуете мне понятнее их суть, то смогу дать ответ.

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

Нам надо понять, как ядро узнает, какой корнеевой раздел ему использовать для загрузки. Это в настройках загрузчика, скорее, всего мы увидим. Я не большой знаток Debian, но предположу, что настройки берутся из /etc/default/grub.

Что покажет cat /etc/default/grub ?

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

Да ччсто случайно :-) Думал, что загрузился с 1-го раздела, поработал в нем, оставил некоторые данные.
А когда загрузился в следующий раз, все наработанное как корова языком слизала.
Тут-то и понял, что в этот раз загрузился не из предыдущего раздела.

Что покажет cat /etc/default/grub ?

Там все тихо, спокойно и лаконично, а главное - понятно:

GRUB_DEFAULT=0
GRUB_TIMEOUT=300
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

В отличие от того невообразимого кошмара, который творится в /boot/grub/grub.cfg

Заодно вопрос - кто-нибудь знает, ради чего это месиво, которое имеет мало чего общего с /etc/default/grub ?
И почему нельзя редактировать /etc/default/grub по своему усмотрению, как в menu.lst а старом добром Grub-1, а надо непременно редактировать /etc/default/grub, а потом еще давать команду update-grub?
Ради чего всё это, какие преимущества, если в Grub-1 все делается на порядок проще?

/boot/grub/grub.cfg

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  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="0"
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
}

if [ x$feature_default_font_path = xy ] ; then
   font=unicode
else
insmod part_msdos
insmod ext2
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  e1605838-bla-bla-bla-9a747be7b834
else
  search --no-floppy --fs-uuid --set=root e1605838-bla-bla-bla-9a747be7b834
fi
    font="/usr/share/grub/unicode.pf2"
fi

if loadfont $font ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  set locale_dir=$prefix/locale
  set lang=en_US
  insmod gettext
fi
terminal_output gfxterm
if [ "${recordfail}" = 1 ] ; then
  set timeout=30
else
  if [ x$feature_timeout_style = xy ] ; then
    set timeout_style=menu
    set timeout=50
  # Fallback normal timeout code in case the timeout_style feature is
  # unavailable.
  else
    set timeout=50
  fi
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=cyan/blue
set menu_color_highlight=white/blue
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
	set gfxpayload="${1}"
}
set linux_gfx_mode=
export linux_gfx_mode
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-e1605838-bla-bla-bla-9a747be7b834' {
	load_video
	insmod gzio
	if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
	insmod part_msdos
	insmod ext2
	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  e1605838-bla-bla-bla-9a747be7b834
	else
	  search --no-floppy --fs-uuid --set=root e1605838-bla-bla-bla-9a747be7b834
	fi
	echo	'Loading Linux 5.10.0-16-amd64 ...'
	linux	/boot/vmlinuz-5.10.0-16-amd64 root=UUID=e1605838-bla-bla-bla-9a747be7b834 ro  quiet
	echo	'Loading initial ramdisk ...'
	initrd	/boot/initrd.img-5.10.0-16-amd64
}
submenu 'Advanced options for Debian GNU/Linux' $menuentry_id_option 'gnulinux-advanced-e1605838-bla-bla-bla-9a747be7b834' {
	menuentry 'Debian GNU/Linux, with Linux 5.10.0-16-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.10.0-16-amd64-advanced-e1605838-bla-bla-bla-9a747be7b834' {
		load_video
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_msdos
		insmod ext2
		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  e1605838-bla-bla-bla-9a747be7b834
		else
		  search --no-floppy --fs-uuid --set=root e1605838-bla-bla-bla-9a747be7b834
		fi
		echo	'Loading Linux 5.10.0-16-amd64 ...'
		linux	/boot/vmlinuz-5.10.0-16-amd64 root=UUID=e1605838-bla-bla-bla-9a747be7b834 ro  quiet
		echo	'Loading initial ramdisk ...'
		initrd	/boot/initrd.img-5.10.0-16-amd64
	}
	menuentry 'Debian GNU/Linux, with Linux 5.10.0-16-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.10.0-16-amd64-recovery-e1605838-bla-bla-bla-9a747be7b834' {
		load_video
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_msdos
		insmod ext2
		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  e1605838-bla-bla-bla-9a747be7b834
		else
		  search --no-floppy --fs-uuid --set=root e1605838-bla-bla-bla-9a747be7b834
		fi
		echo	'Loading Linux 5.10.0-16-amd64 ...'
		linux	/boot/vmlinuz-5.10.0-16-amd64 root=UUID=e1605838-bla-bla-bla-9a747be7b834 ro single 
		echo	'Loading initial ramdisk ...'
		initrd	/boot/initrd.img-5.10.0-16-amd64
	}
}

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
chukcha ★★★★★
() автор топика
Ответ на: комментарий от chukcha

…невообразимого кошмара, который творится в /boot/grub/grub.cfg

Если взглянуть трезвым взглядом, то вполне все подписано. Например:

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

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

имеет мало чего общего с /etc/default/grub

Чуть дальше по коду видно, что /etc/default/grub мало что значит, его значения переопределяются всеми, кому не лень. Например:

...
if [ "${recordfail}" = 1 ] ; then
  set timeout=30
else
  if [ x$feature_timeout_style = xy ] ; then
    set timeout_style=menu
    set timeout=50
  # Fallback normal timeout code in case the timeout_style feature is
  # unavailable.
  else
    set timeout=50
  fi
fi
### END /etc/grub.d/00_header ###

Переназначается «timeout_style» и «timeout».

почему нельзя редактировать /etc/default/grub

Можно. Но, как я уже показал, мало проку. Хотя, наверно здесь опечатка, имелся ввиду /boot/grub/grub.cfg. Можно редактировать и его. Я довольно часто так делаю, в экспериментальных целях. Как «наигрался», выполнил update-grub и все вернулось в исходную.

…как в menu.lst а старом добром Grub-1

Можешь и здесь использовать menu.lst, с его нативным синтаксисом.

Едем дальше:

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=cyan/blue

Понятно, что этот блок создается скриптом /etc/grub.d/05_debian_theme. Удали этот скрипт или убери у него атрибут «выполнения» и твой grub.cfg станет проще. Видим, что в этом блоке задается цветовая схема.

Если тебе все это не нужно, не интересно, то в самом конце:

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg

Пиши все, что тебе нужно в custom.cfg. Помимо этого, перед ним «40_custom» как раз и создано для того, чтобы сюда помещать все свои настройки. Их уже никто не переопределит. Примерно в этом направлении недавно писал здесь.

Например, начало моего 40_custom:

...
 color_normal=light-green/black; menu_color_normal=light-green/black; menu_color_highlight=light-green/blue
default='*buntu hi10 [so1202]'; fallback='Live menu'; timeout_style=menu; timeout=2
 if [ -e '/boot/grub/x86_64-efi/tpm.mod' ]; then rmmod tpm; fi
 if [ -e '/boot/grub/avnfont.pf2' ]
  then	if loadfont '/boot/grub/avnfont.pf2'
...

Задаю свою раскраску, свой шрифт, свой таймаут.

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

andytux

Хотя, наверно здесь опечатка, имелся ввиду /boot/grub/grub.cfg.

Да, тут моя опечатка, должно было быть /boot/grub/grub.cfg

Спасибо за настолько подробное пояснение, что иногда местами кое-что становится понятным :=)

Но опять-таки, остается самый главный вопрос:

- что нам дал переход из простого Grub-1 (по которому вообще не возникало вопросов) на навороченный Grub=2 ?

Не один я задаюсь этим вопросом, вот например еще в 2011 году такое же недоумение.

И соответственно вслед ним сопутствующийвопрос: можно ли в современных дистрибутивах вернуться на Grub-1 ?
Если да, насколько это сложно и какие возможные издержки такого перехода?

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

что нам дал переход из простого Grub-1…

Воистину «Grand…»

можно ли в современных дистрибутивах вернуться на Grub-1 ?

Теоретически, устанавливай да пользуйся. А вот практически… У меня первый возникающий вопрос: «А Груб-1 знает, что такое ЕФИ?». Сегодня уже начинают забывать, что такое БИОС. Например, у меня в УЕФИ есть все настройки для легаси-режима. Изначально, я планировал сделать загрузку в обоих режимах. Но ничего в легаси-режиме мне загрузить не удалось. Как и не удалось загрузить ни одной 32-битной системы.

Если это от «кажущейся сложности» конфига Груб-2, то несколько аргументов в его защиту. Вот конфиг из исо-образа Убунту:

menuentry "Try or Install Ubuntu" {
	set gfxpayload=keep
	linux	/casper/vmlinuz file=/cdrom/preseed/ubuntu.seed maybe-ubiquity iso-scan/filename=${iso_path} quiet splash --- 
	initrd	/casper/initrd
}
menuentry "Ubuntu (safe graphics)" {
	set gfxpayload=keep
	linux	/casper/vmlinuz nomodeset file=/cdrom/preseed/ubuntu.seed maybe-ubiquity iso-scan/filename=${iso_path} quiet splash --- 
	initrd	/casper/initrd
}
menuentry "OEM install (for manufacturers)" {
	set gfxpayload=keep
	linux	/casper/vmlinuz file=/cdrom/preseed/ubuntu.seed only-ubiquity oem-config/enable=true iso-scan/filename=${iso_path} quiet splash --- 
	initrd	/casper/initrd
}

Это весь конфиг меню из трех пунктов. Ничуть не сложнее, чем конфиг Груб-1.

Если не нужны, то зайди в каталог /etc/grub.d/, убери атрибут «исполнение» со всех скриптов, кроме 10_linux.

Если считаешь, что сами пункты загрузки слишком сложны, то напиши «простые свои», пример привел выше.

В grub.cfg пишешь: «legacy_configfile /boot/grub/menu.lst», весь свой код помещаешь в файл menu.lst, используя в нем синтаксис Груб-1.

Мне кажется, все это проще, чем пытаться «воскресить» Груб-1.

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

Воистину «Grand…»

А что оно означает по смыслу?

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

У меня, как древнего консерватора, старая материнка, в которой UEFI и не пахнет.

Хотя стараюсь в Grub-2 поменьше заглядывать, чтобы волосы не вставали дыбом, но иногда все-таки приходится.
Так что твоя идея с примерами упростить конфигурацию Grub-2 мне оченно понравилась, спасибо!

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

Я не о переводе, он понятен, а о смысле, который вы заложили в него в в вашем контексте ;=)

chukcha ★★★★★
() автор топика
20 декабря 2022 г.
Ответ на: комментарий от baaba

Как говорил наш замечательный сатирик, товарищ Райкин…

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

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