grub2 and menus
В предыдущий раз я немного спалился конфигом bootchartd для grub2. Теперь grub2 загружает большинство моих систем. В этот раз похвастаюсь несколькими своими хаками :]
Перейти на grub2 раньше мне мешало несколько вещей:
- grub1 просто работал - незачем менять
- grub2 поглюкивал в rescue mode и часто безвозвратно портил меню при редактировании
- grub2 гораздо сложнее grub1,а значит и больше шансов вляпаться в новую ошибку
Но grub1 - мёртвый проект: обновлений к нему нет, а проблем вылазит всё больше с новыми версиями gcc.
Здесь в единственном баге собралась приличная их пачка:
- не грузится с 1TB+ смещения
- не работает после сборки gcc, который вставляет SSE2 оптимизации: загрузчик сам не инициализирует блок SSE2, но компилятор уже вставляет инструкции SSE2. Это долгое время мешало размаскировать gcc-4.6 в gentoo.
- портит память стека на некоторых кривых BIOS и не грузится
и другие :]
В grub2 этих проблем нет. Ошибки исправляются быстро и фич для обычных пользователй навалом:
- загрузка с ext4, btrfs, reiserfs. Для grub1 это всё только в сторонних патчах.
- поддержка загрузки со всяких RAID, GPT, через UEFI и прочих извратов
- пррержка приличного разрешения для прикольных картинок :]
- поддержка русских букв в меню
- автогенерация рабочего конфига grub.cfg (в том числе для загрузки windows)
При установке grub2 выдается классная ссылка на HOWTO. В моём случае всё было просто:
grub2-install /dev/sda
grub2-mkconfig -o /boot/grub2/grub.cfg
Единственная мелочь, которая мне не понравилась - это ядро по умолчанию. Я хотел, чтобы грузился /boot/vmlinux (он у меня показывает на последнее установленние ядро).
grub2-mkconfig - довольно смешной скрипт. Интересно знать, как он генерит grub.cfg:
- Детектит тип файловых систем для / и /boot/,
- запускает скрипты из /etc/grub.d/,
- которые генерят grub.cfg,
- который является shell-подобным скриптовым языком для grub2
такая вот вложенность :]
Мне сюда просто нужно было вклинить первую строку меню:
cat /etc/grub.d/01_my_live
#! /bin/sh
set -e
cat /boot/grub2/grub.cfg.mine
cat /boot/grub2/grub.cfg.mine
menuentry 'Gentoo current' {
load_video
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
linux /boot/vmlinuz root=/dev/sda2 ro video=SVIDEO-1:d i915.i915_enable_rc6=1 init=/sbin/bootchartd
}
Часть этого меню взята из оригинального автогенеренного grub.cfg.
Теперь grub2-mkconfig генерит мне меню с моим любимым ядром по умолчанию :]