LINUX.ORG.RU

Как все-таки сконфигурировать этот чертов grub2?

 , ,


0

1

Переношу из чрута генту на винт. Пробую загрузку при помощи qemu:

qemu-system-x86_64 -hda /dev/sdb -m 512
Сначала хотел загрузиться по UUID, установил grub2 из чрута. Но получил матюки «no such device».

ОК, делаем вот такой grub.conf:

default 0
timeout 3
#splashimage=(hd0,0)/boot/grub/splash.xpm.gz

title Gentoo 3.18.7
root (hd1,0)
kernel /boot/vmlinuz-3.18.7 root=/dev/ram0 real_root=/dev/sdb1


title Gentoo Linux 3.14.0
root (hd1,0)
kernel /boot/vmlinuz-3.14.0-gentoo root=/dev/ram0 real_root=/dev/sdb1
initrd /boot/initramfs-3.14.0
Запускаю grub2-install, но почему-то он опять ищет диск по UUID!

ОК, генерирую уродство при помощи

grub2-config -o /boot/grub/gruba.cfg

Копирую его в /boot на /dev/sdb1.

Устанавливаю grub2 и на /dev/sdb, и на /dev/sdb1.

И получаю кукиш с маслом!!!


Так что нужно сделать, чтобы правильно загрузчик воткнуть-то?

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

как мне, например, указать, что всякий идиотизм вроде load_video

GRUB_GFXPAYLOAD_LINUX=«text»

UEFI

не ставить пакет для работы с EFI?

шрифтов

GRUB_FONT=«»

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

А где весь список этих переменных найти, не размазанный по 100500 страницам мануала?

Кстати, пишу в /etc/default/grub: GRUB_CMDLINE_LINUX_DEFAULT="root=/dev/disk/by-uuid/48bef3c1-0e94-40b7-8d29-40cf6f8f606c" (нагуглил, что root=UUID=... grub2 тупо не умеет). В конфиге получаю:

linux   /boot/vmlinuz-3.18.7-gentoo root=/dev/sdb1 ro  root=/dev/disk/by-uuid/48bef3c1-0e94-40b7-8d29-40cf6f8f606c
Ну вашпееее...

Eddy_Em ☆☆☆☆☆
() автор топика

Во, нашел. Пишу:

GRUB_DEVICE=/dev/disk/by-uuid/48bef3c1-0e94-40b7-8d29-40cf6f8f606c

в конфиге все правильно, а корень все равно эта собака не находит! Похоже, таки initrd хочет, сволочина! Потому как если написать /dev/sda1, грузится!

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

GRUB_CMDLINE_LINUX_DEFAULT=«root=/dev/disk/by-uuid/48bef3c1-0e94-40b7-8d29-40cf6f8f606c» (нагуглил, что root=UUID=... grub2 тупо не умеет).

Какое отношение командная строка ядра Linux имеет к возможностям GRUB2? GRUB передаёт её ядру и всё, какую задашь, такую и передаст.

GRUB2 умеет искать диски по UUID

Список всех переменных среды можно получить командой set.

Но ты в целом прав, документация по GRUB2 оставляет желать лучшего. Однако он ведь изначально задуман как полноценный интерпретатор shell-образного языка программирования, что даёт широкие возможности, но усложняет конфигурирование.

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

// как же все просто было в lilo!

turtle ~ # eix lilo
* sys-boot/elilo
     Available versions:  *3.6_p20060314 (~)3.10 (~)3.12
     Homepage:            http://elilo.sourceforge.net/
     Description:         Linux boot loader for EFI-based systems such as IA-64

* sys-boot/lilo
     Available versions:  22.8-r2 (~)23.2-r1 23.2-r2 24.0 24.0-r1 (~)24.1 {device-mapper minimal pxeserial static}
     Homepage:            https://alioth.debian.org/projects/lilo/
     Description:         Standard Linux boot loader

* sys-boot/shlilo-lantank
     Available versions:  *20040408^s
     Homepage:            http://www.linux-sh.org/
     Description:         bootloader for the SuperH Lantank

Найдено 3 совпадений.
turtle_bazon ★★★★★
()
Ответ на: комментарий от proud_anon

GRUB2 умеет искать диски по UUID

А у меня не ищет: захожу в командную строку grub2, пишу ls /dev/disk/by-uuid, вижу свой диск. Фигачу set root=/dev/disk/by-uuid/...; пишу ls / получаю ошибку (диск не найден).

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

И, кстати, почему при ручной правке конфига все равно старый получается?

Сдаётся мне, он откуда-то из другого места читается.

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

нагуглил, что root=UUID=... grub2 тупо не умеет

linux   /boot/kernel-genkernel-x86_64-3.19.0-gentoo root=UUID=442b599f-4f62-4515-a64b-4e6e3017a453 ro

Работает.

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

Сейчас еще так попробовал: в командной строке написал linux /boot/vmlinuz... root=/dev/disk/by-uuid/... — фигвам! Только явное указание /dev/sda1 работает почему-то.

Или это qemu виноват?

Ладно, дома буду разбираться.

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

Напиши:

search --fs-uuid <твой UUID>
#Это должно было выставить твой диск в качестве root
echo ${root}
ls /
Что происходит?

Фигачу set root=/dev/disk/by-uuid/...; пишу ls / получаю ошибку (диск не найден).

Конечно не работает, он же ожидает, что в root будет нечто вроде (hd0,msdos0), а у тебя там в лушем случае получится путь к Linux block device, в худшем — путь к несуществующему файлу.

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

// чертов qemu зазватывает мышу и не отдает! Надо будет найти, как мышу-то отбирать

На первую строку говорит hd0,msdos1

На вторую — то же самое.

ls / показывает правильный корень. Но: если ведру передать, то фигвам.

БЛИИИН! Может, это я, рукожопый кривоног, неправильно ведро скомпилял, что оно не понимает UUID?

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

Практически во всех ссылках из гугла на тему "grub boot uuid" кажут, что нужен initrd, т.к. ведро не поддерживает uuid ☹

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

БЛИИИН! Может, это я, рукожопый кривоног, неправильно ведро скомпилял, что оно не понимает UUID?

Вообще ядро вроде как не умеет загружаться по root=UUID=<UUID файловой системы> без initrd. Оно умеет загружаться по root=PARTUUID=<UUID раздела> (см. "ls -l /dev/disk/by-partuuid").

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

А, хотя PARTUUID, наверное, только на GPT есть, а на MBR нету.

Но можно написать скрипт для GRUB'а, чтобы он находил ФС с нужным UUID и преобразовывал её в /dev/sd<что надо>. Вот только сходу не могу такого написать.

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

Это я тоже нагуглил. Не помогает PARTUUID. А директории /dev/disk/by-partuuid вообще нет, это же для GPT.

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

Не помогает PARTUUID.

Да, конечно, на MBR он никак не поможет. UUID файловой системы вписан в файловую систему таким способом, как требует файловая система. Чтобы найти ФС с нужным UUID, надо опросить каждую имеющуюся ФС при помощи нужного драйвера. А PARTUUID — это совершенно отдельный UUID раздела, который вписывается в таблицу GPT, и поэтому ядро очень быстро может найти ФС по PARTUUID.

Я даже не знаю, чего делать... похоже, что манипуляции строк в достаточной мере GRUB2 из коробки не поддерживает. Разве что только собрать его с поддержкой Lua. Или захардкодить /dev/sdX.

А у тебя что, раньше как-то получалось грузиться без initrd по UUID?

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

Пробовал изначально же!

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

Нет, не получалось. Я раньше initrd создавал. Но это было черт-те когда.

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

root определяет сам grub, писать его в GRUB_CMDLINE_LINUX_DEFAULT не нужно

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

Зная ТС, я предположил, что не так уж он хочет grub2 :)

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

Белочка (скотский ондроед на бабочку правит) всегда со мной!

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

Терминальная фаза рукожопия. Ты вообще в курсе, что /dev/disk/by-xxx/yyy — это симлинки, создаваемые udev-ом, и без initramfs их нельзя использовать в качестве значения root=? Нельзя и никогда не было можно. Только /dev/sdXY.

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

Вот еще не хватало мне настолько в ведре продвинуться... Я ж не Линус!

Я вообще думал, что уже давным-давно ведро умеет так делать. Пока не погуглил ☹

Странно: такая важная штука, а еще не реализована. Ведь на современных системах хрен ты напишешь /dev/sdxx — мало ли, какой винт добавишь-убавишь-или ещечо...

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

А чего, собственно, этой фиче делать в ядре? Юзерспейс (и, в частности, initramfs) как раз для того и существует, чтобы не пихать в ядро всё подряд.

P. S.: запись root=UUID=... эквивалентна root=/dev/disk/by-uuid/... (аналогично для LABEL и всего остального) в том плане, что обе работают только при наличии initramfs.

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

Кстати, если ты всё-таки решишься на initramfs, то в конфиге grub2 есть параметр GRUB_DISABLE_LINUX_UUID=, который, будучи выставленным в false, как раз заставляет граб генерировать root=/dev/disk/by-uuid/xxx вместо root=/dev/sdXY.

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

initramfs — какой-то пережиток прошлого. Оно нужно было когда-то, когда биосы не понимали дальше гига разделов — тогда приходилось первым делать /boot и дальше уж извращаться (сейчас-то все ОК).

Кстати, если ты всё-таки решишься на initramfs

Не, не хочу.

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

Ты сейчас о совсем разных вещах говоришь. Каким боком наличие initramfs связано с требованием того, чтобы /boot был первым?

initramfs — какой-то пережиток прошлого.

Я бы сказал, скорее наоборот.

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

Справедливости ради стоит сказать, что раз уж GRUB знает, где какой UUID, он мог бы передавать ядру соответствующий /dev/sdX.

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

Во. Верное замечание. Но фигвам ☹

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

Eddy_Em

К сожалению, нет. Дело в том, что порядок перечисления дисковых контроллеров ядром заранее не определён и в общем случае с нумерацией BIOS-а (которой пользуется граб) не совпадает.

Не будь этой проблемы, /dev/disk и не появился бы (за ненадобностью, собственно).

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

Вы заблуждаетесь. initramfs содержит как раз скрипты, которые разбирают команды ядру и загружают систему дальше. Собственно, root=UUID= это просто соглашение, которое поддерживается во всех скриптах initramfs, ядро такое обрабатывать не может (ну, если это не GPT и не его PARTUUID).

/boot вообще не имеет никакого отношения к initramfs. Иметь систему вообще без initramfs довольно глупо. К слову, initramfs можно вкомпилировать прямо в ядро.

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

Иметь систему вообще без initramfs довольно глупо

С чего бы? У меня нет шифрованных разделов, у меня нет GPT, хитрых рейдов и прочих ужасов.

Единственный недостаток — то, что при изменении количества жестких дисков корень может перескочить со, скажем, /dev/sdh1 на /dev/sdl1. Вот здесь-то и нужны initramfs с root=UUID=...

Посмотрим. Вчера я мелкой был занят, сегодня если будет время, то воткну винт в ноутбук. Т.к. второй SATA-контроллер я еще давно сжег, а вместо оптического привода винт ставить вряд ли буду (т.к. ноут уже мертвец наполовину — у него нет клавиатуры и экрана, поэтому он используется как второй стационарный десктоп), то проблем с root=/dev/sda1 быть не должно.

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

Да, на домашнем десктопе тоже этой проблемы нет, т.к. винты в системе я на горячую меняю.

Eddy_Em ☆☆☆☆☆
() автор топика

Итак, винт был воткнут в ноутбук, при первой загрузке я вручную указал устройство, потом отредактировал /etc/defaults/grub и сгенерировал нормальный конфиг.

Только ноут это не спасло: железо таки уже на ладан дышит (загрузился далеко не с первой попытки).

Ну, а теперь сижу, думаю, как там сеть запустить, чтобы доустановить недостающее (я про wicd забыл, да и просто сеть нужна, чтобы готовые конфиги с компьютера забирать, т.к. с нуля я там все буду месяца три конфигурировать).

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