GrabDuck

Переходим на GRUB2 - Планета Calculate

:

Недавно я начал пользоваться grub2 на домашнем компьютере. Но установка оного оказалась задачей нетривиальной...
Мне пришлось столкнуться с разнообразными проблемами в работе grub2 и в его настройке. Постараюсь их все здесь описать (по крайней мере какие вспомню) и рассказать о путях решения.

Вступление

Забегая вперед скажу, что если вы не обладаете достаточными знаниями и опытом, чтобы в случае неудачи суметь восстановить старый загрузчик, перед выполнением описанного ниже обеспечьте выполнение следующих условий:

  1. компьютер должен работать и не перезагружаться, пока не будут выполнены все пункты инструкции;
  2. должна быть установлена какая-нибудь виртуальная машина. Лучше всего qemu.

В противном случае есть все шансы получить систему, не способную к загрузке.

Я Вас предупредил!

Подготовка

Итак, первое, что нам требуется - размаскировать live-версию grub2.
Имеющиеся в дереве версии 1.9x у меня работать наотрез отказались, выдавая при запуске ошибку. К сожалению, я не записал ее. Но можете поверить мне на слово:)

Для этого помещаем в /etc/portage/package.unmask/sys-boot строчку:

=sys-boot/grub-9999

в /etc/portage/package.keywords/sys-boot строку:

sys-boot/grub **

Если вы не уверены в своих силах, можно включить USE-флаг multislot. Тогда grub2 будет установлен в отдельный слот, а его загрузку можно будет выполнить из старого grub.

Установка

Устанавливаем grub2: emerge grub

А пока нужные пакеты скачиваются и компилируются, встаньте, разомнитесь, походите по комнате.
Посмотрите в окно - на соседнее здание, а потом вдаль на пределе видимости...
Отдохнули? Вот и замечательно!

Теперь в зависимости от того, как вы желаете использовать grub2, выполните один из нижеизложенных вариантов установки:

Запуск grub2 без установки bootloader`а

GRUB2 содержит в себе загрузочный образ, который можно использовать для запуска GRUB2 из GRUB.
Как я уже написал выше, для этого нужно установить grub2 с флагом multislot.

Далее необходимо выполнить "установку" загрузчика. Слово "установка" в кавычках потому, что реальной записи в загрузочный сектор не происходит.

Выполняем команду: grub-install --grub-setup=/bin/true /dev/sda

В /boot/grub/menu.lst добавляем:

title=GRUB2
root (hd0,0)
kernel /boot/grub/core.img

Подробнее: Gentoo Wiki

Установка grub2 в загрузочный сектор

В случае, если вы хотите использовать grub2 как первый и единственный загрузчик, установите его:

grub-install /dev/sda

Все, grub2 установлен. Теперь необходимо его настроить и сгенерировать конфиг.

Настройка

То ли в gentoo все так плохо с grub2, то ли он вообще еще очень сырой, но стандартные скрипты работают некорректно и стандартный конфиг не содержит многих необходимых параметров.

Будем это исправлять.

Конфигурируем grub2

Конфигурация grub2 хранится в файле /etc/default/grub.

Параметры, которые потребуется настроить (часть параметров я опущу за ненадобностью):

GRUB_DEFAULT=saved

Отвечает за выбираемый по-умолчанию вариант загрузки. Нужно либо указать номер пункта (нумеруется с нуля), либо оставить saved. Тогда grub2 запомнит последний выбранный вариант.

GRUB_TIMEOUT=15

Время в секундах. Сколько отображать варианты загрузки.

GRUB_CMDLINE_LINUX_DEFAULT=""

В этой переменной можно указать дополнительные параметры ядра. Однако без использования следующей переменной, она не имеет смысла.

GRUB_CMDLINE_LINUX=""

Здесь можно указать параметры, которые будут переданы ядру. Если оставить ее пустой, то в конфиг будут подставлены параметры загруженного в данный момент ядра.

Почему же предыдущая переменная без этой бесполезна?
Все очень просто. Если записать в нее какое-то значение и сгенерировать новый конфиг, это значение будет подставлено в параметры. После перезагрузки, если сгенерировать конфиг еще раз, эти параметры будут подставлены повторно. И т. д.

С другой стороны, если заполнять GRUB_CMDLINE_LINUX, то все необходимые параметры можно указать в ней и переменная GRUB_CMDLINE_LINUX_DEFAULT становится не нужна.

В общем логика разработчиков здесь мне непонятна.

GRUB_TERMINAL=console

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

GRUB_TERMINAL_OUTPUT="gfxterm"

А вот и первая переменная, которая отсутствует в конфиге, без которой, однако, некоторый функционал grub2 становится недоступен.

Совместно с переменной GRUB_WALLPAPER (см. ниже) включает возможность применения цветовой схемы к меню.

GRUB_GFXMODE="1280x1024@32"

Графический режим. Указать можно любое значение, которое поддерживает VideoBIOS видеокарты.
Узнать доступные режимы можно командой vbeinfo в командной строке grub2, либо установив пакет sys-apps/hwinfo и выполнив команду hwinfo --vbe.

GRUB_DISABLE_LINUX_RECOVERY="false"

По-умолчанию grub2 генерирует для каждого ядра 2 записи в меню. Для обычной загрузки и для режима восстановления. Чтобы это отключить, подставьте true.

GRUB_WALLPAPER="/boot/grub/splash.png"

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

Grub2 поддерживает несколько форматов изображений: png, jpeg (jpg), tga.

Если не установлена, вы не сможете изменить цветовую схему загрузочного меню.

GRUB_BACKGROUND="${GRUB_WALLPAPER}"

Очередная отсутствующая в конфиге переменная. Но использовать ее нужно только при большой необходимости. Судя по коду скриптов она используется, если не найдена или не указана тема оформления.

Тем найти не удалось, потому проверить на практике свои выводы не смог.

Она тоже устанавливает фон - даже без установки GRUB_TERMINAL_OUTPUT, однако при этом фон отрисовывается очень медленно - буквально построчно. И меню при этом тоже жутко тормозит. А так же не применяются цветовые схемы.
Но ее отличие от GRUB_WALLPAPER в том, что картинка растягивается под нужное разрешение. Возможно, отсюда и тормоза.
Лучшим выходом будет использование GRUB_WALLPAPER и GRUB_TERMINAL_OUTPUT, при соответствии разрешения изображения указанному в GRUB_GFXMODE. В этом случае фон рисуется быстро и сразу.

GRUB_COLOR_NORMAL="white/black" 
GRUB_COLOR_HIGHLIGHT="magenta/black"

Цветовая схема меню. Соответственно для невыделенного и выделенного пункта меню.

Вносим правки в скрипты

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

Откройте в любимом редакторе файл /etc/grub.d/05_distro_theme и найдите в нем строку:

. /lib/grub/grub-mkconfig_lib

После нее добавьте:

. /etc/default/grub

Генерируем конфиг grub2

Если для сборки и установки ядра вы используете genkernel, то процедура генерации конфига сводится к одной единственной команде: grub-mkconfig -o /boot/grub/grub.cfg.

Если же вы предпочитаете собирать ядро и настраивать загрузчик вручную, то просто добавьте* в конец файла /etc/grub.d/40_custom запись вида:

menuentry 'Gentoo GNU/Linux' {
        linux   /boot/mykernel
        initrd  /boot/myinitramfs
}
* Добавлять надо именно в конец! И именно добавлять! Заменять содержимое файла нельзя!

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

Проверка работы

У нас все установлено и настроено. Но не надо спешить поскорее перезагружаться. Прежде стоит проверить работоспособность свежеустановленного загрузчика. Тут-то нам и поможет qemu.

Выполните следующую команду:

sync ; echo 3 > /proc/sys/vm/drop_caches ; qemu -hda /dev/sda

*Закрывать окно виртуальной машины лучше в процессе загрузки ядра.

Если вы увидели вожделенное меню на фоне красивой картинки, а ядро радостно загружается, настало время перезагрузить компьютер! Цель достигнута, можно выдохнуть :)