LINUX.ORG.RU

root=hdX,1 в GRUB

 , ,


0

1

Бывает при загрузке на одном компе одной и той же системы с разных носителей (SDcard/USB) приходится в grub.cfg менять root=hd0,1/root=hd1,1.
Т.е. гружусь с SDcard - приходится прописать root=hd0,1, гружусь с USB - приходится прописать root=hd1,1, хотя это полная копия одной и той же ОС. И зависит от того, какие ещё SSD/HDD есть в компе. Т.е. биос меняет порядок устройств. И на другом компе будет по-другому. Прикол ещё в том, что если я гружусь с SD нужно прописывать root=hd0,1, если я гружусь с SSD нужно тоже прописывать root=hd0,1.

Вопорс: как-то можно прописать в root=hdX,1, чтобы GRUB в момент запуска сам автоматически подставлял переменную X номером диска, с которого произошла загрузка этого GRUB?

★★★★★

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

я не про строку linux ... root=UUID=..., которая у меня и так через PARTUUID, а про переменую граба root=0,gpt1, которая раньше строки с linux. или там тоже так можно?

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

как-то можно прописать в root=hdX,1…

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

andytux ★★★★★
()

Не обращал внимание на использование команд set и search? В конфигах GRUB частенько используют search --fs-uuid --set=root вместо set root=(hdN,partM). А так да, документация у этого загрузчика куцая и корявая, но она есть.

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

см. https://www.gnu.org/software/grub/manual/grub/html_node/search.html и примеры https://www.gnu.org/software/grub/manual/grub/grub.html#Multi_002dboot-manual...
Есть поиск по partition label и fs uuid. По partition uuid - нет.
Ну и grub должен быть версии, где поддержка этого есть.

MirandaUser2 ★★
()

В grub-0.97 вообще не нужно в большинстве случае делать set root или что-либо такое. При прописывании в MBR в нём фиксируется устройство и UUID раздела где находится его корневая файловая система с menu.lst.

А для grub2 есть search по UUID / LABEL / файлу.

kostik87 ★★★★★
()

Ну, а по поводу

Т.е. гружусь с SDcard - приходится прописать root=hd0,1, гружусь с USB - приходится прописать root=hd1,1

можно сказать, что это потому, что, во-первых, разные интерфейсы подключения, а во-вторых, в Linux многое работает по принципу «кто первый встал, того и тапки». Из-за этого существует правило udev, которое лежит в /lib/udev/rules.d/60-persistent-storage.rules.

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

Ну, он найдёт (хотя, это не точно), загрузит ядро, а дальше оно переинициализирует устройства и их имена опять поменяются. Хотя да, это уже будет проблема ядра, а не загрузчика.

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

При прописывании в MBR в нём фиксируется устройство и UUID раздела где находится его корневая файловая система с menu.lst.

И как это поможет, если в menu.lst будет неактуальная запись root (hdX,Y) ?

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

Подумай.

Если кратко, root (hdX,Y) в menu.lst вообще не нужен.

Обращение по прямому индексу устройство / раздел нужно только в 1% случаев, если нужно что-то прочитать с другой файловой системы, а не той, чей идентификатор прошит в самом коде grub при его установке в MBR.

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

root=LABEL=$value
наверное самое смыслосодержащие решение, кмк.

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

поиск по partition label

У меня сейчас gnu.org не открывается, но, вроде, label — это filesystem label.

Вобще, у них забавный юмор, по mduuid можно, по cryptouuid можно, и по lvmid можно. А по partuuid нельзя.

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

да, filesystem label.
В fstab использую /dev/disk/by-partlabel/, поэтому путаю..

Вобще, у них забавный юмор, по mduuid можно, по cryptouuid можно, и по lvmid можно. А по partuuid нельзя.

Был предложен патч https://lists.gnu.org/archive/html/grub-devel/2022-02/msg00095.html
Неясно, чем там дело закончилось.

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

Обращение по прямому индексу устройство / раздел нужно только в 1% случаев, если нужно что-то прочитать с другой файловой системы

Ну так, kernel не обязан располагатся на том же разделе, что и grub stages. Особенно, если это multiboot с *BSD или MS Windows.

Хотя в принципе идея о том, чтобы убрать «лишний» root() для остальных случаев, определенно хорошая.

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

Grub при установке в 99% случаев в качестве корня при установке использует файловую систему, на которой находится /boot. А ядро по спецификации ставится в /boot.

Есть ситуации, где вообще в /boot нет ничего кроме конфига загрузчика, а модули вообще в /usr/lib/grub, условно, но в этом случае /boot на одной ФС с корневой ФС Linux.

Так же учитывай контекст, про который говорит автор:

Бывает при загрузке на одном компе одной и той же системы с разных носителей (SDcard/USB) приходится в grub.cfg менять root=hd0,1/root=hd1,1.

Т.е. у него переносной накопитель SD карта / USB накопитель, флешка или USB HDD / SSD диск.

Почему так сложно тебе учитывать контекст вопроса.

И вообще ты пытаешься что-то писать про абстракцию?

Ну так, kernel не обязан располагатся на том же разделе, что и grub stages.

Не обязан, можешь его вообще хоть в /opt, хоть в /var, хоть в /etc положить.

Ты в 99% случаев сам используешь grub, где его модули и конфиг лежит вместе с файлом ядра и Initramfs.

Так зачем ты пишешь и высасываешь из пальца, что что-то тебе не обязано?

Дублирую ответ ещё раз. В случае grub-0.97 или grub-2, которые ставятся в MBR режиме - в код, который прописывается в MBR, а точнее в часть диска между нулевым сектором и первым разделом прописывается идентификатор раздела, на котором расположена файловая система, содержащая /boot, т.е. корневой ФС для загрузчика, с которой он будет читать свой конфиг.

А в случае EFI - GRUB будет искать свой конфиг рядом с grub.efi или bootx64.efi / bootia32.efi.

В случае MBR (CSM) версии загрузчика в 99% ситуаций прописывать root что-то там или делать search не надо, т.к. загрузчик уже будет знать о ФС, на которой находится /boot/grub.cfg или /boot/menu.lst, в зависимости от версии grub.

А в случае EFI при установке не removable - рядом с grub.efi находится минимальный конфиг, котором прописан только поиск ФС по UUID, содержащей /boot/grub.cfg и там же в /boot/ рядом лежат и файлы ядра и Initramfs.

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

А в случае EFI - GRUB будет искать свой конфиг рядом с grub.efi или bootx64.efi / bootia32.efi.

Вы в этом уверены? Вот у меня корень на md-raid, но в /boot/efi смонтрован ESP одного из дисков. Если я указываю boot-каталог для grub'а, то он его прописывает в efi-файл, а если не указываю, то прописывает /boot/grub. И именно в этом каталоге ищет конфиг.

# grub-install --boot-directory=/test/grub/ --no-nvram --efi-directory=/boot/efi/ --bootloader-id=grub-test --target=x86_64-efi 
Installing for x86_64-efi platform.
Installation finished. No error reported.
# strings /boot/efi/EFI/grub-test/grubx64.efi | grep -A 2 '/grub'
(mduuid/73b416c1d5a0125faec3aa8b3c6e4e34)/test/grub/grub

# grub-install  --no-nvram --efi-directory=/boot/efi/ --bootloader-id=grub-test-def --target=x86_64-efi 
Installing for x86_64-efi platform.
Installation finished. No error reported.
# strings /boot/efi/EFI/grub-test-def/grubx64.efi | grep -A 2 '/grub'
(mduuid/73b416c1d5a0125faec3aa8b3c6e4e34)/boot/grub

Можно через objcopy, https://habr.com/ru/articles/855400/ там именно эта строка будет prefix (00 03) внутри grub.

рядом с grub.efi находится минимальный конфиг

Вы про «Early grub config»? Дак он внутри grub.efi, а не рядом. И это дистрибутиво-заморочки, а не базовое свойство grub, так далеко не везде.

в часть диска между нулевым сектором и первым разделом прописывается идентификатор раздела,

И в каком виде он там прописывается? Если там всё сдамнить, разжать, поискать, то там будет только что-то вида:

(,gpt3)/boot/grub
но никаких строк типа «10eb63b1-d43b-4bad-8dc8-95368c639243» нет. И (,gpt3)/boot/grub  — это prefix, который нужно задавать руками, если сломалось и grub-rescue. Но как grub обрабтатвает такой prefix, в котором не указан hd0 непонятно.

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

Grub при установке в 99% случаев…

Набредил, так набредил. Начиная с первой фразы и…

Последовательность слов вроде и правильная, но абсолютно неверное толкование.

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

По моему автор пишет какую то ерунду, он грузиться с разных устройств, при наличии hdd и хочет чтобы его корень всегда совпадал с загружаемым устройством и при этом не менять порядок устройств в bios.

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

А именно. Он вроде вспоминает про «контекст вопроса» и всё…

Что нужно по контексту вопроса ТС-а.

«search –file cdсard.id». Это некий шаблон команды. Ищет уникальный файл-идентификатор. Если найдёт, то правильно установит значение переменной «root». Всё. Здесь не путать (что в этой теме сделали уже не единожды), root - переменная груба, root - параметр ядра. Это две совершенно разные сущности, с разным синтаксисом.

andytux ★★★★★
()

А есть сейчас вообще смысл в монстре grub? Что он даёт?

UEFI ужасен, но с ним всё равно цепочка загрузки ядра в UKI или другого варианта всё равно проще, чем весь этот grub-стимпанк.

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

И в каком виде он там прописывается? Если там всё сдамнить, разжать, поискать, то там будет только что-то вида:

в документации grub 0.97 есть раздел Embedded data

Stage 1 and Stage 2 have embedded variables whose locations are well-defined, so that the installation can patch the binary file directly without recompilation of the stages.

In Stage 1, these are defined:

0x3E
    The version number (not GRUB's, but the installation mechanism's).
0x40
    The boot drive. If it is 0xFF, use a drive passed by BIOS.
0x41
    The flag for if forcing LBA.
0x42
    The starting address of Stage 2.
0x44
    The first sector of Stage 2.
0x48
    The starting segment of Stage 2.
0x1FE
    The signature (0xAA55). 

In the second sector of Stage 1.5 and Stage 2, these are defined:

0x6
    The version number (likewise, the installation mechanism's).
0x8
    The installed partition.
0xC
    The saved entry number.
0x10
    The identifier.
0x11
    The flag for if forcing LBA.
0x12
    The version string (GRUB's).
0x12 + the length of the version string
    The name of a configuration file. 
MirandaUser2 ★★
()

Т.е. биос меняет порядок устройств.

В большинстве случаев в BIOS есть возможность установки кастомного порядка опроса устройств, как минимум по типу. Если выставить HDD (не USB HDD!) первым, то он у тебя всегда будет root=hd0,1, вне зависимости от наличия флэшки в USB.

как-то можно прописать в root=hdX,1, чтобы GRUB в момент запуска сам автоматически подставлял переменную X номером диска, с которого произошла загрузка этого GRUB?

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

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

В большинстве случаев в BIOS есть возможность установки кастомного порядка опроса устройств, как минимум по типу. Если выставить HDD (не USB HDD!) первым, то он у тебя всегда будет root=hd0,1, вне зависимости от наличия флэшки в USB.

Автор не хочет менять порядок устройств. Я думаю он про жмет F8 для выбора устройства загрузки и потом удивляется что он у него грузится не с того устройства. Причем у разных компьютеров в биосе этот порядок разный и это его еще больше удивляет.

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

да не, вроде всё верно, и c параметром ядра нигде путаницы нет.
Речь о том, что в root (переменная груб) по умолчанию при загрузке прописывается раздел, где stage2. Если ядро ОС там же, то она уже в правильном состоянии, и ничего искать не нужно.

Вот сейчас потестил grub 0.97 на qemu: в menu.lst был явно указан root(hd0,0). Далее удаляем диски и добавляем два SATA, так чтобы прежний загрузочный стал вторым (hd1). Грузимся с iso RipLinux и производим chainload со второго диска (boot order меню в seabios здесь не сработает, т.к всегда выставляет загрузочный диск как hd0). Проверяем значение переменой root - там (hd1,0), что нам и нужно, в отличие от жестко прописанного (hd0,0).

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

А откуда вообще взялся в этой теме grub-legacy, его же даже практически никто не пакетирует. Ну, сам-то поставить можешь без вопросов, если умеешь собирать из исходников (и речь здесь не конкретно о тебе, если что). Думаю, многие здесь это умеют.

UPD: а, вот откуда.

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

Это про grub 0.97, grub 2 заметно отличается. То, что прописывается в MBR — просто адрес сектора, без раздела, без PARTUUID.

Stage 2 have embedded variables whose locations are well-defined

В grub2 практически весь stage2 сжатый, там досаточно хитро unlzma делается, чтобы из core.img втащить читаемые строки

Давайте другой вопрос, если установить grub 2 в MBR на гибридном разметке, то он какие PARTUUID возмёт — MBR или GPT? Если сделать sgdisk -G /dev/sda, grub продолжит загружаться или нет?

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

откуда вообще взялся в этой теме grub-legacy…

ТС в самом начале пишет «БИОС», что автоматически означает «легаси и только легаси». Хотя, он сам не ведает, что написал. Но тут-же пишет: «…на другом компьютере», что может означать всё что угодно.

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

По моему автор пишет какую то ерунду, он грузиться с разных устройств, при наличии hdd и хочет чтобы его корень всегда совпадал с загружаемым устройством и при этом не менять порядок устройств в bios.

почему ерунду? я хочу чтобы можно было задать чтобы корень совпадал с загружаемым устройством. при чём здесь порядок устройств в bios?

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

Давайте другой вопрос, если установить grub 2 в MBR на гибридном разметке,

Хм. А где прочитать про гибридную разметку? Всегда думал что есть только dos или gpt.
Причем даже для dos не рекомендуют в mbr пихать … а делать отдельный пустой раздел под grub.

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

почему ерунду? я хочу чтобы можно было задать чтобы корень совпадал с загружаемым устройством. при чём здесь порядок устройств в bios?

grub берет номера разделов из bios. А можно узнать ваш дистр,биос,версию груба и как грузитесь?

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

«Чтобы правильно задать вопрос, нужно знать бOльшую часть ответа»

Но вопросы то были вам. Вам и отвечать.

Вот ваше утверждение:

А в случае EFI при установке не removable - рядом с grub.efi находится минимальный конфиг, котором прописан только поиск ФС по UUID

Вы этот конфиг пробовали править? Grub на его исправления реагирует, начинает другую ФС искать?

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

Если выставить HDD (не USB HDD!) первым, то он у тебя всегда будет root=hd0,1, вне зависимости от наличия флэшки в USB.

нет! у меня если грузиться с USB флешки приходится прописывать root=hd1,1. если грузиться с SSD - root=hd0,1. если грузиться с SD - root=hd0,1. при этом если воткнута SD, загрузиться с SSD не получится, придётся её вытащить, иначе при загрузке с SSD, если при этом вставлена SD-карта, граб будет искать корень на SD-карте. порядок устройств в UEFI такой:
SDcard
USB
SSD
если воткнута SD при выборе меню загрузки по F9 -> SSD не загрузится.

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

А можно узнать ваш дистр,биос,версию груба и как грузитесь?

на SSD - CRUX. на SD и USB флешке - Artix. GRUB 2.12. биос UEFI версии 2018 года (самая свежая версия для моего ноута модели 2013 года).

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

Ещё раз.

…биос меняет порядок устройств. И на другом компе будет по-другому.

Это цитата из начала темы.

везде речь про grub.cfg

Может его использовать в качестве идентификатора. Обозвать его grub.sdcard или cdcard.cfg.

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

ТС в самом начале пишет «БИОС», что автоматически означает «легаси и только легаси». Хотя, он сам не ведает, что написал.

нет. я не подразумевал Legacy BIOS. я специально написал «биос» русскими буквами и специально маленькими.

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

Это уже firmware, прошивка. Режим совместимости с BIOS там зовëтся CSM, или Legacy BIOS (последнее в интерфейсе будет, никто CSM прямо не называет, по крайней мере, я не встречал таких).

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

Если у тебя именно UEFI, то лучше было не объединять, а наоборот, явно указать это в ОП и даже в тегах. Тогда гаданий по ромашке в теме было бы намного меньше.

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

Ну, допустим,https://www.rodsbooks.com/gdisk/hybrid.html здесь https://www.rodsbooks.com/gdisk/hybrid.html

A hybrid MBR is a variant on the normal protective MBR. A hybrid MBR contains a type-0xEE partition, but it also contains up to three additional primary partitions, which point to the same space that's marked out by up to three GPT partitions.

есть только dos или gpt.

Ну, нулевой сектор то есть всегда, то есть всегда есть MBR. И при чисто GPT принято делать protective MBR, содержащий только 0xEE раздел. Именно осмысленные данные в MBR, а не одни нули.

Эта фраза не совсем корректна:

Причем даже для dos не рекомендуют в mbr пихать … а делать отдельный пустой раздел под grub.

Если grub ставится в MBR, то он всегда запишет свой stage1 в MBR. А куда он запишет core.img (stage 2) отдельный вопрос. То, что здесь мучительно описывали как:

в часть диска между нулевым сектором и первым разделом

Коротко называется MBR gap. То есть core.img можеть быть в MBR.gap или в Bios Boot partition. Но для чисто MBR-разметки жирно отдавать целый раздел для grub core.img, там же всего четые первичных раздела. Всякие рассуждения, что MBR gap может быть переписан, поэтому лучше на раздел, они верны от части, «правильный» софт всё перепишет, и MBR gap, и Bios Boot partition :)

А, если вы про времена grub 0.97 при классическом загрузчике в MBR, который грузит первый сектор раздела с флагом Active, и установки grub на Active-раздел, именно на раздел с файловой системой, а не на bios boot part., то в grub 2, ЕМНИП, это давно сломано и забыто.

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

Не может. То что ты называешь «grub2», на самом деле это два совершенно разных загрузчика: «грубЕФИ» и «грубПС». Каждый может работать только в своём режиме.

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

А в prefix у вас что при разных вариантах загрузки? То есть, если вызвать командную строку grub и там набрать echo $prefix , там тоже все время будет (hd0,1)/... или меняется?

mky ★★★★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария