Grub-меню — теперь со ссылками!

Материал из Rosalab Wiki
Перейти к: навигация, поиск
Эта статья викилога является черновиком и ещё не была опубликована.

После перехода на Grub2 мы столкнулись с многочисленными жалобами пользователей на невозможность установки загрузчика в раздел. Несмотря на то, что технически Grub2 поддерживает такой режим, он работает не для всех файловых систем, является крайне ненадёжным, и сами разработчики настоятельно рекомендуют его не примененять, поэтому к идее добавления такой опции мы всегда относились весьма скептически. Но это не означает, что мы не признаём наличия проблемы и не собираемся её решать. Мы предпочли подойти с другой стороны: понять, для чего вообще требуется установка загрузчика в раздел, и предложить альтернативные пути решения этих задач. Из отзывов пользователей мы смогли выудить следующие сценарии:

  • Основным загрузчиком является не grub, а что-то другое, с конфигами граба работать не умеющее. Пользователь хочет поставить Росу, но оставить свой загрузчик. Тогда установка Росовского граба в раздел позволила бы добавить ссылку на него в основной загрузчик, так что при выборе соответствующего пункта управление просто передавалось бы в первый (загрузочный) сектор раздела, и на экране появлялось бы меню Росы.
Эта задача пока остаётся нерешённой, но поскольку подавляющее большинство Linux-систем уже перешло на grub2, актуальность такого сценария невелика.
  • Похожий, но несколько отличающийся вариант: пользователь просто хочет сохранить свой текущий загрузчик (может быть, тоже grub, но от другой системы), а установщик Росы всегда принудительно устанавливает свой вариант граба, перезатирая то, что было. Опция установки в раздел была бы в этом случае просто обходным путём для сохранения имеющегося загрузчика.
Эту проблему мы решили более логично, просто добавив в инсталлятор возможность отказа от установки загрузчика. При этом локальный grub.cfg целевой системы продолжает генерироваться и обновляться, так что обновление основного загрузочного меню будет происходить корректно.
  • Каждый раз при установке нового ядра в одной из вторичных систем пользователь вынужден перезагружаться в основную систему и вручную обновлять загрузочное меню, чтобы туда добавились новые ядра. Если бы была возможность установки граба в раздел, достаточно было бы однократно добавить в основное меню ссылку на него, и про необходимость ручного обновления можно забыть: локальный grub.cfg перегенерируется автоматически, так что при передаче управления в этот вторичный граб пользователю показывался бы сразу актуальный список ядер.
Решению вот этой-то задачи и посвящена данная статья.

На пути к решению

Предположим, что у нас уже есть возможность установки загрузчика в раздел, и представим себе, как будет выглядеть для пользователя настройка основного загрузчика для реализации третьего сценария. Для начала ему придётся вручную создать пункт загрузочного меню, который будет ссылаться на целевой раздел, что уже достаточно проблематично для пользователя, не слишком знакомого со структурой grub-меню и механизмами загрузки. Но будем считать, что пункт успешно добавлен и корректно работает. Что увидит пользователь после очередного обновления? В списке окажутся сразу три пункта, относящиеся к этой вторичной системе: прямая загрузка с использованием последней версии ядра, подменю с перечислением всех версий ядер, и, наконец, тот самый вручную добавленный пункт для перенаправления на загрузчик из раздела. Немножко избыточно, как вы считаете?

Что же мы можем здесь улучшить? На самом деле, пользователю совершенно необязательно передавать управление на загрузчик. Grub прекрасно умеет загружать свои конфигурационные файлы из произвольных мест. То есть если пользователя устраивает вышеописанная схема, то с нашей стороны и не потребуется ничего делать. Просто в том самом вручную созданном пункте надо будет вместо команды chainloader, передающей управление другому загрузчику, вписать команду configfile с путём к целевому grub.cfg.

И всё же избыточность раздражает. Да, в грабе есть возможность отключить генерацию дополнительных пунктов меню для вторичных систем, но тонкая настройка отсутствует напрочь: либо всё, либо ничего. Так что если установлено более двух систем, то прописывать вручную придётся их все (кроме основной, разумеется). Ну и, конечно, ручное создание всех этих пунктов меню не очень-то соответствует нашим представлениям о user-friendly.

Мы решили решить обе проблемы одним ударом. В Grub2 была добавлена новая опция GRUB_OS_PROBER_LINKED, при включении которой все вторичные системы добавляются в меню не как обычно (один пункт для загрузки последнего ядра плюс подменю «Advanced options» со списком ядер), а в виде одного пункта-ссылки, перенаправляющего пользователя прямо на целевой конфиг-файл, как если бы он был обычным подменю. Вот как меняется загрузочное меню при использовании новой опции:

Было
Стало

Хочу, хочу!

Сейчас нововведение проходит последние стадии тестирования и проверки, и скоро обновлённые пакеты будут доступны в репозиториях. Чтобы воспользоваться новой возможностью, нужно будет прописать в файле /etc/default/grub строчку:

GRUB_OS_PROBER_LINKED=true

и перегенеровать загрузочное меню командой update-grub2. Для установки же системы с нуля мы добавили соответствующую галочку в расширенные настройки инсталлятора:

Опция в инсталляторе

Чтобы вернуть меню к прежнему виду, удалите строчку с GRUB_OS_PROBER_LINKED или задайте этому параметру значение false и снова вызовите update-grub2.

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

Надеюсь, эта новость вас…

Ввела в экстаз ^_^48
25%
Порадовала :)127
66%
Оставила равнодушным -_-13
7%
Огорчила :(5
3%

[ Хронологический вид ]Комментарии

(нет элементов)

Войдите, чтобы комментировать.