GRUB Setup (in Russian)

В GRUB2 основным файлом конфигурации является не /boot/grub/menu.lst, как это было в предыдущей версии, а /boot/grub/grub.cfg. Однако редактировать его напрямую не нужно, ведь при каждом обновлении файл генерируется автоматически с помощью файла настроек /etc/default/grub и скриптов директории /etc/grub.d.

Автоматическая конфигурация (grub-mkconfig)

Генерация конфига

Команда grub-mkconfig может быть использована для генерации файла grub.cfg.

Для автоматического обнаружения ОС отличных от Linux установите пакет os-prober. Если после установки пакета os-prober автоматическое обнаружение не работает должным образом, то может потребоваться установка пакета hwinfo.

Для отключения автоматического обнаружения других операционных систем следует добавить в файл /etc/default/grub строку

GRUB_DISABLE_OS_PROBER="true"

Для настройки конфигуратора используйте файл /etc/default/grub и файлы в каталоге /etc/grub.d/.

Если Вы хотите добавить свои пункты в меню GRUB, настроить их можно в файле /etc/grub.d/40_custom, либо в /boot/grub/custom.cfg.

Чтобы применить изменения, запустите команду:

# grub-mkconfig -o /boot/grub/grub.cfg

Она не только создаст файл /boot/grub/grub.cfg, но и проверит конфигурацию на наличие ошибок.

Важно: Если вы запускаете конфигуратор при установке Linux, убедитесь, что вы делаете это внутри chroot, иначе программа будет читать и записывать файлы конфигурации текущей, а не устанавливаемой системы.

Параметры конфигуратора

Дефолтный файл /etc/default/grub содержит параметры конфигуратора с настройками по-умолчанию, снабженные комментариями на английском языке. Ниже перечислены некоторые наиболее общие из них:

  • GRUB_DEFAULT Номер или заголовок пункта меню, выбранного по-умолчанию

  • GRUB_TIMEOUT Время, после которого будет автоматически загружаться пункт по-умолчанию

  • GRUB_CMDLINE_LINUX Параметры ядра Linux, добавляемые во все пункты меню.

  • GRUB_CMDLINE_LINUX_DEFAULT Параметры ядра Linux, добавляемые только в пункты меню, сгенерированные без "recovery".

Другие параметры конфигуратора вы можете найти ниже, в соответсвующих тематических главах.

Прямая конфигурация

GRUB2 – программируемый загрузчик, и файл его конфигурации – это не файл настроек, а программа, выполняемая загрузчиком, скрипт. Как всякий скрипт, он может быть как очень простым, не сложнее menu.lst в GRUB Legacy, так и очень сложным, поскольку сложность скриптов практически ничем не ограничена.

Код скрипта конфигурации, генерируемый grub-mkconfig, обычно пригоден для загрузки в типовых случаях, но слишком громоздок, избыточен, непригоден для изучения, ограничен в возможностях, и создаёт ложное впечатление о "сложном конфиге GRUB2".

Ещё одно распространённое заблуждение происходит от надписи "DO NOT EDIT ..." в начале кода, генерируемого конфигуратором. Надпись правильная, но её смысл состоит лишь в том, что именно этот, автоматически сгенерированный код, действительно нет смысла редактировать. Надпись стандартна для автоматических конфигураторов, и относится не к grub.cfg вообще, а только к продукту деятельности конфигуратора, безотносительно имени файла, в который его сохранили.

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

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

Язык конфигурации GRUB2 – сильно упрощённый UNIX-шелл, из которого убраны возможности перенаправления ввода-вывода, и добавлены команды, специфичные для загрузчика.

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

Возможности скриптов GRUB2 позволяют средствами самого загрузчика, прямо перед загрузкой ОС, генерировать меню с переменным количеством строк, для поиска и загрузки всех установленных ядер Linux, без изменения каких-либо файлов конфигурации. То же самое возможно и для версионных ядер Debian и Ubuntu.

Примеры кода конфигурации даны ниже, подробный справочник имеется на сайте GRUB.

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

Защита конфигурации

К сожалению, мейнтейнеры пакета grub отказываются убирать из него бессмысленный, по определению неработающий и никому не нужный "дефолтный" вариант файла grub.cfg, создающий небольшую, но постоянную угрозу перезаписи настоящего рабочего конфига GRUB, особенно в случае ошибок со стороны мейнтейнеров. Эта опасность не зависит от используемого метода конфигурации GRUB – и ручной, и автогенерированный конфиг может быть однажды случайно перезаписан или переименован при очередном обновлении пакета, и выяснится это с большой вероятностью только после перезагрузки.

Вынос конфигурации в другой файл

Так как GRUB поддерживает модульность конфигурации, можно оставить в файле grub.cfg только одну строку со ссылкой на другой файл, например menu.cfg

/boot/grub/grub.cfg . $prefix/menu.cfg

и в дальнейшем вместо grub.cfg править только menu.cfg

Для автоконфигурации в этом случае можно использовать команду

Прямая блокировка grub.cfg

Чтобы защитить файл от любых изменений, присвойте ему атрибут immutable

Блокировка снимается командой

Если основная конфигурация уже вынесена в другой файл, блокировку grub.cfg достаточно установить однажды и больше не снимать.

Блокировка защитит файл от перезаписи скриптами установки пакетов. Чтобы избежать конфликта с файлом из пакета, добавьте его имя в строку NoUpgrade в /etc/pacman.conf:

Перенос каталога grub

Если каталог grub/ со всеми файлами загрузчика расположен в корневом разделе, для защиты конфигурации можно переместить его из /boot в другое место в пределах раздела, проще всего прямо в корень :

Вместо /dev/sda используйте текущее имя диска для установки (при установке для UEFI указывать его не нужно). Все файлы загрузчика после этого будут находиться в каталоге /grub , в том числе файл конфигурации /grub/grub.cfg . Образы ядра и initramfs останутся по-прежнему в /boot , и будут загружаться как обычно, правки путей не потребуется.

В модульных и многофайловых (шрифты, темы) конфигурациях вместо /boot/grub можно использовать в путях к файлам переменную $prefix, в этом случае конфиги будут работать правильно вне зависимости от текущего расположения файлов загрузчика.

Если вы используете автоконфигуратор, не забудьте после переноса заменить возможные упоминания /boot/grub на /grub в файлах /etc/default/grub и /etc/grub.d/*

Для генерации конфига после переноса можно пользоваться командой

Синтаксис файла конфигурации grub.cfg

Пример минимальной работающей конфигурации

Здесь только один пункт меню, загрузчик в корневом разделе, который передаётся ядру меткой Arch_root

Основные команды и переменные

Файл конфигурации состоит из команд, выполняемых по порядку, как в обычном шелл-скрипте.

  • Строки или продолжения строк, начинающиеся с символа # , считаются комментариями.

  • В GRUB2 используются обозначения дисков вида hdX и разделов вида hdX,Y , где X - номер диска, Y - номер раздела на нём. Нумерация разделов начинается с единицы (как в ядре Linux), нумерация дисков – с нуля. Если обозначение диска или раздела используется само по себе, например в переменной root, оно пишется без скобок.

  • Пути к файлам могут начинаться с обозначения диска или раздела в скобках, например (hd0,1)/boot/vmlinuz соответствует файлу vmlinuz в каталоге /boot на разделе /dev/sda1

  • Если в пути к файлу не указан диск или раздел, подразумевается текущий диск или раздел из переменной root . При запуске GRUB2 эта переменная уже указывает на раздел, где хранятся все файлы загрузчика, и как правило, образы ядра и initramfs. Задавать переменную root в конфиге имеет смысл ТОЛЬКО для загрузки с ДРУГОГО раздела.

Пример:

  • Кроме файлов, GRUB2 позволяет обращаться напрямую к цепочкам секторов на диске или разделе, в формате X+Y , где X - номер начального сектора цепочки, а Y - количество секторов. Если цепочка начинается с первого (номер 0) сектора, её обозначение сокращается до +Y. Наиболее употребительная цепочка в конфигах GRUB -- бут-сектор раздела или диска, обозначается как +1

  • В обозначении раздела перед его номером может стоять слово, обозначающее его принадлежность к таблице разделов определённого типа, например hd0,msdos3 означает третий раздел в MBR на нулевом диске, а hd1,gpt2 означает второй раздел в GPT на следующем диске. GRUB2 всегда добавляет тип таблицы при выводе разделов командой ls и при записи $prefix в процессе установки, однако писать тип таблицы вручную не требуется -- он определяется автоматически. Исключение может составлять только особо тяжелый случай двух разных таблиц разделов с разной нумерацией на одном диске, причём гибрид GPT+MBR таким случаем не является - GRUB2 игнорирует MBR, если на диске обнаружена GPT.

  • Команда menuentry генерирует один пункт меню. Она задаёт видимый заголовок и список команд, которые выполнятся после выбора этого пункта меню:

  • Переменная default задаёт номер или заголовок пункта меню, выбранного по-умолчанию. Например, set default=1 выбирает второй пункт. Пункты меню нумеруются с нуля.

  • Переменная timeout определяет время в секундах, по истечении которого будет загружен пункт меню по-умолчанию, например, set timeout=5.

Примечание: Если таймаут не задан, GRUB будет показывать меню неограниченно долго, и не начнёт загрузку ОС без вмешательства пользователя.

  • Команда linux загружает образ ядра и параметры для него.

  • Команда initrd загружает образ начальной корневой ФС. Если образов указано несколько, они будут загружены по очереди. Например, образ для обновления микрокода процессоров Intel загружается перед основным образом:

  • Команда chainloader предназначена для загрузки "по цепочке" образа другого загрузчика. В режиме BIOS это, как правило, boot-сектор или его копия в файле, в режиме UEFI это может быть любое EFI-приложение, даже не обязательно находящееся в доступном для UEFI разделе – главное, чтобы файл мог быть прочитан средствами GRUB, а переменная root при вызове команды указывала на доступный UEFI раздел.

Стандартный пример конфигурации

В этом примере так или иначе фигурируют три раздела:

  • hd0,1 – раздел Windows, указан явно в последнем пункте меню.

  • hd0,2 – boot-раздел , монтируется в /boot , поэтому /boot отсутствует в путях к файлам. При старте раздел уже находится в переменной root, поэтому отдельно никак не задаётся, только подразумевается.

  • hd0,3 – корневой раздел Arch Linux , в Linux отображается как /dev/sda3 , как и прописан в параметрах ядра.

Примечание: Если образы ядра и initramfs лежат не в отдельном разделе, а в каталоге /boot, он должен быть указан в путях к ним:

Вторичные конфиги, вложенные меню и смена контекста

Как и UNUX-шелл, GRUB2 поддерживает три вида переменных: обычные, позиционные параметры и переменные окружения.

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

  • Переменные окружения недоступны непосредственно, но наследуются и автоматически импортируются в обычные при смене контекста.

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

Обычные переменные создаются в момент первого присвоения, командой set переменная=значение

При этом само слово set можно не писать:

Для уничтожения обычной переменной может быть использована команда unset

Обычные переменные могут быть экспортированы "в окружение" командой export

Так же как в шелл-скриптах, из одного конфига GRUB2 может вызван другой файл конфига.

  • Команда source (часто обозначается просто точкой .) выполняет другой конфиг без смены контекста, после чего продолжает выполняться текущий.

Пример:

  • Команда configfile запускает новый конфиг в новом контексте:

  • Команда submenu создаёт новый пункт меню, так же как и menuentry, и может иметь точно такой же набор параметров. Единственное отличие submenu состоит в том, что команды внутри него выполняются в новом контексте, так же как при вызове конфига через configfile. Соответственно, все новые пункты меню, создаваемые в новом контексте, добавляются в новое меню, отсюда и название команды.

  • Возврат в старое меню (и старый контекст, со старыми переменными) из вложенного, может быть выполнен нажатием клавиши ESC.

Постоянное именование устройств

UUID

При загруженном Linux, узнать UUID имеющихся разделов можно с помощью команды lsblk -f

Полученный UUID корневого раздела можно вручную вставить в параметры ядра, примерно так: root=UUID=355ccb5c-99e1-400d-b612-451f9247e35e, но делать это имеет смысл, только если у вас есть отдельный boot-раздел.

Чаще всего и GRUB, и ядро находятся в одном том же корневом разделе, который уже и так находится в $root, остаётся получить его UUID в переменную для подстановки в параметры ядра:

Пример загрузки ядра с автоматической подстановкой UUID:

Параметры команды probe здесь те же самые, просто в сокращённой форме.

И только если образ ядра находится не в том разделе, что GRUB, то есть не в корневом, и не в boot-разделе, требуется отдельно указать его загрузчику. Чтобы сделать это, используйте команду search. Так мы устанавливаем корневой раздел в переменную загрузчика $root через поиск по UUID, и этот же UUID подставляем в параметры ядра, если отдельного boot-раздела нет:

Метки

Метки - легко читаемые заголовки, присваиваемые файловым системам и не только:

Метку можно подставить в параметры ядра.

Пример:

Если загрузчик находится в отдельном от ядра и корня разделе, корневой раздел можно указать через метку и загрузчику:

Особые типы устройств

LVM

При использовании GRUB2 на LVM, как правило, никаких дополнительных команд в конфиге GRUB не требуется, достаточно просто передать ядру в параметре root= обозначение группы и тома LVM, принятое в Linux, то есть /dev/mapper/Group-Name:

или /dev/Group/Name:

Только если GRUB находится на разделе, отдельном от раздела с ядрами, то есть не на корневом, и не на boot-разделе, может потребоваться указать ему нужный раздел с образами ядра и imitramfs. Группа и том LVM в формате GRUB2 задаются так:

И только если GRUB2 установлен не на LVM, а образы ядра он должен прочесть с тома LVM, может также потребоваться предварительно загрузить его модуль командой insmod :

/etc/default/grub

Данный файл содержит в себе основные настройки для grub2. Через него, собственно, они и изменяются. Для наглядности ниже приводится примерное содержимое этого файла:

Мы видим, что файл представляет собой набор опций в человекопонятном формате ОПЦИЯ=ЗНАЧЕНИЕ. Мы не будем здесь рассматривать все представленные параметры, поскольку рядовому пользователю вполне достаточно понимания пары-тройки основных параметров. Наиболее часто встречающаяся потребность при настройке grub — изменение стандартного пункта загрузки и/или времени показа меню. Рассмотрим же, как это делается.

Что делать, если файла /etc/default/grub нет

Начинающие пользователи внимательно читают этот замечательный учебник и пытаются следовать описанным здесь сведениям. Однако тут же натыкаются на грабли: файла /etc/default/grub нет.

1) У вас версия Grub1

2) Проверить, есть ли файл /etc/sysconfig/grub2. Править его аналогичным образом.

В этом разделе будет написано, почему этого файла нет и как настраивать загрузчик в этом случае.

Изменение стандартного пункта загрузки

По умолчанию стандартный пункт (выделенный при показе меню) — верхний в списке. После установки Ubuntu она окажется наверху, а Windows, например, будет последним пунктом. После обновления ядра первым пунктом списка становится загрузка с новым ядром. это происходит потому, что именно первый пункт загрузки является стандартным по умолчанию. За это, собственно, отвечает параметр GRUB_DEFAULT. Значением его является номер пункта в меню загрузки, который должен быть выбран стандартным, причем нумерация начинается с нуля. Значение по умолчанию - 0, поэтому и выбирается первый пункт. Для того, чтобы выбрать другой пункт, нам нужно узнать, каким по счету он будет в списке.

Тут есть два варианта: просмотреть содержимое /boot/grub/grub.cfg и сосчитать, какой по счету окажется нужная запись, или же перезагрузиться и более наглядно посмотреть то же самое в меню загрузки (перед этим побегайте стрелочками по меню, чтобы остановить таймер). Второй вариант отличается более наглядным представлением, что проще для неопытного пользователя. В обоих случаях не забывайте о порядке нумерации — 0, 1, 2, 3 и так далее, то есть пятому сверху пункту будет соответствовать значение 4, второму — 1, первому — 0. В вышеприведенном примере установлено значение 6, то есть стандартным задан седьмой пункт меню.

Кроме задания конкретного пункта есть еще другие интересные варианты. Например, если в качестве значения указать saved и добавить строку GRUB_SAVEDEFAULT=true - тогда при загрузке будет выбран тот пункт, который был загружен в прошлый раз. Или же можно указать точное название пункта. В данном случае оно должно быть именно таким, каким мы его видим в /boot/grub/grub.cfg. При этом значение должно указываться в кавычках. Данный способ удобен тем, что после обновления ядра не придется изменять настройки из-за сбившейся нумерации.

Пример:

Если в grub.cfg пункт меню выглядит так:

то и значение параметра GRUB_DEFAULT должно указываться именно в виде

Изменение времени отображения меню

По умолчанию меню загрузки отображается 10 секунд, после чего загружается стандартный пункт (если раньше не нажат enter и не выбран другой пункт, что останавливает таймер). С изменением задержки все совсем просто. За эту задержку отвечает параметр GRUB_TIMEOUT (не путайте с GRUB_HIDDEN_TIMEOUT!). Значение задается в секундах. Обратите внимание, что цифра указывается в кавычках. В нашем примере это значение — 2, то есть меню отображается две секунды. Кроме того, есть одна хитрость. Если поставить значение "−1", то меню будет отображаться до тех пор, пока пользователь не выберет какой-либо пункт. То есть без всяких таймеров и утекающих секунд.

Изменение времени отображения в debian 8

Данный хак будет полезен и для владельцев систем построенных на debian. Дело в том что файл /etc/grub.d/00_header построен по непонятному принципу, а строчка в GRUB_TIMEOUT в /etc/default/grub не меняет время отображения. Для того чтобы это исправить надо открыть любым редактором файл /etc/grub.d/00_header и удалить данные строчки (делаем резервную копию на всякий случай):

Эта функция запутанная и ничего не даёт. Далее ищем и удаляем полностью данный текст:

Далее удаляем полностью из файла следующий текст:

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

для того чтобы удостоверится в том что ошибок не возникает (будет создан файл test-grub.cfg в текущей папке). Теперь для того чтобы установить желаемое значение timeout нам нужно открыть файл /etc/grub.d/00_header, и после строчки set -e добавить:

Теперь для того чтобы изменить время отображения меню нам будет достаточно изменить данную строчку и выполнить update-grub. Таким же образом можно записывать любые переменные в наш готовый grub.cfg (после echo можно вводить что угодно, и это будет записано в наш готовый конфиг).

"Скрытое" меню

В случае, если на компьютере установлена только Ubuntu, меню загрузки по умолчанию не будет отображаться, а grub2 будет загружать вас напрямую в систему. Однако же, иногда может возникнуть необходимость загрузиться с другим ядром или же запустить проверку памяти. для этого предусмотрено "скрытое меню". За него отвечает параметр GRUB_HIDDEN_TIMEOUT. В случае, когда установлены другие ОС, этот параметр закомментирован (# в начале строки).Если в меню загрузки присутствует Windows, этот параметр игнорируется, даже если он раскомментирован, т.е. использовать скрытое меню невозможно. В случае с единственной ОС он будет активен. значение его задает задержку в секундах. Grub2 приостановит загрузку на заданное количество секунд, давая пользователю возможность вызвать меню загрузки, нажав Escape. Если значение установлено в 0, то задержки не будет. Однако, пользователь все равно сможет вызвать отображение меню, удерживая при загрузке shift. Параметр GRUB_HIDDEN_TIMEOUT_QUIET отвечает за отображение таймера во время паузы. При значении true таймер показан не будет. При выборе false - будет отображаться.

Изменение стандартных параметров загрузки ядра

Иногда бывает необходимо загружать ядро системы с какими-либо особыми параметрами. Например, для корректной работы специфического оборудования. в этом случае весьма полезен будет параметр GRUB_CMDLINE_LINUX_DEFAULT. Он отвечает за те параметры, с которыми запускаются linux-ядра при загрузке. Значение его по умолчанию - quiet splash, что приводит к показу графической заставки при запуске системы, и отключению отображения какой-либо текстовой информации. Вы можете добавить необходимые вам параметры запуска ядра, приведя это значение к виду quiet splash your_param1 your_param2, то есть дописав через пробел нужные параметры.

Пример:

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

на

Теперь все наши пункты загрузки linux-ядер будут преобразованы в verbose mode, то есть режим загрузки без графической заставки и с выводом на экран текстовой информации о загрузке компонентов системы, что позволяет следить за процессом загрузки и выявлять неполадки.

Обратите внимание, чтобы ядру не передавались лишние параметры через GRUB_CMDLINE_LINUX, если он не пустой. Все вышеописанное работает для

Остальные настройки файла /etc/default/grub

  • данная строка отвечает за названия дистрибутива, которое будет отображаться в меню GRUB2 (Ubuntu, Xubuntu, Debian, и т.д.)

  • раскомментируйте данную строку, и это позволит отключить графический терминал (grub-pc only). Данный прием будет полезен тем, что отключение графического режима может существенно увеличить скорость работы меню (прокрутка, отзывчивость).

  • раскомментируйте, если вы не хотите, чтобы GRUB передавал вашей системе параметр root=UUID=xxx.

  • этот пункт отвечает за разрешение графического меню GRUB2. Данный параметр предоставляет разрешение, которое поддерживается видеокартой пользователя (например: 640x480, 800x600, 1024x768, 1600×1200 - для соотношения сторон 4:3. И 640x400, 800x500, 1024x640, 1280x800, 1680x1050 - для широкоформатных мониторов с соотношением сторон 16:10). Настройки применимы только для меню загрузки. Так же у нас есть возможность увидеть все доступные разрешения для экрана из меню GRUB2. Для этого, находясь в меню, жмем с, затем в строке grub> пишем vbeinfo.

Если строка GRUB_GFXMODE=640x480 закомментирована или выбранное разрешение недоступно, тогда GRUB2 использует настройки по умолчанию, определенные скриптом /etc/grub.d/00_header.

Несколько советов:

  • Настройка одинакового разрешения в меню GRUB2 и вашей операционной системы, позволит немного уменьшить время загрузки.

  • В качестве дополнительной опции пользователь может задать битность изображения, просто добавив необходимые данные в настройку разрешения. Например так: 1280x1024x24 или 640x480x32.

  • Пользователь может добавить одновременно несколько разрешений. Как это работает? А вот так, если GRUB2 не может использовать первое заданное разрешение, тогда он будет пробовать следующее и т.д. Перечень разрешений необходимо разделять запятыми.

Пример: 1280x1024x16,800x600x24,640x480.

  • Если используется строка GRUB_GFXMODE= и при выполнении команды

вам выдается сообщение not found, просто попробуйте или добавить или изменить битность изображения.

  • для того, чтобы избежать появления в меню режима Recovery, добавьте (если отсутствует) или раскомментируйте данную строку. Если вам нужен режим Recovery только для конкретно взятого ядра - вам будет нужно создать необходимую запись в скрипт /etc/grub.d/40_custom.

  • Включает/выключает проверку скриптом /etc/grub.d/30_os-prober наличия на других разделах операционных систем, включая такие как Windows, Linux, OSX и Hurd.

/etc/grub.d

Этот каталог содержит в себе скрипты, которые используются при создании grub.cfg. При обновлении grub2 они находят все установленные на компьютере системы и ядра и формируют в grub.cfg меню загрузки, которое мы и видим. Два основных из них - 10_linux и 30_os-prober отвечают за поиск linux-ядер и остальных ОС на других разделах соответственно. Файл 40_custom позволяет добавлять свои пункты загрузки. Это может быть полезно, если вы, например, хотите добавить какие-то особые варианты загрузки системы.

Пример:

Добавляем verbose-mode (режим загрузки без графической заставки, с текстовым отображением процесса загрузки), позволяющий контролировать процесс загрузки системы. Для этого мы немного отредактируем обычный пункт загрузки. Допустим, он выглядит так (в /boot/grub/grub.cfg):

Для того, чтобы сделать из этого verbose-mode, нам нужно убрать опции quiet и splash из строки linux. Ну, и для понятности изменим название самого пункта. в итоге получаем:

Все это и добавляем в 40_custom в конец файла. Строка с echo не является обязательной, она лишь будет сигнализировать нам о том, что наш пункт найден и добавлен при обновлении grub2

Применение изменений

После того, как мы отредактировали и сохранили наши файлы, радоваться еще рано. Теперь нужно закончить дело, обновив наш /boot/grub/grub.cfg. Это довольно просто - нужно всего лишь выполнить команду

Она выполнит скрипты в каталоге /etc/grub.d и применит заданные в /etc/default/grub параметры. После этого смело перезагружаемся и видим, что все работает как надо. Ну или не работает... Если все прошло успешно, то в выводе консоли вы увидите список найденных grub2 ОС и linux-ядер. Выглядит все это примерно так, как на скриншоте.

Тот же самый скрипт выполняется и при обновлении ядра.

Загрузка другого grub2 из текущего

Как выяснилось в ходе экспериментов, все весьма просто. загружаемся в grub2, переходим в консоль нажатием c. Загрузка другого grub2 происходит по методу "set root - chainloader - boot". Для начала определимся с диском, в MBR которого прописан grub2, который мы собираемся загрузить. Выполните команду

чтобы увидеть список текущих дисков и разделов. Диск, с которого производился загрузка будет именоваться (hd0). В нашем примере мы загрузим с флэшки основной grub2 на жестком диске. Если флэшка - (hd0), то жесткий диск будет (hd1). Выполняем

или же

Во втором случае видим сообщение, что файловая система неизвестна. Это нормально. Передаем управление по цепочке

и даем команду на запуск

и попадаем в искомый загрузчик.

Создание дополнительных меню загрузки

В этом разделе мы рассмотрим создание своих собственных загрузочных меню со своей конфигурацией. Суть в том, что вместо уже знакомого нам grub.cfg можно загрузить другой файл конфигурации. Это позволяет создать дополнительное меню, совершенно другое — с другими пунктами, настройками. оформлением. Те, кто имел дело с установкой ArchLinux, могли заметить несколько подменю в grub установочного диска. Примерно такой метод мы и будем использовать. Итак, создадим наш новый файл конфигурации. Писать с нуля мы его, конечно же, не будем, а сотворим на основе имеющегося grub.cfg. Для чего скопируем последний, дав новое имя, например:

Поскольку файл скопируется с правами 444, выставим ему права на запись:

Теперь открываем его в любимом текстовом редакторе и начинаем ковырять. Если вы в достаточной мере знаете структуру grub.cfg и понимаете, какие строки что делают, можно значительно сократить свой файл, вырезав лишнее, и привести его к более удобочитаемому виду. Однако же, можно и не трогать руками все подряд, а изменить лишь интересующие параметры, что мы и проделаем. Для начала найдем строку set default=... (у меня это 13-я строка). Здесь можно задать пункт меню по умолчанию, указав или его номер или точное название. Далее отыщем строку set gfxmode... (24-я в моем случае). Здесь задается разрешение экрана в привычном формате WxH. Можно также указать глубину цвета, например 1024x768x32. Можно указать несколько вариантов, при этом если первый не сможет быть установлен, будет загружен второй, если и он не сработает - третий и т.д. Варианты перечисляются через запятую и без пробелов:

Теперь зададим время отображения меню. Для этого ищем строку set timeout, но именно ту, которая идет после else (36). Здесь и задается задержка в секундах. Установите -1 для отключения таймера. Настроим оформление нашего меню. Для задания фонового изображения найдем строку с if background_image... (45). (здесь подразумевается, что в вашем grub.cfg используется фоновое изображение. Если нет - смотрите пример файла в конце этого раздела). После команды background_image прописан путь к файлу картинки. Поменяйте его на нужный файл (обратите внимание, что разрешение картинки должно соответствовать заданному выше разрешению экрана! Но не обязательно, только чревато низким качеством фона). Строкой ниже мы можем задать цвета текста. Правятся они точно так же, как и в /etc/grub.d/05_debian_theme (подробнее о цветах читайте в главе II, раздел настройка цвета пунктов меню).

Еще можно проделать один интересный трюк: уберите строки с set color_highlight и else. Теперь настройка будет такой: color_normal задает цвет/фон текста сверху и снизу (версия grub и комментарии) и текста в консоли menu_color_normal отвечает за цвет пунктов меню и фон прямоугольника, в котором они находятся menu_color_highlight задает цвет/фон выделенного пункта меню. Закончив с настройкой, перейдем собственно к пунктам. Ниже идут пункты из вашего grub.cfg. Измените их, удалите ненужные и добавьте новые, пересортируйте на свой вкус. Ниже будет приведен пример с немного отредактированными тремя пунктами загрузки. Настроив свой файл, сохраните его. Теперь нам нужно добавить возможность загрузить его вместо grub.cfg. Для этого в последний нужно будет добавить еще один пункт, что мы сделаем через /etc/grub.d/40_custom. Для смены файла конфигурации в grub2 используется команда configfile. Ей мы и воспользуемся, добавив в 40_custom запись такого вида:

Если ваш путь к файлу отличается - исправьте его. Если вы используете отдельный boot-раздел, путь будет таким: /grub/custom.cfg. Также учтите, что 40_custom должен заканчиваться пустой строкой! Если вы хотите, чтобы ваше новое меню загружалось вместо стандартного grub.cfg, установите новый пункт в качестве пункта по умолчанию. Также можете установить таймаут для grub.cfg в 0/etc/default/grub), но перед этим рекомендую протестировать свежеиспеченное меню на работоспособность. Обновите свой grub.cfg выполнив

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

Пример файла "custom.cfg"

Ниже я приведу в качестве образца то, что получилось у меня (файл сильно урезан до необходимого минимума):