О Linux без initramfs

Как настроить grub-mkconf для этого?

Настройки отображения темы Показывать по сообщений с сортировкой .
Выводить , отправленные .
Одна страница
Распечатать
4X_Pro
Создатель сайта
Всего сообщений: 3457
Зарегистрирован: 9 дек. 2015 г., 19:20
Рейтинг пользователя: 1661

1
. Редактировалось 2 раза, последний — #1
Давно хотел избавиться от initramfs в целях ускорения загрузки. Для этого пытался вкомпилировать все необходимое (драйвера SATA и файловой системы) в ядро, а не в модули, но при загрузке все равно получал kernel panic. И только недавно нашел на Linux.Org.Ru объяснение, почему так происходит. Если кратко, то ядро не видит UUID файловой системы, а видит только UUID раздела. И для нормальной загрузки нужно передать root=PARTUUID=значение. (Посмотреть значения для разделов можно с помощью partx --show /dev/sdбуква).
Но дальше вылезла другая проблема. В grub-mkconf вроде бы до сих пор нет штатных средств для того, чтобы генерировать PARTUUID вместо UUID при автоматическом создании grub.conf. Сейчас я это частично решил тем, что прописал в /etc/defaults/grub параметр
GRUB_CMDLINE_LINUX_DEFAULT="quiet root=PARTUUID=мой_ид", и вроде бы даже работает. Но может быть, есть решения лучше?

Ребята, давайте жить спокойно!

10geek
Единомышленник
Нет Всего сообщений: 293
Зарегистрирован: 29 июн. 2018 г., 09:36
Рейтинг пользователя: 19

0
. Редактировалось 3 раза, последний — #2
Решение есть, это можно автоматизировать на уровне скрипта "/etc/grub.d/10_linux", который используется при генерации "grub.cfg".
  1. В начале файла /etc/grub.d/10_linux есть примерно такой фрагмент кода (возможно в разных дистрибутивах или версиях пакета он будет отличаться):
    if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ || uses_abstraction "${GRUB_DEVICE}" lvm; then LINUX_ROOT_DEVICE=${GRUB_DEVICE} else LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} fi
    Перед ним добавляем:
    if [ "$GRUB_DEVICE" = use_rootfs_partuuid ]; then GRUB_DISABLE_LINUX_UUID=true GRUB_DEVICE=PARTUUID=$(blkid -d -o value -s PARTUUID "$(mount | awk '$3 == "/" { print $1; exit }')") fi
    /etc/grub.d/10_linux помечен в пакете, как конфигурационный файл, поэтому его можно смело редактировать, использовать dpkg-divert в этом случае не нужно.
  2. В /etc/default/grub добавляем:
    GRUB_DEVICE=use_rootfs_partuuid
    Казалось бы, почему бы не создать для этого отдельную опцию? Дело в том, что в скрипте grub-mkconfig, который читает /etc/default/grub и выполняет скрипты из /etc/grub.d, почему-то решили захардкодить экспортируемые из /etc/default/grub переменные, вместо того, чтобы использовать "set -a" для автоматического экспорта объявляемых в /etc/default/grub переменных ("set +a" отменяет это поведение). Из-за этого мы не можем использовать произвольные имена переменных, т.к. для этого придётся править grub-mkconfig и все правки слетят при следующем обновлении пакета (если, конечно, не воспользоваться dpkg-divert).
  3. Выполняем update-grub и проверяем содержимое /boot/grub/grub.cfg, в нём параметры запуска ядра должны иметь примерно такой вид:
    linux /boot/vmlinuz-5.0.9 root=PARTUUID=uuid_раздела [параметры_запуска_ядра]…
Ещё можно создать свой скрипт для генерации пункта меню GRUB, на эту тему есть хорошая статья: https://ru.wikibooks.org/wiki/Grub_2#/etc/grub.d

Одна страница
Распечатать

У вас нет прав для отправки сообщений в эту тему.

Задать вопрос

Здесь можно задать мне вопрос или спросить совета по любой теме, затронутой в блогах или на форуме. После того, как я отвечу, вопрос и ответ появятся в соответствующем разделе. Но не забываем, что я — сторонник slow life, поэтому каких-либо сроков ответов не обещаю. Самые интересные вопросы станут основой для новых тем на форуме или записей в блоге.
Сразу предупреждаю: глупости, провокации, троллинг и тому подобное летит прямо в /dev/null.