О Linux без initramfs

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

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

1
27 июля 2019, 02:25. Редактировалось 1 раз, последний — 30 июля 2019, 02:07#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
    Новичок
    Всего сообщений: 48
    Зарегистрирован: 29 июн 2018, 09:36
    Рейтинг пользователя: 1

    0
    29 июля 2019, 20:38. Редактировалось 3 раза, последний — 29 июля 2019, 20:48#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.