LINUX.ORG.RU

Grub видит ядра, которых нет

 ,


0

1

У меня две системы, Kali и Fedora. По какой-то неведомой для меня причине, когда я создаю файл конфигурации, то grub не видит федору (???), однако при непосредственно загрузке он показывает все установленные на данный момент ядра. Grub-customer тут тоже бессилен, он показывает все версии kali, но ни одной для федоры. Более того, если установить тот же grub-customer на kali, то ситуация повторяется.

До поры до времени мне было на это как-то пофиг, я просто удалял старые ядра вручную и в grub была только последняя версия федоры и кали. Но недавно, после удаления старых ядер, grub не стал удалять их из списка. Что забавно, ведь если перейти на старое ядро, то высвечивается ошибка в стиле «тут ничего нет».

Вопрос: Откуда grub берёт информацию об установленных системах? В файлах /boot/efi/EFI/fedora/grub.cfg и /boot/grub2/grub.cfg нет ни слова про федору.


Ответ на: удаленный комментарий

Ответ: Зависит от того кто и как его собрал и как и куда установил.

А это хороший вопрос т.к. я совершенно не понимаю куда и что он ставит. В этом и проблема, его файлы есть как в просто boot, так и в boot/efi/EFI/fedora, а почему? А я без понятия. И кто за что отвечает я не знаю, и интернет как на зло молчит…

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

А это хороший вопрос т.к. я совершенно не понимаю куда и что он ставит.

man grub

В этом и проблема, его файлы есть как в просто boot, так и в boot/efi/EFI/fedora, а почему?

Потому что их туда записали. Они везде есть, даже в etc

А я без понятия. И кто за что отвечает я не знаю

Я тоже иногда.

и интернет как на зло молчит…

Включи телевизор.

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

Во-первых, у grub есть возможность посмотреть кусок конфига, отвечающий за каждый пункт - можешь посмотреть там те самые пункты, которые ты не знаешь откуда берутся, а потом хоть полный поиск по всему диску сделать чтоб найти где эти строчки прописаны.

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

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

Дак вы начинайте с начала, система грузится через EFI или Legacy (BIOS MBR)?

Если EFI, то должен быть ESP-раздел, причём один, видимо тот, который монтируется в /boot/efi. Но на всякий случай можно посмотреть какие разделы есть (″fdisk -l /dev/sda″ или ″sfdisk -d /dev/sda″). И там смотреть где ″EFI System″. Такой раздел должен быть только один, иначе «ОЙ». Потом по выводу команды ″mount″ или ″cat /proc/mounts″ убедиться, что именно этот раздел смонтирован в /boot/efi.

Ну, а дальше смотреть, сколько каталогов в /boot/efi/EFI, там каждый загрузчик обычно создаёт свой каталог, в котором есть *.efi-файл, который и загружается первым. Дальше смотреть вывод ″efibootmgr -v″, по строке BootOrder определять какой загрузчик будет первым.

Обычно, в /boot/efi/EFI/linux/ grub ставит один efi файл, в котором grub с минимальным набором модулей. Все модули grub и его конфиг в /boot/grub. efi файл обычно не сжатый и там прописано, где находится каталог с grub, из которого берутся модули и конфиг, можно посмотреть как-то так:

strings grubx64.efi | grep '/grub'

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

Хорошо напутал. Я добавлю ещё путаницы.

Если ЕФИ, то даёт четыре варианта. Система установлена в ЕФИ, загружена в ЕФИ. Система установлена в ЕФИ, загружена в легаси. Система установлена в легаси, загружена в ЕФИ. Система установлена в легаси, загружена в легаси. Это для одной системы…

Дальше, количество вариантов растёт как снежный ком.

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

Если система загружена в легаси, то ″efibootmgr -v″ скажет:

EFI variables are not supported on this system.

Строки BootOrder не будет.

Дальше, количество вариантов растёт как снежный ком.

Ничто не мешает ТСу подробнее описывать его настройки, отсекая лишний снег с кома.

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

А где хранится ссылка на конфиг, который должен использовать grub?

$ efibootmgr -v
BootCurrent: 0001
Timeout: 0 seconds
BootOrder: 0001,0002,0003,0000
Boot0000* Windows Boot Manager  HD(6,GPT,bab0c468-da25-48cd-b064-176a780db64d,0x2fe9a800,0x32000)/\EFI\Microsoft\Boot\b...
Boot0001* manjaro       HD(6,GPT,bab0c468-da25-48cd-b064-176a780db64d,0x2fe9a800,0x32000)/\EFI\manjaro\grubx64.efi
      dp: 04 01 2a 00 06 00 00 00 00 a8 e9 2f 00 00 00 00 00 20 03 00 00 00 00 00 68 c4 b0 ba 25 da cd 48 b0 64 17 6a 78 0d b6 4d 02 02 / 04 04 36 00 5c 00 45 00 46 00 49 00 5c 00 6d 00 61 00 6e 00 6a 00 61 00 72 00 6f 00 5c 00 67 00 72 00 75 00 62 00 78 00 36 00 34 00 2e 00 65 00 66 00 69 00 00 00 / 7f ff 04 00
...

Вот в этом dp что ли или нет? На efi-разделе конфига у меня нет, лежит на разделе с системой, в папке /boot , но где-то наверно на него должна быть ссылка, чтобы загрузчик EFI\manjaro\grubx64.efi мог конфиг найти…
У меня всё работает, это я так, для саморазвития :)

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

Зависит от… Много от чего зависит. Рядом с grubx64.efi нет?

Например, в убунту:

~$ ls -l /mnt/nvme0n1p1/EFI/ubuntu
total 4392
-rwxr-xr-x 1 root root     108 Oct 29 01:16 BOOTX64.CSV
-rwxr-xr-x 1 root root     117 Oct 29 01:16 grub.cfg
-rwxr-xr-x 1 root root 2656136 Oct 29 01:16 grubx64.efi
-rwxr-xr-x 1 root root  856280 Oct 29 01:16 mmx64.efi
-rwxr-xr-x 1 root root  966664 Oct 29 01:16 shimx64.efi

В этом grub.cfg всего три строки, указывают раздел, где искать основной конфиг.

Помимо этого, у меня на этом разделе ещё свой грубЕФИ:

~$ ls -l /mnt/nvme0n1p1/EFI/boot
total 4144
-rwxr-xr-x 1 root root  966664 Oct 29 01:16 bootx64.efi
-rwxr-xr-x 1 root root   88344 Oct 29 01:16 fbx64.efi
-rwxr-xr-x 1 root root 2320264 Aug  7 04:21 grubx64.efi
-rwxr-xr-x 1 root root  856280 Oct 29 01:16 mmx64.efi

А в MBR ещё свой грубПС. Все остальные модули и конфиг для их обоих на этом-же разделе:

~$ ls -l /mnt/nvme0n1p1/boot/grub
total 64
drwxr-xr-x 2 root root  4096 Aug 31 07:57 fonts
-rwxr-xr-x 1 root root 18334 Nov 10 15:27 grub.cfg
drwxr-xr-x 2 root root 20480 Aug 31 07:57 i386-pc
drwxr-xr-x 2 root root 20480 Aug 31 07:57 x86_64-efi
andytux ★★★★★
()
Ответ на: комментарий от PeleWin

Конфиг лежит в каталоге с модулями grub, который и прописывается в efi-файле. Этот файл обычно не сжатый, поэтому можно попробовать грепнуть:

strings grubx64.efi | grep '/grub'

естествено, при смонтированом efi-разделе и из каталога EFI/manjaro/ . Если там будет что-то типа ″(,gpt3)/grub″, значит там и лежит.

Хотя, конечно, может быть, что в efi-файл засунут конфиг (early config), тогда можно аналогичным образом поискать строки ″root=″, ″prefix=″, ″configfile″.

В общем, информация, где брать конфиг и модули зашита в grubx64.efi, но штатных средств в пакете grub для «распаковки» этого файла и получения этой ссылки нет. В случае с MBR был такой сторонний скрипт https://github.com/arvidjaar/bootinfoscript

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

Нет, у меня на efi-разделе конфига нет, там только собственно исполняемый файл:

#find /efi -type f | grep -v "Microsoft"
/efi/EFI/Boot/bootx64.efi
/efi/EFI/manjaro/grubx64.efi
/efi/shellx64.efi

Ну, видимо, где-то в NVME-памяти, или как она правильно называется, должна быть ссылка на конфиг. Опять же эти значения «dp», которые показывает efibootmgr что-то означают, хотя и не очень понятно, что.

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

Вот это вау, так и получилось. Не думал, что это в исполняемый файл вкомпилено :)

$ sudo strings /efi/EFI/manjaro/grubx64.efi | grep "boot"
prohibited by secure boot policy
grub_boot_time_head
grub_efi_finish_boot_services
grub_efi_get_secureboot
grub_real_boot_time
grub_reboot
(,gpt1)/boot/grub
PeleWin
()
Ответ на: комментарий от PeleWin

Как-бы вкомпилено. Там исполняемый файл собирается из отдельных кусков, типа архива. В основном grubx64.efi состоит из модулей, которые в виде отдельных файлов лежат в /boot/grub/x86_64-efi/*.mod.

Команда grub-mkimage, которая и складывает всё в файл grubx64.efi, скорее архиватор (линкер), чем компилятор (транслятор).

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

Я не знаю, что именно выводит efibootmgr в поле ″dp″, возможно это просто DivicePath в сыром виде. Но, в принципе, спецификация UEFI допускает, что в EFI boot entry, выводимом командой efibootmgr, есть OptionalData. Это то, что передётся загруженому efi-файлу. И там может быть что угодно, в том числе можно было бы размеситить путь к grub.cfg.

Но, grub универсальный загрузчик для кучи платформ. Разработчикам не выгодно завязываться на свойства UEFI, которых больше нигде нет. Плюс grub может быть EFI fallback загручиком (/EFI/BOOT/BOOTX64.EFI), то есть работать без прописывания в nvram, то есть без OptionalData.

mky ★★★★★
()