Руководство по grub

Ссылки по теме

  • Процесс загрузки Arch
  • Главная загрузочная запись
  • Таблица разделов GUID
  • Unified Extensible Firmware Interface (Русский)
  • GRUB Legacy (Русский)
  • GRUB/EFI examples

GRUB (GRand Unified Bootloader) — мультисистемный модульный программируемый кроссплатформенный загрузчик с поддержкой сети, множества файловых систем, таблиц разделов, логических томов, образов и архивов.

Текущая версия GRUB — GRUB 2 — не использует код старой ветки GRUB 0.9x (GRUB Legacy) и создана на основе проекта PUPA.

Предисловие

Релиз GRUB-2.00 уже вышел, но разработка продолжается. В репозиториях Arch Linux появляюся самые свежие, в том числе и бета-версии GRUB, поэтому переустанавливать загрузчик (командой grub-install) и особенно обновлять файл конфигурации (командой grub-mkconfig) следует с осторожностью.

Если вы хотите стабильности — не переустанавливайте без необходимости загрузчик и не запускайте генератор конфига. Пакет grub сам по себе содержит лишь утилиты и файлы, необходимые для установки и настройки загрузчика, и обновления пакета не затрагивают загрузчик. Однако, существует некоторый риск в отношении файла grub.cfg, см. Защита конфигурации.

Если вы не хотите использовать GRUB2, можно установить GRUB Legacy из AUR.

Замечание для текущих и бывших пользователей GRUB Legacy

  • Для пользователей, непривычных к шелл-коду, в GRUB2 существует утилита grub-mkconfig уровня ОС, для автоматического создания файла конфигурации загрузчика с типовым меню.
  • Однако и без автоматического конфигуратора настройка GRUB2 не сложнее, чем GRUB Legacy.
  • Обозначения устройств в GRUB2 отличаются от таковых в GRUB Legacy. Разделы теперь нумеруются с 1 (как в Linux), а диски по-прежнему с 0. Например, первый раздел первого диска в GRUB2 обозначается как hd0,1.
  • Существуют различия между командами GRUB Legacy и GRUB2. Подробнее о командах можно прочесть в этой статье и в официальном руководстве по GRUB2.
  • GRUB2 теперь модульный, и не имеет постоянных образов stage1_5 и stage2. Роль stage1_5 в GRUB2 играет образ core.img/core.efi, при каждой установке загручика собираемый из ядра GRUB2 и модулей, необходимых для доступа к файловой системе. Остальные модули загружаются из ФС по мере надобности, расширяя функциональность загрузчика.

Требования к диску

Загрузчик в BIOS

Сама по себе BIOS, как правило, не требует наличия на диске каких-либо таблиц разделов.

Примечание: Некоторые реализации BIOS могут проверять содержимое MBR, чтобы определить тип носителя (особенно это относится к USB-дискам и флешкам). Носитель без MBR, или носитель с очень маленьким первым (по номеру) разделом типа FAT, может быть ошибочно принят некоторыми версиями BIOS за USB-флоппи-дисковод, что может сделать невозможной нормальную загрузку с него.

Примечание: Некоторые реализации BIOS могут отказаться запускать код загрузчика, если ни один из разделов MBR не отмечен флагом «bootable». Несмотря на это, BIOS может запустить код загрузчика только из бут-сектора диска (сектор MBR), но не раздела, а после запуска кода GRUB уже не важно, на какой из разделов установлен флаг.

Участие BIOS в процессе загрузки сводится к считыванию с диска его начального сектора размером в 512 байт, проверке наличия в конце сектора сигнатуры 55AA, и запуску содержимого как исполняемого кода. Так как в 512 байт невозможно уместить сколь-нибудь сложную программу, единственное, что может сделать код начального сектора – загружать с диска другие сектора, на чтение файлов он не способен.

Поэтому, для успешной загрузки в режиме BIOS, используемый способ разметки диска должен предусматривать:
1) встраивание кода загрузчика в начальный сектор;
2) выделение на диске специальной, не занятой файловыми системами области (группы секторов), из которой будет загружаться стартовый образ загрузчика, умеющий читать хотя бы одну файловую систему.

Программа установки GRUB2 умеет встраивать код BIOS-версии загрузчика на диски с таблицами разделов MBR и GPT, которые удовлетворяют обоим требованиям.

В обоих случаях, для встраивания используются два образа:

  • boot.img, код которого встраивается в начальный сектор диска,
  • core.img, собираемый программой установки из ядра GRUB и модулей доступа к используемой на диске таблице разделов и файловой системе.

Требования GRUB2-BIOS к MBR

Сама по себе таблица разделов на диске с разметкой MBR занимает 68 байт в конце начального сектора диска, последние два байта занимает «загрузочная» сигнатура 55AA. Оставшиеся 442 байта с начала сектора – и есть то место, в которое встраивается код загрузчика из образа boot.img.

Для встраивания образа загрузчика core.img на диск с MBR, используется промежуток между начальным сектором с MBR и самым первым (по расположению) разделом. Если ближайший к началу диска раздел начинается с сектора 63 или больше,

# fdisk -l /dev/sda
...
Device    Boot     Start       End    Blocks  Id System
/dev/sda1             63   2120579   1060258+ 82 Linux swap / Solaris
...

то в большинстве случаев этого места (31КБ) вполне достаточно для встраивания GRUB2. Размер образа core.img зависит от размера модулей для чтения используемых таблицы разделов и ФС. В частности, для комбинации MBR+ext4 он составляет всего 25КБ.

Однако, в некоторых более сложных случаях, размер образа может оказаться больше 31КБ, и тогда отступа в 63 сектора уже не хватит. Поэтому современные версии fdisk по-умолчанию предлагают создавать первый раздел с гораздо большим отступом (1МБ), начиная с 2048 сектора.

Требования GRUB2-BIOS к GPT

Начальный сектор диска с разметкой GPT зарезервирован, как ни странно, для MBR, которая обычно используется для совместимости, но точно так же оставляет в секторе те же 442 байта, достаточные для встраивания кода загрузчика из boot.img. Сама GPT располагается на следующих секторах.

В отличии от MBR, GPT предусматривает возможность создания на диске специального раздела для встраивания BIOS-загрузчика. Раздел BIOS boot partition имеет GUID=21686148-6449-6e6f-744e656564454649, и может быть создан в fdisk как раздел типа 4, или в gdisk как раздел типа EF02. Этот раздел не должен содержать никакой файловой системы, иначе она будет затёрта при установке загрузчика. Номер раздела может быть любым, расположение также практически любым. На больших дисках рекомендуется располагать BIOS boot partition в пределах первых 2ТБ, поскольку средства BIOS, скорей всего, не позволят прочесть более дальние сектора.

Если такой раздел на диске с GPT создан, программа установки GRUB2 автоматически найдёт его и использует для встраивания стартового образа BIOS-версии загрузчика. Минимальные требования к размеру раздела те же, что и для просвета перед первым разделом в случае MBR – на это место должен поместиться образ core.img. Так как расположение BIOS boot partition не привязано к началу диска, создать его с размером порядка 1МБ будет несложно, и более чем достаточно в любом случае.

Загрузчик в UEFI

В отличии от BIOS, UEFI загружает образ загрузчика из файла, и поэтому предъявляет определённые требования к таблице разделов, разделу, файловой системе, и к содержимому загружаемого файла.

Таблица разделов
Большинство реализаций UEFI поддерживает таблицы разделов GPT и MBR. Некоторые, однако, могут не поддерживать MBR, а некоторые могут поддерживать другие таблицы разделов, специфичные для производителя.
Загрузочный раздел
Загрузочный раздел UEFI называется «EFI system partition», он же ESP, он же EFISYS. На каждом диске может быть не более одного такого раздела.

  • В GPT он должен иметь тип EF00 (GUID=C12A7328-F81F-11D2-BA4B-00A0C93EC93B), и может располагаться в любом месте диска под любым номером.
  • К загрузочному разделу в MBR требования более жесткие: он должен одновременно иметь тип EF, флаг «bootable«, и быть первым.
Файловая система
Большинство реализаций UEFI работают с загрузочным разделом с файловой системой FAT любой разрядности – FAT12, FAT16 и FAT32. Некоторые реализации могут требовать только FAT32, некоторые могут поддерживать другие ФС, специфичные для производителя.
Загрузочный образ
Загружаемый файл должен быть оформлен как EFI-приложение, а значит иметь унаследованный от DOS и Windows бинарный формат MZ/PE (Portable Executable) и соответствовать архитектуре UEFI. Все реализации UEFI для платформы PC имеют архитектуру x86_64, а значит и сборка загрузчика обязательно должна быть под эту архитектуру. Сборка загрузчика под i386 может быть полезна только на некоторых специфических машинах, в основном это старые компьютеры фирмы Apple, а также некоторые миниатюрные устройства на мобильных SoC производства Intel.
Имя файла по-умолчанию
UEFI архитектуры x86_64 автоматически находит на загрузочном разделе и запускает файл EFIBOOTBOOTX64.EFI, который может быть стартовым образом загрузчика.
Загрузочные записи
На загрузочный раздел можно записать больше одного EFI-приложения, каждое под своим именем и в свой каталог. Чтобы можно было запускать их при старте, UEFI обычно предоставляет через специальный программный интерфейс доступ к загрузочным записям – особым переменным (UEFI Variables), хрянящимся в энергонезависимой памяти материнской платы (NVRAM). Каждая загрузочная запись содержит:

  • видимый в пользовательском интерфейсе UEFI заголовок,
  • тип таблицы разделов,
  • ID таблицы разделов,
  • расположение и размер загрузочного раздела,
  • путь к исполняемому файлу EFI-приложения.
Кроме самих загрузочных записей, в NVRAM задаётся порядок их проверки при загрузке, который может быть изменён пользователем.
Программа установки GRUB2 будет пытаться создать загрузочную запись с помощью пакета efibootmgr, сохранив в ней параметры для запуска созданного ей образа загрузчика.

Рекомендации по установке загрузчика

Выбор раздела

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

  • Только в тех случаях, когда Arch Linux установлен на диск, недоступный для чтения средствами BIOS или UEFI, которыми пользуется загрузчик, либо если для корневого раздела использована слишком новая, экзотическая, или зашифрованная файловая система, не читаемая GRUB2, может потребоваться вынос каталога /boot на отдельный диск либо раздел, и установка загрузчика на него.
  • Если загрузчик в состоянии прочесть корневой раздел, создание отдельного раздела для /boot не нужно и не рекомендуется.

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

  • Не требуется монтировать этот раздел в /boot или переносить в него образы ядра – GRUB2 и так может загрузить их практически из любого раздела.
  • Не следует переустанавливать загрузчик без особой необходимости – от него зависит загрузка всех ОС на машине.
  • Не рекомендуется использовать для общесистемного загрузчика генератор конфигурации – даже если забыть о его «сырости» и ненадёжности, скорей всего, конфигуратор будет работать только в одной системе, а в остальных всё равно придётся редактировать конфиг загрузчика. Вносить правки гораздо легче в простой и понятный конфиг, чем в громоздкий продукт деятельности конфгуратора.

Выбор таблицы разделов

  • Если на диске уже есть таблица разделов, и её возможностей для ваших целей достаточно, то нет никакого смысла её менять.
  • Если вы устанавливаете систему на чистый диск, и выбираете таблицу разделов, то с точки зрения установки GRUB2 предпочтительнее GPT, которая позволяет выделить для встраивания загрузчика раздел в любом месте диска. Это общая рекомендация, она действительна как для BIOS, так и для UEFI.
  • Если на этот диск планируется установка ОС, не поддерживающих GPT, но поддерживающих MBR, вам придётся выбрать MBR, или в крайнем случае, гибридную разметку диска MBR+GPT.

Важно: Ни одна из версий Windows в режиме BIOS не поддерживает загрузку с GPT.
Версии Windows, поддерживающие UEFI, имеют по два варианта загрузки (и загрузчиков): только с MBR в режиме BIOS, и только с GPT в режиме UEFI. См. Windows.

  • Если на диске уже имеется MBR, но в ней недостаточно места перед первым разделом для встраивания GRUB2, и освобождение этого места проблематично, одним из выходов может стать преобразование MBR в GPT, например, с помощью программы gdisk. После этого на диске можно в любом доступном месте создать BIOS boot partition, и использовать её для встраивания загрузчика.
  • Если UEFI вашей машины поддерживает загрузку только с GPT, выбор очевиден.
  • Если вы устанавливаете Arch Linux на переносной носитель (флешку или USB-диск), то для универсальности вы можете использовать на ней GPT, и установить в неё сразу две сборки GRUB2 – i386-pc и x86_64-efi. В этом случае на носителе понадобится создать два загрузочных раздела – EFISYS для UEFI, и BIOS boot partition для BIOS. Файлы со сборками для каждой из архитектур установятся в отдельные каталоги внутри grub/, и не помешают друг другу. Файл конфигурации тоже можно использовать общий, но тогда для некоторых специфических настроек и действий понадобятся дополнительные проверки, описанные ниже.
  • Если требуется сохранить возможность использования переносного носителя в Windows, включая XP, после создания на нём GPT и установки UEFI-загрузчика, можно использовать для этого гибридную разметку GPT+MBR, с описанием в последней только FAT-раздела с данными, и обязательно под номером 1. Остальное место на носителе в MBR должно быть покрыто «защитными» разделами с кодом 0xEE. Сделать всё это можно программой gdisk. GRUB2 в этом случае будет устанавливаться всегда только на GPT.

Установка

Установка GRUB2 в процессе установки Arch Linux

Чтобы установить GRUB2 в процессе установки, предварительно требуется смонтировать корневой раздел устанавливаемого Arch, (а в него boot-раздел, если требуется), и выполнить команду arch-chroot.

Установка пакета

Файлы и утилиты для установки GRUB2 содержатся в пакете grub, и устанавливаются командой

pacman -S grub

Установка загрузчика

Установка BIOS-версии загрузчика

Полноценная установка для BIOS
  • Для установки GRUB2 нужно выполнить команду от root:
grub-install /dev/sda

где /dev/sda это устройство (не раздел!) для установки загрузочных образов GRUB. Файлы загрузчика будут установлены в каталог /boot. Код GRUB (boot.img) будет встроен в начальный сектор, а загрузочный образ core.img – в просвет перед первым разделом MBR, или BIOS boot partition для GPT.

  • Если при выполнении команды происходит ошибка, попробуйте добавить —recheck в аргументы как показано ниже:
grub-install --recheck /dev/sda
  • Если требуется установить файлы загрузчика в другой каталог, его можно указать в опции —boot-directory . С этой опцией можно легко установить GRUB2 на диск с другой системой (устанавливаемой или исправляемой) без чрута, достаточно правильно указать текущий путь к смонтированному каталогу для установки и текущее имя устройства, примерно так:
grub-install --boot-directory=/mnt/boot /dev/sdb
  • Если нужно установить BIOS-версию загрузчика из-под системы, загруженной в режиме UEFI, требуется принудительно задать программе установки нужную сборку GRUB:
grub-install --target=i386-pc /dev/sda
Генерация загрузочного образа для BIOS без установки

Новые версии GRUB2 генерируют загрузочный образ core.img, который может быть загружен не только кодом бут-сектора, но и другими загрузчиками (GRUB2, GRUB Legacy, syslinux), в качестве ядра, совместимого со стандартом Multiboot. Например, другой экземпляр GRUB2 может запустить его командой multiboot, а GRUB Legacy командой kernel.

Чтобы заставить программу установки GRUB2 сгенерировать готовый образ grub/i386-pc/core.img, но не устанавливать его в таблицу разделов, можно применить вот такой хак:

grub-install --grub-setup=/bin/true /dev/sda

Обычно программа установки вызывает сначала grub-mkimage (передавая ему множество параметров, что неудобно делать вручную), чтобы сгенерировать образ, а потом запускает grub-bios-setup, чтобы установить boot.img и core.img в таблицу разделов. С помощью ключа —grub-setup можно подсунуть программе установки вместо grub-bios-setup заглушку (команду true), которая всегда возвращает код успешного завершения.

Установка UEFI-версии загрузчика

В режиме UEFI

Если Arch x86_64 уже загружен в режиме UEFI, системный загрузочный раздел EFI уже создан и смонтирован в /boot/efi, а efibootmgr уже установлен и работает, для установки загрузчика остаётся выполнить команду

grub-install

Программа установки сгенерирует стартовый образ GRUB2, оформленный в виде EFI-приложения, скопирует его в файл /boot/efi/EFI/arch/grubx64.efi, файлы загрузчика будут записаны в каталог /boot/grub/, в том числе модули в /boot/grub/x86_64-efi/, после чего будет сделана попытка с помощью efibootmgr создать в переменных UEFI загрузочную запись «arch» со ссылкой на файл EFIarchgrubx64.efi, которую можно будет выбрать при следующей загрузке и установить её по-умолчанию.

  • Опция —boot-directory задаёт путь, по которому будет установлен каталог grub/, и где grub-install будет искать каталог efi/ с загрузочным разделом EFI. По-умолчанию этот путь равен /boot. Если вы хотите установить каталог с файлами загрузчика в другое место, например в корень, используйте команду вида
grub-install --boot-directory=/
В этом случае файлы загрузчика установятся в каталог /grub, а загрузочный раздел раздел должен быть предварительно смонтирован в /efi.
  • Опция —efi-directory принудительно задаёт каталог, в который смонтирован загрузочный раздел EFI. С её помощью можно указать точку монтирования этого раздела, не привязанную жестко к расположению каталога grub/.
  • Опция —bootloader-id задаёт «ID загрузчика» – имя, под которым будет создаваться загрузочная запись GRUB, видимая при выборе варианта загрузки в интерфейсе UEFI. Под этим же именем в загрузочном разделе будет создан каталог с образом GRUB2. По-умолчанию это имя arch .

Используя эти опции вместе, при желании можно установить файлы загрузчика непосредственно в загрузочный раздел EFI, например так:

grub-install --efi-directory=/boot/efi --boot-directory=/boot/efi/EFI --bootloader-id=grub

В этом примере загрузочный раздел EFI с каталогом EFI/ заранее смонтирован в /boot/efi, а ID загрузчика полностью совпадает с именем каталога «grub». Поэтому и образ, и файлы загрузчика будут установлены в один и тот же каталог EFI/grub/ на загрузочном разделе. Соответственно, в этом случае стартовый образ будет установлен в /boot/efi/EFI/grub/grubx64.efi, конфиг загрузчика должен быть в /boot/efi/EFI/grub/grub.cfg, а модули в каталоге /boot/efi/EFI/grub/x86_64-efi/.

Без доступа к UEFI
  • Если нужно установить EFI-версию GRUB2, действуя из системы, загруженной в режиме BIOS, либо в режиме UEFI для другой архитектуры, либо на сменный носитель (флешку или переносной диск), требуется принудительно задать программе установки нужную сборку загрузчика с помощью опции —target .
  • Кроме того, в этом случае не будет работать efibootmgr, и создать загрузочную запись со ссылкой на стартовый образ загрузчика из этой системы не удастся. В такой ситуации можно использовать дефолтный загрузочный путь EFIBOOTBOOTX64.EFI, по которому UEFI самостоятельно найдёт стартовый образ, с помощью опции —removable :
grub-install --target=x86_64-efi --removable
Опции —boot-directory и —efi-directory можно добавлять при надобности, как описано выше, их действие не изменится.
  • Аналогично можно установить GRUB2 на флешку для загрузки в режиме UEFI:
grub-install --boot-directory=/mnt/sdb2/boot --efi-directory=/mnt/sdb1 --target=x86_64-efi --removable
В случае переносного носителя создание загрузочной записи в UEFI бессмысленно, поскольку загрузка будет происходить на другой машине, и использование дефолтного пути к загрузочному образу остаётся единственным вариантом.
  • Если вы не хотите или не можете использовать для GRUB дефолтный путь на загрузочном разделе, можно использовать опцию —no-nvram , чтобы программа установки поместила загрузочный образ в отдельный (не дефолтный) каталог, но не пыталась вызывать efibootmgr:
grub-install --target=x86_64-efi --no-nvram

Примечание: В этом случае вам придётся самостоятельно создать в переменных UEFI загрузочную запись с актуальным путём к загрузочному образу GRUB, с помощью UEFI Shell или иных средств, либо запускать этот образ из другого загрузчика.

Из 32-битного Arch

Если на машине есть UEFI, но установленный Arch Linux имеет архитектуру i686, установить UEFI-версию GRUB можно, но есть дополнительное затруднение – сборка загрузчика x86_64-efi отсутствует в пакете «grub» для архитектуры i686. В пакете же для архитектуры x86_64 присутствуют все три сборки:

  • i386-pc для BIOS,
  • i386-efi для 32-битных прошивок UEFI (встречается редко, в основном это старые машины фирмы Apple, некоторые HDMI-стики),
  • x86_64-efi для 64-битных UEFI.

Перед тем, как устанавливать UEFI-версию GRUB из системы i686, придётся сначала скачать пакет grub для x86_64, и распаковать из него (под рутом) недостающую сборку загрузчика:

tar xvf /путь/grub-версия-x86_64.pkg.tar.xz -C / usr/lib/grub/x86_64-efi

После этого можно устанавливать загрузчик, как описано в предыдущей главе «Без доступа к UEFI».

Установка в LVM

Установка GRUB2 на диск с LVM происходит в целом так же, как и на диск без LVM.

GRUB2 читает файловые системы из логических томов LVM, как и из обычных разделов, поэтому никакого отдельного раздела /boot вне LVM для файлов GRUB2 и загружаемых им образов ядра не требуется. Однако, для встраивания стартовых образов GRUB2 по-прежнему нужна таблица разделов.

Для загрузки в режиме BIOS, в MBR никаких дополнительных разделов создавать не нужно, достаточно единственного раздела на весь диск, полностью отданного под LVM, и оставленного свободного места перед разделом для встраивания загрузчика.

Для загрузки в режиме UEFI, или загрузки с GPT в любом режиме, требуется как минимум один загрузочный раздел вне LVM для стартового образа GRUB2, но не для файлов загрузчика, и не для образов ядра (не /boot ).

Подробнее см. Требования к диску.

Установка на образ диска

В некоторых случаях может понадобиться установить GRUB2 на образ диска, например, для загрузки в виртуальной машине.
К сожалению, в нынешних версиях (на конец 2015г) программа установки загрузчика grub-install по-умолчанию считает loop-устройство, через которое подключается образ, не имеющим разделов, а потому не ищет на нём таблицу разделов, и не включает в начальную загрузку модуль чтения таблицы разделов.

Возможно, в будущем это будет исправлено, а пока для обхода проблемы требуется явно потребовать добавить соответствующий модуль: опцией --modules=part_msdos для MBR, или --modules=part_gpt для GPT.

Пример установки GRUB2 на образ диска с MBR, и размещением файлов загрузчика в каталоге /grub на первом разделе:

[root@host ~]# losetup --show -P -f /home/user/VM/disk.img
/dev/loop0
[root@host ~]# ls -1 /dev/loop0*
/dev/loop0
/dev/loop0p1
/dev/loop0p2
[root@host ~]# mkdir -p /mnt/part1
[root@host ~]# mount /dev/loop0p1 /mnt/part1
[root@host ~]# grub-install --modules=part_msdos --boot-directory=/mnt/part1 /dev/loop0

Переустановка загрузчика

Переустановка пакета не переустанавливает загрузчик.

Переустановка GRUB2 выполняется командой grub-install, и ничем не отличается от установки.

Переустановка GRUB2 может потребоваться в следующих случаях:

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

Переустановка GRUB2 не требуется:

  • При изменении файла конфигурации загрузчика.
  • При обновлении ядра, установке другого ядра, или пересборке initramfs.
  • При смене архитектуры установленного Arch с i686 на x86_64 без смены раздела и без форматирования корневой ФС.
  • При обновлении пакета «grub».

Перенос загрузчика

Загрузчик GRUB состоит из двух частей: (внефайлового) загрузочного кода в таблице разделов и файлов в каталоге /grub (/boot/grub).

Вне зависимости от того, какие из этих частей переносятся, при переносе обязательно нужно переустановить загрузчик с помощью grub-install .

Если загрузчик переносится на другой диск, также может потребоваться изменение настроек BIOS/UEFI, чтобы загрузка начиналась с этого диска.

Загрузчик GRUB не читает fstab и игнорирует флаг bootable в MBR, поэтому любые манипуляции с ними не имеют никакого отношения к установке, переустановке или переносу GRUB.

После установки

В настоящее время GRUB2, сразу после установки, готов к работе только в режиме консоли. (Это будет продолжаться до тех пор, пока мейнтейнеры пакета «grub» не заменят бессмысленный дефолтный файл конфигурации загрузчика на рабочую статическую или автоматически генерируемую версию.)

Чтобы получить при загрузке действующее меню GRUB2, требуется заменить файл grub.cfg самостоятельно. Речь об этом идёт в следующей части «Настройка».

Настройка

Главный файл конфигурации загрузчика

Главный файл конфигурации по-умолчанию находится в /boot/grub/grub.cfg.

  • Если вы пользуетесь автоматическим генератором конфигурации grub-mkconfig, не редактируйте главный файл конфигурации вручную – сгенерированный код пригоден для загрузки, но громоздок и неудобен для редактирования, а все изменения будут стёрты при запуске конфигуратора.
  • Соответственно, если вы собираетесь редактировать конфиг загрузчика сами – создайте его либо полностью заново, либо на основе примеров, и не пытайтесь запустить grub-mkconfig или использовать сгенерированный им код.

Автоматическая конфигурация (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, но и проверит конфигурацию на наличие ошибок.

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

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

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

  • GRUB_DEFAULT Номер или заголовок пункта меню, выбранного по-умолчанию
  • GRUB_TIMEOUT Время, после которого будет автоматически загружаться пункт по-умолчанию
  • GRUB_CMDLINE_LINUX Параметры ядра Linux, добавляемые во все пункты меню.
  • GRUB_CMDLINE_LINUX_DEFAULT Параметры ядра Linux, добавляемые только в пункты меню, сгенерированные без «recovery». В Arch Linux настройки автоконфигуратора по-умолчанию содержат GRUB_DISABLE_RECOVERY=true, поэтому фактически в каждый пункт меню добавляются параметры из обех упомянутых строк.

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

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

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

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

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

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

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

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

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

В Arch Linux не используется версионное обновление ядер – имена образов ядра и initramfs для каждого пакета с ядром не меняются при обновлении, и файл конфигурации загрузчика не обновляется при обновлении ядра.

Более того, возможности скриптов GRUB2 позволяют средствами самого загрузчика, прямо перед загрузкой ОС, генерировать меню с переменным количеством строк, для поиска и загрузки всех установленных ядер Arch 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-mkconfig -o /boot/grub/menu.cfg

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

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

chattr +i /boot/grub/grub.cfg

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

chattr -i /boot/grub/grub.cfg

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

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

/etc/pacman.conf
NoUpgrade = boot/grub/grub.cfg

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

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

mv /boot/grub /
grub-install --boot-directory=/ /dev/sda

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

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

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

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

grub-mkconfig -o /grub/grub.cfg

Синтаксис файла конфигурации GRUB

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

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

/boot/grub/grub.cfg
set timeout=5
menuentry "Arch Linux" {
 linux /boot/vmlinuz-linux root=LABEL=Arch_root rw
 initrd /boot/initramfs-linux.img
}

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

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

  • Строки или продолжения строк, начинающиеся с символа # , считаются комментариями.
  • В GRUB2 используются обозначения дисков вида hdX и разделов вида hdX,Y , где X номер диска, Y номер раздела на нём. Нумерация разделов начинается с единицы (как в ядре Linux), нумерация дисков – с нуля. Если обозначение диска или раздела используется само по себе, например в переменной root, оно пишется без скобок.
  • Пути к файлам могут начинаться с обозначения диска или раздела в скобках, например (hd0,1)/boot/vmlinuz соответствует файлу vmlinuz в каталоге /boot на разделе /dev/sda1
  • Если в пути к файлу не указан диск или раздел, подразумевается текущий диск или раздел из переменной root . При запуске GRUB2 эта переменная уже указывает на раздел, где хранятся все файлы загрузчика, и как правило, образы ядра и initramfs. Задавать переменную root в конфиге имеет смысл ТОЛЬКО для загрузки с ДРУГОГО раздела. Пример:
set root=hd0,1 # задаём раздел с другой ОС или другим загрузчиком
chainloader +1 # загружаем его бут-сектор
  • Кроме файлов, GRUB2 позволяет обращаться напрямую к цепочкам секторов на диске или разделе, в формате X+Y , где X номер начального сектора цепочки, а Y количество секторов. Если цепочка начинается с первого (номер 0) сектора, её обозначение сокращается до +Y. Наиболее употребительная цепочка в конфигах GRUB – бут-сектор раздела или диска, обозначается как +1
  • В обозначении раздела перед его номером может стоять слово, обозначающее его принадлежность к таблице разделов определённого типа, например hd0,msdos3 означает третий раздел в MBR на нулевом диске, а hd1,gpt2 означает второй раздел в GPT на следующем диске. GRUB2 всегда добавляет тип таблицы при выводе разделов командой ls и при записи $prefix в процессе установки, однако писать тип таблицы вручную не требуется – он определяется автоматически. Исключение может составлять только особо тяжелый случай двух разных таблиц разделов с разной нумерацией на одном диске, причём гибрид GPT+MBR таким случаем не является – GRUB2 игнорирует MBR, если на диске обнаружена GPT.
  • Команда menuentry генерирует один пункт меню. Она задаёт видимый заголовок и список команд, которые выполнятся после выбора этого пункта меню:
menuentry "Заголовок" {
# команды
}
  • Переменная default задаёт номер или заголовок пункта меню, выбранного по-умолчанию. Например, set default=1 выбирает второй пункт. Пункты меню нумеруются с нуля.
  • Переменная timeout определяет время в секундах, по истечении которого будет загружен пункт меню по-умолчанию, например, set timeout=5.

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

  • Команда linux загружает образ ядра и параметры для него.
  • Команда initrd загружает образ начальной корневой ФС. Если образов указано несколько, они будут загружены по очереди. Например, образ для обновления микрокода процессоров Intel загружается перед основным образом:
initrd /boot/intel-ucode.img /boot/initramfs-linux.img
  • Команда 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 , как и прописан в параметрах ядра.
/boot/grub/grub.cfg
# по-умолчанию выбран пункт меню 0
set default=0

# при бездействии пользователя он загрузится через 5 секунд
set timeout=5

# пункт меню номер 0
menuentry "Arch Linux" {
 linux /vmlinuz-linux root=/dev/sda3 rw
 initrd /initramfs-linux.img
}

# пункт меню номер 1
menuentry "Windows XP" {
 chainloader (hd0,1)+1
}

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

menuentry "Arch Linux" {
 linux /boot/vmlinuz-linux root=/dev/sda3 rw
 initrd /boot/initramfs-linux.img
}

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

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

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

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

head="Arch linux"

Примечание: В примерах конфигов в этой статье слово set использовано при присвоении встроенных переменных GRUB2, чтобы их было проще отличать от обычных, пользовательских переменных. На самом деле, использование set при присвоении не требуется ни для каких переменных.

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

unset timeout

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

export a b c

Примечание: Некоторые встроенные переменные GRUB2, в частности root и lang, имеют свойство экспортироваться автоматически.

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

  • Команда source (часто обозначается просто точкой .) выполняет другой конфиг без смены контекста, после чего продолжает выполняться текущий. Пример:
. $prefix/custom.cfg
  • Команда configfile запускает новый конфиг в новом контексте:
configfile /boot/grub/new.cfg

Примечание: Переменная prefix при запуске GRUB содержит полный путь к каталогу, в который установлен загрузчик. Задавать её явно обычно не требуется, однако $prefix удобно использовать при обращении к другим конфигам, так как именно в этом каталоге находится grub.cfg, и как правило, дополнительные файлы конфигурации.

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

Примечание: Несмотря на название, можно использовать команду submenu и без создания нового меню, просто для смены контекста. В большинстве примеров этой статьи команда submenu использована только для того, чтобы локально менять текущий раздел в переменной $root, не затрагивая других пунктов меню в случае возврата.

Примечание: В принципе, ничто не мешает создавать пункты меню и внутри menuentry, однако в этом случае новые пункты будут будут добавляться не в новое, а прямо в текущее меню.

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

UUID

Примечание: Автоматический конфигуратор использует UUID по-умолчанию. Если вы хотите, чтобы он использовал классические имена устройств (например, если у вас нет initramfs), вы можете запретить конфигуратору использовать UUID, раскомментировав в /etc/default/grub строку
GRUB_DISABLE_LINUX_UUID=true

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

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

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

probe --set=UUID --fs-uuid $root

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

menuentry "Arch Linux" {
 probe -s UUID -u $root
 linux /boot/vmlinuz-linux root=UUID=$UUID rw
 initrd /boot/initramfs-linux.img
}

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

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

menuentry "Arch Linux" {
 UUID=355ccb5c-99e1-400d-b612-451f9247e35e
 search --fs-uuid $UUID --set root
 linux /boot/vmlinuz-linux root=UUID=$UUID rw
 initrd /boot/initramfs-linux.img
}

Метки

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

e2label /dev/sda3 Arch_root      # ставим метку на ext2/3/4
swaplabel -L Arch_swap /dev/sda2 # ставим метку свап-разделу
mkswap -L Arch_swap /dev/sda2    # если свап "старый", пересоздаём с меткой
ntfslabel /dev/sda1 WindowsXP    # ставим метку на NTFS
fatlabel /dev/sda5 OTHERDATA     # ставим метку на FAT

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

menuentry "Arch Linux" {
 linux /boot/vmlinuz-linux root=LABEL=Arch_root rw
 initrd /boot/initramfs-linux.img
}

Примечание: Если вы используете метки для поиска разделов при загрузке, позаботьтесь об их уникальности. К примеру, метки Arch, root или my_disk уникальностью не отличаются.

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

menuentry "Arch Linux" {
 search --label Arch_root --set root
 linux /boot/vmlinuz-linux root=LABEL=Arch_root rw
 initrd /boot/initramfs-linux.img
}

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

LVM

  • При использовании GRUB2 на LVM, как правило, никаких дополнительных команд в конфиге GRUB не требуется, достаточно просто передать ядру в параметре root= обозначение группы и тома LVM, принятое в Linux, то есть /dev/mapper/Group-Name:
menuentry "Arch Linux" {
 linux /vmlinuz-linux root=/dev/mapper/Arch-Root rw
 initrd /initramfs-linux.img
}

или /dev/Group/Name:

menuentry "Arch Linux" {
 linux /vmlinuz-linux root=/dev/Arch/Root rw resume=/dev/Arch/Swap
 initrd /initramfs-linux.img
}
  • Только если GRUB находится на разделе, отдельном от раздела с ядрами, то есть не на корневом, и не на boot-разделе, может потребоваться указать ему нужный раздел с образами ядра и imitramfs. Группа и том LVM в формате GRUB2 задаются так:
set root=lvm/Group-Name
  • И только если GRUB2 установлен не на LVM, а образы ядра он должен прочесть с тома LVM, может также потребоваться предварительно загрузить его модуль командой insmod :
menuentry "Arch Linux" {
 insmod lvm
 set root=lvm/Arch-Root
 linux /vmlinuz-linux root=/dev/mapper/Arch-Root rw
 initrd /initramfs-linux.img
}

Загрузка других операционных систем

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

Если вы используете автоконфигурацию GRUB, но хотите, чтобы в генерируемый конфиг добавлялись ваши пункты меню, написанные вручную, отредактируйте файл /etc/grub.d/40_custom и допишите их в конец этого файла. Всё его содержимое будет добавлено в конфиг загрузчика при запуске grub-mkconfig

GNU/Linux

В этом примере другой дистрибутив Linux загружается с раздела sda2:

submenu "Other Linux" {
 set root=hd0,2
 linux /boot/vmlinuz # добавьте сюда все нужные опции ядра
 initrd /boot/initrd.img # файл initrd, если он используется
}

Windows

Операционные системы Windows не поддерживают протокол Multiboot, и GRUB не может загружать Windows непосредственно. Чтобы загрузить Windows, нужно запустить её собственный загрузчик, который, в свою очередь, загружает ядро Windows и набор необходимых для старта драйверов, по списку, который он читает из реестра Windows.

Для BIOS и для UEFI в одной и той же версии Windows используются две различных версии загрузчика, каждая со своими особенностями. Windows, установленная в режиме BIOS, не имеет UEFI-загрузчика и не стартует в режиме UEFI, и наоборот – будучи установленной в режиме UEFI, Windows не стартует режиме BIOS.

Windows в режиме BIOS

Загрузчик Windows для режима BIOS поддерживает только одну таблицу разделов – MBR, и не поддерживает GPT, независимо от версии Windows. Кроме того, 32-битная версия Windows XP может быть запущена только в режиме BIOS.

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

menuentry "Windows" {
 chainloader (hd0,2)+1
}

либо напрямую из его файла, специальной командой ntldr

submenu "Windows XP" {
 set root=hd0,2
 ntldr /ntldr
}

В Windows Vista и выше файл загрузчика называется иначе, но может быть загружен той же командой:

submenu "Windows 7" {
 set root=hd0,3
 ntldr /bootmgr
}
Windows в режиме UEFI

Загрузчик Windows, установленной в режиме UEFI, поддерживает только одну таблицу разделов – GPT, и не поддерживает MBR.

Если GRUB2 установлен в режиме UEFI, его стартовый образ лежит в том же ESP/EFISYS разделе, что загрузчик Windows. Полный путь к стартовому образу GRUB2 режима UEFI указывает переменная $cmdpath с содержимым вида (диск,раздел)/EFI/каталог/grubx64.efi.
Чтобы из этого пути получить диск и раздел, можно регулярным выражением обрезать скобки и путь, и записать результат в переменную $root. После этого загрузчик Windows запускается командой chainloader, как обычное EFI-приложение:

submenu "Windows 8" {
 regexp -s root '((.+))' "$cmdpath"
 chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

Запуск FreeDOS

Аналогично командам linux и ntldr, в GRUB предусмотрена возможность прямой загрузки ядра FreeDOS, командой freedos, без использования оригинального загрузочного кода в MBR и бут-секторе:

menuentry "FreeDOS" {
 freedos /KERNEL.SYS
}

Это может быть удобно, когда требуется скопировать уже установленную, к примеру, на флешку, FreeDOS, используемую для запуска MHDD и подобных инструментов.
Такой способ загрузки позволяет под Linux копировать файлы и каталоги однажды установленной FreeDOS на другие носители, в том числе «мультизагрузочные».
(Установка FreeDOS штатным способом, с записью её загрузочного кода в MBR и бут-сектор, требует каждый раз загружать саму FreeDOS, хотя бы в виртуальной машине.)

Запуск программ, работающих без ОС

Memtest86+

Тест памяти memtest86+ (версия для BIOS):

menuentry "Memtest86+" {
 linux16 /boot/memtest86+/memtest.bin
}

Он же, но для UEFI (пакет memtest86+-efi):

menuentry "Memtest86+" {
 linux /boot/memtest86+/memtest.efi
}
EFI-приложения

EFI-приложения можно запускать не только из интерфейса UEFI, но и из других EFI-приложений, в том числе из UEFI-версии GRUB2, с помощью команды chainloader. На примере загрузчика Windows это уже показано выше.

Чтобы запустить EFI-приложение, вовсе не обязательно класть его на раздел EFISYS, особенно если приложение большое, а на спецразделе очень мало места. Достаточно, чтобы файл приложения читался средствами GRUB, а переменная root указывала на EFISYS. В этом примере UEFI Shell запускается прямо из /boot:

submenu "UEFI Shell" {
 archroot=$root
 regexp -s root '((.+))' "$cmdpath"
 chainloader ($archroot)/boot/Shell.efi
}

При выходе из UEFI Shell вы снова увидите меню GRUB.

Debian, Ubuntu и другие дистрибутивы с версионным обновлением ядра

В дистрибутивах с версионными ядрами, при каждом обновлении ядра автоматически вызывается генератор конфигурации загрузчика, поскольку имена загрузочных образов vmlinuz и initrd меняются при каждом обновлении. Это обстоятельство вынудило разработчиков Debian и Ubuntu сделать автоконфигуратор даже для первой версии GRUB, в которой обычно использовались только статические конфиги.

Если другой дистрибутив установлен на отдельный диск (в режиме BIOS), и имеет собственную установку GRUB2, для его загрузки достаточно запустить другой загрузчик:

menuentry "Ubuntu" {
 chainloader (hd1)+1
}

В режиме UEFI несколько загрузчиков могут быть установлены и на один диск, и запускаться один из другого как EFI-приложения:

submenu "Ubuntu" {
 regexp -s root '((.+))' "$cmdpath"
 chainloader /EFI/ubuntu/grubx64.efi
}

В некоторых случаях (не всегда) другую установку GRUB2 можно запустить в режиме BIOS с помощью команды multiboot, минуя встраивание образа в таблицу разделов:

sunmenu "Other Linux" {
 set root=hd0,6
 multiboot /boot/grub/i386-pc/core.img
}

К сожалению, часто встречается ситуация, когда другой дистрибутив установлен в режиме BIOS на тот же самый диск, в таблицу разделов которого можно установить только один загрузчик, и запустить второй проблематично. В этом случае остаётся либо использовать GRUB из состава того дистрибутива, либо учить штатный загрузчик Arch Linux работать с версионными ядрами.

Самый простой способ это сделать – подсунуть «своему» GRUB конфиг от чужого, в котором всё уже предусмотрено, не забыв перед этим сбросить некоторые переменные, которые могут вызвать проблемы:

submenu "Ubuntu" {
 unset lang
 unset gfxmode
 set root=hd0,2
 configfile /boot/grub/grub.cfg
}

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

. $prefix/ubuntu.cfg

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

usettings.cfg
uroot=hd0,2
boot=/boot
opts="root=LABEL=Ubuntu_root ro resume=LABEL=SwapU"
hpref="Ubuntu"

Сам скрипт:

ubuntu.cfg
function usave {
 if [ "$1" != "$usel" ] ; then
  usel="$1"
  save_env usel
 fi
}

function umenu {
 . $prefix/usettings.cfg

 kpref=$boot/vmlinuz-
 ipref=$boot/initrd.img-

 load_env
 default="$hpref $usel"
 if [ -n "$2" ] ; then default="$default $2" ; fi

 kernels=
 for kfile in "$uroot$kpref"* ; do
  k=
  regexp -s k "$kpref"'(.+)' "$kfile"
  kernels="$k $kernels"
 done

 for k in $kernels ; do
  ifile="$uroot$ipref$k"
  if [ -f "$ifile" ] ; then
   head="$hpref $k"
   if [ -n "$2" ] ; then head="$head $2" ; fi
   menuentry "$head" --source="usave $k
linux $uroot$kpref$k $opts $1
initrd $ifile"
  fi
 done
}

submenu "Ubuntu" --hotkey=u {
 insmod regexp

 submenu "Recovery mode" --hotkey=r {
  umenu "recovery nomodeset" "recovery mode"
 }

 umenu
}

Этот скрипт в конфиге GRUB динамически генерирует отдельное подменю со всеми имеющимися ядрами Ubuntu, и отдельно (для Ubuntu) запоминает последнее выбранное ядро.

Прямая загрузка из образа диска

GRUB2 может загружать образы ядер ОС в том числе из файлов-образов, отображаемых в псевдоустройство командой loopback. Однако следует иметь в виду, что псевдоустройство действует только в пределах загрузчика. В общем случае загрузка из образа выглядит примерно так:

loopback loop файл-образа
linux (loop)/путь/к/vmlinuz параметры
initrd (loop)/путь/к/initrd

После отображения образа в loop-устройство (имя может быть любым, не только loop), можно средствами GRUB2 обращаться с ним так же, как и с физическими дисками – не только загружать файлы ядра и initrd, что происходит перед загрузкой, а к примеру, прочитать метку ФС образа (требуется для образа Arch):

probe -s isolabel -l loop

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

  • Установочный образ Arch требует метку ФС образа в параметре ядра archisolabel=, и линуксовое устройство раздела, на котором он лежит, в параметре img_dev= (универсальнее всего прочесть и передать его UUID, но можно использовать и метку, если она есть).
  • Образ Ubuntu довольствуется лишь путём к образу на диске, а остальное находит сам.

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

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

Arch Linux ISO

В этом примере GRUB2 загружает официальный установочный образ Arch Linux.

grub.cfg
dir=
arch=x86_64
insmod regexp               # для шаблонов * в именах файлов
probe -s root_uuid -u $root # получаем UUID для подстановки в img_dev=

for iso in $dir/archlinux-*-$arch.iso ; do      # ищем образ(ы) Arch по шаблону
 if [ ! -f "$iso" ] ; then continue; fi        # только если образ существует
 regexp -s build 'archlinux-(.+)-'$arch "$iso"  # получаем из имени образа дату сборки

  menuentry "Arch Linux ISO $build $arch" --source="
loopback loop $iso
probe -s isolabel -l loop
linux (loop)/arch/boot/$arch/vmlinuz archisolabel=$isolabel img_dev=/dev/disk/by-uuid/$root_uuid img_loop=$iso earlymodules=loop
initrd (loop)/arch/boot/$arch/archiso.img"

done

Файл образа с именем вида archlinux-YYYY.MM.DD-x86_64.iso должен лежать в корне раздела. В этом случае текст файла конфигурации можно использовать «как есть», без каких-либо правок – загрузчик сам определит конкретное имя образа (или образов), сам прочитает UUID раздела, метку образа, и при загрузке передаст всё это дистрибутиву через параметры ядра.

Если же вы хотите использовать для образа (образов) особый каталог, впишите путь к нему (относительно корня раздела) в строку dir=, например

dir=/images
Ubuntu desktop ISO

В этом примере GRUB2 загружает любые ISO-образы Ubuntu, кроме серверных. В сгенерированном меню будут варианты загрузки для всех найденных образов Ubuntu.

grub.cfg
dir=
insmod regexp

for iso in $dir/*ubuntu-*.iso ; do         # ищем образ(ы) Ubuntu
 if [ ! -f "$iso" ] ; then continue; fi    # только если образ существует
 regexp -s name '.*/(.+).iso' "$iso"                # выделяем только имя
 if regexp server "$name" ; then continue ; fi              # Ubuntu Server не трогаем, там всё иначе
 if regexp amd64 "$name" ; then efi='.efi' ; else efi= ; fi # для x86_64 образ ядра vmlinuz.efi

  menuentry "$name" --source="
loopback loop $iso
linux (loop)/casper/vmlinuz$efi boot=casper iso-scan/filename=$iso noeject --
initrd (loop)/casper/initrd.lz"

done

Как и в предыдущем примере, код не требует никаких правок, если файлы образов лежат в корне раздела, но можно вписать отдельный каталог для них в строку dir=

Загрузка образов с отдельного раздела встроенного диска

Если образы требуется загружать с некорневого раздела встроенного жесткого диска (например, /home ), можно использовать тот же код, создав для него подменю:

submenu "ISO boot" {
 dir=
 set root=hd0,5 # здесь нужно вписать настоящий номер раздела
 # или найти его по метке, например Arch_home:
 # search -s root -l Arch_home
 insmod regexp
 probe -s root_uuid -u $root
 arch=x86_64
 
 # вместо этой строки вставляем основной код, начиная с for
}

Если раздел требуется задать по UUID, можно сделать так:

submenu "ISO boot" {
 dir=
 root_uuid=ef6daeca-9278-40df-8c3b-55cf093ab215
 search -s root -u $root_uuid
 insmod regexp
 arch=x86_64
 
 # вместо этой строки вставляем основной код, начиная с for
}

Управление ходом загрузки

Так же, как и из Linux, из GRUB можно выполнить перезагрузку командой reboot и выключение командой halt

Кроме того, в режиме UEFI есть некоторые специфические действия.

Переход в интерфейс настроек UEFI

Не секрет, что на некоторых прошивках UEFI, особенно это относится к ноутбукам, может быть очень сложно попасть в интерфейс настроек UEFI путём нажатия при включении F2 или других клавиш, особенно если режим совместимости с BIOS (Legacy mode) полностью отключён или вообще отсутствует, а UEFI «видит» доступный загрузчик. Конечно, перезагрузиться в настройки UEFI можно и после загрузки Linux, например, консольной командой

systemctl reboot --firmware-setup

Но есть более быстрый способ: перейти в интерфейс UEFI прямо из загрузчика, для этого в GRUB есть специальная команда fwsetup

Другими словами, вы можете добавить в меню GRUB дополнительный пункт:

menuentry "UEFI Settings" {
 fwsetup
}

и выбрав его, сразу открыть настройки UEFI, без загрузки и перезагрузки ОС.

Защита загрузчика паролем

О защите загрузчика

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

Всё это может помочь при настройке и восстановлении системы, однако те же самые инструменты существенно облегчают любому посетителю взлом системы. Изменение параметров ядра может быть использовано для получения полномочий root без ввода пароля, а загрузка с внешнего носителя – для получения полного доступа ко всем незашифрованным данным.

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

Реализация паролей в GRUB2

Пользователи в GRUB2 делятся на три категории:

  • Гости, они же неавторизованные пользователи. Могут выполнять только не защищённые паролем пункты меню.
  • Авторизованные пользователи. Могут выполнять разрешенные для них пункты меню.
  • Администраторы. Имеют полный доступ – могут выполнять любые пункты меню, редактировать их перед выполнением, и открывать командный терминал.

Для управления доступом к пунктам меню, команды menuentry и submenu поддерживают следующие опции:
--users= позволяет задать список пользователей, которым разрешено выполнять этот пункт меню
--unrestricted разрешает выполнять этот пункт меню без авторизации.

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

Список администраторов задаётся в переменной superusers, например так:

set superusers=root

Пароль для каждого пользователя отдельно может быть задан в открытом виде командой

password пользователь пароль

либо в зашифрованном (хешированном) виде, командой

password_pbkdf2 пользователь хеш

Для хеширования пароля используется утилита grub-mkpasswd-pbkdf2. Запустив её и введя (дважды) пароль, можно получить его хеш, пригодный для вставки в конфиг GRUB2.

Чтобы защитить пароли и хеши от просмотра, можно задать права на файл с конфигом GRUB в виде root:root 600, либо вынести команды с паролями в отдельный файл

. $prefix/secret.cfg

и ограничить доступ только к нему.

Внедрение паролей в генерируемый конфиг

Конфигуратор grub-mkconfig сам не умеет ограничивать доступ к загрузчику, хотя и устанавливает права доступа к конфигу в -rw------- root root, что имеет смысл только для сохранения паролей.

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

cat << EOF

set superusers=root
password_pbkdf2 root grub.pbkdf2.sha512.10000.C2DDC47FC5C7341CE73DBD6728E8D29A.AA5A1DEA93E23358E908301439DEC488

EOF

Важно: После генерации такого конфига ВСЕ пункты меню станут доступны только администратору!

Более гибкая настройка доступа к загрузчику, например разрешение штатной загрузки системы без ввода пароля, возможна либо путём добавления своих пунктов меню с опцией --unrestricted в конец файла /etc/grub.d/40_custom, либо при самостоятельном написании всего конфига GRUB.

Пример конфига с паролями

Здесь «Arch Linux» разрешено загружать без авторизации, «Windows» разрешено загружать пользователю second с паролем dnjhjq, а активировать «Boot next disk», позволяющий загрузиться с подключённой флешки, может только администратор по имени root, который никому не сказал свой пароль.

set default=0
set timeout=5
set superusers=root

password second dnjhjq
password_pbkdf2 root grub.pbkdf2.sha512.10000.C2DDC47FC5C7341CE73DBD6728E8D29A.AA5A1DEA93E23358E908301439DEC488

menuentry "Arch Linux" --unrestricted {
 linux /boot/vmlinuz-linux root=LABEL=Arch_root rw resume=LABEL=Arch_swap
 initrd /boot/initramfs-linux.img
}

submenu "Windows" --users=second {
 set root=hd0,1
 chainloader +1
}

submenu "Boot next disk" {
 set root=hd1
 chainloader +1
}

Визуальная настройка

GRUB2 предоставляет возможность менять способы отображения и внешний вид меню.

Цвета меню

Цвета меню GRUB2 задаются в переменных menu_color_normal (общие цвета текста/фона) и menu_color_highlight (цвета текста/фона выделенной строки). Например, цвета по умолчанию для Arch задаются в конфиге GRUB (grub.cfg) так:

set menu_color_normal=light-blue/black
set menu_color_highlight=light-cyan/blue

или в настройках /etc/default/grub конфигуратора grub-mkconfig так:

GRUB_COLOR_NORMAL="light-blue/black"
GRUB_COLOR_HIGHLIGHT="light-cyan/blue"

Список доступных в GRUB2 цветов можно найти на сайте.

Скрытое меню

grub-mkconfig умеет «скрывать» меню так, что оно появляется на экране только при нажатии клавиши ESC до истечения таймаута. Чтобы использовать эту его возможность, нужно раскомментировать в /etc/default/grub строки

GRUB_HIDDEN_TIMEOUT=5
GRUB_HIDDEN_TIMEOUT_QUIET=true

В конфиг GRUB (grub.cfg) для получения аналогичного результата можно добавить такой код:

set timeout=5

echo -n "Press ESC to see the menu... "
if sleep --verbose --interruptible $timeout
then set timeout=0
else unset timeout
fi

Здесь не задаётся отдельный таймаут для скрытого и видимого меню, а используется общий из переменной timeout. После вывода надписи запускается ожидание sleep с в выводом обратного отсчёта --verbose и прерыванием по ESC --interruptible . Если отсчёт не был прерван, таймаут уменьшается до нуля set timeout=0, и меню проскакивает без вывода на экран. В противном случае таймаут отключается вообще unset timeout, чтобы отсчёт не начался повторно после показа меню.

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

Настройка параметров режима экрана

Проверка доступных режимов экрана

GRUB2 может работать в текстовом и графических режимах экрана. Актуальный список режимов доступных средствами BIOS или UEFI на конкретной машине, можно получить, выполнив команду videoinfo в консоли загрузчика. На разных машинах, с разными графическими адаптерами, прошивками и мониторами, этот список может существенно отличаться.

Выбрав нужный режим желательно предварительно его проверить с помощью команды videotest режим в той же консоли, примерно так:

videotest 1280x1024x32

Тестовая картинка должна отображаться на экране до нажатия на любую клавишу. Если вы видите её, значит тест пройден.

Примечание: Тест графики можно запускать только из текстового режима.

Важно: Автоматический генератор конфигурации включает графический режим по умолчанию, без проверки. Если графический режим уже задан в конфигурации неудачно и вы не видите на экране интерфейса GRUB2 при загрузке, включите текстовый режим в настройках конфигуратора.

Текстовый режим

GRUB2 стартует в текстовом режиме. Если нужно вернуться в текстовый режим из графического, можно использовать в скрипте конфигурации, или прямо в консоли GRUB, следующие команды:

unset lang
terminal_output console

Если вы используете автоматический конфигуратор, в настройках которого стоит auto по-умолчанию, загрузчик после старта будет переходить в графический режим. Чтобы изменить это поведение, можно задать для загрузчика текстовый режим:

GRUB_GFXMODE=console

или же задать текстовый режим только для загрузки ядра:

GRUB_GFXPAYLOAD_LINUX=text
Графические режимы

GRUB2 позволяет задать режим экрана для самого загрузчика в переменной gfxmode , и отдельно режим, который будет использоваться ядром Linux при загрузке, через переменную gfxpayload

Эти режимы могут быть разными:

grub.cfg
set gfxmode=1024x768x32
set gfxpayload=1280x1024x16
/etc/default/grub
GRUB_GFXMODE=1024x768x32
GRUB_GFXPAYLOAD_LINUX=1280x1024x16

или одинаковыми:

grub.cfg
set gfxmode=1280x1024x32
set gfxpayload=$gfxmode
/etc/default/grub
GRUB_GFXMODE=1280x1024x32
GRUB_GFXPAYLOAD_LINUX=keep

Также можно задать только один из них, не задавая другой.

Режим экрана для ядра Linux будет установлен в начале загрузки ядра, никаких модулей GRUB для этого специально загружать не требуется.

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

Существует также старый, специфический для BIOS, способ задать VESA-режим – через параметр ядра Linux vga, например vga=790

Возможные значения для параметра vga, в зависимости от количества цветов и пикселей на экране, можно найти в этой таблице

+-----+--------------------------------------------+
|     |  640x480    800x600   1024x768   1280x1024 |
+-----+--------------------------------------------+
| 256 | 0x301=769  0x303=771  0x305=773  0x307=775 |
| 32K | 0x310=784  0x313=787  0x316=790  0x319=793 |
| 64K | 0x311=785  0x314=788  0x317=791  0x31A=794 |
| 16M | 0x312=786  0x315=789  0x318=792  0x31B=795 |
+-----+--------------------------------------------+

Однако в некоторых версиях BIOS могут использоваться и другие коды режимов. Актуальные значения можно получить из вывода команды videoinfo в консоли GRUB или же выполнить в терминале запущенной ОС GNU/Linux команду

sudo hwinfo --framebuffer

Команда hwinfo доступна в репозитории community.

Графический режим, шрифт и обои

Установка переменной gfxmode сама по себе НЕ переключает GRUB в графический режим. Чтобы перейти в графику, требуется:

  • задать режим в переменной gfxmode
  • загрузить командой loadfont хотя бы один шрифт
  • загрузить модуль поддержки графического режима (vbe для BIOS, либо efi_gop и efi_uga для UEFI)
  • и модуль графического терминала gfxterm
  • после всего этого запустить графический терминал командой terminal_output gfxterm

GRUB2 поддерживает растровые шрифты в собственном формате pf2. Шрифт Unifont включен в пакет grub под именем unicode.pf2, и при установке загрузчика командой grub-install автоматически копируется в каталог /boot/grub/fonts

В графическом режиме GRUB2 также позволяет установить обои командой background_image . Поддерживаются изображения в форматах tga, png и jpeg, для каждого из них требуется предварительно загрузить соответствующий модуль. Максимальный поддерживаемый размер изображения зависит от вашего оборудования.

В настройках конфигуратора /etc/default/grub обои можно задать так:

GRUB_BACKGROUND=/boot/grub/themes/starfield/starfield.png

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

if [ "$grub_platform" = "pc" ] ; then
 insmod vbe                        # загружаем модуль для BIOS
else
 insmod efi_gop                    # или для EFI
 insmod efi_uga
fi
loadfont $prefix/fonts/unicode.pf2  # загружаем шрифт
set gfxmode=auto
insmod gfxterm                      # загружаем модуль графического терминала
terminal_output gfxterm             # эта команда запускает графику
insmod png                          # для этих обой требуется модуль png
background_image $prefix/themes/starfield/starfield.png

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

Важно: Не пытайтесь использовать русский язык в текстовом режиме! Если требуется возврат в текстовый терминал командой terminal_output console , следует предварительно отключить русский язык командой unset lang , иначе вместо надписей на русском останутся одни вопросы.

Чтобы использовать в GRUB свои шрифты, нужно предварительно конвертировать их в формат pf2. Для этого в состав пакета grub входит утилита grub-mkfont . Лучше всего она работает с растровыми шрифтами в формате BDF

grub-mkfont шрифт.bdf -o шрифт.pf2

и векторными в формате TTF

grub-mkfont шрифт.ttf -s размер -o шрифт.pf2
Установка шрифта на примере Terminus

Пакет terminus-font для GRUB не подходит, требуется скачать с официального сайта его исходники, они как раз в формате BDF. Далее остаётся распаковать архив, конвертировать файл со шрифтом нужного размера, и скопировать в каталог, доступный для GRUB:

 $ tar xf terminus-font-4.38.tar.gz
 $ cd terminus-font-4.38/
 $ ls *.bdf
ter-u12b.bdf  ter-u14v.bdf  ter-u18b.bdf  ter-u22b.bdf  ter-u28b.bdf
ter-u12n.bdf  ter-u16b.bdf  ter-u18n.bdf  ter-u22n.bdf  ter-u28n.bdf
ter-u14b.bdf  ter-u16n.bdf  ter-u20b.bdf  ter-u24b.bdf  ter-u32b.bdf
ter-u14n.bdf  ter-u16v.bdf  ter-u20n.bdf  ter-u24n.bdf  ter-u32n.bdf
 $ grub-mkfont -v ter-u16b.bdf -o ter-u16b.pf2
Font name: Terminus Bold 16
Max width: 8
Max height: 16
Font ascent: 12
Font descent: 4
Number of glyph: 879
 $ sudo cp ter-u16b.pf2 /boot/grub/fonts/

Пример фрагмента конфига GRUB со шрифтом Terminus и русским языком:

loadfont $prefix/fonts/ter-u16b.pf2
set gfxmode=auto
set lang=ru      # включаем русский язык
insmod vbe
insmod gfxterm
terminal_output gfxterm
Проверка загрузки шрифтов

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

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

loadfont $prefix/themes/тема/шрифт.pf2

При попытке загрузить несовместимый шрифт будут выдаваться сообщения об ошибках.

Графическая тема оформления

Даже после переключения в графический режим, меню GRUB отображается с помощью символов псевдографики. Альтернативный вариант отображения GRUB – графические темы оформления

Тема включает в себя файл описания theme.txt, а также может содержать элементы картинок для «рисования» меню, шрифты и обои.

В пакет grub входит дефолтная тема оформления, при установке командой grub-install она копируется в каталог /boot/grub/themes/starfield/ . Тему для GRUB требуется прописывать в виде полного пути к файлу описания темы. В настройках конфигуратора /etc/default/grub это делается так:

GRUB_THEME="/boot/grub/themes/starfield/theme.txt"

В файлах конфигурации GRUB путь к файлу описания темы требуется записать в переменную theme ДО переключения в графический режим. Чтобы тема могла использовать указанные в ней элементы, до перехода в графику также нужно загрузить модули для использованных в ней форматов картинок (чаще всего png) и загрузить все имеющиеся в ней шрифты.

Пример загрузки темы оформления, входящей в пакет grub:

dir=$prefix/themes/starfield # каталог с темой
set theme=$dir/theme.txt     # задаём файл описания
insmod regexp                # этот модуль позволяет использовать шаблоны в именах файлов
loadfont $dir/*.pf2          # загружаем по шаблону сразу все шрифты из темы
insmod png                   # модуль поддержки картинок
set gfxmode=auto
set lang=ru
insmod gfxterm
insmod vbe
terminal_output gfxterm      # включаем графику

Некоторые темы оформления GRUB можно найти в AUR.

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

Автоматизация в меню

Запоминание выбранного пункта меню

В настройках конфигуратора запоминание включается так:

/etc/default/grub
GRUB_DEFAULT="saved"
GRUB_SAVEDEFAULT="true"

Пример реализации запоминания в конфиге GRUB2 приведён ниже.

Однократная загрузка заданного без смены дефолта

Существует утилита grub-reboot, с её помощью можно из-под ОС запланировать однократную загрузку другого пункта меню, например так:

grub-reboot "Windows XP"

В генерированном меню это работает, если перед запуском grub-mkconfig в /etc/default/grub была строка

GRUB_DEFAULT="saved"

Пример реализации однократного выбора в конфиге GRUB2 приведён ниже.

Пример конфига GRUB с реализацией запоминания

set timeout=5
set default=0
load_env # восстанавливаем переменные из файла

if [ -n "$next_entry" ] ; then   # если задан временный выбор
 set default="$next_entry"       # временно подменяем дефолт
 unset next_entry                # и очищаем временный выбор
 save_env next_entry
fi                               # временный дефолт не сохраняем

export default    # на случай использования savedef внутри submenu

function savedef {     # Создаём функцию по имени savedef
 if [ -n "$1" ]               # выбор берём либо
  then def="$1"               # из первого параметра
  else def="$chosen"          # либо из $chosen, переменной GRUB
 fi                           # с заголовком выбранного пункта меню
 if [ "$def" != "$default" ] ; then   # Если выбор отличается
  set default="$def"                  # от текущего дефолта -
  save_env default                    # сохраняем его
 fi
 unset def
}                    # конец функции

menuentry "Arch Linux" {
 savedef
 linux /boot/vmlinuz-linux root=LABEL=Arch_root rw
 initrd /boot/initramfs-linux.img
}

menuentry "Arch Linux fallback" {
 savedef "Arch Linux" # в следующий раз выберется "Arch Linux"
 linux /boot/vmlinuz-linux root=LABEL=Arch_root rw
 initrd /boot/initramfs-linux-fallback.img
}

submenu "Windows XP" {
 savedef
 set root=hd0,1
 ntldr /ntldr
}

В данном примере используется предоставляемая GRUB2 возможность сохранения переменных между сеансами.

Команда load_env загружает из файла все сохранённые в нём переменные.

Команда save_env сохраняет указанные переменные в файл.

В переменную chosen после выбора пункта меню помещается его заголовок. При выборе пунктов вложенных меню, в переменную записывается весь «путь», состоящий из последовательно выбранных заголовков, разделённых знаком «>«. Например, если в подменю «Fallback» выбран пункт «Arch linux-lts», в переменной будет "Fallback>Arch linux-lts".

Также здесь используется объявление функции. Функция вызывается так же, как другие команды GRUB. При каждом вызове эта функция будет сравнивать свой параметр или заголовок выбранного пункта меню с переменной default, и если выбор отличается — записывать его в default и сохранять.

Переменные сохраняются в файле /boot/grub/grubenv . Так как GRUB не умеет корректно модифицировать файловые системы, файл должен быть заранее создан, а длина его при перезаписи не должна меняться, поэтому конец файла до нужной длины в 1024 байта всегда заполнен символами ### . Для просмотра и изменения при загруженной ОС сохранённых в этом файле переменных, настоятельно рекомендуется использовать утилиту grub-editenv, либо grub-reboot и grub-set-default.

Динамическое меню

Конфиг GRUB2 это скрипт, выполняемый загрузчиком. Он действительно генерирует, а не статически описывает меню загрузчика.

В этом примере загрузчик сам, «на лету», находит в /boot/ все установленные ядра Arch Linux и образы initramfs, правильно группирует их и формирует меню для их загрузки, а после выбора пункта меню запоминает его. При загрузке в параметры ядра подставляется автоматически найденный загрузчиком UUID корневого раздела.

В grub.cfg пишем только ссылку. (причину см. выше.)

/boot/grub/grub.cfg
. $prefix/main.cfg

Пользовательские настройки подключаются из отдельного файла settings.cfg

/boot/grub/settings.cfg
set menu_color_normal=white/blue
set menu_color_highlight=white/black
set timeout=5
set default=0

boot=/boot
probe -s UUID -u $root    # автоматически определяем UUID корня
opts="root=UUID=$UUID rw" # и подставляем его в параметры ядра
addimg=$boot/intel-ucode.img # включаем обновление микрокода CPU intel

load_env

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

/boot/grub/main.cfg
# Подключаем файл настроек
. $prefix/settings.cfg

# Поддержка однократного выбора
if [ -n "$next_entry" ] ; then
 set default="$next_entry"
 unset next_entry
 save_env next_entry
fi

export default

# Описываем функцию запоминания
function savedef {
 if [ -n "$1" ]
 then def="$1"
 else def="$chosen"
 fi
 if [ "$def" != "$default" ] ; then
  set default="$def"
  save_env default
 fi
 unset def
}

# Подключаем динамическое меню
. $prefix/dynamic.cfg

# Подключаем файл для дополнительных пунктов меню, если он есть
c="$prefix/custom.cfg"
if [ -f "$c" ] ; then
 . "$c"
fi

Скрипт поиска ядер и генерации меню:

/boot/grub/dynamic.cfg
insmod regexp

initrd=initrd
if [ -n "$addimg" -a -f "$addimg" ] ; then
 initrd="$initrd $addimg"
fi

kpref="$boot/vmlinuz-"
ipref="$boot/initramfs-"

kernels=
for kfile in "$kpref"* ; do
 k=
 regexp -s k "$kpref"'(.+)' "$kfile"
 kernels="$kernels $k"
done

for ifile in "$ipref"* ; do

 kname=
 for k in $kernels; do
  if regexp "$k" "$ifile" ; then
   if ! regexp "$kname" "$k" ; then continue; fi
   head="Arch $k"
   if regexp -s s "$k"'-(.+).img' "$ifile"
   then head="$head $s"; fi
   kname="$k"
  fi
 done

 if [ -n "$kname" ] ; then
  menuentry "$head" --source="savedef
linux $kpref$kname $opts
$initrd $ifile"
 fi

done

Консоль GRUB2

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

Нормальная консоль

Запуск консоли

Если вы видите в терминале GRUB2 приглашение вида grub> , значит вы попали в его нормальную консоль.

GRUB2 открывает нормальную консоль, если:

  • при загрузке не найден файл конфигурации grub.cfg;
  • файл конфигурации найден и выполнен, но в ходе его выполнения так и не было создано меню, и не была выполнена команда boot (см. ниже), либо её выполнение завершилось неудачно;
  • в меню загрузчика нажата клавиша «c«.

Команды, полезные в консоли GRUB2

Кроме уже описанных в части «Настройка», в консоли GRUB2 могут пригодиться:

  • Переменная pager . Присвоение ей единицы командой pager=1 поможет вам полностью читать вывод следующих команд, если он не помещается на экран.
  • Команда help . Без параметров выводит список всех поддерживаемых в текущей конфигурации команд загрузчика. При вызове вида help слово выводит справку по командам, в которых присутствует заданное слово. Например, команда help normal покажет справку по командам normal и normal_exit.
  • Команда ls без параметров выводит список дисков и разделов, доступных в данный момент загрузчику. С ключом -l показывает подробные сведения о каждом из них – размер, метку, UUID и тип файловой системы. С ключами -lh выводит размеры в «человекочитаемом» виде. С параметром в виде диска или раздела выводит сведения только о нём, например ls (hd0,1) выведет сведения о первом разделе на нулевом диске.
  • Команда ls с параметром в виде полного пути к каталогу выводит содержимое каталога. С ключом -l показывает подробные ведения о каждом файле и каталоге, с ключами -lh выводит размеры и даты в «человекочитаемом» фромате. К примеру, команда ls -lh /boot подробно выведет содержимое каталога /boot на текущем (в переменной root) разделе, а ls (hd0,1)/ покажет список файлов и каталогов в корневом каталоге раздела hd0,1.
  • Команда set без параметров. Выводит список всех переменных со значениями.
  • Команда echo аналогична такой же команде обычного шелла, и выводит всё, что в ней написано. Может использоваться для вывода переменных, например echo $cmdpath $prefix $root покажет значения трёх самых важных переменных загрузчика.
  • Команда cat аналогична одноимённой команде шелла, и выводит содержимое заданного файла в консоль. Так как перенаправления ввода-вывода GRUB2 не поддерживает, использовать её можно только для просмотра текстовых файлов, например, конфига самого загрузчика, fstab, и т.д.
  • Команда boot запускает образ ядра, другого загрузчика, или EFI-приложения, загруженный перед этим командами linux, initrd, ntldr, chainloader и некоторыми другими. В отличии от меню GRUB, где запуск загруженных образов происходит автоматически после завершения кода пункта меню, в консоли выполнение этой команды обязательно – без неё загруженный образ сам не запустится.

В нормальной консоли GRUB2 поддерживает возврат к предыдущим командам и автодополнение команд, каталогов и файлов по нажатию клавиши TAB, как в консоли Linux.

Пример загрузки Arch Linux из консоли загрузчика

Если вы успешно установили загрузчик в корневой раздел, но забыли создать конфиг загрузчика, вы увидите меню из дефолтного конфига, но оно не будет работать. Чтобы продолжить загрузку, вы можете войти в консоль, нажав клавишу «c«, и выполнить команды:

probe -s UUID -u $root
linux /boot/vmlinuz-linux rw root=UUID=$UUID
initrd /boot/initramfs-linux.img
boot

Пример загрузки с внешнего диска из консоли

Во многих версиях BIOS нет специального интерфейса для однократной загрузки с флешки. Для этого можно создать отдельный пункт меню, но на один раз проще обойтись консолью GRUB:

root=hd1
chainloader +1
boot

Пример конфига с загрузкой без меню

grub.cfg
set timeout=3

probe -s UUID -u $root
linux /boot/vmlinuz-linux rw root=UUID=$UUID
initrd /boot/initramfs-linux.img

if sleep -vi $timeout
then boot
fi

В этом примере GRUB2 загружает с диска образы ядра и initramfs, ждёт 3 секунды, и запускает ядро.

Если же в течении этих секунд пользователь нажмёт ESC, он попадёт в консоль загрузчика. Так как ядро уже загружено, для продолжения загрузки достаточно набрать команду boot в консоли.

Аварийная консоль

Если вместо меню или «шапки» нормальной консоли вы видите при старте загрузчика сообщение об ошибке и приглашение вида grub rescue>, значит вы попали в аварийную консоль.

Аварийная консоль GRUB2 встроена в стартовый образ загрузчика, и запускается в случаях, когда GRUB2 не может самостоятельно перейти в «нормальный» режим. Такое может случиться, если ядро GRUB2 при загрузке не нашло каталог со своими файлами и модулями по пути, указанному в переменной prefix.

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

В режиме аварийной консоли GRUB2 понимает всего 4 команды: set , unset , ls , и insmod . Повтор и автодополнение не поддерживаются, команда ls поддерживается в урезанном виде – без ключей и с выводом в сведениях о разделах только типа файловой системы, если она опознана. По-умолчанию в стартовый образ загрузчика включается модуль для поддержки таблицы разделов и файловой системы только для того раздела, на который устанавливается GRUB2. Остальные модули должны загружаться уже из файлов, если загрузчику удастся их найти.

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

Если вы попали в аварийную консоль, наберите для начала команду set. Вы увидите значения трёх главных переменных GRUB2. В переменной cmdpath будет обозначение диска, либо полный путь к EFI-файлу, из которого стартовал образ загрузчика. В переменной prefix будет тот путь, по которому должен был быть каталог с остальными файлами загрузчика. В переменной root будет текущий диск или раздел, скорей всего совпадающий с тем, что в $prefix. Попробуйте команды

ls
ls $root
ls $prefix

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

Если в переменной $root оказался не тот или несуществующий раздел, можно проверять командами вида ls (диск,раздел)/ каждый раздел из тех, что вывела первая команда, пока не найдётся нужный. Если он нашелся – к примеру, оказался hd0,msdos5 вместо hd0,msdos6, и читается – запишите его в переменные:

root=hd0,5
prefix=($root)/boot/grub

Если раздел правильный, а неправильный каталог (команда ls $prefix выдаёт ошибку или не то, что нужно), запишите в переменную правильный путь, допустим такой:

prefix=($root)/grub

Если у вас получилось найти правильный диск, раздел и каталог, и вы успешно прописали из в переменные, остаётся загрузить модуль «normal» и выполнить одноимённую команду (она станет доступна после загрузки модуля), чтобы перейти в «нормальный» режим загрузчика:

insmod normal
normal

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

Запуск GRUB2 из других загрузчиков

  • Загрузочный EFI-образ GRUB2 в режиме UEFI может быть запущен так же, как любое EFI-приложение.
  • Загрузочный образ BIOS-сборки GRUB2 новых версий может быть запущен по стандарту Multiboot из других загрузчиков. См. также главу «Генерация загрузочного образа для BIOS без установки».

Загрузка из старых версий GRUB

Код конфига для GRUB Legacy, с загрузкой GRUB2:

menu.lst
default 0
timeout 1

title       Chainload into GRUB v2
root        (hd0,7)
kernel      /boot/grub/i386-pc/core.img

Загрузка из syslinux

Пример загрузки GRUB2 из syslinux приведён в статье о нём.

Примеры исправления проблем

Сообщение о невозможности встраивания в MBR

grub-setup: warn: This msdos-style partition label has no post-MBR gap; embedding won't be possible!
grub-setup: warn: Embedding is not possible. GRUB can only be installed in this setup by using blocklists.
            However, blocklists are UNRELIABLE and its use is discouraged.
grub-setup: error: If you really want blocklists, use --force.

Эта ошибка может возникнуть, когда вы попытаетесь установить в виртуальную машину VMware. Читайте больше об этом здесь.

Это также может случится, если первый раздел начинается сразу после MBR, без необходимого места в 60 блоков перед первым разделом.

Смотрите также

  • Статья о GNU GRUB на Википедии
  • Официальное руководство пользователя GRUB (англ.)
  • Статья о GRUB на Ubuntu Wiki (англ.)
  • Загрузка на UEFI-системах (англ.)
  • Загрузочный раздел BIOS (англ.)
  • Настройка GRUB (англ.)
  • Загрузка с помощью GRUB (англ.)
  • Определение EFI-файлов и их загрузка с помощью GRUB (англ.)

Contents

  1. Introduction
  2. File Structure

    1. Main Directories & Files

      1. The Menu: /boot/grub/grub.cfg

        1. File Layout
        2. Editing grub.cfg directly
      2. User Settings: /etc/default/grub
      3. Scripts: /etc/grub.d/

        1. Script Descriptions
  3. Configuring GRUB 2

    1. /etc/default/grub

      1. Editing the File
      2. Specific Entries
      3. User-Assigned Variables
  4. Links
  5. External Links

GRUB 2 is the default boot loader for Ubuntu. GRUB 2’s method of building the GRUB menu is vastly different from GRUB 0.97. This page describes the new file structure and details how to the user can change the default settings used to create the boot menu.

The current version of GRUB is 1.99, which was introduced with Ubuntu 11.04, Natty Narwhal and is the version installed with 12.04, Precise Pangolin LTS. The documentation on this page applies to GRUB 1.99 unless otherwise noted. To determine your version, use grub-install -V.

Introduction

GRUB 2 builds its menu (grub.cfg) by running scripts found in the /etc/grub.d/folder and the settings in the /etc/default/grub file. This file is recreated automatically whenever the update-grub command is run. This command activates scripts which by default determine the status of the current Ubuntu OS and search the system for other operating systems which, if found, are added to the GRUB 2 menu. The update-grub

  • command can be invoked by a user with Administrator (root) privileges and is automatically run when GRUB 2 packages or the kernel is updated.

File Structure

GRUB 2 incorporates a totally revised directory and file hierarchy. The menu.lst of GRUB legacy is no longer used.

To find out where GRUB 2 is installed, the user can run the following commands:

  • Device: sudo grub-probe -t device /boot/grub

  • UUID: sudo grub-probe -t fs_uuid /boot/grub

From the GRUB 2 menu at boot, the user can also determine which Ubuntu is controlling the boot on a multi-OS system. By default, the first menuentry always lists an option from the installation which is in charge of GRUB 2. For example, if the first menuentry contains «on sda5, then the GRUB installed on sda5 OS is controlling the menu/boot.

Main Directories & Files

grub.cfg is the file which replaced GRUB 0.97’s menu.lst. This file contains the GRUB 2 menu information but unlike GRUB’s menu.lst the grub.cfg file is not normally edited directly. The file is the result of various scripts which build the menu in sections, with each script responsible for a specific part of the menu.

  • grub.cfg is updated by running the update-grub command as root.

    • The update-grub command is a stub for

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

    • If the user wishes to create a boot menu with a different name or path, use the full command with the -o switch.

  • grub.cfg is automatically rebuilt with kernel installations/removals, updates to some GRUB 2 packages, when update-grub is executed, or when other operations would affect the boot process.

  • The grub.cfg file is not created or updated when the grub-install command is run.

File Layout

  • Each section is clearly delineated with «(### BEGIN)» and references the script in the /etc/grub.d directory from which the information was generated. These sections are more fully explained in the Scripts section.

Editing grub.cfg directly

  • In the earliest versions of GRUB 2, not only was editing this file discouraged, it was made read-only even for «root». This changed and now the developers acknowledge that sometimes the user may wish to simply edit the file manually. Because of the automatic changes induced by update-grub however, manual edits are subject to being overwritten by the system.

    If grub.cfg is manually edited, here are some considerations:

    • The user will need to edit the file after each running of update-grub, updates of some GRUB 2 packages, and addition or removal of the main Ubuntu’s system kernels.

    • It is possible to «freeze» the current grub.cfg file by redirecting the update-grub command so that it doesn’t actually run. The versatility of GRUB 2 probably makes this option the least desirable.

    • The parts of grub.cfg which the user actually sees are generated by the /etc/grub.d scripts. The user can make one or more of those scripts non-executable and substitute a custom entry or edit the actual script. Either method allows menu customization while still permitting the system to update GRUB 2.

User Settings: /etc/default/grub

The entries in this file can be edited by a user with administrator (root) privileges and are incorporated into grub.cfg when it is updated. This configuration file contains information formerly contained in the upper section of GRUB Legacy’s menu.lst and items contained on the end of the kernel line.

While the most common settings are present in the default file, additional environmental settings are available for inclusion in this file. These include items such as backgrounds and themes. The pre-defined variables are contained in /usr/sbin/grub-mkconfig and can be listed using the following command:

  •  grep "export GRUB_DEFAULT" -A50 /usr/sbin/grub-mkconfig | grep GRUB_

Common settings are detailed in the Configuring GRUB 2 section.

Scripts: /etc/grub.d/

The scripts in this directory are read during execution of the update-grub command and their instructions are incorporated into /boot/grub/grub.cfg.

  • The placement of the menu items in the grub.cfg menu is determined by the order in which the files in this directory are run. Files with a leading numeral are executed first, beginning with the lowest number. 10_linux is run before 20_memtest, which would run before 40_custom. If files with alphabetic names exist, they are run after the numerically-named files.

  • Custom menu entries can be added to the 40_custom file or in a newly created file. Based on its name, 40_custom entries by default appear at the bottom of the menu. A custom file beginning with 06_ would appear at the top of the menu since its alphanumeric sorting would place it ahead of 10_ through 40_ files.

  • Only executable files generate output to grub.cfg during execution of update-grub. By default the files in the /etc/grub.d folder are executable.

Script Descriptions

  • 00_header Sets environmental variables such system file locations, video settings, and previously saved entries. It also imports preferences stored in /etc/default/grub. Users normally do not need to make changes to this file.

  • 05_debian_theme The settings in this file set the GRUB 2 background image, text colors, selection highlighting and themes. In the absence of a splash image, this file sets a monochromatic theme for the initial menu display. Information on how to set font renderings and splash images are discussed in the Grub2/Displays community documentation page.

  • 10_linux Identifies kernels on the root device for the operating system in use and creates menu entries for these items. This includes the associated recovery mode option if enabled. In GRUB 1.99 and later, only the latest kernel is displayed on the main menu page, with additional kernels included in a submenu. See the Grub2/Submenus page for information on this feature.

    Note: For earlier versions of GRUB 2, all kernels residing in the boot folder are included on the main menu. To reduce the number of displayed kernels, remove the older kernels from the /boot folder or use one of the available GRUB 2 customization applications.

  • 20_memtest86+ Searches for /boot/memtest86+.bin and includes it as an option on the GRUB 2 boot menu. There is currently no line option to remove this entry from the menu. The display of memtest86+ can be inhibited by removing the executable bit from this file and running update-grub.

    • sudo chmod -x /etc/grub.d/20_memtest86+
      sudo update-grub

  • 30_os-prober This script uses os-prober to search for Linux and other operating systems and places the results in the GRUB 2 menu.

    1. The file’s sections include options for Windows, Linux, OSX, and Hurd.
    2. Variables in this file determine the format of the displayed names in /boot/grub/grub.cfg and on the GRUB 2 menu. Users familiar with basic scripting can alter these variables to change the format of the displayed menu entries.

    3. The user can insert an entry into /etc/default/grub which disables this script (see Configuring GRUB 2). Removing the executable bit from the file will also prevent it from searching for other operating systems.

    4. By default os-prober ignores any disks that possess «dmraid» signatures, which can be listed via sudo dmraid -r -c (if installed).

    5. If the script finds another Ubuntu/Linux operating system, it will attempt to use the titles contained in the 10_linux section of that installation’s grub.cfg file. If not found, the script will construct a menuentry from the actual boot information it locates.

  • 40_custom A template for adding custom menu entries which will be inserted into grub.cfg upon execution of the update-grub command.

    1. The contents of this file, below the «exec tail -n +3 $0» line and the default comments, are imported directly into /boot/grub/grub.cfg without any changes.

      1. As the comments at the top of the file state, add custom lines below those already contained in the 40_custom file.

    2. The file can be renamed or copied. The file must be executable to be incorporated into the GRUB 2 menu.
      1. As mentioned in the introduction of this section, the name of the file determines the location of its contents in the GRUB 2 menu. As a general rule, if using numerals at the start it is advisable to allow the 00_header and 05_debian_theme scripts to be run before the first custom menu. These files contain no menuentries and thus will not interfere with a menuentry from a custom script with a lower priority.

Configuring GRUB 2

Configuration changes are normally made to /etc/default/grub and to the custom files located in /etc/grub.d. Any changes made directly to the /boot/grub/grub.cfg are overwritten whenever update-grub is executed either by the user or when called automatically by various system functions.

After editing /etc/default/grub or the scripts in the /etc/grub.d folder the user should run sudo update-grub to incorporate the changes into the GRUB 2 menu.

info.png Some of the most common changes, such as the default OS/kernel and menu timeout, can be changed from within a GUI applications such as Grub Customizer.

/etc/default/grub

This file contains basic settings which would be considered normal for the user to configure. Options include the time the menu is displayed, the default OS to boot, etc. The default options included in file upon installation are only a small number of the variables which GRUB 2 can recognize. The GRUB 2 defined variables can be identified using the command previously documented in the GRUB 2 Settings section or at the end of this section.

In addition to the defined variables, the user may introduce self-created variable(s) and use them in the scripts contained in the /etc/grub.d folder.

Editing the File

The grub file is a system file, therefore any editing must be done by a user with ‘Administrator/root’ privileges. The file is a simple text file and can be edited by any text editor. In Ubuntu the default text mode editor is nano and the graphical mode editor is gedit, and the file can be edited with one of the following commands. The «&» allows the terminal to be used to update GRUB 2 once the user saves the file.

  • sudo nano /etc/default/grub

or in graphical mode

  • gedit admin:///etc/default/grub &

After making changes and saving the file, the GRUB 2 menu must be updated to include the changes by running:

  • sudo update-grub

Specific Entries

This section details some of the entries available in the /etc/default/grub file. Much of this information can also be found by referring the the Gnu GRUB manual or on the system itself by running the following command:

  • info -f grub -n 'Simple configuration'

  • GRUB_DEFAULT=

    • Sets the default menu entry. Entries may be numeric, a complete menuentry quotation, or «saved»
      1. GRUB_DEFAULT=0 Sets the default menu entry by menu position. The first «menuentry» in grub.cfg is 0, the second is 1, etc.

        • Note: Grub 1.99 introduces a submenu menu structure. For a menu item in a submenu, the entry becomes a two-digit entry. The first entry is the position of the submenu title in the main menu. The second entry is the position within the submenu. If the submenu is the 3rd entry in the main entry, and the user wishes to boot the first entry in the submenu, it would be designated as «2>0». See the community documentation for a fuller explanation: Grub2/Submenus.

      2. GRUB_DEFAULT=»xxxx» An exact menu entry, including the quotation symbols, may also be used. In this case, location in the menu will not matter.

        • Example: GRUB_DEFAULT=»Ubuntu, Linux 2.6.31-9-generic»

        • Example (Submenu Entry): GRUB_DEFAULT=»2>Ubuntu, Linux 2.6.38-8-generic»

      3. GRUB_DEFAULT=saved The information in this section applies to GRUB 1.98 and later. The «saved» entry enables the «grub-reboot» and «grub-set-default» commands to set the default OS for future boots.

        • The default OS for future boots will not be set merely by selecting an OS when booting.

        1. grub-set-default Sets the default boot entry until changed.

          • The format is sudo grub-set-default X, with X being the menu entry position (starting with 0 as the first entry) or the exact menu string.

            • Example: sudo grub-set-default 3

            • Example: sudo grub-set-default «Ubuntu, Linux 2.6.32-15-generic»

          • To obtain the existing menu entry choice number (starting from 0) or the menu entry «string», run:
            • grep menuentry /boot/grub/grub.cfg

        2. grub-reboot This command sets the default boot entry for the next boot only. The format of the command is the same as for grub-set-default (see above).

  • GRUB_SAVEDEFAULT=

    • If set to true this setting will automatically set the last selected OS from the menu as the default OS on the next boot.

      • No commands need be run to set the default OS.
      • Any time a menu entry is manually selected from the GRUB 2 menu, it becomes the default OS.
      • This option currently does not work if your /boot directory resides on an LVM partition or RAID.
      • For this to work you must also set GRUB_DEFAULT=saved.

      Note: Ubuntu’s version of Grub 1.99 introduced the submenu feature. Designating a default boot option located in the Previous Linux versions submenu requires special formatting. For information regarding the submenu feature, please refer to Grub2/Submenus

  • GRUB_HIDDEN_TIMEOUT=0

    • Wait this many seconds for the user to press a key. During this period no menu is shown unless the user presses a key. If no key is pressed, control is passed to GRUB _TIMEOUT when the GRUB_HIDDEN_TIMEOUT expires. See the note regarding bugs to this feature at the end of this section.
      • The developers envisioned using this setting with a GRUB_TIMEOUT value of 0. This would give users a period of time (GRUB_HIDDEN_TIMEOUT) to display the menu by pressing a key, after which the system would boot without the menu being displayed (GRUB_TIMEOUT=0).
    • GRUB_HIDDEN_TIMEOUT=0

      • No menu is displayed. The system is immediately booted to the default OS.
      • This is the default setting with only one identified operating system.
        • To display the menu under this condition, place a # symbol at the start of the line and ensure the GRUB_TIMEOUT setting is a positive integer.

      • If the value is set to 0, a keystatus check is performed to determine if the SHIFT key is depressed. If GRUB 2 determines the SHIFT key is depressed during the boot process, the menu will be displayed. This gives the user a method of interrupting an automatic boot which would normally not display the menu.

    • GRUB_HIDDEN_TIMEOUT=X

      • X is a positive integer (e.g. 1, 5, 10, etc)

      • The boot process will pause and display a blank screen or the designated splash image for X seconds. At the end of the time period, the system will boot. No menu will be displayed.

      • While GRUB_HIDDEN_TIMEOUT is active, the menu can be displayed by pressing any key.
    • GRUB_HIDDEN_TIMEOUT=

      • No value entered after the = sign

      • The menu will be displayed for the number of seconds designated by GRUB_TIMEOUT.
    • GRUB_TIMEOUT_STYLE=menu

      • In newer Ubuntu [& family flavours] you should also modify this variable from hidden to menu in order to display the menu.

  • GRUB_HIDDEN_TIMEOUT_QUIET=true

    • Determines whether a countdown timer is displayed on a blank screen when using the GRUB_HIDDEN_TIMEOUT feature.

      • true No countdown is displayed. The screen will be blank.

      • false A counter will display on a blank screen for the duration of the GRUB_HIDDEN_TIMEOUT value.

      Note: There is a longstanding confirmed bug on the hidden menu feature in GRUB 1.97 to GRUB 1.99. The menu may not hide as specified in the description on this page. While editing the 30_os-prober script can fix this issue, it is beyond the scope of this page.

  • GRUB_TIMEOUT=10

    • Sets the time period in seconds for the menu to be displayed before automatically booting unless the user intervenes.
      • This instruction begins at the expiration of GRUB_HIDDEN_TIMEOUT.
      • Setting this value to -1 will cause the menu to display until the user makes a selection.
      • On a single OS system, by default this setting is not used and the menu will not display.
        • To display the menu on each boot:
          • Place a comment symbol (#) in front of the GRUB_HIDDEN_TIMEOUT entry

          • Make the GRUB_TIMEOUT value 1 or higher.
  • GRUB_DISTRIBUTOR=lsb_release -i -s 2> /dev/null || echo Debian

    • Retrieves the descriptive name in the menu entry. (Ubuntu, Xubuntu, Debian, etc.)
  • GRUB_CMDLINE_LINUX

    • Entries on this line are added to the end of the ‘linux’ command line (GRUB legacy’s «kernel» line) for both normal and recovery modes. It is used to pass options to the kernel.
  • GRUB_CMDLINE_LINUX_DEFAULT=«quiet splash»

    • This line imports any entries to the end of the ‘linux’ line (GRUB legacy’s «kernel» line). The entries are appended to the end of the normal mode only.
      • To view a black screen with boot processes displayed in text, remove «quiet splash». To see the grub splash image plus a condensed text output, use «splash».
  • #GRUB_TERMINAL=console

    • Uncomment to disable graphical terminal. This may provide help if the GRUB 2 menu is too large or unreadable. It also may help when using the GRUB_HIDDEN_TIMEOUT feature.
  • #GRUB_DISABLE_LINUX_UUID=»true»

    • Uncomment if you don’t want GRUB to pass «root=UUID=xxx» parameter to Linux
      • The search line will still use UUIDs. The linux line will use the /dev/sdXY convention when this option is enabled.

  • #GRUB_GFXMODE=640×480

    • GRUB 2 will automatically set the menu resolution to what it thinks is the best option. Uncommenting this line will set the resolution to 640×480, or you may change the value to another GRUB-compatible setting.
      • The setting applies only to the boot menu display, not the resolution of the operating system that boots.
        • Tip: Setting the same resolution in GRUB 2 and the operating system will decrease boot times slightly.
      • Although not required, the user can also specify the color bit depth by appending it to the resolution setting. An example would be 1280x1024x24 or 640x480x32.
      • The user can also add multiple resolutions. If GRUB 2 cannot use the first entry, it will try the next setting. Settings are separated by a comma. Example: 1280x1024x16,800x600x24,640×480.

      • If using a splash image, the resolution setting and the splash image size should be compatible for best results.
      • If using an entry that produces a «not found» message when running update-grub, try adding or changing the color bitdepth.

      • Resolutions available to GRUB 2 can be displayed by typing videoinfo in the GRUB 2 command line. The command line is accessed by typing «c» when the main GRUB 2 menu screen is displayed.

      • If this line is commented (#) or the resolution is unavailable GRUB 2 uses the default setting determined by /etc/grub.d/00_header.

        • In GRUB 1.99 (Natty) the ‘optimum’ resolution is selected by GRUB if no resolution is specified.
  • #GRUB_DISABLE_LINUX_RECOVERY=true

    • Allows the user to prevent the recovery options from inclusion on the GRUB 2 menu.
      • Uncomment (remove the # symbol) to prevent the «Recovery» mode kernel options from appearing in the menu. If you want a «Recovery» option for only one kernel, make a special entry in /etc/grub/40_custom.
  • GRUB_INIT_TUNE=»480 440 1″

    • Removing the comment symbol (#) allows GRUB 2 to play a single beep just prior to the Grub 2 menu display. More complex tunes can be designed by expanding the pitch/duration values.

      • The format is tempo [pitch1 duration1] [pitch2 duration2] …

        • tempo is set once and applies to all duration settings.

        • duration is the result of 60/tempo. A duration of 1 with a tempo of 60 would produce a 1 second beep. A duration of 1 with a tempo of 480 produces a .125 second beep.

      • Caution: The menu is displayed after the tune is complete. Creating a long tune will delay the appearance of the menu.
      • Online documentation is available by typing info grub —index-search play in a terminal. It mentions the ability to play a tune with the command play file if the tune is composed with little-endian numbers.

  • GRUB_BACKGROUND

    • Sets the background image, enter the full path to the image here. See splash image configuration above for further details and other options.
  • GRUB_DISABLE_OS_PROBER=true

    • This entry is used to prevent GRUB from adding the results of os-prober to the menu. A value of «true» disables the os-prober check of other partitions for operating systems, including Windows, Linux, OSX and Hurd, during execution of the update-grub command. Using this option rather than removing the executable bit from the /etc/grub.d/30_os-prober file has several advantages:

      • The setting can be easily changed while making other changes to the grub file.

      • While both methods prevent os-prober from running and placing items in the menu display, using this setting allows the 30_os-prober script, but not the os-prober command, to run. This script enables the GRUB_HIDDEN_TIMEOUT setting and/or the ability to display a hidden menu by pressing the ESC key (depending on other settings). This functionality is lost if the 30_os-prober script is disabled by making it unexecutable.

info.png To inspect the currenlty-available predesignated variables on your system’s GRUB 2 library files, run:

    • grep DEVICE -A40 /usr/sbin/grub-mkconfig

User-Assigned Variables

  • Variables in the /etc/default/grub file are read and acted upon as needed. This allows users to add their own variables in a central location and then alter the GRUB 2 scripts to meet their needs. Keeping the user-defined variables within this file allows easier management of, and change to, those variables when desired. To add a variable, use the following format:

    • export <VARIABLE>

  • The following example would define a variable used to omit a specific Ubuntu partition from the menu:
    1. Define and export the variable in /etc/default/grub :

      • export GRUB_EXCLUDE_PARTITION=»/dev/sda1″

    2. Establish the conditional in /etc/grub.d/30_os-prober in the 10_linux section:

      • if [ $GRUB_EXCLUDE_PARTITION = $LROOT ]; then

      • or
      • if [ ! $GRUB_EXCLUDE_PARTITION = $LROOT ]; then

      • Complete the conditional at the appropriate point in the script
    3. Save the files and run sudo update-grub to incorporate the changes into the GRUB 2 menu.

Links

  • Grub2

  • Grub2/CustomMenus

  • Grub2/Displays

  • Grub2/Installing

  • Grub2/Passwords

  • Grub2/Submenus

  • Grub2/Troubleshooting

  • Grub2/Upgrading

  • Grub2: chainload and multiboot

  • Grub 2 (Ubuntu Wiki)

External Links

  • GNU GRUB2 Manual

  • Grub Customizer (Launchpad)


CategoryBootAndPartition

Содержание

GRUBGRUB (GRand Unified Bootloader1)) — программа-загрузчик операционных систем.

GRUB является эталонной реализацией загрузчика, соответствующего спецификации Multiboot и может загрузить любую совместимую с ней операционную систему. Среди них: Linux, FreeBSD, Solaris и многие другие. Кроме того, GRUB умеет по цепочке передавать управление другому загрузчику, что позволяет ему загружать Windows (через загрузчик NTLDR), MS-DOS, OS/2 и другие системы.

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

GRUB позволяет пользователю при загрузке задавать произвольные параметры и передавать их в ядро Multiboot-совместимой ОС для дальнейшей обработки.

GRUB — самый популярный загрузчик в мире Linux и является загрузчиком по умолчанию в большинстве известных дистрибутивов.

Здесь и далее в иных статьях под названием программы GRUB подразумевается GRUB 2, который используется в операционных системах семейства Ubuntu начиная с версии 9.10, до него использовался GRUB первой версии, сейчас известный как GRUB Legacy. GRUB 2 полностью переписан с нуля и не имеет ничего общего с GRUB Legacy, разработка которого была остановлена в пользу более совершенного и мощного GRUB.

Первые шаги

При первом сравнении GRUB со старым GRUB Legacy самым весомым различием оказывается измененная структура файлов конфигурации.

Настройка GRUB производится теперь принципиально иным способом — основным файлом конфигурации является «/boot/grub/grub.cfg«. Однако же, не торопитесь править его так, как привыкли это делать с «menu.lst» в GRUB Legacy. При внимательном прочтении мы видим в начале файла «grub.cfg» такие строки:

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by /usr/sbin/grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

И об этом нас предупреждают не просто так. Ведь «grub.cfg» генерируется автоматически с использованием нескольких скриптов. Поэтому после следующего обновления GRUB ваш «grub.cfg» будет создан заново, и все ваши правки будут утрачены.

Кроме файла «grub.cfg», отвечающего за загрузочное меню, имеются файл «/etc/default/grub» и папка «/etc/grub.d«. Рассмотрим их подробнее.

/etc/default/grub

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

GRUB_DEFAULT=6
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT="2"
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
 
# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
 
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480
 
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
 
# Uncomment to disable generation of recovery mode menu entrys
#GRUB_DISABLE_LINUX_RECOVERY="true"

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

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

По умолчанию стандартный пункт (выделенный при показе меню) — верхний в списке. После установки Ubuntu она окажется наверху, а Windows, например, будет последним пунктом.

Значением «GRUB_DEFAULT» является номер пункта меню, который должен быть выбран стандартным. Чтобы выбрать другой пункт, нам нужно узнать, каким по счету он будет в списке. Есть два варианта:

  • Просмотреть содержимое «/boot/grub/grub.cfg» и сосчитать, какой по счету окажется нужная запись;

  • Перезагрузиться и более наглядно посмотреть меню загрузки.

Нумерация пунктов меню начинается с нуля. Значение по умолчанию — 0, поэтому и выбирается первый пункт.

Пятому сверху пункту будет соответствовать значение 4, второму — 1, первому — 0. В вышеприведенном примере установлено значение 6, то есть стандартным задан седьмой пункт меню.

В качестве значения можно указать saved. Это позволит использовать команды grub-reboot и grub-set-default для выбора пункта меню по-умолчанию при последующих перезагрузках. Например:

  • Команда sudo grub-reboot 1 однократно выбирает второй пункт меню по-умолчанию (только для следующей загрузки),

  • Команда sudo grub-set-default 2 выбирает на постоянной основе третий пункт меню по-умолчанию.

Или же можно указать значение идентификатора (id), оно должно быть именно таким, каким мы его видим в «/boot/grub/grub.cfg«. Данный способ удобен тем, что после обновления ядра не придется изменять настройки из-за сбившейся нумерации.

Пример

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

menuentry 'Example GNU/Linux distribution' --class gnu-linux --id example-gnu-linux {
        ...
     }

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

GRUB_DEFAULT=example-gnu-linux

Ранее документацией предлагалось указывать название пункта меню загрузки (так, как он отображается в самом меню). Хотя этот способ по-прежнему работает, использовать его не рекомендуется, поскольку эти названия могут меняться, например, при обновлении ядра/версии ОС

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

По умолчанию меню загрузки отображается 10 секунд (при наличии других установленных ОС, если система одна — GRUB по умолчанию не отображается и сразу начинает загрузку), после чего загружается стандартный пункт, если раньше не нажат Enter или не выбран другой пункт, что останавливает таймер. За эту задержку отвечает параметр «GRUB_TIMEOUT», значение задается в секундах.

Если поставить значение «-1», то меню будет отображаться до тех пор, пока пользователь не выберет какой-либо пункт

Обратите внимание, что цифра указывается в кавычках. В нашем примере это значение — 2, то есть меню отображается две секунды.

«Скрытое» меню

В случае, если на компьютере установлена только Ubuntu, меню загрузки по умолчанию не будет отображаться, а GRUB будет загружать вас напрямую в систему. Однако же, иногда может возникнуть необходимость загрузиться с другим ядром или же запустить проверку памяти. Для этого предусмотрено «скрытое меню» за него отвечает параметр «GRUB_HIDDEN_TIMEOUT».

В случае, когда установлены другие ОС, этот параметр закомментирован (# в начале строки). Данное значение позволит приостановит загрузку на заданное количество секунд, давая пользователю возможность вызвать меню загрузки, нажав Esc.

Если значение установлено в 0, то задержки не будет, однако вызвать меню можно, удерживая при загрузке Shift

Параметр «GRUB_HIDDEN_TIMEOUT_QUIET» отвечает за отображение таймера во время паузы. Если его значение «true» таймер отображаться не будет, а со значением «false» будет.

Чтобы GRUB отображал меню со списком установленных операционных систем, без нажатия клавиш вызова меню (например Shift или Esc) необходимо:

  • Открыть файл /etc/default/grub для редактирования:

sudo gedit /etc/default/grub
  • Выставить время до автоматической загрузки выделенной системы/ядра (например 10 секунд):

GRUB_TIMEOUT="10"
  • Чтобы меню GRUB отображалось, необходимо закомментировать следующую строчку (значком #):

#GRUB_HIDDEN_TIMEOUT=0
  • Применяем изменения командой:

sudo update-grub

Убираем подменю

Чтобы раскрыть все меню используем такой параметр:

GRUB_DISABLE_SUBMENU="y"

Это бывает нужно если хотим загружаться не с первой строчки.

Особые случаи

Поведение меню отличается от заданного переменными GRUB_TIMEOUT и GRUB_HIDDEN_TIMEOUT когда предыдущая загрузка не завершилась успехом или предыдущаяя загрузка происходила в режиме восстановления. Подробно это описано далее, в разделе «Защита от зацикливания на перезагрузке». Полную справку по параметрам файла настроек можно дав команду:

info -f grub -n 'Simple configuration'

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

Иногда бывает необходимо загружать ядро системы с какими-либо особыми параметрами (например, для корректной работы специфического оборудования). В этом случае весьма полезен будет параметр «GRUB_CMDLINE_LINUX_DEFAULT» он отвечает за те параметры, с которыми запускаются ядра при загрузке.
Его значение по умолчанию — «quiet splash»: происходит показ графической заставки при запуске системы без отображения какой-либо текстовой информации.

Вы можете добавить необходимые вам параметра запуска ядра, приведя это значение к виду «quiet splash your_param1 your_param2», то есть дописав через пробел нужные параметры.

Пример

Чтобы заменить графическую заставку во время загрузки на информацию о загрузке компонентов системы (это позволит проследить за процессом загрузки и выявить неполадки). Необходимо заменить строчку:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

На следующую:

GRUB_CMDLINE_LINUX_DEFAULT=""

/etc/grub.d

Эта папка содержит в себе скрипты, которые используются для создания файла «grub.cfg». При обновлении GRUB они находят все установленные на компьютере системы и ядра и формируют в файле «grub.cfg» меню загрузки, которое мы и видим. Два основных из них:

  • «10_linux» и «30_os-prober» отвечают за поиск Linux ядер и остальных ОС на других разделах соответственно.

  • Файл «40_custom» позволяет добавлять свои пункты загрузки. Это может быть полезно, если вы, например, хотите добавить какие-то особые варианты загрузки системы.

Файл «40_custom» должен заканчиваться пустой строкой, иначе последний пункт не будет отображаться в меню!

Пример

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

menuentry "Ubuntu, Linux 2.6.32-020632rc6-generic" {
        recordfail=1
        if [ -n ${have_grubenv} ]; then save_env recordfail; fi
	set quiet=1
	insmod ext2
	set root=(hd0,5)
	search --no-floppy --fs-uuid --set 0e717c2a-24bd-4abe-acfe-ecf98fc814f8
	linux	/boot/vmlinuz-2.6.32-020632rc6-generic root=UUID=0e717c2a-24bd-4abe-acfe-ecf98fc814f8 ro   quiet splash
	initrd	/boot/initrd.img-2.6.32-020632rc6-generic
}

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

echo "adding verbose mode" >&2
menuentry "Ubuntu, Linux 2.6.32.rc6 verbose-mode" {
        recordfail=1
        if [ -n ${have_grubenv} ]; then save_env recordfail; fi
	set quiet=1
	insmod ext2
	set root=(hd0,5)
	search --no-floppy --fs-uuid --set 0e717c2a-24bd-4abe-acfe-ecf98fc814f8
	linux	/boot/vmlinuz-2.6.32-020632rc6-generic root=UUID=0e717c2a-24bd-4abe-acfe-ecf98fc814f8 ro
	initrd	/boot/initrd.img-2.6.32-020632rc6-generic
}

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

Команды консоли GRUB

Чтобы попасть в консоль, нужно нажать клавишу C во время отображения меню загрузки.

ls

Довольно универсальная команда при использовании в чистом виде выдает список жестких дисков и разделов. Также она может быть использована как одноименная команда в Linux — для вывода содержимого папки. например:

ls /boot/grub

Еще одно полезное свойство комадны «ls» — она позволят получить информацию о любом разделе:

ls (hd0,5)

Команда сообщит нам тип файловой системы на разделе, метку раздела (если таковая имеется), UUID и дату последнего изменения данных на разделе (в формате UTC).

cat

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

cat /путь/имя_файла

linux

Аналог команды «kernel» в GRUB Legacy. Загружает указанное Linux-ядро:

linux файл_ядра опция1=значение опция2 опция3

Например, так:

linux /boot/vmlinuz-2.6.32-020632-generic root=/dev/sda5 single

initrd

Загружает указанный initrd-образ. Используется так:

initrd /boot/initrd.img-2.6.32-020632-generic

Обратите внимание, что версия initrd должна соответствовать версии загружаемого ядра!

chainloader

Передает управление загрузкой по цепочке другому загрузчику (загрузчик ищется на заданном в качестве root разделе). В общем случае требует указания файла для загрузки:

chainloader /путь/имя_файла

Для (загрузчика Windows) можно использовать:

chainloader +1
boot

root

При использовании без параметров сообщает, какой раздел сейчас используется в качестве корневого и тип файловой системы на этом разделе, также команда может быть использована для задания другого root-раздела. Раздел задается в «grub device» — формате »(hd*,*)«. например:

root (hd0,5)

После задания раздела команда сообщит новый root-раздел и тип файловой системы. Примечание: «root hd(*,*)» не всегда корректно срабатывает. более предпочтительным вариантом является «set root» (см. ниже)

set

Весьма универсальная команда для изменения различных параметров. Служит для задания значений переменных и используется в формате:

set переменная=значение

Наиболее необходимое ее применение — для задания root-раздела, например:

set root=(hd0,5)

Также с ее помощью можно, например, «на лету» изменить цвет текста в меню и консоли, что позволяет опробовать цветовую схему перед установкой ее в качестве основной. Для этого изменяем переменные «color_normal» — для обычного пункта (и текста в консоли) и «color_highlight» для выделенного пункта соответственно. Например, попробуем такой вариант:

set color_normal=magenta/green
set color_highlight=light-blue/black

search

Служит для поиска раздела по UUID, метке или заданному файлу. Имеет следующие ключи:

  • -u (или –fs-uuid) — поиск раздела по UUID

  • -l (или –label) — поиск по метке раздела

  • -f (или –file) — поиск по указанному файлу

  • -n (или –no-floppy) — не проверять флоппи-дисковод (чтоб не трещал)

  • -s (или –set) — установить найденный раздел в качестве значения заданной переменной.

lsfonts

Команда отобразит список загруженных в настоящий момент шрифтов.

help

При использовании в чистом виде выведет список доступных команд. В формате:

help r

Выведет справку по всем командам, начинающимся на «r».

help search

Отобразит справку по команде «search»

halt

Выключение компьютера.

reboot

Перезагрузит компьютер.

background_image

Позволяет «на лету» изменить фоновое изображение. Используется в формате:

background_image /путь/имя_файла

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

Данная команда не заменит ваши настройки оформления, фон будет изменен лишь на текущий сеанс.

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

terminal_output.console

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

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

После того, как мы отредактировали и сохранили наши файлы. Нужно закончить дело, обновив файл «grub.cfg». Это довольно просто — нужно всего лишь выполнить команду:

sudo update-grub

После этого смело перезагружаемся и видим, что все работает как надо.

Нюанс с нумерацией дисков и разделов

В GRUB имеется еще одно важное отличие от старого GRUB Legacy, а именно изменилась нумерация разделов диска. Нумерация дисков идет с нуля, а нумерация разделов — с единицы!

Если в GRUB Legacy первый раздел первого диска (sda1) именовался «hd0,0». То в GRUB, первый раздел первого диска (sda1) теперь будет «hd0,1».

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

Суть в том, что вместо уже знакомого «grub.cfg» можно загрузить свой файл настройки загрузочного меню со своей конфигурацией. Это позволяет создать дополнительное меню с другими пунктами, настройками, оформлением и т.д. Итак, создадим наш новый файл конфигурации. Создавать с нуля не будем, а скопируем «grub.cfg», дав новое имя:

sudo cp /boot/grub/{grub,custom}.cfg

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

sudo chmod 744 /boot/grub/custom.cfg

Теперь открываем его в любимом текстовом редакторе и изменяем:

sudo gedit /boot/grub/custom.cfg

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

  • set default задаем пункт меню по умолчанию, указав или его номер или точное название.

  • set gfxmode здесь задается разрешение экрана в привычном формате WxH. Можно также указать глубину цвета, например «1024x768x32». можно указать несколько вариантов, при этом если первый не сможет быть установлен, будет загружен второй, если и он не сработает — третий и т.д. Например:

    set gfxmode=1024x768x32,1024x768x24,1024x768
  • Теперь зададим время отображения меню, для этого ищем строку set timeout, и устанавливаем значение -1 для отключения таймера.

Для задания фонового изображения найдем строку с if background_image (подразумевается, что в вашем «grub.cfg» используется фоновое изображение. Если нет — смотрите пример файла в конце раздела). После команды background_image прописан путь к файлу картинки, поменяйте его на нужный файл.

Обратите внимание, что разрешение картинки должно соответствовать заданному выше разрешению экрана!

Строкой ниже мы можем задать цвета текста. Изменяются они так же, как и в »/etc/grub.d/05_debian_theme« (см. Настройка внешнего вида загрузчика GRUB). Можно проделать один интересный трюк: уберите строки с set color_highlight и else теперь настройка будет такой:

  • color_normal задает цвет/фон текста сверху и снизу (версия grub и комментарии) и текста в консоли

  • menu_color_normal отвечает за цвет пунктов меню и фон прямоугольника, в котором они находятся

  • menu_color_higlight задает цвет/фон выделенного пункта меню.

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

Настроив свой файл, сохраните его Ctrl+Shift и закройте.

Теперь необходимо добавить дополнительное меню. Для этого в файле »/etc/grub.d/40_custom« добавим запись такого вида:

menuentry "Название меню"{
configfile /boot/grub/custom.cfg
}

Если ваш путь к файлу отличается — исправьте его.

Если вы используете отдельный boot-раздел, путь будет таким: »/grub/custom.cfg«.
Также учтите, что «40_custom» должен заканчиваться пустой строкой!

Если вы хотите, чтобы ваше новое меню загружалось вместо стандартного «grub.cfg», установите новый пункт в качестве пункта по умолчанию, но перед этим проверьте новое меню на работоспособность.

Обновите свой «grub.cfg» выполнив команду:

sudo update-grub

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

В качестве образца пример файла «custom.cfg» (файл урезан до необходимого минимума):

have_grubenv=true
load_env
 
### выбранный пункт по умолчанию
set default=0
### таймаут меню
set timeout=2
### разрешение
set gfxmode=800x600x32,800x600x24,800x600
 
insmod ext2
search -u 0e717c2a-24bd-4abe-acfe-ecf98fc814f8 -s
insmod gfxterm
insmod vbe
if terminal_output gfxterm ; then true ; else terminal gfxterm; fi
insmod png
 
### фоновое изображение
background_image /usr/share/images/grub/yellow.png
### настройка цветов
set color_normal=black/black
set menu_color_normal=green/light-blue
set menu_color_highlight=red/blue
 
menuentry "9.10 @ 2.6.32" {
search -u 0e717c2a-24bd-4abe-acfe-ecf98fc814f8 -s
linux /boot/vmlinuz-2.6.32-020632-generic root=UUID=0e717c2a-24bd-4abe-acfe-ecf98fc814f8 ro quiet splash
initrd /boot/initrd.img-2.6.32-020632-generic
}
menuentry "9.10 @ 2.6.32 (recovery)" {
search -u 0e717c2a-24bd-4abe-acfe-ecf98fc814f8 -s
linux /boot/vmlinuz-2.6.32-020632-generic root=UUID=0e717c2a-24bd-4abe-acfe-ecf98fc814f8 ro single 
initrd /boot/initrd.img-2.6.32-020632-generic
}
menuentry "windooz"{
search -u AC9C75E59C75AA8A -s
chainloader +1
}

Защита от зацикливания на перезагрузке

Если загрузка ОС не закончилась успешно, или осуществлялась загрузка в режим восстановления, то при следующей загрузке — меню выбора GRUB будет выводится и ждать явного вмешательства оператора (так же, как если бы вы выставили GRUB_TIMEOUT=-1). При этом последующие аппаратные сбросы системы — не помогут проскочить меню.

Зачем это сделано

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

Совсем иная ситуация при загрузке — никакие сервисы по очистке логов не работают (они запускаются позже) и, если, в процессе загрузки система свалится и начнет перезагружаться, то лог будет только расти. И расти он будет до тех пор пока будут повторятся перезагрузки, и будет хватать места на том разделе диска, где расположен каталог /var/log. А когда на разделе с /var/log место кончится то система зависнет уже наглухо и даже в режим восстановления ее будет не загрузить. Загрузится можно будет только с LiveCD/USB (с Live системы и надо будет лечить систему, первым делом руками зачистив логи).

Защита встроенная в GRUB не позволит системе попасть в столь тяжелое положение.

А что если…

Функция (как видно) — безусловно полезная, однако она может быть неудобной для без-клавиатурных станций — на них «зависшее» меню GRUB-а — это не преимущество, а некоторые сложности (без подключения клавиатуры такая станция, попавшая в меню GRUB, никогда не загрузится вообще).

А что если отключить?

Собственно сами случаи, когда циклится загрузка — не так и часты, если машина работает без графики то там вообще мало чему падать на этапе загрузки, да еще так, что бы система вышла на перезагрузку. Разве что совсем кривой прикладной софт встроенный в процесс загрузки…

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

Отключаем…

Как это работает

Реализовано все достаточно просто — в скрипте /boot/grub/grub.cfg переменная окружения GRUB recordfail устанавливается в ходе каждой загрузки в 1.
Скрипт /etc/init.d/grub-common запускается на финальных этапах загрузки (линки с именем S99grub-common есть в /etc/rc2.d, /etc/rc3.d, … /etc/rc5.d). grub-common сбрасывает переменную recordfail в 0.
Если скрипт /etc/init.d/grub-common не отработает, то не сброшенное значение recordfail предотвращает автоматическую загрузку, меню GRUB появляется и потребуется явное интерактивное вмешательство со стороны оператора.

Для того, что бы убрать необходимость интерактивного вмешательства в процесс загрузки нужно установить переменную GRUB_RECORDFAIL_TIMEOUT в /etc/defaul/grub в то количество секунд, которые меню GRUB-а будет ждать ввода в случае когда recordfail=1.
Сохранить изменения и обновить GRUB (sudo update-grub).

Вы должны понимать, что проделанные изменения могут привести к довольно печальным последствиям, если все-таки у вас случится ситуация, при которой зациклится перезагрузка системы.

Финт с GRUB_RECORDFAIL_TIMEOUT может не сработать в некоторых (старых) версиях GRUB. Тогда нужно редактировать /etc/grub.d/00_header. Нужно найти функцию make_timeout (), которая выглядит примерно так:

make_timeout ()
{
    cat << EOF
if [ "${recordfail}" = 1 ]; then
  set timeout=-1
else
  set timeout=${2}
fi
EOF
}

и заменить в ней строчку

set timeout=-1

на

set timeout=${GRUB_RECORDFAIL_TIMEOUT:--1}

После этого финт с GRUB_RECORDFAIL_TIMEOUT заработает. Нужно сохранить изменения и обновить GRUB (sudo update-grub).

Изменения в скрипте /etc/grub.d/00_header могут быть утеряны при обновлении пакета grub-common. Но в новых версиях GRUB переменная GRUB_RECORDFAIL_TIMEOUT уже внедрена (т.е. эти изменения уже сделаны в 00_header).

Ссылки

  • Grub2 — Ubuntu Documentation (англ.)

Оригинал: GRUB 2 bootloader — Full tutorial

Автор: Igor Ljubuncic

Дата публикации: 05 сентября 2012 г.

Перевод: С. Русинов

Дата публикации перевода: 4 февраля 2013 г.

А я тебя вижу!
Законченное руководство с сайта Dedoimedo «GRUB 2.00 руководство по мультизагрузке»
(GRUB 2.00 multi-boot tutorial) помещено
в 117-ом выпуске журнала «Linux User & Developer Magazine»! Рекомендую
посмотреть его.

Загрузчик GRUB 2 находится в постоянном развитии. Со временем часть информации должна измениться, так как свойства добавляются, удаляются и меняются. Последние обновления, пожалуйста, смотрите ниже в разделе Updates.

Это руководство описывает GRUB версии 2, последующую версию популярного загрузчика.
Если вас интересует руководство по оригинальной (сейчас, так называемая, legacy)
версии GRUB, пожалуйста, посмотрите эту
статью.

Добро пожаловать в руководство по начальному загрузчику GRUB 2! Обязательно
прочитайте мое руководство
по GRUB legacy. В течение двух с половиной лет только
оно одно набрало около полумиллиона просмотров. Это доказывает, что оно практично
и очень популярно у пользователей во всем мире.

Я хочу повторить подобный успех с руководством по GRUB 2. Моя цель предоставить
пользователям, запускающим UNIX-подобные операционные системы или осуществляющим мультизагрузку
на своих компьютерах с помощью загрузчика GRUB, простое пошаговое руководство, проверенное и
работоспособное, которое позволит им быстро, просто и безопасно управлять загрузкой операционных
систем.

В этом руководстве вы узнаете как работать с GRUB 2. Как добавить и удалить конфигурации
меню, как адаптировать под свои требования загрузочные конфигурации с помощью заголовков и
загрузочных опций, как осуществить двойную загрузку и тройную загрузку операционных систем.
Особое внимание будет уделено совместному использованию GRUB legacy и GRUB 2 и адаптации Windows
к этой структуре. После этого мы узнаем, как избавиться от ошибок. Следуйте за мной.

Содержание

  1. Предупреждение
  2. GRUB 2 — перспективы развития
  3. Введение в GRUB 2

    1. Новая структура
    2. Пример файла grub.cfg
    3. Пример директории /etc/grub.d/
    4. Пример /etc/default/grub
  4. Основное применение

    1. Как работает GRUB 2?
    2. Добавление нового GRUB скрипта
    3. Обновление GRUB
    4. Изменение порядка загрузки скрипта с помощью изменения номеров
    5. Замена загрузочной конфигурации по умолчанию
    6. OS Prober (поиск загрузочных конфигураций)
    7. Переустановка GRUB
    8. Промежуточный итог
  5. Реальные случаи мультизагрузки

    1. Двойная загрузка: две операционные системы с GRUB 2
    2. Двойная загрузка: две операционные системы с GRUB legacy и GRUB 2
    3. Двойная загрузка: Windows 7 и Ubuntu
    4. Обновление GRUB legacy до GRUB 2
  6. Дополнительные тестовые сценарии

    1. Тройная загрузка
  7. Адаптация меню GRUB

    1. Редактирование /etc/default/grub
    2. Удаление memtest из меню
    3. Изменение параметров titles (заголовков) в блоках меню
    4. Изменение темы (фоновое изображение)
  8. Восстановление GRUB 2

    1. Восстановление после неудачной загрузки
  9. Обзор небольших проблем

    1. Механизм получения дампа памяти при падении ядра
    2. Имена команд
  10. Сравнение версий GRUB legacy и GRUB 2

    1. GRUB legacy
    2. GRUB 2
    3. Вывод
  11. Дополнительная информация (документы и ссылки)

    1. Официальная информация
    2. Другие полезные источники по GRUB 2
  12. Заключение
  13. Обновления

Предупреждение

Обратите внимание! GRUB 2 до сих пор является бета-версией программного обеспечения. Несмотря на это, он уже поставляется с Ubuntu подобными системами, хотя является не совсем доработанным продуктом. Вы, наверное, сможете использовать его без каких-либо проблем. Хотя проблемы и существуют, но вероятность повреждения системы невелика.

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

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

Теперь мы знаем об этом и пойдем дальше смело.

Просто помните, что GRUB 2 является бета-версией. Хотя тоже самое можно сказать и о
Google Mail, который был бета-версией приблизительно шесть лет или около этого, поэтому вы должны
быть осторожны. Еще одна важная деталь, содержание и соответствующее ему содержимое в этом
руководстве до сих пор, бывает, меняется вместе с изменениями в программном продукте GRUB 2,
поэтому следите за обновлениями.

GRUB 2 — перспективы развития

Это то, с чем вы должны ознакомиться до опробования GRUB 2. Когда GRUB 2 станет де-факто
загрузчиком для UNIX подобных операционных систем? В настоящее время GRUB legacy прекрасно
справляется и будет продолжать это делать еще много лет. Получив долгосрочную поддержку от компаний,
подобных RedHat и Novell, в серверных дистрибутивах, GRUB legacy остался ключевым игроком на самое
меньшее 5-10 лет.

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

На данное время GRUB 2 применяется только в системах семейства Ubuntu, которые занимают
только третью часть рынка настольных систем на базе Linux. Данное обстоятельство делает это
руководство актуальным только для одного из двух или даже трех домашних пользователей Linux,
которые могли бы быть заинтересованы в том, чтобы узнать больше о GRUB 2 и его применении.

Теперь давайте перейдем к реальным механизмам.

Введение в GRUB 2

Перед тем, как вы начнете углубяться в материал, я настоятельно советую вам прочитать
написанное мной оригинальное
руководство по GRUB. Это поможет вам лучше понять эту статью.

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

Все эти новшества практически бесполезны для большинства пользователей. Для управления
GRUB 2 необходимо знать изменения в конфигурационных файлах и их размещение.

Новая структура

Конфигурационные файлы старого загрузчика GRUB были (и до сих пор!) размещены в
/boot/grub/, включая файл menu.lst. Этот файл считывался во время загрузки и
его содержимое отображалось на экране пользователя в виде пользовательского меню GRUB.

GRUB 2 размещает свои файлы в трех местах:

/boot/grub/grub.cfg — Это главный конфигурационный файл, который заменил
menu.lst. В отличие от menu.lst, этот файл не может быть отредактирован
вручную! Я настоятельно рекомендую не пытаться вмешиваться в этот файл, используя команду chattr
или что-то подобное. Пусть все остается как есть.

/etc/grub.d/ — Это новая директория, содержащая GRUB скрипты. Эти скрипты
являются структурными элементами, из которых состоит grub.cfg файл. Когда выполнена соответствующая
команда GRUB, скрипты выполняются в определенной последовательности, и создают конфигурационный
файл grub.cfg.

/etc/default/grub — Этот файл содержит установки меню GRUB, которые считываются
GRUB скриптами и записываются в конфигурационный файл grub.cfg. Он является частью GRUB и
предназначен для его кастомизации (обеспечение соответствия требованиям пользователя). Он похож
на старый конфигурационный файл menu.lst, в нем находятся существующие загрузочные конфигурации.

Это значит, что если вы хотите изменить меню GRUB, вам будет нужно отредактировать
существующие скрипты или создать новые и после этого обновить меню. Это больше похоже на LILO,
в которой меню редактировалось на лету, чем на GRUB legacy.

Пример файла grub.cfg

Этот файл размещен в следующией директории /boot/grub/:

Boot grub

Так будет выглядеть grub.cfg файл:

grub.cfg

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

Пример директории /etc/grub.d/

Содержимое этой директории на только что установленной системе, в данном случае Kubuntu:

Директория

Давайте рассмотрим скрипты:

00_header этот скрипт загружает установки GRUB из /etc/default/grub, такие, как время ожидания выбора конфигурации, конфигурация загружаемая по умолчанию и другие. Позже мы поговорим об этом подробнее.

05_debian_theme определяет фон, цвета и темы. Имя этого скрипта зависит о выбранного дистрибутива и изменяется при выборе другого дистрибутива в GRUB 2.

10_linux загружает конфигурации меню для установленного дистрибутива.

20_memtest86+ загружает утилиту тестирования памяти.

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

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

Вы обратили внимание на нумерацию в именах скриптов? Это несколько похоже на порядок скриптов Запуска/Завершения на различных уровнях выполнения. Нумерация осуществляется согласно очередности. Это означает, что скрипт 10_linux будет выполнен до 20_memtest86+ и поэтому он размещен выше в загрузочном меню.

Эти скрипты не очень интересны. Так же как и grub.cfg файл, они не могут быть отредактированы, за исключением скрипта 40_custom. Вам нужно быть очень осторожными, когда вы работаете с этими скриптами.

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

Пример /etc/default/grub

Этот файл находится в /etc/default:

Директория по умолчанию

Эта директория содержит много других файлов, так что не подумайте, что все они используются GRUB. Файл grub является текстовым файлом, это показано на примере скрипта 00_header. Вы можете вносить свои собственные изменения в него, если хотите, конечно. Мы рассмотрим это позже в разделе кастомизация.

Grub

Теперь мы знаем какие файлы являются основными. Посмотрим, как мы можем их использовать.

Основное применение

Теперь, добавим к нашим теоретическим знаниям немного практики.

Как работает GRUB 2?

GRUB 2 работает подобно этому:

/etc/default/grub содержит кастомизацию; /etc/grub.d/ содержит скрипты содержащие информацию о меню GRUB и скрипты, загружающие операционные системы. Когда вы запускаете команду update-grub, он считывает содержимое grub файла и скрипты из grub.d, и создает файл grub.cfg.

Это все!

Для изменения grub.cfg вам необходимо отредактировать grub файл или скрипты, размещенные в grub.d.

Скрипты предназначены для выполнения. Это значит, что стандартная процедура выполнения должна
быть для них включена. Если вы отключите стандартную процедуру выполнения, то они не будут запущены.

Это означает, что вы можете разместить в директории grub.d столько файлов, сколько вам нужно,
так как они не являются исполняемыми оболочкой скриптами, которые может считывать update-grub.
Если вы хотите использовать их, вам нужно активировать для них стандартную процедуру выполнения или,
наоборот, отключить ее, если необходимо сделать их не доступными для update-grub.

Давайте рассмотрим скрипты.

Например, 00_header и 05_debian_theme:

00_header

05_debian_theme

40_custom более содержателен, но он не поможет нам понять, как можно настраивать скрипты. Не беспокойтесь, мы скоро все узнаем.

40_custom

Добавление нового GRUB скрипта

Чтобы добавить новую загрузочную опцию, вам необходимо следовать основным правилам:

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

Например, 11_ конфигурация будет размещена после конфигурации по умолчанию, 08_конфигурация будет размещена перед конфигурацией 10_ linux.

Следующий шаг — записать необходимые данные. Вот пример:


#!/bin/sh -e
echo "Some string"
cat << EOF
menuentry "Something" {
set root=(hdX,Y)
-- boot parameters --
}
EOF

Давайте рассмотрим этот файл:

Это shell скрипт, что следует из объявления в первой строке файла.

echo "Some string" строка, которую вы увидите после запуска команды update-grub. Если вы не хотите видеть вывод на экран команды echo, то вы можете перенаправить его на стандартную ошибку или /dev/null:

$ echo "Some string" > &2

Пример: echo "Adding openSUSE 11.2"

cat << EOF определяет начало текущей загрузочной конфигурации.

menuentry "Something" это имя, которое будет показано в меню. Пример: Linux.

set root=(hdX,Y) — вернемся к уже знакомому материалу, установка корневого (root) устройства.

Очень важно! GRUB 2 использует нумерацию разделов с 1, а не с 0, как было в GRUB legacy! Это крайне важно, помните об этом!

Другими словами, устройства по прежнему нумеруются с 0, а разделы с 1. Например, это значит, что sda1 теперь (hd0,1), а НЕ (hd0,0), как было раньше!

-- boot parameters -- (загрузочные параметры) будут меняться в зависимости от ОС (операционной системы). В Linux вы можете использовать, что-то подобное:


linux /boot/vmlinuz
initrd /boot/initrd.img

Однако в Windows вы будете использовать, скорее всего, следующую команду:


$ chainloader (hdX,Y)+1

По этой причине, законченный пример скрипта будет выглядеть приблизительно так:


#!/bin/sh -e
echo "Adding my custom Linux to GRUB 2"
cat << EOF
menuentry "My custom Linux" {
set root=(hd0,5)
linux /boot/vmlinuz
initrd /boot/initrd.img
}
EOF

Или в случае Windows, приблизительно так:


#!/bin/sh -e
echo "Adding Windows 8 to GRUB 2 menu"
cat << EOF
menuentry "Windows 8" {
set root=(hd0,1)
chainloader (hd0,1)+1
}
EOF

EOF конец GRUB файла.

Теперь у нас есть готовый файл. И нам нужно сделать его исполняемым.

$ chmod +x XX_new_os_script

GRUB 2 команды

Еще одна вещь, на которую мне хотелось бы обратить внимание, это данные, содержащиеся во
фрагменте cat << EOF. Как мы сейчас видели, команда cat определяет начало кода в
скрипте, который будет полностью добавлен в GRUB меню, и он не интерпретируется оболочкой. Другими
словами, все, что находится между cat << EOF и EOF, является командами GRUB.

Мы можем использовать ряд различных команд в этом скрипте. Некоторые из них мы встречали
раньше в GRUB legacy, но появились новые, незнакомые команды.

Не беспокойтесь, есть полный список команд, который включает все команды и даже аналогичные
команды GRUB legacy. Некоторые команды были заменены на другие. Для получения дополнительной
информации, пожалуйста, посмотрите GRUB 2 command list.

Обновление GRUB

Новый скрипт создан и размещен, но GRUB меню (grub.cfg) не изменилось. Вам необходимо
запустить команду update-grub, она выполнит обновление меню.

$ update-grub

Это пример из конфигурации двойной загрузки, которую мы рассмотрим подробнее позже. Я добавил две конфигурации Kubuntu и одну Ubuntu в GRUB меню Ubuntu. Я сделал это, чтобы исключить конфигурацию по умолчанию 10_linux, которая неприглядная и использует в заголовке имя универсального ядра, что вносит путаницу в обозначение и одинаково для Ubuntu и Kubuntu.

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

Новый скрипт

Обновление

После перезагрузки, мы получим вот это. Прошу прощения за некрасивый скриншот.

Размещение новых скриптов

Один раз мы использовали новые скрипты и загрузка прошла удачно. Теперь можно выполнить команду chmod -x для скрипта 10_linux и исключить generic (универсальные) 2.6.31-14 конфигурации, что позволит содержать наше меню в превосходном состоянии.

Изменение порядка загрузки скрипта с помощью изменения номеров

Вы также можете изменить номера скриптов, если хотите. Например, я изменил конфигурацию Kubuntu 08 и 09 и сделал, чтобы они загружались первыми до конфигурации по умолчанию и собственного скрипта Ubuntu.

Переопределение порядка загрузки

Замена загрузочной конфигурации по умолчанию

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

Вот пример, который есть у меня:

Шаблон

И соответственно, я создал новый скрипт:

Копирование

OS Prober (поиск загрузочных конфигураций)

OS Prober может тоже помочь вам. Он найдет дополнительные конфигурации на вашем жестком диске и добавит их в меню. Вы можете использовать его для добавления информации в созданные вами скрипты. Для получения дополнительной информации снова обратимся к файлу grub.cfg, раздел os-prober.

OS prober

Переустановка GRUB

GRUB 2 может быть установлен даже во время работы операционной системы, когда она загружена.
Для этого вам не нужно выходить из среды операционной системы. Просто запустите команду grub-install с указанием устройства или необходимого вам раздела.


$ grub-install <target>

<target> может быть /dev/hda, /dev/sdb, /dev/sdc4, и так далее.

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

grub-install сообщения о нерабочих устройствах

Вот пример, этого:

Установка

Вам нужно открыть файл /boot/grub/device.map, удалить неверные данные, в нашем случае это /dev/sdb и заново выполнить команду grub-install.

Снова установка

Промежуточный итог

Это то, что нам нужно на данный момент. У вас есть инструменты, которые необходимы для начала работы.
До сих пор я старался делать вещи более понятными, поэтому я подготовил краткий обзор, который завершает введение и применение основных разделов. Отсюда мы и начнем.

GRUB 2 имеет три основные части:

  1. /etc/default/grub — файл содержащий установки меню GRUB 2.
  2. /etc/grub.d/ — директория, содержащая скрипты, создающие GRUB 2 меню.
  3. /boot/grub/grub.cfg — GRUB 2 не редактируемый конфигурационный файл.

Команда update-grub считывает директорию /etc/grub.d и просматривает в ней исполняемые скрипты. Скрипты считываются в порядке их нумерации и записываются в файл grub.cfg вместе с установками меню, которые считываются из файла /etc/default/grub.

Загрузочные конфигурации образуются из нескольких источников: по умолчанию это дистрибутив, другие операционные системы, найденные на доступных дисках и скрипты, записанные пользователем в соответствии с требуемыми правилами. Скрипты записываются как shell (sh — оболочка).

Вы можете добавить/удалить конфигурации. Просто выполните команду chmod для нужного скрипта, поэтому можно не удалять неиспользуемые скрипты. GRUB 2 может быть переустановлен в любое время, даже во время работы операционной системы, когда она загружена.

Уже хорошо? Отлично. Вы видите, это довольно просто.

Сейчас давайте рассмотрим несколько реальных случаев. Позже мы будем настраивать GRUB 2 и узнаем как восстановить его после серьезных ошибок и ошибок в конфигурациях.

Реальные случаи мультизагрузки

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

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

Двойная загрузка: две операционные системы с GRUB 2

Это, наверное, простейшая конфигурация двойной загрузки. Обе операционные системы используют GRUB 2, таким образом, они могут легко взаимодействовать друг с другом. В нашем случае это две системы Ubuntu 9.10 и Kubuntu 9.10 с одинаковой файловой системой Ext4.

Ubuntu была установлена первой, GRUB 2 установлен в главную загрузочную запись (MBR) на диске /dev/sda. Kubuntu установлена второй, ее загрузчик также установлен в MBR, который перезаписал предыдущий экземпляр GRUB 2. Однако, скрипт OS probe обнаружил и добавил Ubuntu в конфигурационные файлы.

Если вы читали мое руководство по Kubuntu, то вы знаете, что загрузочная конфигурация Kubuntu также обозначается как и Ubuntu. Это может внести путаницу, если у вас несколько различных Ubuntu конфигураций на вашей машине.

В этом разделе мы сделаем следующее:

  • Узнаем как редактировать существующие конфигурации и как сделать их более презентабельными.
  • Добавим новые конфигурации и перенумеруем существующие.

Это даст нам первоначальную информацию о работе GRUB 2 и о том, что нужно делать пользователям для обеспечения правильного функционирования. После этого мы проверим загрузку систем с GRUB 2 из GRUB legacy и наоборот. И после этого мы добавим Windows.

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

Поэтому обратимся к файлу grub.cfg. Проверим синтаксис 10_linux и скопируем из него некоторые данные в новые скрипты, которые мы назвали 08_9_10_kubuntu и 09_9_10_kubuntu_recovery. Подобное мы делали раньше.

Запись 1

Восстановление записи

После этого нам необходимо сделать скрипты исполняемыми с помощью команды chmod +x и обновить GRUB. Очень просто.

Новое обновление

Новый скрипт

После перезагрузки и проверки работы системы мы можем заменить 10_linux конфигурацией с собственными скриптами.

Работа сделана, все очень просто!

Двойная загрузка: две операционные системы с GRUB legacy и GRUB 2

Это интересный случай. Предположим, вы имеете две операционные системы подобные Ubunty 9.10, которые используют новый загрузчик GRUB 2 и загружаются из раздела с файловой системой Ext4, и классический дистрибутив подобный openSUSE 11.2, который тоже использует Ext4 файловую систему, но загружается с помощью старой версии GRUB.

Вот что мы узнаем:

  • Как загрузить Ubuntu из среды openSUSE GRUB.
  • Как загрузить openSUSE из среды Ubuntu GRUB.
  • Как редактировать конфигурации в обоих системах, чтобы они оставались рабочими.

Давайте, сделаем это.

Решение: какую систему сделать системой по умолчанию?

Это то, что вам необходимо решить. У вас имеется два варианта загрузки. и вам нужно выбрать один по умолчанию.

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

Таким образом, если для загрузки вы используете GRUB legacy, то вам необходимо сделать следующее:

  • Установить GRUB в главную загрузочную запись (MBR) во время установки дистрибутива, например, openSUSE, как в нашем примере. Обратите на это внимание, когда устанавливаете дистрибутив!
  • Установить GRUB 2 в корневой раздел, в который установлен используемый дистрибутив, в этом случае Ubuntu. Уделите этому внимание, когда устанавливаете дистрибутив!

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

Выбор загрузчика

Разделы по умолчанию

Настройки загрузчика

Если вы не полностью уверены, посмотрите таблицу разделов.

fdisk

В нашем примере, Ubuntu была установлена первой с корневой директорией в /dev/sda6 и домашней директорией home в /dev/sda7. openSUSE была установлена следующей в /dev/sda1. Так как мы хотим использовать загрузчик GRUB legacy, тогда нужно сделать следующее:

  • Загрузчик Ubuntu необходимо установить в /dev/sda6.
  • Загрузчик openSUSE нужно установить в MBR (/dev/sda).

Когда это выполнено, загрузите систему и посмотрите, что получилось.

После установки openSUSE вы заметите, что зеленое меню GRUB содержит только конфигурацию
openSUSE. Причина этого в том, что GRUB legacy не знает, как интерпретировать структуру GRUB 2,
поэтому не может найти дополнительные конфигурации меню. Вы должны добавить их вручную.

Загрузите openSUSE и откройте в текстовом редакторе файл menu.lst. Вначале сделайте его резервную копию!

В действительности мы не знаем как работать с GRUB 2 конфигурациями из GRUB legacy. Поэтому мы будем конфигурировать его так же как Windows. Настроим последовательную загрузку (chainload) другой операционной системы, когда управление передается другому загрузчику.

Будет ли это работать? Я не знаю, но давайте проверим! Воспользуемся нашим опытом работы с GRUB и попробуем его применить к новый ситуации.

Chainload - последовательная загрузка

Для тех кто не видит, что показано на изображении, мы добавили в файл menu.lst следующие строки:


title Ubuntu 9.10 Karmic Koala
root (hd0,5)
chainloader (hd0,5)+1

После загрузки вы увидите меню (снова неважный скриншот):

Меню GRUB

Если вы попытаетесь загрузить Karmic Koala, выбрав ее из меню, то вы столкнетесь с неожиданной ошибкой 13 загрузчика GRUB:

Не поддерживаемый формат

Этот тип ошибки является общим для Linux пользователей, пытающихся загрузить Windows или Mac разделы. Для Windows решение состоит в переопределении разделов. Необходимо скрыть разделы или сделать их активными, это обычно решает проблему.

В отношении Mac, проблема подобна той, которую мы рассмотрим далее. Версия GRUB legacy, которая поставляется с openSUSE не обрабатывает Ubuntu разделы и структуру GRUB 2. Поэтому необходим другой метод, чтобы выполнить загрузку.

Для получения дополнительно информации, посмотрите GRUB error messages.

Загрузка Ubuntu (с GRUB 2) из openSUSE, правильный способ

Вот что вам нужно сделать, чтобы это работало. Вернитесь в openSUSE и откройте снова файл menu.lst. Вам нужно сделать его похожим на это меню:

GRUB правильная запись

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


title Ubuntu 9.10 Karmic Koala
root (hd0,5)
kernel /boot/grub/core.img
savedefault
boot

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

После перезагрузки будет доступно меню GRUB 2. Выберите нужную строку и загрузите систему.

После загрузки Ubuntu вы можете сделать маленькую хитрость, если хотите. Вы можете повторить запуск update-grub скрипта. Скрипт найдет установленную openSUSE и добавит ее в меню. Вы получите рекурсивное меню GRUB, то есть меню, которое вызывает другое меню, которое в свою очередь, вызывает другое …

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

Смешанное окружение

Другой интересный случай — это двойная загрузка Mandriva 2010 и Ubuntu 9.10. Когда устанавливается Mandriva, вы имеете возможность вручную отредактировать меню загрузчика GRUB, даже до первой загрузки. Это правда, многие дистрибутивы позволят вам конфигурировать загрузочное меню на определенном этапе установки. Если вы знаете, что вам нужно, вы можете сэкономить время и настроить конфигурации меню в процессе установки.

Теперь, как редактировать GRUB меню в процессе установки Mandriva. Это должно выглядеть примерно так:

Добавление Ubuntu

В основном, мы сделаем все тоже самое, что делали с openSUSE. Подробнее, пожалуйста, смотрите в статье выше.

Двойная загрузка: Windows 7 и Ubuntu

Скорее всего это будет интересно совсем не многим пользователям. В общем это все тоже, что было рассмотрено нами раньше. Чтобы было интереснее, я добавил один новый элемент — это обновление GRUB до GRUB 2.

Исходные тестовые данные: двойная загрузка Windows 7 и Ubuntu Jaunty, как в моем новом руководстве. Jaunty использует GRUB legacy, но он может быть обновлен до GRUB 2, что мы и сделаем.

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

Обновление GRUB legacy до GRUB 2

Во-первых, установим пакет GRUB 2:


$ sudo apt-get install grub2

Посмотрите на терминал. Через некоторое время, ответьте на несколько запросов.

Последовательная загрузка (сhainload) — первая

Во-первых, нужно решить, пойти по правильному пути и установить GRUB 2 в MBR (главную загрузочную запись) или по тестовому пути, то есть сделать корневым тот раздел, в который установлена Ubuntu и осуществить последовательную загрузку из GRUB legacy. Мы делали это ранее, и знаем как сделать это сейчас с помощью файла core.img.

Для ясности, мы не пропустим этот шаг.

Chainload - первая последовательная загрузка

Chainload - последовательная загрузка

Следующий шаг — проверка параметров команд. Большинству людей не нужно делать никаких изменений.

Опции

GRUB 2 теперь установлен:

Сделано

До перезагрузки, убедитесь, что grub.cfg сформирован правильно. Проверьте его содержимое: правильность загрузочных конфигураций, ссылки на устройства загрузки и разделы. Воспользуйтесь командой fdisk, если это необходимо, чтобы убедиться, что все в порядке.

Ubuntu конфигурация:

Linux конфигурация

Windows конфигурация:

Windows конфигурация

Теперь перезагрузка и проверка. Ваше GRUB меню будет изменено и включает конфигурацию с последовательной загрузкой внутри GRUB 2.

Последовательная загрузка внутри GRUB 2

Возможные ошибки

Вы можете столкнуться с ошибками в GRUB, например, ошибкой 11 или ошибкой 15, когда пытаетесь загрузиться в GRUB 2.

Ошибка

Например, ошибка 11 означает, что выбрано неверное корневое устройство или загрузочное устройство имеет ID (идентификатор) больше, чем его действительный номер. Для устранения ошибки необходимо изменить одну из строк конфигурации.

У вас будет выделена конфигурация, осуществляющая последовательную загрузку, поэтому для
решения проблемы, нажмите e для редактирования конфигурации. Затем измените команду root
так, чтобы она отражала ваше реальное загрузочное устройство. Не забывайте, вы работаете с GRUB
legacy, в котором нумерация разделов начинается с 0.

В худшем случае переберите возможные варианты командой root (hdX,Y), пока не найдете
правильный вариант. Измените строку с командой root, нажмите Enter, после нажмите b для загрузки.

Однако, если GRUB использует непонятную длинную строку, которая называется идентификатором устройства (ID), то вам будет нужно заменить строку root с uuid. После этого вы сможете загрузить ядро. HowtoForge — хороший пример со скриншотами.

В итоге, вы увидите меню GRUB 2:

меню GRUB 2

Как видите, мы имеем Ubuntu конфигурации и Vista загрузчик (Windows 7). Все выглядит хорошо.
Теперь загрузим Ubuntu и Windows 7, и убедимся, что все работает правильно.

Как только все будет выполнено, загрузите Ubuntu и завершите процесс миграции. Сейчас вы можете записать GRUB 2 в MBR и сделать его загрузчиком по умолчанию.


$ sudo upgrade-from-grub-legacy

Миграция завершена

Обратите внимание на отображенное устройство и измените его соответствующим образом. Это все. Мы сделали это. Мы узнали как обновить GRUB, как справиться с некоторыми ошибками и как правильно загрузить двойную загрузочную конфигурацию, которая включает Windows и Linux.

Дополнительные тестовые сценарии

Тройная загрузка

Начиная с этого момента, все очень просто. Используйте любой загрузчик, какой хотите (GRUB, GRUB 2).

Если вы установили в качестве загрузчика GRUB legacy, тогда вы будете загружать Windows конфигурации, так же как мы делали в оригинальной статье. Только еще добавите /boot/grub/core.img для GRUB 2 конфигураций.

Но если вы используете GRUB 2, тогда примените OS Prober для поиска других операционных систем. Если вам не нравятся заголовки, создайте пользовательские загрузочные конфигурации на основе уже существующих (созданных OS Prober).

Теперь все в ваших руках.

Адаптация меню GRUB

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

Редактирование /etc/default/grub

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

/etc/default/grub

GRUB_DEFAULT=0 определяет пункт меню, загружаемый по умолчанию. Нумерация осуществляется с 0, также как и меню. Измените настройки как вам нужно. Если вы установите GRUB_DEFAULT=saved, то будет загружен
пункт, выбранный во время предыдущей загрузки.

GRUB_TIMEOUT="10" определяет время ожидания. Измените настройку как вы хотите. Очень маленькое значение не рекомендуется. Установка значения -1 укажет GRUB ожидать выбора конфигурации пользователем вручную и нажатия Enter.

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

Еще один момент, который может заинтересовать вас, как отключить пункты меню recovery.

Отключение пунктов меню recovery

Следующая строка в файле /etc/default/grub позволяет отключить режим отображения пунктов меню recovery. Просто раскомментируйте строку и обновите GRUB:

GRUB_DISABLE_LINUX_RECOVERY=»true»

Отключение пунктов memtest в меню

Если вы хотите скрыть пункты меню, содержащие memtest, то просто выполните команду chmod -x для скрипта 20_memtest. Он не будет запускаемым и не будет считываться при формировании grub.cfg файла и, соответственно, не будет добавлен в него при следующем обновлении GRUB.


$ sudo chmod -x 20_memtest86+

Изменение параметров titles (заголовков) в блоках меню

Можно внести небольшие изменения в существующую конфигурацию, как я предлагал ранее, то есть создать Linux конфигурацию по умолчанию и отключить (с помощью команды chmod -x сделать не исполняемым) скрипт 10_linux. Однако, вы можете редактировать текущий скрипт, который может работать по-разному и предоставлять информацию в более понятном формате.

Это немного странный материал, который можно найти в Ubuntu install title tweaks.

Изменение темы (фоновое изображение)

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

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

Для начала изображения нужно разместить в какой-то определенной директории. По умолчанию GRUB 2 берет изображения из /usr/share/images/desktop-base. Вы можете использовать это размещение или собственное, которое можете создать сами. Например, /usr/share/images/grub, как показано в Ubuntu blog.

Скопируйте ваши изображения туда, и помните о расширении. По умолчанию GRUB 2 работает с .png и .tga файлами. Вы также можете использовать .jpg файлы, если хотите.

Следующий шаг, редактирование скрипта 05_debian_theme. Необходимо заменить соответствующую запись собственной:

Добавление нового изображения

Что я сделал, закомментировал исходную строку цикла for-loop, которая считывала изображение(я), и создал собственную. Если вы чувствуете себя неуверенно при редактировании конфигурационного файла, вам лучше отложить настройку темы и сделать это позднее.

Мой файл размещен здесь: /usr/share/images/grub/dark.png.

Теперь, файл изменен, выполните команду update-grub для обновления конфигурационного файла grub.cfg. Если вы сделали все правильно, вы увидите сообщение в терминале Found Debian background.

Найдено новое изображение

Обратите внимание, что в меню GRUB не будут использоваться фоновые изображения, если отключена соответствующая опция. Чтобы ее включить, нужно изменить строку use_bg=false в скрипте темы на use_bg=true.

Перезагрузите и проверьте:

Новая тема

Как видите, выбранное мной фоновое изображение оказалось очень плохим! Вы не можете увидеть текст! По этой причине тщательно выбирайте фоновое изображение, которое будете использовать. Лучшим выбором будет тема с небольшими градиентами.

Для получения подробной информации, пожалуйста, обратитесь к Wiki документации.

Восстановление GRUB 2

Восстановление после неудачной загрузки

Вдруг случится, что вы повредите GRUB 2? Должен же быть способ восстановить его и спасти положение? Все как обычно, есть два пути: легкий и сложный.

Легкий путь: Super Grub Disk

Это мощный инструмент, который работает с GRUB 2, так что не беспокойтесь. Установите его на CD/DVD диск, загрузитесь с него и восстановите поврежденный GRUB.

SGD

Сложный путь: Ручное исправление с помощью live CD

Вам необходим live CD, подобный Ubuntu или Kubuntu, который имеет на борту GRUB 2. Загрузитесь в live сессию (сессия временной загрузки операционной системы), монтируйте жесткий диск и установите GRUB 2 в MBR.

Вот последовательность команд, которые необходимо выполнить (предполагая, что диск = /dev/sda). Вам необходимо смонтировать раздел с установленным дистрибутивом (например, Ubuntu) и содержащим /boot директорию. Он может быть отдельным разделом в системе, это зависит от параметров, выбранных во время установки системы.

После его монтирования вам нужно запустить еще раз команду grub-install.


$ mount /dev/sda1 /mnt/
$ grub-install --root-directory=/mnt /dev/sda

Если это не сработает, то вам необходимо будет выполнить длительную и сложную процедуру, которая описана в official GRUB 2 Ubuntu Wiki documentation.

Применяйте команду fdisk для поиска корневого устройства до его монтирования. В качестве примера, предположим, что /dev/sda1 отведен под /boot раздел, а /dev/sda2 является корневым разделом в вашем дистрибутиве.


$ sudo mount /dev/sda2 /mnt

Если у вас /boot раздел размещен на отдельном разделе, то вам необходимо монтировать и его.


$ sudo mount /dev/sda1 /mnt/boot

Далее размонтируем устройства, используя опцию —bind. Для дополнительной информации о работе команды mount, пожалуйста, посмотрите на странице man.


$ sudo mount --bind /dev /mnt/dev

Фактически, сейчас у вас есть корневая система для монтирования. Теперь вы можете изменить размещение root (/) на /mnt. Это можно сделать с помощью команды chroot.


$ sudo chroot /mnt

Это значит, что команда выполненная в этом терминале будет обращаться к /mnt/. Теперь, переконфигурируем GRUB пакет:


$ dpkg-reconfigure grub-pc

Вам должны сказать GRUB, какое устройство нужно использовать. Вы можете осуществить выбор с помощью клавиши пробел. Показанные устройства будут совпадать с данными из файла карты устройств. Если у вас только одно устройство, то путаницы быть не должно.

После этого вы можете выйти из рабочей среды команды chroot. Это делается нажатием сочетания клавиш Ctrl + D. Затем демонтируйте устройства. Первым демонтируйте /dev, а после все остальные.


$ sudo umount /mnt/dev
$ sudo umount /mnt

Теперь выполните перезагрузку. GRUB 2 будет восстановлен.

Обзор небольших проблем

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

Механизм получения дампа памяти при падении ядра

GRUB 2 имеет раздел, в котором настраивается механизм получения и сохранения дампа памяти при падении ядра. Механизм работает подобно Kdump, он установлен, сконфигурирован и может быть изменен в разделе настроек ядра. Применять его не самая лучшая идея, так как скрипт не проверяет смещение, где он может разместить поврежденное ядро. При этом выделение памяти должно быть сделано администратором и непроизвольным образом, а в определенном диапазоне, потому что неизвестен объем поврежденного ядра.

Механизм получения дампа памяти при падении ядра

Имена команд

Две главные команды: grub-install и update-grub, отличаются порядком употребления слова grub, что не очень хорошо. Либо обе должны иметь префикс grub, или обе должны иметь суффикс grub.

Сравнение GRUB legacy и GRUB 2

Теперь хороший вопрос, какой из них вы будете использовать, а какой нет?

GRUB legacy

Это старая версия и больше не разрабатывается, но работает отлично и хорошо зарекомендовала себя. Редактировать GRUB меню очень просто и не требуется высокая квалификация пользователя, то есть нужно только создать в соответствии с правильным синтаксисом и сохранить.

GRUB 2

GRUB 2 является бета версией программного обеспечения. На данный текущая версия 1.97, которая запросто может стать официальной. Это делает его менее успешным кандидатом для применения в производственных системах.

Кроме того, GRUB 2 более сложен в работе, по ряду причин: а) он требует уверенного владения shell, которым владеет далеко не каждый; б) изменить GRUB меню гораздо сложнее и требуется выполнить три этапа, прежде чем оно будет изменено; в) изменения не сохраняются автоматически и должны быть «скомпилированы» в меню всякий раз, при внесении изменений, как и в случае с загрузчиком LILO.

В настоящее время, GRUB 2 поддерживается небольшим числом дистрибутивов, поэтому маловероятно получить поддержку и найти ответы он-лайн (в сети Интернет, например). Поэтому у вас есть шанс столкнуться с проблемами использования GRUB 2 в смешанном окружении.

Вывод

В обоих руководствах по GRUB я показал, что даже сложные ситуации могут быть разрешены сравнительно просто. Это можно осуществить с помощью совместного использования обоих загрузчиков GRUB legacy и GRUB 2, как подробно показано в моих примерах.
Сейчас для вас, наверное, лучше GRUB legacy, если вы не очень опытный пользователь.

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

Дополнительная информация (документы и ссылки)

Я настоятельно рекомендую посмотреть следующие статьи, обзоры и howtos руководства:

Официальная информация

GRUB 2 official site

GRUB 2 Manual

GRUB 2 Ubuntu Wiki documentation

GRUB 2 Command List

Другие полезные источники по GRUB 2

Начальный загрузчик GRUB — полное руководство (моя статья) (перевод на русский язык)

Herman’s GRUB pages (отличная коллекция руководств howto)

GRUB error messages

How to change GRUB 2 theme

GRUB 2 title tweaks (дополнительный материал, поможет избежать трудностей с заменой пунктов меню)

GRUB 2 on archlinux Wiki (дополнителный материал)

How to install GRUB 2 on Ubuntu 9.04

Заключение

Это все. Теперь у вас имеется пошаговое руководство по установке, конфигурированию и разрешению проблем с GRUB 2, которое содержит: описание структуры и основных функций, многочисленные реальные примеры, подобные двойной загрузке с GRUB legacy, последовательной загрузке GRUB 2 и Windows, а также инструменты и инструкции по решению проблем. Это руководство должно быть очень полезно для вас, будь вы начинающий пользователь, недавний пользователь Windows, перешедший на Linux, или ветеран Linux.

В сравнении с GRUB legacy GRUB 2 немного сложнее в использовании, он требует хорошо знать и уверенно работать с shell, с которым большинство пользователей мало знакомы. При этом он не позволяет простого изменения, и загрузочная конфигурация должна собираться каждый раз перед применением после внесения изменений.

Подлинная мощь GRUB 2 до сих пор не раскрыта.

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

Успехов и расширяйте ваши познания!

Пока.

Обновления

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

Декабрь 2009, обновление:

Несколько вопросов, заданных моими читателями.

Нужно ли мне что-то делать, если я использую Ext3 файловую систему? Можно ли boot разделы GRUB отформатировать в Ext4?

Ответ: Может быть. Если ваш дистрибутив поддерживает Ext4, то да, если не поддерживает, то нет, потому что он не сможет ничего прочитать из разделов отформатированных в Ext4. Самый простой путь, преодолеть ограничения совместимости файловой системы, использовать под /boot отдельный раздел, отформатированный в Ext3. Этот способ будут поддерживать все современные дистрибутивы Linux.

У меня есть два диска. Ubuntu Karmic находится на втором диске. Что мне использовать в GRUB core.img файл или можно использовать обычный способ последовательной загрузки (chainload)?

Ответ: Eсли ваш загрузчик установлен в корне второго диска, тогда вы можете использовать традиционный метод последовательной загрузки (chainload). Однако, если вы используете один загрузчик, тогда вы должны воспользоваться core.img файлом.

Из-за чего отличаются 40_custom скрипт и ваши пользовательские скрипты?

Ответ: Скрипт 40_custom уже настроен для использования, во время сборки конфигурационного файла GRUB, в соответствии с содержанием других скриптов. Однако, пользовательские скрипты вы можете записать в любое время. Обязательная строка в этом скрипте exec tail -n +3 $0, но вам не нужно использовать ее в собственных скриптах.

Будут ли обновлены мои скрипты, если обновлю ядро другой операционной системы установленной в этой же системе?

Ответ: Автоматического обновления не произойдет. Вам нужно будет перезаписать ссылки на ядра вручную. Один из путей решения этой задачи, создание символической ссылки на последнее ядро и initrd image (Стартовая корневая файловая система, которая монтируется в первую очередь. initrd входит в состав ядра, и загружается как его часть во время загрузки. Ядро монтирует initrd в первой части загрузочного процесса для последующей загрузки модулей и реальной корневой файловой системы.) с помощью vmlinuz и initrd с универсальными именами. Именно это реализовано в openSUSE, и позволяет вам сохранять статическим ваше GRUB меню. После обновления ядра, в изменениях нуждаются только символические ссылки. Изменять конфигурационные файлы GRUB не нужно.

Я не могу установить пользовательский фон в меню GRUB!

Ответ: Посмотрите раздел в скрипте debian_theme и установите значение параметра use_bg в true.

Июнь 2010, обновление:

GRUB 2 текущая версия 1.98 и это stable release (В версию STABLE попадают только протестированные разработки. Это гарантия того, что они останутся в системе и дальше. По мере работы, когда в STABLE накапливается довольно много изменений и есть гарантия стабильности, STABLE переводится в RELEASE. То есть, существуют моменты времени, когда STABLE и RELEASE полностью идентичны.). Имеется несколько небольших изменений в функциональности, но 99% того, что написано выше, все еще актуально.

GRUB 2 rescue CD (диск аварийного восстановления)

Если вы не используете Super Grub Disk (SGD) или live CD с Linux дистрибутивом, поддерживающим GRUB 2, тогда вы, наверное, хотите создать свой собственный CD диск, для восстановления GRUB 2 (rescue CD). Преимущество этой процедуры в том, что rescue CD будет иметь собственное меню GRUB.

Это делается с помощью команды grub-mkrescue, которая похожа синтаксисом на Lucid Lynx, который используется в GRUB2-1.98-1ubuntu5 и Karmic и более ранних версиях, которые использовали бета версию начального загрузчика.

Теперь, посмотрим как это сделать:

Ubuntu 10.04:


$ grub-mkrescue --output=<name>.iso /boot/grub

Вы можете использовать любое имя.

Ubuntu 9.10 and earlier:


$ grub-mkrescue --overlay=/boot/grub <name>.iso

После создания ISO образа, вы запишите его на CD. Затем протестируйте его, желательно на другой машине. Сделайте так, чтобы GRUB загрузился с CD, а не локального диска. Если вы используете имена файлов без указания полного пути, то ISO образ будет создан в текущей директории.

Целевой (тестовый) хост настройте на загрузку с CD, rescue CD загрузит командную строку GRUB. Убедитесь, что загрузка произошла действительно с CD, и он работает как ожидалось, и содержит ваше GRUB меню. Для этого выполните следующую команду:

$ configfile /grub.cfg

Она выведет на экран ваше меню. Если вас устраивает результат, то держите этот диск под рукой на случай аварийных ситуаций. Помните, что нужно создавать новый ISO образ при каждом обновлении вашего GRUB меню.

Вы будете использовать rescue CD для загрузки нужной операционной системы и восстановления GRUB с помощью команды grub-install, как показано ранее. Rescue CD не будет работать, если вы удалите операционную систему или разделы, содержащие ее.

Ссылки:

How to make your own GRUB2RESCUE CD-ROM

Есть также дискуссионные темы доступные на Ubuntu и wilderssecurity.com форумах, но они в основном касаются использования этих же команд и их вариаций в различных версиях Ubuntu.

Спасибо Ocky за этот совет!

Декабрь 2010, обновление:

Еще немного изменений. Здесь вы найдете их краткий обзор и дополнительную информацию.

Условные обозначения

Снова изменены условные обозначения. Для разделов MS-DOS, которые представляют абсолютное большинство среди разделов, GRUB 2 в Maverick (версия Ubuntu 10.10 Maverick Meerkat) использует новые обозначения. Вместо универсального обозначения hd(X,Y), теперь будет hd(X,msdosY), которое может немного запутать. Вы должны это учитывать, когда создаете сложные мультизагрузочные установки.

Для большей информации, пожалуйста, посмотрите мой обзор по Maverick.

Дополнительная информация для чтения

Также, добро пожаловать, на официальный форум Ubuntu в тему по GRUB2.

Декабрь 2011, обновление:

Несколько дополнительных изменений. Официальная версия GRUB 1.99 и в нее внесено несколько изменений. Прежде всего сделаны важные внешние изменения. В старых версиях ядра меню представлялось в виде цельного списка, теперь оно отображается подобно списку файлов в обособленной директории, что делает его более читабельным. Кроме этого, в Ubuntu меню стало отображаться с более высоким разрешением и более мелким размером шрифта. Теперь рассмотрим некоторые другие изменения.

Загрузка Xen ядера в мультизагрузочной конфигурации под управлением GRUB2

Вы видели этот пример в моем вводном руководстве по Xen. Особенности:

Отметьте, пожалуйста, если вы используете последовательную загрузку openSUSE с GRUB 2, то вам необходимо специально создать конфигурацию для Xen ядра, которая не должна быть автоматически добавлена с помощью скрипта OS probe. Посмотрите на отличие этой конфигурации от стандартных загрузочных блоков.

multiboot /boot/xen.gz
module /boot/vmlinuz-xen <options>
module /boot/initrd-xen

Конечно, в ней приведены полные пути к вашим установкам, устройствам, и т.п. Здесь приведен скриншот файла меню, находящегося на моей тестовой машине:

Меню GRUB 2

Поддержка Fedora 16 Verne

Fedora
16 также поддерживает GRUB2. Некоторые установки немного отличаются от систем
базирующихся на Debian. Навигация в Fedora покажется вам немного более сложной
после работы в GRUB 2 на Ubuntu и системах из его семейства. Поддержка GRUB2
в Fedora реализована не очень хорошо, так как она совсем недавно поддерживает
GRUB 2, и, конечно, имеются ошибки в некоторых функциях.

Как обновить меню GRUB

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

$ grub2-mkconfig -o /boot/grub2/grub.cfg

Команда создаст grub.cfg файл в соответствии с вашими скриптами из /etc/grub.d.

Fedora - файл grub.d

Изменение скрипта header (строка меню по умолчанию и время ожидания)

В Ubuntu изменить пункт меню по умолчанию и время ожидания очень просто. Но в Fedora это совсем не так. Редактирование файла 00_header является более сложным. Вы должны изменить функционал скрипта, чтобы получить то, что вам нужно.

Время ожидания задается функцией make_timeout(). Эта функция допускает два входных параметра: GRUB_TIMEOUT и GRUB_TIMEOUT_BUTTON, которые объявляются в начале скрипта 00_header.

Заголовок файла

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

Функция make_timeout(), вы можете отредактировать ее объявление set timeout=${2} и сделать ее значение статическим. Скрипт проигнорирует входные параметры и будет использовать присвоенные вами значения. Например, вы хотите увеличить время ожидания с 5 секунд до 20 секунд.

функция make_timeout

В этом случае измените скрипт следующим образом:

#set timeout=${2}
set timeout=20

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

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

Изменения времени ожидания

И теперь загружаемся, заметьте время ожидания на счетчике.

Загрузка

Дополнительная информация

Более подробную информацию можно получить на следующих онлайн страницах:

GRUB2 — FedoraProject.org

GRUB2 features — FedoraProject.org

Если вы считаете, что есть необходимость в отдельном руководстве, по применению Fedora и GRUB2, то мы можем сделать его.

Июнь 2012, обновление:

Вышла официальная
версия GRUB 2.00. GRUB 2 стал привлекательным во всех отношениях. Мы увидим
главную release версию GRUB 2 в различных дистрибутивах уже к концу этого года.
Для конечных пользователей изменения будут незаметны. Просто используйте это
руководство и приятно проводите время.

Это еще не все…

Если вам понравилась статья, поделитесь ею с друзьями:


Оригинал: GRUB bootloader — Full tutorial

Автор: Igor Ljubuncic

Дата публикации: 13 сентября 2007г.

Перевод: С. Русинов

Дата публикации перевода: 07 января 2013г.

В этом руководстве рассматривается предыдущая версия GRUB. Если вы ищете руководство по GRUB 2, последующей версии популярного начального загрузчика, пожалуйста, взгляните на эту статью.

Самое пугающее в Linux — это страшная фраза «начальный загрузчик». Главная причина этого состоит в том, что большинство новых пользователей Linux работали только с операционной системой Windows, в которой отсутствует полноценный начальный загрузчик или взаимодействие с ним пользователя сведено к минимуму. В мире Windows они никогда не задумывались о начальном загрузчике. Для них процесс загрузки операционной системы был полностью прозрачен. Самое большее, что они делали — это использовали Windows Recovery Console для решения возникающих проблем. Поэтому им необходимо познакомиться с одной из важнейших частей программного обеспечения компьютера — маленькой программой, выполняющей загрузку операционной системы.

Цель данной статьи предоставить вам основные сведения о начальном загрузчике GRUB. Если вы читали мои другие статьи о Linux, то вы хорошо знакомы с разбиением на разделы и условными обозначениями Linux, а также с командной строкой. Логично сделать следующий шаг для дальнейшего углубления этих знаний. Понимание того как работает GRUB и, что означают записи в загрузочном меню, поможет вам понять как работает операционная система, как исправить возникающие ошибки, как восстановить или модифицировать меню загрузчика GRUB в соответствии с вашими нуждами и как установить несколько операционных систем с разными рабочими средами.

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

Ну, если вы готовы, читайте дальше.

Но, сначала, важное предисловие. Эта статья состоит из поясняющей информации и примеров, которые помогут вам изучить GRUB. Конечно, все это есть на просторах интернета. Однако, новые пользователи Linux возможно потратят часы на поиск необходимой информации (особенно, если их ПК — персональный компьютер не загружается) немного разочаровавшись. Цель данного руководства предоставить простые и быстрые решения часто встречающихся проблем при мультизагрузочной установки и установки Linux операционных систем.

Содержание

Все есть файл

Введение

Что такое LILO?

Как работает GRUB?

Терминология GRUB

Конфигурация GRUB

Установка GRUB

GRUB на флоппи диске

Установка GRUB по умолчанию

Установка GRUB с помощью grub-install

Настройка GRUB вручную (после установки)

Резервное копирование!

Добавление новой операционной системы в меню GRUB

Типичные проблемы

Как восстановить GRUB после удаления?

Простой способ

Сложный способ

Windows установлена не на первом жестком диске (Своппинг)

Несколько Windows операционных систем установлены на одном первом жестком диске (Скрыть/Показать)

Вы изменили размер раздела; GRUB не работает

Полезные инструменты

Дополнительная информация (специально для фанатов)

Ссылки

Другие мои статьи

Общая информация (в алфавитном порядке)

Все есть файл

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

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

Введение

GNU GRUB это загрузчик (то есть начальный или первичный загрузчик) способный загружать различные свободно распространяемые и проприетарные операционные системы. GRUB будет хорошо работать с Linux, DOS, Windows или BSD. Аббревиатура GRUB расшифровывается, как GRand Unified Bootloader (Главный унифицированный загрузчик).

GRUB является динамически конфигурируемым. Это означает, что пользователь может внести изменения в настройки GRUB во время загрузки. Например, изменить существующие загрузочные записи, добавить новые пользовательские записи, выбирать различные ядра операционной системы или модифицировать initrd. GRUB также поддерживает режим логической адресации блоков (Logical Block Address). Это означает, что если ваш компьютер оснащен достаточно современной BIOS, то может быть доступно более 8ГБ (первые 1024 цилиндра) места на жестком диске. Соответственно и GRUB будет автоматически доступно все это пространство.

GRUB может быть запущен или установлен с любого устройства (гибкого диска — дискеты, жесткого диска, CD- ROM привода, USB диска, сетевого диска) и может загружать операционные системы из различных источников, включая сетевые диски. Также он может может распаковать образ операционной системы перед ее загрузкой.

Вы можете получить дополнительную информацию, гораздо больше, чем в данной статье, из официального руководства GNU GRUB Manual 0.97.

Что такое LILO?

Вы, наверное, слышали о другом начальном загрузчике Linux, который называется LILO (образовано из начальных букв LInux LOader, что означает загрузчик Linux). Не смотря на то, что LILO для многих пользователей Linux подходящий вариант, я считаю, что GRUB — лучший выбор по нескольким причинам:

LILO поддерживает только 16 различных загрузочных конфигураций, а GRUB поддерживает неограниченное количество конфигураций.

LILO не может загружаться по локальной сети, а GRUB может.

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

LILO не имеет командного интерактивного интерфейса.

Подводя итог изложенному выше, отметим, что GRUB выглядит победителем. Итак, позвольте показать, что эта малютка может делать.

Как работает GRUB?

Когда компьютер загружается, BIOS передает управление первому загрузочному устройству, которое может быть жестким диском, дискетой, CD-ROM или другим устройством, распознаваемым BIOS. Для простоты будем считать, что это жесткий диск.

Первый сектор жесткого диска называется Master Boot Record (MBR)(Главная Загрузочная Запись). Длина этого сектора всего 512 байт. Он содержит небольшой фрагмент кода (446 байт), который называется основной загрузчик, и таблицу разделов (64 байта). Таблица разделов содержит описание первичных и дополнительных разделов жесткого диска.

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

GRUB заменяет код MBR по умолчанию собственным кодом.

При этом работа GRUB состоит из нескольких стадий.

Стадия 1: размещение в MBR. Из-за малого объема MBR размещается только ссылка для перехода к Стадии 2, которая содержит все требуемые данные.

Стадия 2: переход к конфигурационному файлу, который содержит все компоненты пользовательского интерфейса и настройки, необходимые для работы GRUB. Стадия 2 может находиться в любом месте на диске. Если в результате работы Стадии 2 не найдена конфигурационная таблица, GRUB прекратит процесс загрузки и предоставит пользователю возможность выбрать вручную загрузочную конфигурацию из командной строки.

Еще существует Стадия 1.5, которая используется, если загрузочная информация не может быть размещена непосредственно после MBR.

Структура Стадии позволяет GRUB иметь довольно большой объем (~20-30К). Поэтому GRUB достаточно сложный и хорошо конфигурируемый, по сравнению с большинством загрузчиков, которые более компактные и проще укладываются в ограничения для Таблицы Разделов.

Терминология GRUB

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

GRUB имеет собственные условные обозначения, которые немного отличаются от общепринятых условных обозначений применяемых в Linux.

Вот, пример типичного начала GRUB:

(hd0,1)

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

hd означает жесткий диск. Гибкий диск обозначается как fd, CD-ROM как cd и т.д.

Первый номер (целое число, для квалифицированных пользователей) — это ссылка на номер физического жесткого диска. Нумерация первого привода начинается с нуля. В качестве примера, hd2 ссылка на третий физический жесткий диск.

Второй номер, ссылка на номер раздела выбранного жесткого диска. Нумерация разделов тоже начинается с нуля. В этом случае, 1 соответствует второму разделу.

Отсюда следует, что в GRUB (меню) не различаются IDE и SCSI приводы или первичный и логический разделы. Задача определения какой жесткий диск или раздел должен быть загружен, определяется BIOS и на Стадии 1.

Как видите, условные обозначения очень простые.

Первичные разделы имеют обозначения от 0 до 3 (hd?,0), (hd?,1), (hd?,2), (hd?,3). Логические разделы в дополнительном разделе нумеруются начиная с 4. Их нумерация не зависит от текущего количества первичных разделов на жестком диске. Например, (hd1,7).

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

Также GRUB необходимо знать какой из образов операционной системы загружать. Эти параметры и специальные флаги (ключи) присваиваются каждому загрузочному устройству. Например, специальный флаг для Windows Safe Mode.

Здесь показан пример меню GRUB загружающего только Ubuntu.

GRUB загрузка Ubuntu

Здесь показан пример меню GRUB для компьютера с тройной загрузочной конфигурацией (SUSE 10.2, Ubuntu 6.10 и Windows XP). Это реальный menu.lst на одной из моих действующих машин.

GRUB конфигурация тройной загрузки

Попытайтесь понять, что означают эти данные. Считаются только незакомментированные строки. Комментарии обозначаются специальным символом #. Строки начинающиеся с нескольких последовательных серых x (индикатор предыдущей строки) являются продолжением предыдущей строки. Другими словами, текст просто перенесен на другую строку, чтобы улучшить зрительное восприятие на экране длинных строк, с учетом размеров окна текстового редактора и разрешения экрана.

default 0

timeout 8

Первая строка (default 0) означает, что будет загружена первая операционная система из списка. В нашем случае, это SUSE 10.2. Вторая строка (timeout 8) сообщает сколько времени (в секундах) имеется у пользователя чтобы выбрать систему для загрузки до того как загрузится система по умолчанию. Просто, не правда ли?

gfxmenu (hd0,2)/boot/message

GRUB меню может быть графическим. Все необходимое для отображения изящного пользовательского представления с цветным фоном и некоторыми дополнительными элементами, размещено на первом физическом диске, третьем разделе (hd0,2). Это первичный раздел, как вы успели заметить.

title openSUSE 10.2

root (hd0,2)

kernel /boot/vmlinuz-…

initrd /boot/initrd.img-…

Это первая операционная система в меню.

title (заголовок) — элементарно, означает тоже, что и его смысл. Эта строка предназначена помочь пользователю прочитать меню в более доступной терминологии.

root (hd0,2) указывает GRUB, где размещены его конфигурационные файлы. В этом примере они могут быть найдены на (hd0,2)/boot/grub.

kernel /boot/vmlinuz-… загрузка модуля ядра текущей операционной системы. Может быть доступно несколько подобных образов. Тот факт, что отсутствует ссылка на загрузочное устройство перед /boot/vmlinuz означает, что образ размещен на том же разделе жесткого диска, что и сам GRUB. Это обстоятельство часто определяет ваш выбор операционной системы, загружаемой по умолчанию.

initrd /boot/initrd.img-… является временным системным файлом, который создается системой при подготовке к загрузке. Подготовка включает в себя адаптацию универсального модуля ядра для конкретного оборудования, до его загрузки.

Дополнительные ключи используются после указания ядра. Они определяют текущее размещение корневой директории (root), используемый графический режим и размещение раздела подкачки (swap). В этой статье не будут рассматриваться подробно расширенные конфигурации GRUB.

title Ubuntu, kernel … (/dev/sda9)

kernel (hd0,8)/boot/vmlinuz-…

initrd (hd0,8)/boot/initrd.img-…

В данном случае, title отображаемое имя, с некоторыми дополнительными техническими подробностями.

kernel (hd0,8)/boot/vmlinuz-… размещение 9-й раздел на первом жестком диске (hd0,8). Флаг root (/dev/sda9) обозначает, что root раздел так же содержит в себе модуль ядра, то есть размещаются они на одном разделе жесткого диска. Обычно, это делается из соображений практичности и простоты. Вы можете изменить это размещение во время установки операционной системы.

initrd (hd0,8)/boot/initrd.img-… здесь ничего нового.

Замечания по разделам модулей ядра и корневому разделу: на старых компьютерах, BIOS которых не поддерживает доступ к более чем 1024 цилиндрам, вы должны были установить загрузочный раздел, содержащий модуль ядра и корневой раздел, в разных местах. Однако пользователи с компьютерами младше чем проблема Y2K (проблема 2000 года) могут не беспокоиться.

Другая вещь, на которую вы должны обратить внимание, это подробная загрузка Ubuntu. Ubuntu загружается с помощью загрузчика OpenSUSE. Это свойство называется совместимая мультизагрузка (Multi-boot Compliance). OpenSUSE распознает Ubuntu и может правильно вызвать ее модули (включая специальные ключи) и cмонтировать разделы. Однако большинство операционных систем лишь частично совместимы с данным свойством (Multi-boot Compliance).

Позже я покажу вам как по разному может быть выполнен вход в Ubuntu с одинаковыми результатами.

title Windows

rootnoverify (hd0,0)

chainloader (hd0,0)+1

rootnoverify (hd0,0) означает, что openSUSE не может определить Windows операционную систему, так как она не обладает свойством мультизагрузочной совместимости (Multi-boot Compliance). По этой причине операционная система вызывается без какой-либо дополнительной информации о ее ядре. GRUB предполагает, что требуемый образ ядра будет находиться на указанном разделе и монтирует загрузчик операционной системы. Как вы видите, Windows была установлена на первом разделе первого жесткого диска. Это самое удачное расположение системы.

Команда chainloader (hd0,0)+1 специально предназначается для применения с операционными системами, которые не могут быть непосредственно загружены. Не удивительно, что Windows операционные системы не могут быть загружены напрямую. Они загружаются с использованием метода chainloading. Как следует из названия, GRUB передает управление загрузочной последовательностью другому загрузчику, размещенному на устройстве, которое указано в меню GRUB. Это может быть Windows операционная система или любая другая, например, Linux.

Вернемся к Ubuntu. Вы, помните я говорил, что мы сможем загрузить Ubuntu другим способом? В самом деле, мы можем просто воспользоваться chainloaded, точно также как и для Windows.

title Ubuntu

root (hd0,8)

chainloader (hd0,8)+1

Это будет работать также хорошо.

Следующий пункт в меню позволяет вам загрузить SUSE в защищенном (failsafe) режиме (разновидность безопасного режима). Этот пункт не содержит очень ценной и полезной информации, поэтому пропустим его, без ущерба для наших знаний.

Позвольте привести несколько примеров.

Приведенный ниже действующий пример, который записан в Ubuntu menu.lst (конечно, закомментирован).

title Windows 95/98/NT/2000

root (hd0,0)

makeactive

chainloader +1

title Linux

root (hd0,1)

kernel /vmlinuz root=/dev/hda3 ro

Теперь вы можете легко понимать язык GRUB. Мы начали с title. root определенный раздел на котором мы рассчитываем найти ядро Windows и смонтировать его (rootnoverify эта работа будет предоставлена загрузчику Windows). makeactive команда, которая делает активным раздел с корневой директорией на диске, указанном в предыдущей строке GRUB root device. Это означает, что команда chainloader выполняется без указания целевого раздела системы (так как этот раздел совпадает с активным).

Второй пункт меню еще проще. Мы назвали его Linux, определили его раздел и загружаем его ядро. Этот случай очень интересный. Так как образ ядра и корневой раздел (root или /) находятся на разных разделах. Этот случай очень похож на случай со старыми компьютерами или компьютером с одним загрузочным разделом.

И наконец, совершенно безумные вещи:

Меню GRUB загружающего более 100 операционных систем: DOS, Windows, Linux, BSD и Solaris

Вы понимаете, что все просто! Когда вы набьете руку, все сомнения исчезнут.

Для получения дополнительной информации, вам необходимо обратиться к GNU GRUB Manual 0.97.

Также вам нужно ознакомиться со статьей The list of command line and menu entry commands.

Конфигурация GRUB

Большую часть времени, у вас не будет желания или необходимости конфигурировать GRUB. Когда вы устанавливаете операционные системы, GRUB будет устанавливаться автоматически и соответствующие строки будут добавлены в конфигурационный файл, особенно, если выбрана правильная последовательность установки операционных систем (авторитарные, то есть Windows подобные операционные системы, — первыми, гибкие операционные системы, то есть Linux и его семейство, — после).

Тем не менее, вам необходимо знать где и что нужно делать, если что-то пойдет не так.

Установка GRUB

GRUB может быть установлен на различные устройства. Большинство людей будет интересовать процесс установки GRUB на жесткий диск. Однако, изучение других его настроек совсем не повредит. Конечно, вы можете перейти дальше.

Ранее мы не устанавливали GRUB, поэтому нам необходимо знать местонахождение требуемых файлов.

Если GRUB установлен, то его меню находится внутри корневого раздела:

/boot/grub/menu.lst

Всегда, всегда делайте резервную копию этого файла перед любыми изменениями!

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

/usr/lib/grub/i386-pc

Вы должны также знать основные команды Linux, относящиеся к жестким дискам и разделам. С этой целью, вы можете посмотреть мою статью «Самые полезные настройки и команды Linux».

Тем не менее здесь приводится ее краткая версия, для тех кого не радует чтение еще одной статьи.

Вы можете вывести на экран любую информацию о среде вашего ПК (персональный компьютер), используя терминал или текстовый редактор. Чтобы открыть файлы в текстовом редакторе необходимо указать в командной строке текстовый редактор, имя файла и путь к нему. Для открытия системных файлов необходимо иметь права суперпользователя (su или sudo для системных файлов).

$ sudo vi /etc/fstab

ИЛИ

$ sudo gedit /etc/fstab

Или вы можете просто вывести на экран содержимое файлов прямо в терминале с помощью команды cat.

$ (sudo) cat /etc/fstab

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

Выводит на экран таблицу разделов:

$ fdisk -l

Выводит на экран список монтированных разделов:

$ cat /etc/fstab

Сейчас мы знаем что нужно, и где это найти, для того чтобы установить GRUB.

GRUB на флоппи диске

Для того чтобы установить GRUB на флоппи диск, мы должны скопировать файлы (Стадия 1 и Стадия 2) из директории образа операционной системы , в первый и второй сектор флоппи диска. Для этого будем использовать команду dd, которая копирует информацию посекторно.

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

$ cd /usr/lib/grub/i386-pc

$ dd if=stage1 of=/dev/fd0 bs=512 count=1

$ dd if=stage2 of=/dev/fd0 bs=512 seek=1

Небольшое пояснение: if обозначает файл ввода, of обозначает файл вывода, /dev/fd0 ссылка на первый смонтированный дисковод флоппи дисков, bs заданный размер блока (в байтах), count инструкция, указывающая на количество блоков, которое должно быть скопировано, и seek указывает сколько блоков будет пропущено перед записью. Неудивительно что выбрана такая последовательность команд записи. В начале мы записали stage1 в первый сектор и скопировали stage2 во второй (пропустили первый сектор и затем записали).

Теперь, когда вы поняли всю мощь командной строки, в качестве домашней работы, предлагаю вам самим разобраться с особенностями других команд. Более подробно о команде dd на Wikipedia.

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

Установка GRUB по умолчанию

Установка по умолчанию означает размещение GRUB Стадия 1 в первом секторе на жестком диске (Главная Загрузочная Запись — MBR или Таблица Разделов). Это значит, что вы сможете загрузиться без второго устройства, подобного флоппи диску, который стал редким в наши дни. Так же это означает, что если вы установите авторитарную операционную систему позже (подобную Windows) или восстановите главную загрузочную запись по какой-то причине (запустите fdisk /MBR из командной строки DOS) , вы удалите GRUB и сделаете не загружаемыми все системы, представленные в menu.lst.

Для установки GRUB в MBR вам необходимо загрузиться с внешнего носителя (флоппи диск, live CD Linux). После загрузки, как только будет доступно приглашение на ввод команды GRUB (grub>), выполните следующие команды:

Найдите корневое устройство GRUB:

grub> find /boot/grub/stage1

GRUB будет искать все доступные Стадии 1 и отобразит их на экране. Если у вас имеется более одного образа операционной системы (например, SUSE, Kubuntu, Mandriva), вам будут доступны несколько Стадий 1.

Пример:

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

SUSE на (hd0,1)

Kubuntu на (hd0,2)

Mandriva на (hd0,4)

Эти системы имеют свой собственный GRUB, поэтому любая из них может быть использована в качестве GRUB устройства (так как каждая из них имеет свои собственные файлы GRUB).

Если вы хотите использовать SUSE GRUB, вам необходимо сделать корневым устройством GRUB (GRUB root device) первый раздел жесткого диска (hd0,1):

grub> root (hd0,1)

Если вы хотите использовать Mandriva’s GRUB, необходимо сделать следующее:

grub> root (hd0,4)

Если вам известно размещение корневого раздела GRUB и необходимых файлов, то можете обойтись без команды find.

Если вы определили корневой раздел, вам необходимо записать информацию в MBR (Главную Загрузочную Запись):

grub> setup (hd0)

И наконец, выйдите из GRUB консоли:

grub> quit

Вот вся последовательность команд, которую вам необходимо выполнить:

grub> find /boot/grub/stage1 (optional)

grub> root (hdX,Y)

grub> setup (hd0)

grub> quit

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

Это все. Просто и быстро!

Установка GRUB с помощью grub-install

Этот метод считается менее безопасным (согласно руководству), так как осуществляет автоматическое преобразование дисков. Можете успокоиться, для полных новичков, которым нужна подробная помощь при установке, это, наверное, самый предпочтительный метод.

Вам нужно вызвать только одну команду с одним аргументом — указать размещение, куда должен быть установлен загрузчик. Эта команда может быть записана несколькими способами, которые эквивалентны:

$ grub-install /dev/hda

$ grub-install /dev/hd0

$ grub-install ‘(hd0)’

$ grub-install hd0

После того как вы установили GRUB, ваша операционная система будет загружаться. После загрузки операционной системы, вы можете опять экспериментировать с GRUB. Изменять вручную установки, например, добавлять и удалять конфигурационные данные, менять загрузчики в последовательной загрузке (chainloader), скрывать и отображать разделы.

Настройка GRUB вручную (после установки)

Вы можете переконфигурировать или переустановить GRUB в любой момент.

Резервное копирование!

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

$ cp /boot/grub/menu.lst /boot/grub/menu.lst_backup

Для получения доступа к GRUB выполните следующую команду в Linux терминале:

$ sudo grub

Через какое-то время, приглашение GRUB будет показано на экране. Наличие приглашение вы можете определить по его виду: grub>.

GRUB консоль — приглашение на ввод команды

Также вы можете получить доступ к командной строке GRUB во время загрузки. Когда меню GRUB загружается, нажмите кнопку C на клавиатуре.

Добавление новой операционной системы в меню GRUB

Предположим, вы имеете ранее установленную операционную систему Sabayon (Sabayon Linux ранее известный как RR4 и RR64 — дистрибутив на ядре Linux, представляющий собою форк дистрибутива Gentoo). В процессе установки вы пропускаете установку GRUB. Это означает, что конфигурационные файлы ранее установленного GRUB не изменились и не содержат данных о Sabayon. И Sabayon не сможет быть загружен.

Примечание: Разделы GRUB меню названы комнатами (возможно это особенность данного экземпляра?).

Таким образом, нам необходимо добавить Sabayon в конфигурационный файл GRUB.

Если вы знаете, где Sabayon был установлен, то вам надо добавить его данные в menu.lst.

title Sabayon

root (hdX,Y)

chainloader +1

Это все.

Однако это можно сделать во время загрузки компьютера без редактирования меню. Когда установленный GRUB начнет загружаться, нажмите кнопку C, чтобы вызвать командную строку. И затем:

grub> root (hdX,Y)

grub> chainloader +1

При желании вы можете использовать команду find, чтобы узнать требуемые данные.

Это и есть вся магия GRUB. Как вы видите, она очень-очень простая. Но для людей, которые никогда не слышали о GRUB и видели только длинный список странных команд, может показаться устрашающей.

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

Типичные проблемы

Как восстановить GRUB после удаления?

Это часто происходит, если вы устанавливаете Windows после Linux. Windows считает, что она единственная операционная система в мире и не пытается интерпретировать существующую информацию, находящуюся в MBR. Она ее просто перезаписывает. Для людей, у которых имеется система двойной загрузки и небольшие познания в Linux, — это просто катастрофа. К счастью это очень легко поправимо.

Простой способ

Используйте Super Grub Disk. Я писал об этой утилите в статье A (cool) list of Linux tools, в разделе Rescue.

Сложный способ

Загрузитесь с флоппи диска или CD (любой Linux live CD должен подойти)

Войдите в режим командной строки GRUB.

grub> find /boot/grub/stage1 (optional)

grub> root (hdX,Y)

grub> setup (hd0)

grub> quit

Все тоже самое, что и раньше!

Windows установлена не на первом жестком диске (Своппинг)

GRUB не может загрузить напрямую операционную систему Microsoft. Иногда даже последовательная загрузка может не работать, особенно, если Windows установлена не на первом жестком диске. И снова вы должны помнить, что нужно устанавливать Windows первой, на первый жесткий диск и на первый раздел (правило 3П — трех первых). При этом, даже если вы установили Windows на отдельном диске, вы можете решить проблему с помощью своппинга.

Вам необходимо сделать виртуальный своп между жесткими дисками. Таким образом:

grub> map (hd0) (hd1)

grub> map (hd1) (hd0)

После добавления этих двух строк, вы должны загрузить Windows (или DOS).

Несколько Windows операционных систем установлены на одном первом жестком диске (Скрыть/Показать)

С Windows опять могут возникнуть проблемы, если имеется несколько экземпляров размещенных на одном жестком диске, в особенности, если они установлены на первичных разделах. Раньше, когда вы использовали команду chainloader (последовательная загрузка), вы передавали управление начальному загрузчику Windows. Какому загрузчику операционной системы передать управление сейчас?

Проблема легко решается с помощью скрытия и отображения разделов. Если GRUB скроет раздел, то он будет невидим для Windows, что позволить избежать неопределенности. И наоборот, если вы сделаете видимым раздел, Windows обнаружит его и сможет с него загрузиться.

Приводимый здесь пример, взят из руководства, он демонстрирует этот момент.

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

grub> unhide (hd0,0)

grub> hide (hd0,1)

grub> rootnoverify (hd0,0)

grub> chainloader +1

grub> makeactive

Вы изменили размер раздела; GRUB не работает

Это интересный случай. Он может случиться после использования программного обеспечения для работы с жесткими дисками (управление разделами жесткого диска, восстановление разделов из образов разделов, и т.д.), которое изменяет Таблицу Разделов. Обычно это случается, когда вы делаете такие изменения из Windows. Linux не будет информирована об этих изменениях, потому что Windows не обращает внимания ни на что, кроме имеющихся на этой машине продуктов Microsoft. Следовательно, GRUB не будет работать.

Скорее всего повреждена файловая система и ее необходимо восстановить для решения данной проблемы.

Загрузитесь с live CD и выполните следующие команды (предполагается что вы знаете, где размещены Linux-разделы).

Выполните проверку файловой системы:

$ fsck.ext2 /dev/hdXY

Замените X и Y буквой жесткого диска и номером раздела, который вы хотите проверить (hda2, hdb3, и т.д.).

Измените тип файловой системы на файловую систему ext2/3.

$ tune2fs -j /dev/hdXY

Теперь монтируйте корневую файловую систему на /mnt/sysimage и запустите grub:

$ mount -t ext2 /dev/hdXY /mnt/sysimage

ИЛИ

$ mount -t ext2 /dev/hdXY /mnt/sysimage

$ cd /mnt/sysimage/sbin

$ grub

Вы снова вернулись в знакомую среду.

Для получения дополнительной информации о командах Linux, например, fsck.ext2, tune2fs и других, обратитесь к Manual pages на Linux Reviews.

В заключение, несколько каверзных вопросов, отвеченных в Ubuntu wiki:

How to restore GRUB menu after Windows installation

How to identify the name of the boot drive (hd0, hd1, hd2, etc)

How to add Windows entry into GRUB menu

How to boot into Windows installed on a separate SATA drive

Полезные инструменты

GParted

GParted — это редактор разделов Gnome. Несмотря на то, что он является Linux ориентированным, он полностью поддерживает NTFS файловую систему. Он запускается непосредственно с CD.

SystemRescueCD

Это live CD, который специально предназначен для аварийного восстановления. Этот пакет инструментальных программных средств включает несколько очень важных утилит доступных пользователю Linux, например, GParted, QTParted, Partimage, Grub, Lilo, sfdisk, утилиты обеспечения безопасности, сетевые утилиты и много других.

Super Grub Disk

Super Grub Disk предназначен для запуска с флоппи диска или CD, и применяется для восстановления системы. Самое важное, что он может восстановить первичный загрузчик, например, GRUB, LILO и даже загрузчик Windows.

TestDisk

TestDisk — это утилита, специально разработана для восстановления поврежденных разделов и загрузочных дисков. Это очень полезный инструмент, который может быть найден на ряде live CD, включая Knoppix и GParted. Он поддерживает NTFS разделы и имеет версию работающую под Windows.

GRUB 2 (GRand Unified Bootloader version 2), sometimes stylized as GRUB2 and commonly referred to as GRUB, is a multiboot secondary bootloader capable of loading kernels from a variety of filesystems on most system architectures. GRUB supports PC BIOS, PC EFI, IEEE 1275 (Open Firmware), SPARC, and MIPS Lemote Yeeloong.

GRUB replaces the original GRUB Legacy boot loader with an entirely separate code base featuring a new shell-like syntax for advanced scripting capabilities.

For a quick setup approach, see GRUB2 Quick Start.

If migrating a system from GRUB Legacy to GRUB2, see GRUB2 Migration.

Installation

Due to the way GRUB Legacy (grub-0.97) and GRUB2 were slotted in Gentoo, both versions of GRUB were able to be installed at the same time on the same system; however, only one version at a time could be installed into the Master Boot Record (MBR) of a hard drive.

It is recommended all systems should upgrade to GRUB2, since it supports all the same features sets as Legacy. Legacy was removed from the Gentoo ebuild repository on 2019-02-08.[1]

Prerequisites

To control which platforms GRUB will install for, set the GRUB_PLATFORMS variable in make.conf. The amd64 architecture includes a profile default which works for most systems.

FILE /etc/portage/make.confExample of setting the GRUB_PLATFORMS variable for EMU, EFI, and PC platforms

GRUB_PLATFORMS="emu efi-32 efi-64 pc"

The following platforms are supported depending on the target CPU:

Target
Platform i386 ia64 mips mipsel powerpc sparc64 x86_64
ARC No No No Yes No No No
Coreboot Yes No No No No No 32-bit
EFI Yes Yes No No No No Yes
EMU Yes Yes Yes Yes Yes Yes Yes
IEEE 1275 (Open Firmware) Yes No No No Yes Yes 32-bit
Loongson No No No Yes No No No
Multiboot Yes No No No No No 32-bit
QEMU Yes No No No No No 32-bit
QEMU-MIPS No No Yes No No No No
PC Yes No No No No No 32-bit

Note
Whenever the values in the GRUB_PLATFORMS variable are adjusted GRUB will need to be re-emerged in order to build the changed binary. Be sure to use the --newuse --deep options as shown in the emerge section below.

The amd64 profiles enable support for (U)EFI functionality by default. When using a BIOS-based system, set GRUB_PLATFORMS variable to pc to avoid unneeded dependencies.

USE flags

USE flags for
sys-boot/grub

GNU GRUB boot loader

device-mapper Enable support for device-mapper from sys-fs/lvm2
doc Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally
efiemu Build and install the efiemu runtimes
fonts Build and install fonts for the gfxterm module
libzfs Enable support for sys-fs/zfs
mount Build and install the grub-mount utility
nls Add Native Language Support (using gettext — GNU locale utilities)
sdl Add support for Simple Direct Layer (media library)
test Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently)
themes Build and install GRUB themes (starfield)
truetype Build and install grub-mkfont conversion utility

Emerge

To install GRUB use the normal emerge syntax:

root #emerge --ask --newuse --deep sys-boot/grub

Additional software

Optionally, install the os-prober utility (provided through the sys-boot/os-prober package) to have GRUB probe and generate boot entries for other operating systems when running the grub-mkconfig command. In most instances, this will enable GRUB to automatically detect other operating systems including Windows 7, 8.1, 10, other distributions of Linux, etc.

root #emerge --ask --newuse sys-boot/os-prober

The GRUB (and optionally sys-boot/os-prober) installations do not automatically enable the boot loader’s operation. These only install the boot loader software on the operating system. To install the boot loader to the system itself (so that it is used when booting the system), additional steps need to be taken, which are covered in the Configuration section.

Configuration

There are two important aspects to the configuration of GRUB:

  1. Installation of GRUB software as the secondary boot loader of the system.
  2. Configuration of the GRUB boot loader.

The installation of GRUB software is specific to the type of system, and is covered in Installing the boot loader. First we cover the configuration of the boot loader itself.

Main configuration file

The grub-mkconfig script is used to generate a grub configuration. It uses the scripts under /etc/grub.d/* together with the /etc/default/grub configuration file to generate the final /boot/grub/grub.cfg — the only configuration file used by GRUB itself.

File Format Edits recommended? Description
/usr/sbin/grub-mkconfig POSIX shell script No Installed as part of the sys-boot/grub:2 package. Run this script to generate /boot/grub/grub.cfg after configuring the files described below.
/boot/grub/grub.cfg GRUB shell script No The file generated by grub-mkconfig. This file is evaluated by GRUB’s built-in script interpreter and doesn’t necessarily support all POSIX commands or syntax. See the scripting reference in the GRUB manual for supported features. Be aware that modifications to this file won’t persist to the next time grub-mkconfig is run.
/etc/grub.d/* POSIX shell scripts Maybe Each script under /etc/grub.d/* that has its execute bit set is evaluated in sequence, and the stdout is concatenated to form the final /boot/grub/grub.cfg (or whatever file is given to the grub-mkconfig -o option). These scripts use the current system shell and therefore can use any supported syntax. Ideally they should be POSIX-compatible scripts, and the output script must be compatible with the GRUB interpreter. It may be necessary to disable or add scripts. For instance, to add menu items that couldn’t be automatically generated.
/boot/grub/custom.cfg GRUB shell script Maybe The /etc/grub.d/41_custom script will reference this file to be read in at boot time if it exists. This file provides a place to add additional entries or commands and does not require regeneration of the main grub.cfg file.
/etc/default/grub POSIX shell script Yes In most cases this is the only file that should be modified directly. It is mainly used to assign variables used by the scripts in /etc/grub.d to generate a working configuration file. See GRUB configuration variables or the official reference for supported variables.

GRUB does not require the administrator to manually maintain a boot option configuration (as is the case with boot loaders such as GRUB Legacy and LILO). Instead it can generate its configuration file (/boot/grub/grub.cfg) using the grub-mkconfig command. This utility will use the scripts in /etc/grub.d/ and the settings in /etc/default/grub.

Warning
The grub-mkconfig utility does not work properly when using software RAID. Manual configuration of the scripts in /etc/grub.d/ is necessary, as otherwise after installation the system will be left in a non-bootable state.

After modifying one or more settings, run the grub-mkconfig utility with the -o option pointing to the output file located at /boot/grub/grub.cfg (this is GRUB’s default output location):

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

Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.3.0-gentoo
done

Each time the grub-mkconfig utility is called a new configuration will be generated.

Warning
If grub-mkconfig does not report any found entries then no entries were found. In this case GRUB will offer no boot selections when upon system restart which may be a tricky, time consuming situation to resolve. Make sure the output is satisfactory before restarting the system.

Setting configuration parameters

The following variables in /etc/default/grub are the most common ones to set to control how GRUB will function:

Variable Explanation Default value
GRUB_DEFAULT Defines the default menu entry selected on boot. May be a numeric index, a menu title, or «saved». Defaults to first detected entry.
GRUB_TIMEOUT Delay (in seconds) before booting default menu entry. Set to 0 to boot immediately or -1 to wait indefinitely. The default is 5 seconds.
GRUB_CMDLINE_LINUX Parameters to be passed on the kernel command line for all Linux menu entries. For instance, to support hibernation, users will need to add GRUB_CMDLINE_LINUX="resume=/dev/sdXY" with /dev/sdXY being the swap partition.
GRUB_CMDLINE_LINUX_DEFAULT Parameters to be passed on the kernel command line for non-recovery Linux menu entries.
GRUB_DEVICE The initial root device (i.e. the kernel’s root= parameter). Set this to override the grub-mkconfig command’s root device auto-detection. For example, GRUB_DEVICE=/dev/ram0 will force root=/dev/ram0 to be used in the kernel command line.

For a more complete list, please refer to the configuration variables sub-page and as the info page of grub-mkconfig.

After modifying the parameters, regenerate the GRUB configuration file with grub-mkconfig.

Enabling or disabling configuration scripts

The directory /etc/grub.d/ contains the scripts that grub-mkconfig uses to generate a grub.cfg file. By default the contents of this directory should be similar to the following:

user $ls /etc/grub.d/

00_header  10_linux  20_linux_xen  30_os-prober  40_custom  41_custom README

GRUB will use all installed scripts that are marked as executable (which by default, they all are). To disable any of the scripts simply remove the executable bit from the script’s file permissions using the chmod command. In the following example every script but 00_header and 10_linux are disabled:

root #chmod -x /etc/grub.d/{20_linux_xen,30_os-prober,40_custom,41_custom}

After modifying the scripts (or removing the executable bit), regenerate the configuration file using grub-mkconfig.

Manipulating configuration scripts

Some features or functionalities are only possible to be exploited by modifying the configuration scripts. For instance, to support dual-booting with FreeBSD, the following manipulation needs to be done.

Change the /etc/grub.d/40_custom script to:

FILE /etc/grub.d/40_customAdding an entry for dual booting

menuentry "FreeBSD" --class freebsd --class bsd --class os {
 insmod ufs2
 insmod bsd
 set root=(hd0,1)
 kfreebsd /boot/kernel/kernel
 kfreebsd_loadenv /boot/device.hints
 set kFreeBSD.vfs.root.mountfrom=ufs:/dev/ada0s1a
 set kFreeBSD.vfs.root.mountfrom.options=rw
 set kFreeBSD.hw.psm.synaptics_support=1
}

/dev/sda1 or (hd0,1) is the partition in which FreeBSD resides. If the normal UFS install was used for the FreeBSD partition then /dev/sda1 is a container (something like a logical partition). It consists of the swap and root partition. Verify the 40_custom script is executable by running ls -la /etc/grub.d/40_custom. If the executable bit is not set then set it using the chmod u+x 40_custom command.

Note
Users familiar with how GRUB Legacy numbered partitions should note partitions starting from 1, not 0, with GRUB.

Next install GRUB and update the configuration file:

root #grub-install /dev/sda

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

Installing the boot loader

Warning
The --efi-directory used in this article deviates from that one used in the AMD64 Handbook.

Installing GRUB as the system’s boot loader depends on how the system is meant to boot (through which type of firmware, e.g. on PCs either the legacy BIOS or its successor UEFI) and how the disk on which the boot loader should be installed is partitioned (e.g. on a PC, wheather it is using the MBR or the GPT partition layout).

This article covers the following situations:

  • BIOS with MBR or (U)EFI using the CSM (often called ‘BIOS mode’ or ‘legacy/compatibility mode’)
  • BIOS with GPT
  • UEFI with GPT, the native (U)EFI boot mode
  • Open Firmware (IEEE 1275) on PowerPC

Select the installation instructions appropriate for the system.

BIOS with MBR

Note
When the system is meant to dual-boot with another (pre-installed) operating system, such as Microsoft Windows, make sure that the Linux bootloader can coexist or dual-boot both operating systems. On PCs it is recommended to use the same boot method as the pre-installed system, e.g. when Windows is using the legacy MBR partitioning, it is also booted in ‘legacy BIOS’ mode (UEFI calls it CSM, short for Compatibility Support Module, in essence a BIOS emulation). If the mode is changed, e.g. from EFI-CSM (BIOS mode) to native (U)EFI mode, the pre-installed system will most certainly no longer be bootable.

Make sure that the /boot location is available — if this uses a separate partition, make sure that it is mounted:

Run the grub-install command to copy the relevant files to /boot/grub. On the PC platform, this also installs a boot image to the Master Boot Record (MBR) or a partition’s boot sector. If all goes well, after running grub-install an output such as the one below is to be expected:

root #grub-install /dev/sda

Installation finished. No error reported.

grub-install accepts a --target option to set the CPU architecture and system platform. If unspecified, grub-install will attempt to guess the proper values; on an amd64/x86 system it will use i386-pc by default. grub-install also accepts a --boot-directory option to tell the GRUB installer which directory to look for the boot files. This defaults to the current /boot but is useful when trying to move a root partition.

Partitioning for BIOS with MBR

Be sure to leave enough free space before the first partition. Starting the first partition at sector 2048 leaves at least 1 MiB of disk space for the master boot record. It is recommended (but not mandatory) to create an additional partition for GRUB called the BIOS boot partition. This partition just needs to be defined, but not formatted. It is only needed if the system is later migrated to the GPT partition layout. When sticking with MBR, this is not needed.

If the Gentoo installation instructions were followed, this BIOS boot partition will already be available.

BIOS with GPT

Warning
GPT was not designed for the legacy BIOS, yet with the protective MBR it includes a provision for it. Also, dual-boot with legacy operating systems designed to be booted from MBR, which is the de facto standard on computers with a BIOS, will need to access their partitions through the MBR, which can be accomplished by creating GPT/MBR hybrid partitions. This technique, however, has specific constraints.

On a BIOS system with GPT partitioning, GRUB relies on a partition call «BIOS boot partition». This partition is not formatted with a file system, instead grub-install will copy parts of the boot loader to it. The «BIOS boot partition» is not the same partition as a /boot partition.

If a /boot partition is needed, start by mounting the /boot partition:

If all goes well, after running the grub-install command an output such as the one below is to be expected:

root #grub-install /dev/sda

Installation finished. No error reported.

grub-install accepts a --target option to set the CPU architecture and system platform. If unspecified, grub-install will attempt to guess the correct values; on an amd64/x86 system in BIOS mode it will use i386-pc by default and in conjunction with a GUID partition table (GPT) a «BIOS boot partition» will be automatically used when present.

grub-install also accepts a --boot-directory option to tell the GRUB installer which directory to look in for the boot files. This defaults to the current /boot but is useful when trying to move a root partition.

Dual-boot with Windows

When the system is meant to dual-boot with Microsoft Windows installed in BIOS mode, full and native GPT partitioning isn’t possible. Windows only allows to be booted from an MBR partition when in BIOS mode, which includes the BIOS emulation mode of (U)EFI called ‘CSM’. For Linux however it is still possible to use a GPT partitioning scheme even from BIOS (or EFI-CSM) mode, but for the dual-boot with Windows this requires hybrid partitioning: up to four partitions can be defined in both the GPT and the MBR partition tables simultainiously.

Note
Traditionally x86-PCs used a BIOS as firmware. After the switch to (U)EFI on PCs (around 2005) there used to be a BIOS emulation called ‘Compatibility Support Module’ (CSM), PCs were therefore still compatible with existing operating systems. On mainstream PCs the EFI-CSM has been phased out since 2020. Even before 2020 some (U)EFI implementations, such as servers, lacked the CSM completely. ‘Legacy BIOS mode’ is therefore no longer available on modern UEFI systems. UEFI in its native boot mode demands the GUID Partition Table (GPT), a pre-installed operating system will therefore already be using a GPT partitioning scheme.

An already installed Windows will refuse to boot when the boot mode or the partitioning scheme is changed. Also, older Windows systems don’t support GPT (or EFI) at all, demanding that a BIOS or the EFI-CSM along with an MBR must be used. If Windows supports EFI it can be re-installed in the native UEFI mode and the GPT partitioning scheme, as well as Linux; see section UEFI with GPT.

Hybrid partitioning between GPT and MBR creates both a valid GPT partition table and a valid MBR partition table at the same time, but limits the total number of hybrid partitions to four because of the four primary partition limit of the MBR. Since the ESP (the EFI System Partition holding the EFI bootloaders) takes up one partition this leaves only three shared partitions between MBR and GPT. When one partition is used for Windows and one for Linux, there is only one additional hybrid partition possible, like a separate Linux /boot partition or a shared data partition between the two operating systems.

Warning
Normally, a GPT partition table will always also create an MBR partition table which holds only one partition spanning over the whole disk. This will ensure that older software doesn’t mistake the disk as ’empty’. The MBR with its protective partition is therefore called a ‘protecive MBR’ and is part of the GPT specification.
By defining hybrid partitions, this protective feature of the GPT is sacrificed! Legacy software will no longer see used space when analyzing the hybrid MBR. Software that is unaware of the GPT and only sees the MBR may mistake undefined disk space as unused and empty space. Data written outside the defined MBR partitions may cause data loss to the underlying GPT partitions!

If there are two physical disks available to the system, a great solution is to have one disk use the GPT and the other the MBR partitioning scheme. Normally, the Windows installation uses only one partition as ‘system partition’ and ‘boot partition’, called ‘drive C:’. When in BIOS mode the initial partition for booting, the ‘system partition’, must be an MBR partition. This applies to every Windows version since Windows XP and includes Windows 10. Since Windows Vista (actually Windows XP x64 Edition) the Microsoft operating system supports accessing GPT partitions. The solution is to relocate the ‘system partition’ part of an installation to the MBR partitioned disk, and convert the ‘boot partition’ (the one containing WINDOWS) into a GPT partitioned disk. Windows can thereafter access all the GPT partitions on the one disk, and will continue to use the MBR partitions (or hybrid partitions) on the disk containing the ‘system partition’. The Windows installation (containing WINDOWS) would be a GPT partition, even when booted in BIOS mode. Windows 11 no longer supports BIOS/CSM/MBR mode.

Partitioning for BIOS with GPT

When a GPT partition table is present on the system, a small BIOS boot partition with type EF02 (which is different from the EFI System Partition (ESP) which has type EF00) will need to be available. 1 MiB will be enough to work, but 2-4 MiB is a safer option. This BIOS boot partition will hold the stage 2 of the bootloader. BIOS boot partitions do not need to be formatted with a filesystem; the grub-install command will overwrite any existing filesystem with one of its own.

Important
The BIOS boot partition is not the same partition that is commonly mounted at /boot. The /boot and BIOS boot are different partitions and should be handled separately. The BIOS boot partition should not be regularly mounted on the system (i.e., it should not be defined in /etc/fstab). The /boot partition can be regularly mounted with no issues and therefore can be present in the /etc/fstab file.

To set a partition as a BIOS partition use the command-line tool parted (sys-block/parted) by typing (change 1 to the number of the partition to mark as a BIOS boot partition!):

(parted)set 1 bios_grub on

With sys-apps/gptfdisk’s cgdisk utility, this is accomplished by setting the partition type to 0xEF02 and giving it a label of gptbios.

An EFI System Partition is not required, but it would be sensible to make sure that the BIOS boot partition is large enough to be converted to one, should the system motherboard later be upgraded to an UEFI board.

The following is the output of pressing the p key using the gdisk utility on a GPT-partitioned disk with both a BIOS boot [0xEF02] partition and an EFI [0xEF00] partition:

root #gdisk /dev/sdc

GPT fdisk (gdisk) version 0.8.1
 
Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present
 
Found valid GPT with protective MBR; using GPT.
 
Command (? for help): p
Disk /dev/sdc: 976773168 sectors, 465.8 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): AA369F4D-37A4-4C0D-A357-DC24B99A6337
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 976773134
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)
 
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048       828377087   395.0 GiB   8E00  Linux LVM
   2       828377088       891291647   30.0 GiB    0700  Microsoft basic data
   3       891291648       975177727   40.0 GiB    0700  Microsoft basic data
   4       975177728       976754687   770.0 MiB   8300  Linux filesystem
   5       976754688       976756735   1024.0 KiB  EF02  BIOS boot partition
   6       976756736       976773134   8.0 MiB     EF00  EFI System
 
Command (? for help): 

Note
The 0x hexadecimal prefix does not need to be entered for GPT when using fdisk.

Using the same setup, the parted utility gives output with slightly different syntax:

root #parted /dev/sdc

GNU Parted 3.0
Using /dev/sdc
(parted) print
...
Sector size (logical/physical): 512B/512B
Partition Table: gpt
  
Number  Start   End    Size    File system  Name                  Flags
 1      1049kB  424GB  424GB                Linux LVM             lvm
 2      424GB   456GB  32.2GB               Microsoft basic data
 3      456GB   499GB  42.9GB               Microsoft basic data
 4      499GB   500GB  807MB   ext2         Linux filesystem
 5      500GB   500GB  1049kB               BIOS boot partition   bios_grub
 6      500GB   500GB  8396kB               EFI System            boot
  
(parted)

Creating partitions in gdisk is straightforward for users familiar with the fdisk partitioning utility. After starting gdisk, type n (for new) in the main menu, provide beginning and end sectors (if needed), and set the partition type to EF00 for an EFI system partition.

Users who have followed the Gentoo installation instructions will already have the proper partitioning layout set up.

UEFI with GPT

Note
If the UEFI-CSM is used, refer to BIOS with MBR or BIOS with GPT instead. CSM stands for ‘Compatibility Support Module’ and is a BIOS emulation, making the UEFI behave like a BIOS. In the firmware setup it is often called ‘Legacy Mode’ or ‘Compatibility Mode’. UEFI-CSM has always been optional and was phased out on mainstream systems (such as PCs) in 2020.

Make sure that the /boot location is available — if this uses a separate partition, make sure that it is mounted:

Run the grub-install command to copy the relevant files to /boot/grub. This should install GRUB in /boot/grub, copy the core image to /boot/efi/EFI/gentoo/grubx64.efi, and call efibootmgr to add a boot entry.

root #grub-install --efi-directory=/boot/efi

Installation finished. No error reported.

Important
The above command assumes a FAT formatted EFI System Partition (ESP) is mounted at /boot/efi. If the ESP is mounted directly at /boot, use --efi-directory=/boot instead.

grub-install also accepts a --target option to set the CPU architecture and system platform. If unspecified, grub-install will attempt to guess the proper values; on an AMD64 UEFI-booted system it will use x86_64-efi by default. grub-install also accepts a --boot-directory option to tell the GRUB installer which directory to look for the boot files. This defaults to /boot but is useful when trying to move a root partition.

Partitioning for UEFI with GPT

For UEFI GPT boot, the system must have a dedicated EFI System Partition containing a FAT filesystem.

The EFI partition can replace having a /boot partition on /dev/sda1 by having a /boot/efi partition on /dev/sda1. This is to say a successful UEFI boot scenario using GRUB can operate with two partitions total (three total if a swap partition is needed): a root partition and an EFI partition. Using this configuration, the /boot folder will be located in the root / partition (at /boot) and the EFI partition will mount in the boot folder (at /boot/efi). For further clarification, see the example /etc/fstab file below.

FILE /etc/fstabExample of an UEFI capable /etc/fstab file with a swap partition:

/dev/sda1       /boot/efi       vfat    noauto,noatime  1 2
/dev/sda2       none            swap    sw              0 0
/dev/sda3       /               ext4    noatime         0 1

Generating a 100MB partition for /boot/efi should provide plenty of space for holding multiple *.efi files (multiple entries will most likely not be needed; most systems will only use one).

Create the partition using the partitioning tool of choice. The gdisk (sys-apps/gptfdisk) and parted (sys-block/parted) tools fit nicely for this purpose. When using the gdisk utility, be sure to use type EF00.

Proceed to create a FAT filesystem on the EFI system partition using mkfs.fat and add it to /etc/fstab by following the example below:

root #mkfs.fat -F 32 -n efi-boot /dev/sda1

root #mkdir /boot/efi

FILE /etc/fstabAdding the /boot/efi mount entry

/dev/sda1       /boot/efi       vfat    noauto,noatime  1 2

Note
It is helpful to set the GRUB_PLATFORMS variable in /etc/portage/make.conf. This will assist GRUB in determining what options to use when detecting the proper EFI target. For 32-bit UEFI systems use efi-32. For 64-bit use efi-64.

Warning
Even though 64-bit x86 processors «x86-64» or «x64» do support running legacy 32-bit software, it is not possible for an EFI implementation to do the same. A 64-bit EFI will not be able to run 32-bit .efi loaders! It should be noted that some early 64-bit-capable systems, i.e. systems with an x64 processor (an x86 processor featuring AMD64 or Intel 64), used a 32-bit implementation of EFI, like some early MacBooks (Intel Core 2) and some pre-2010 Windows computers. In such cases, even though the processor is 64-bit, (U)EFI is implemented as 32-bit software making efi-32 the proper EFI target because, likewise, a 32-bit EFI cannot run 64-bit .efi loaders.

Important
In order for GRUB to install properly, the EFI directory must be mounted and the efivars kernel module must be loaded before the grub-install command will complete successfully.

Alternative: using the default UEFI firmware location

If the system’s UEFI firmware fails to find GRUB’s EFI bootloader file, using the default boot loader location should provide a working solution. This circumvents the boot menu managed by efibootmgr and thus offers reduced functionality, but is less error prone. To do this, verify the EFI partition is mounted at /boot/efi then copy the file grubx64.efi located at /boot/efi/EFI/gentoo/grubx64.efi to /boot/efi/EFI/BOOT/BOOTX64.EFI. This example assumes a 64-bit UEFI system, on 32-bit UEFI systems replace «X64» with «IA32» (i.e. /boot/efi/EFI/BOOT/BOOTIA32.EFI).

Open Firmware (IEEE 1275) on PowerPC

See here.

Install on encrypted partition

If the whole disk is encrypted, including /boot, extra steps need to be taken, to make sure GRUB will be able to decrypt and mount the device.

The device-mapper USE flag needs to be set before installing the GRUB package. Then the sys-fs/cryptsetup package needs to be installed as well. The partition needs to be encrypted as luks1. After which grub-install should work fine.

After installing GRUB on the device, depending on the way the kernel is setup, initramfs might need to be modified in order for the system to boot completely. If a distribution kernel is installed, Dracut will be installed on the system as well and can be used to finish the configuration.

Extended features

GRUB 2 has many features that make it a very powerful boot loader. It supports:

  • Booting from UEFI platforms.
  • Booting from GPT partitioned drives without needing a hybrid MBR (hybrid MBR can enabled as needed for compatibility or portability).
  • Booting from a btrfs formatted /boot partition.
  • Booting from a ZFS pool.
  • Booting directly from a btrfs raid set without needing an initramfs for early mount setup.
  • Booting directly from logical volume management (such as LVM2).
  • Booting with support for DM-RAID (RAID 0, 1, 4, 5, 6, 9 and 10).
  • Booting from encrypted devices (LUKS).

Some specific features are explained in more detail next.

Chainloading

GRUB 2 was built with a truly improved chainload mode when compared to GRUB Legacy. To chainload another boot loader, use the chainloader option.

FILE /etc/grub.d/40_customChainloading another bootloader

menuentry "Custom Super-bootloader example" {
     insmod part_msdos
     insmod chain
     chainloader (hd1,1)+1
}

For more information on chainloading, please see the Chainloading sub-page.

To secure GRUB so it is not possible for anyone to change boot parameters or use the command line, add a user/password combination to GRUB’s configuration files. The program grub-mkpasswd-pbkdf2 generates password hashes for GRUBː

user $grub-mkpasswd-pbkdf2

Password:
Reenter password:

PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.9CA4611006FE96BC77A...

Then, add the following toː

FILE /etc/grub.d/35_auth:

# Grub user
echo 'set superusers="<username>"'
# Grub password
echo 'password_pbkdf2 <username> <password-hash>'

The above may lock all Grub menu entries, even the default entry. In that case, to allow users to boot some menu entries without a password, see Securing the grub boot loader.

The permissions for the file need to be properly set before doing grub-mkconfig:

root #chmod 755 /etc/grub.d/35_auth

Using framebuffer display

To have GRUB use a framebuffer graphical display, re-emerge GRUB with the truetype USE flag enabled. This will install a default True Type font as well as a font conversion utility.

root #emerge --ask --newuse sys-boot/grub:2

Proceed to configure the default configuration file located at /etc/default/grub. For example:

FILE /etc/default/grubFramebuffer related settings

# Set resolution and color depth
GRUB_GFXMODE=1366x768x32
 
# Keep resolution when loading the kernel
GRUB_GFXPAYLOAD_LINUX=keep
  
# Set a background image
GRUB_BACKGROUND="/boot/grub/bg.png"
 
# Use a custom font, converted using grub-mkfont utility
GRUB_FONT="/boot/grub/fonts/roboto.pf2"
 
# Set the menu colors 
GRUB_COLOR_NORMAL="light-blue/black"
GRUB_COLOR_HIGHLIGHT="light-cyan/blue"

HiDPI displays

On modern displays with high DPI («HiDPI»), e.g. UHD (3840×2160), the standard font will look very small. If you like to have the same font as the kernel, Terminus can be used, which resembles a BIOS built-in textmode font…

KERNEL Terminus 16×32 font

CONFIG_FONT_TER16x32:

Terminus Font is a clean, fixed width bitmap font, designed
for long (8 and more hours per day) work with computers.
This is the high resolution, large version for use with HiDPI screens.
If the standard font is unreadable for you, say Y, otherwise say N.

To select this font in-kernel, CONFIG_FONT_TER16x32 has to be enabled.

KERNEL Kernel compiled-in fonts

Library routines  --->
      [*] Select compiled-in fonts
      [*] Terminus 16x32 font (not supported by all drivers)

The same font is available as media-fonts/terminus-font, which can then be used for GRUB as well.

root #emerge --ask media-fonts/terminus-font

root #grub-mkfont -s 32 -o /boot/grub/fonts/terminus32b.pf2 /usr/share/fonts/terminus/ter-u32b.otb

In the above example the filename chosen for grub-mkfont output is terminus32b.pf2. The font’s path has to be accessible to GRUB during boot, so it should reside in the same mount point as GRUB does; this example uses /boot/grub/fonts. The font then has to be set as GRUB_FONT in /etc/default/grub in order to be used.

FILE /etc/default/grubFramebuffer related settings

# Use a custom font, converted using grub-mkfont utility
GRUB_FONT="/boot/grub/fonts/terminus32b.pf2"

Updating the GRUB configuration file grub.cfg will then activate the configuration with the new font.

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

Troubleshooting

Note
For more troubleshooting, please refer to the Troubleshooting sub-article.

Most of the issues can be resolved by ensuring that the partition layout is correct. Make sure enough space is available before the first partition of the disk, or optionally make sure that a BIOS boot partition is available. Also verify that /boot/grub/grub.cfg was correctly generated with grub-mkconfig, or generate one with a custom menu entry.

os-prober not running

When running the grub-mkconfig command, os-prober is not running as expected, even though it is installed:

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

Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.11.14-gentoo-x86_64
Found initrd image: /boot/amd-uc.img /boot/initramfs-5.11.14-gentoo-x86_64.img
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
done

This can be corrected by setting the GRUB_DISABLE_OS_PROBER variable to false in /etc/default/grub file.

FILE /etc/default/grub

GRUB_DISABLE_OS_PROBER=false

Upon the next run, grub-mkconfig should find additional bootable partitions:

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

Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.11.14-gentoo-x86_64
Found initrd image: /boot/amd-uc.img /boot/initramfs-5.11.14-gentoo-x86_64.img
Warning: os-prober will be executed to detect other bootable partitions.
It's output will be used to detect bootable binaries on them and create new boot entries.
Found Windows Boot Manager on /dev/nvme0n1p2@/efi/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for UEFI Firmware Settings ...
done

Motherboard firmware not finding the .EFI file

Some especially older (pre-2020) motherboards from certain manufacturers seem to only support one location for the .EFI file in the EFI System Partition (ESP): the fallback or removable media path. If this seems to be the case, simply move GRUB’s default file to the /efi/boot/ location. First, make sure the ESP is mounted. Presuming the ESP is mounted at /boot/efi (as suggested in the Handbook), execute:

root #mkdir -p /boot/efi/efi/boot

root #cp /boot/efi/efi/gentoo/grubx64.efi /boot/efi/efi/boot/bootx64.efi

On a 32-bit EFI implementation use bootia32.efi instead:

root #cp /boot/efi/efi/gentoo/grubia32.efi /boot/efi/efi/boot/bootia32.efi

The removable parameter can be used with grub-install command to generate this file automatically:

root #grub-install --efi-directory=/boot/efi --removable

Installation finished. No error reported.

This should aid the motherboard firmware in loading the GRUB executable. Reboot the system to see if the firmware now correctly loads GRUB.

os-prober and UEFI in chroot

The sys-boot/os-prober utility is used to discover alternate installs, such as Microsoft Windows. To function properly, it needs to have access to information from the live environment’s udev to test for the EFI System Partition.

Run these commands in the host environment to provide the required files (example shows Gentoo mounted on /mnt/gentoo like in the Handbook):

root #mkdir -p /mnt/gentoo/run/udev

root #mount -o bind /run/udev /mnt/gentoo/run/udev

root #mount --make-rslave /mnt/gentoo/run/udev

Installing a new kernel

Whenever a new kernel is installed, GRUB must be reconfigured to recognize it. This can be done using grub-mkconfig, as shown below, or can be done manually.

Note
Make sure the /boot partition is mounted for this step.

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

Generating grub.cfg ...
Found linux image: /boot/kernel-3.3.8-gentoo
Found initrd image: /boot/initramfs-genkernel-x86_64-3.3.8-gentoo
Found linux image: /boot/kernel-3.2.12-gentoo
Found initrd image: /boot/initramfs-genkernel-x86_64-3.2.12-gentoo
done

Note that GRUB only needs to be reconfigured, not reinstalled to the boot drive’s Master Boot Record (MBR). On the other hand, when GRUB itself has been upgraded it does need to be reinstalled on the boot drive, but usually does not need to be reconfigured.

Automatic GRUB reconfiguration

If the package sys-kernel/installkernel-gentoo is installed and the USE flag grub is set, then on every installation of a kernel, grub-mkconfig will run automatically.

See also

  • In Chainloading the use of GRUB to boot other boot loaders is described. This is important to read when dual-booting systems, or when GRUB needs to be configured to boot ISO files.
  • In Advanced storage the necessary steps are documented on how to install and use GRUB on more advanced storage situations, such as software RAID, logical volumes or encrypted file systems.
  • In Configuration variables an exhaustive list of GRUB configuration variables, as used by /etc/default/grub, is documented.
  • In Troubleshooting a list of common GRUB errors (with their solutions) is presented.
  • In Hybrid partition table the use of a mixed MBR/GPT setup is documented, as well as how to use such hybrid partition layout with GRUB.

External resources

For more information, please see:

  • GNU GRUB 2 manual page
    • Network (PXE) section of GRUB
  • Legacy BIOS issues with GPT article
  • GPT and Hybrid MBR article
  • GPT fdisk utility page
  • Arch Linux GRUB 2 wiki article
  • Fedora GRUB2 wiki article : Encountering the dreaded GRUB2 boot prompt
  • ubuntu UEFI booting help
  • https://unix.stackexchange.com/questions/109272/dualboot-freebsd-gentoo-with-grub2-mbr
  • A blog post entry on locking specific GRUB2 boot entries with a password
  1. https://gitweb.gentoo.org/repo/gentoo.git/commit/sys-boot/grub?id=65be92768fab88a84a8cc05eea53fc9b67384c8b

Listen to this article

Для инициализации ядра и запуска операционной системы Linux используется загрузчик. Это программа, которая запускается после завершения проверки оборудования BIOS, подготавливает оборудование к работе, задает нужные параметры ядра и позволяет выбрать операционную систему. Основная задача загрузчика дать пользователю выбрать операционную систему для загрузки.

Включение устройства

Программа GRUB — это так называемый загрузчик. Она запускается первой после включения компьютера и, как правило, отображает меню, в котором можно выбрать для загрузки операционную систему Windows или какой-либо дистрибутив Linux. В большинстве современных дистрибутивов применяется версия GRUB 2. В старых, особенно корпоративных, установках Linux, вы наверняка столкнетесь с устаревшей, не поддерживаемой уже несколько лет версией GRUB 0.97. Поэтому я кратко расскажу и об этой версии.

Аббревиатура GRUB означает Grand Unified Bootloader (Грандиозный унифици- рованный загрузчик). Программа запускает Linux и вообще очень полезна для работы с параллельными установками Windows и Linux, так как непосредственно после запуска компьютера позволяет выбрать для работы желаемую операционную систему.

Основы

Версии GRUB. C июня 2012 года используется версия GRUB 2.0. Разработка этой версии велась еще с 2005 года. Некоторые дистрибутивы не стали дожидаться полной доработки GRUB 2 и уже давно применяют новый загрузчик. Например, Ubuntu использует GRUB 2, начиная с версии 9.10, а Debian — с версии 6. Дистрибутив openSUSE перешел на GRUB 2 только в версии 12.2. Особый случай представляет дистрибутив Fedora: его разработчики перешли на GRUB 2 уже в 16 версии, но только в компьютерах, работающих с BIOS. Если же инсталлировать Fedora 16 или 17 с EFI, то вместе с дистрибутивом будет установлена EFI-сов­местимая версия GRUB 0.97!

Итак, версия, применявшаяся до GRUB 2, имеет название GRUB 0.97 legacy (устаревшая). Примечание «устаревшая» указывает на то, что эта версия не развивается уже несколько лет и ее технической поддержкой никто не занимается. А число 0,97 не оставляет сомнений, что данная разработка не достигла и никогда не достигнет уровня GRUB 1.0. Несмотря на это, производители многих дистрибутивов неоднократно применяли GRUB 0.97 legacy по собственному усмотрению, в результате реализация некоторых функций GRUB отличается от дистрибутива к дистрибутиву!

Хотя в новых дистрибутивах применяется преимущественно GRUB 2, GRUB 0.97 по-прежнему широко распространен. Во-первых, как уже было сказано, эта программа встретится вам в старых версиях Linux, во-вторых, в корпоративных дистрибутивах GRUB 0.97 сохраняет свои позиции основного загрузчика (например, в RHEL он задействуется вплоть до версии 6.3).

Далее перечислены все важнейшие нововведения, появившиеся в GRUB 2 по сравнению с официальной версией GRUB 0.97. В некоторых дистрибутивах имеется пропатченная версия GRUB 0.97, в которой присутствуют не все, а лишь некоторые из перечисленных ниже функций. Правда, такие пропатченные версии являются неофициальными и содержат особенности, специфичные для конкретных дистрибутивов.

  • GRUB 2 совместим с менеджером логических томов и программным RAID. Таким образом, в установках LVM и RAID больше не требуется загрузочный раздел /boot.
  • GRUB 2 совместим с файловыми системами ext4 и btrfs.
  • GRUB 2 позволяет запрашивать разделы диска по уникальному идентификатору файловой системы.
  • GRUB 2 совместим с системами, альтернативными BIOS, — EFI и coreboot (ранее называлась LinuxBIOS).
  • GRUB 2 позволяет отображать в записях меню любые символы Unicode.

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

Конфигурация GRUB стала значительно сложнее. Конфигурационный файл grub.cfg является результатом исполнения различных конфигурационных сценариев. grub.cfg может и сам содержать сценарный код на shell-подобном языке либо на языке программирования LUA.

Компоненты и пакеты. Файлы, необходимые для работы GRUB 2, как правило, распределены по нескольким пакетам. Так, в Debian и Ubuntu в пакете grub-common содержатся различные платформозависимые конфигурационные файлы и команды, а в пакете grub-pc находятся файлы, специфичные для BIOS. Для компьютеров, использующих вместо BIOS EFI, coreboot и другие программы, вместо grub-pc требуются, соответственно, пакеты grub-efi-amd64, grub-efi-ia32 или grub-coreboot. Наконец, в пакете grub-rescue-pc имеется IMG-файл и файл образа диска, необхо- димые для того, чтобы сохранить систему аварийного восстановления GRUB на флешке или CD-диске. Таким образом, в критическом случае вы сможете запустить GRUB с такой флешки или диска, а потом запустить систему, вручную вводя команды GRUB или изменяя предусмотренные записи меню.

В Fedora удалось избежать такого разброса программ по разным пакетам. В пакете grub2 содержится GRUB для компьютеров, работающих с BIOS, а в пакете grub2-efi — версия, совместимая с EFI. Обновлением конфигурации GRUB (этот процесс необходимо выполнять после появления обновлений для ядра) занимаются Fedota-специфичные сценарии из пакета grubby.

Независимо от конкретного дистрибутива, для работы GRUB 2 требуется предварительно установить пакет os-prober. Одноименная команда просматривает все доступные разделы дисков на наличие операционных систем. Результат выполнения os-prober интегрируется в автоматически создаваемое меню GRUB.

Отличия, специфичные для конкретных дистрибутивов. К сожалению, в различных дистрибутивах GRUB 2 не только распределяется по разным пакетам, но и работает на основе не совсем идентичных конфигурационных файлов и механизмов. В этой главе описываются Debian версии 6 и выше, Fedora версии 16 и выше, openSUSE версии 12.2 и выше и Ubuntu версии 9.10 и выше.

Документация. Официальная документация по GRUB выдается по запросу справочной командой info grub.

Загрузка системы в BIOS

Прежде чем подробно обсудить установку и конфигурацию GRUB, коротко рассмотрим, что же происходит при загрузке системы. В зависимости от того, работает ли на компьютере традиционная система BIOS или более новая EFI, процесс загрузки может значительно отличаться.

После включения компьютера с BIOS инициализируется базовая система ввода-вывода. В ходе этого процесса на экране обычно отображается несколько системных сообщений — например, каким объемом памяти располагает компьютер. Затем BIOS загружает содержимое первого сектора первого жесткого диска в память и выполняет код этого сектора. Такой специальный сектор называется MBR (Master Boot Record, главная загрузочная запись).

Загрузчик Windows. Если на компьютере установлена ОС Windows, то в MBR располагается крошечная программа. Она находит раздел, помеченный как «активный», а затем запускает загрузчик Windows, который расположен в загрузочном секторе данного раздела. Если на компьютере установлено несколько версий Windows, то загрузчик Windows позволяет выбрать одну из них.

Загрузчик Linux. Если на компьютере установлена и Linux, MBR обычно заменяется кодом загрузчика GRUB. В таком случае GRUB может либо запустить Linux, либо совершить условный переход для запуска Windows.

Альтернативный метод заключается в том, чтобы не трогать MBR и установить GRUB в загрузочном секторе системного раздела Linux, пометив этот раздел как «активный». Такой метод хотя и не противоречит правилам MBR, менее надежен и поэтому почти не используется.

Основная загрузочная запись имеет размер всего 512 Мбайт, поэтому загрузчик не сможет полностью поместиться в MBR. Чтобы можно было обойти это ограничение, MBR может вместить ровно такой фрагмент кода, который позволит вам запустить оставшуюся часть загрузчика уже с жесткого диска. Соответственно, код GRUB подразделяется на две или три части: stage1 находится в основной загрузочной записи и предназначена для того, чтобы загрузить первые сектора части stage1_5 или stage2. В части stage1_5 содержится дополнительный код, обеспечивающий доступ к файлам различных файловых систем. Наконец, в stage2 содержится сам загрузчик.

Когда запустится загрузчик, появится меню, в котором будут на выбор представлены все операционные системы, определенные в процессе конфигурации GRUB (обычно это Windows и Linux). Теперь с помощью клавиш управления курсором можно выбрать интересующую вас операционную систему и запустить ее, нажав Enter. Часто GRUB настроен так, чтобы по истечении определенного промежутка времени операционная система загружалась автоматически.

Запуск Linux. Если вы определяете в загрузчике, что необходимо запустить Linux, то загрузчик должен поместить в оперативную память файл ядра Linux и запустить этот файл. Обычно файл ядра Linux называется /boot/vmlinuz (последняя буква z указывает на то, что ядро архивировано). Иными словами, загрузчик должен быть в состоянии загрузить из файловой системы весь указанный файл.

Параметры ядра. Обычно ядру сообщается несколько параметров. Как минимум один параметр передается обязательно: имя устройства системного раздела (например, root=/dev/sdb13). Это делается для того, чтобы ядро знало, какой из разделов является системным. Когда ядро запустится, управление будет передано программе Linux /sbin/init, отвечающей за инициализацию системы Linux. Например, она отвечает за запуск сетевых служб.

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

Чтобы процесс запуска прошел успешно, ядро должно иметь возможность получать доступ к системному разделу. Если этот раздел расположен в файловой системе, не поддерживаемой ядром напрямую, или на жестком диске SCSI, для которого в ядре нет подходящего драйвера, возникает проблема «курицы и яйца»: ядро не может обратиться к файловой системе и загрузить из нее модули, которые понадобились бы ядру, чтобы прочитать файлы файловой системы.

Файл Initrd. Решение заключается в том, что GRUB должен загружать не только ядро, но и файл Initrd. Это специальный файл, в котором содержатся все модули ядра, необходимые для запуска системы. Ядро временно использует этот файл как псевдодиск, то есть оно может загрузить все модули сразу же после запуска псевдодиска (сокращение Initrd означает Initial RAM Disk — диск в оперативной памяти для начальной инициализации).

Обычно файл Initrd называется /boot/initrd или /boot/initrd.gz. В большинстве дистрибутивов имеются инструменты, позволяющие создать такой файл Initrd, который бы подошел к применяемому аппаратному обеспечению и к файловой системе, которая находится в системном разделе (команда mkinitrd).

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

Конфигурация GRUB протекает по-разному в зависимости от версии GRUB. В GRUB 0.97 применяется центральный конфигурационный файл /boot/grub/menu.lst. В GRUB 2 есть целая коллекция конфигурационных сценариев, находящихся в каталоге /etc/grub.d/. Благодаря исполнению этих сценариев создается сам конфигурационный файл GRUB 2 /boot/grub/grub.cfg.

Запуск системы с EFI

В Apple система EFI (Extensible Firmware, расширяемый интерфейс между операционной системой и микропрограммами) применяется уже много лет, но на рынке ПК с другими системами постепенный отказ от BIOS продлился значительно дольше.

EFI и GPT. Даже притом, что EFI заново разрабатывался практически с нуля, выгоды для конечного пользователя остаются довольно ограниченными. Но не может не радовать, что теперь есть гигантские жесткие диски с таблицей секционирования GUID (GPT), совершенно не доставляющие проблем при работе. Не забывайте, что применение GPT не является обязательным, в том числе и на компьютерах с EFI! EFI нормально работает и с такими жесткими и твердотельными дисками, чья таблица секционирования сохранена в главной загрузочной записи (MBR). Лично я считаю, что использовать GPT предпочтительно и на жестких и твердотельных дисках, которые не превышают по размеру 2 Тбайт, поскольку такая таблица значительно упрощает весь процесс секционирования диска.

Параллельная установка. С введением EFI значительно изменился весь загрузочный процесс. В то время как BIOS в принципе предусматривал установку только одной операционной системы и при любой параллельной установке приходилось задействовать менеджер загрузок, EFI сам по себе поддерживает установку нескольких операционных систем. Каждая операционная система может сохранить собственный загрузчик в специально предусмотренном для этого сегменте диска. При запуске компьютера сначала происходит инициализация EFI, а потом автоматически запускается загрузчик той операционной системы, которая была задана по умолчанию. (Как правило, по умолчанию задается та операционная система, которая была установлена последней.) Если при запуске компьютера нажать специальное сочетание клавиш (к сожалению, оно не стандартизировано и варьируется в зависимости от производителя EFI и ПК), то EFI отобразит меню со всеми загрузчиками.

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

В сущности, GRUB с EFI совершенно не нужен. Ядро Linux содержит все необходимые функции, позволяющие EFI-системе запускать Linux напрямую, то есть, минуя GRUB или другие загрузчики. Но на практике этот вариант пока не играет роли: GRUB или другие загрузчики позволяют выбирать одну из нескольких установленных версий ядра, передавать параметры ядра, изменять параметры загрузки и т.д. При запуске Linux непосредственно из EFI вся эта гибкость теряется. EFI и GRUB. Чтобы EFI и GRUB правильно взаимодействовали, нужно наст­роить специальную версию EFI, рассчитанную на работу с GRUB. Установочные программы распространенных дистрибутивов решают эту задачу автоматически. В любом случае такое взаимодействие предполагает, что установочная программа должна выполняться в EFI-режиме! (Многие варианты реализации EFI совместимы с BIOS. При запуске той или иной установки Linux решающее значение имеет то, в каком режиме происходит данная установка. На некоторых компьютерах один установочный носитель — то есть DVD или флешка — в меню EFI отображается как два: одно устройство в BIOS-режиме и одно в EFI-режиме. Вы должны выбирать именно ту запись, которая относится к EFI!)

Раздел EFI. На компьютерах с EFI код GRUB записывается не в главную загрузочную запись, а в каталог раздела с EFI. Это особый раздел диска, в котором применяется файловая система VFAT. Такой раздел должен быть помечен специальным идентификатором: (MBR) или (C12A7328-F81F-11D2-BA4B-00A0C93EC93B) (GPT).

Microsoft рекомендует создавать EFI-раздел как первый раздел жесткого диска, хотя стандарт EFI этого и не требует. Данный раздел не должен быть очень большим, вполне достаточно будет 100–200 Мбайт (в тех дистрибутивах, которые я протестировал, загрузчик EFI в каждом из случаев требовал менее 1 Мбайт. Windows 8 требует значительно больше места — ориентировочно порядка 25 Мбайт).

Раздел с EFI должен быть подключен к файловой системе Linux в каталоге /boot/efi! Если при установке Linux вы выполняете секционирование диска вручную, то об этом подключении должны позаботиться вы сами.

Ядро, файл Initrd. Если GRUB уже работает, то запуск Linux протекает точно так же, как и на компьютере с BIOS: GRUB загружает ядро и запускает его, и в ходе запуска происходит передача файла Initrd и параметров ядра.

Файлы Initrd

Ядро Linux содержит разнообразные модули. Многие дополнительные функции —  такие как управление SCSI-картой, доступ к определенным файловым системам, массивам RAID или сегментам LVM — обеспечиваются не самим ядром, а его модулями. Но при запуске системы это доставляет определенные проблемы. Действительно, как ядру загрузить модуль, если оно даже не имеет возможности получить доступ к файловой системе. Поэтому модули, которые требуются непосредственно для запуска системы, помещаются в диск оперативной памяти для начальной инициализации (Initial RAM Disk, сокращенно Initrd). Соответствующий Initrd-файл передает GRUB ядру (обратите внимание на ключевое слово initrd в конфигурационном файле GRUB).

Ядро и файл Initrd обычно находятся в каталоге /boot, но название самого Initrd— файла различается в зависимости от дистрибутива. В принципе, если применяется GRUB 0.97, то каталог /boot часто находится в собственном сегменте диска, вне системы RAID или LVM, поскольку GRUB 0.97 может обращаться только к обычным сегментам жесткого диска. В этом отношении GRUB 2 отличается значительно большей гибкостью.

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

Строго говоря, название «Initrd-файл» в большинстве современных дистрибутивов уже неприменимо. На самом деле мы работаем с initramfs -файлами, организация которых будет описана немного ниже. Но поскольку и в параметрах GRUB, и в различных командах для создания файлов используется понятие initrd, а само ядро правильно интерпретирует файл, несмотря на неверное название, я тоже не буду отступать от привычного названия Initrd — пусть оно и заведомо неверное.

Файл Initrd не всегда необходим для работы. Если ядро вашего дистрибутива содержит все компоненты, необходимые для загрузочного процесса, то запуск возможен и без Initrd-файла. Но для этого ядро нужно соответствующим образом скомпилировать — и именно такого в большинстве дистрибутивов не происходит. (Почти все модули ядра при желании можно интегрировать в само ядро. Разумеется, файл ядра от этого увеличится.)

К огромному сожалению, создание Initrd-файлов не стандартизировано. В каждом дистрибутиве для этого используются собственные инструменты. Initrd-файлы содержат не только модули ядра, но и сценарии для инициализации оборудования. Исполнение этих сценариев длится достаточно долго и стало головной болью для многих разработчиков, так как сильно тормозит процесс загрузки.

Update-initramfs (Debian, Ubuntu). В Debian и Ubuntu для создания Initrd-файлов и их последующего администрирования предусмотрен сценарий updateinitramfs. В простейшем случае для обновления Initrd-файла новейшей установ-ленной версии ядра вы просто задаете параметр -u. Но если вы хотите обновить Initrd-файл не до новейшей, а до какой-то другой версии ядра, то укажите номер версии с помощью параметра -k. Параметр -k all обновляет Initrd-файлы для всех установленных версий ядра.

С помощью параметров -c или -d сценарий update-initramfs создает новый или удаляет имеющийся Initrd-файл. В таком случае обязательно требуется указать версию ядра с помощью параметра -k.

root# update-initramfs -c -k 3.5-13-generic

update-initramfs: Generating /boot/initrd.img-3.5-13-generic

«За кулисами» сценарий update-initramfs обращается для создания Initrd-файлов к сценарию mkinitramfs. Базовая конфигурация происходит в файле /etc/initramfstools/initramfs.conf, Кроме того, к Initrd-файлу добавляются все модули, перечисленные в каталоге /etc/initramfs-tools/modules (один модуль на строку).

В стандартной конфигурации (с MODULES=most в initramfs.conf) сценарий mkinitramfs создает довольно крупные Initrd-файлы, содержащие многочисленные дополнительные модули. В частности, здесь находятся важнейшие файловые системы Linux, драйверы для USB, SCSI и SATA, а также сетевые и NFS-драйверы.

При непосредственном вызове mkinitramfs (это приходится делать редко), нужно как минимум сообщить имя нового Initrd-файла (параметр -o). Если Initrd-файл должен быть создан не для актуальной версии ядра, то дополнительно укажите желаемую версию:

root# mkinitramfs -o myinitrd 3.5-13-generic

Dracut (Fedora, Red Hat). Fedora в версии 12 и выше и Red Hat Enterprise Linux в версии 6 и выше используют для создания Initrd-файла программу dracut. В более ранних версиях Fedora и RHEL вместо этого применяется программа mkinitrd. dracut автоматически выполняется при каждом обновлении ядра. Initrd-файлы, создаваемые с помощью dracut, содержат меньше дистрибутиво-специфичного кода, чем ранее, и в большей мере опираются на информацию из системы udev.

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

Команда dracut учитывает настройки, указанные в файле /etc/dracut.conf, и встраивает в Initrd-файл модули из каталога /usr/share/dracut/modules.d. Чтобы создать Initrd-файл для самостоятельно скомпилированного ядра версии 3.5.3 (файл /boot/vmlinuz-3.5.3), выполните следующую команду:

root# dracut /boot/initrd-3.5.3 3.5.3

Mkinitrd (SUSE). В дистрибутивах SUSE Initrd-файлы создаются с помощью команды mkinitrd. Как правило, этой команде не требуется передавать никаких параметров. Команда mkinitrd автоматически создает Initrd-файлы для всех файлов ядра, которые находит в каталоге /boot. Новые Initrd-файлы получают имя вида /boot/initrd-nnn, где nnn — версия ядра. Кроме того, mkinitrd создает ссылку, которая указывает c /boot/initrd на Initrd-файл, соответствующий vmlinuz.

Если вы хотите создать только один определенный Initrd-файл, то с помощью параметров –k и -i можете задать, соответственно, файл ядра и файл Initrd (по умолчанию, это делается в каталоге /boot). Команда mkinitrd интерпретирует переменную INITRD_MODULES из файла /etc/sysconfig/kernel. В этом файле содержатся все модули, необходимые для загрузки, он может иметь примерно следующий вид:

# в /etc/sysconfig/kernel

INITRD_MODULES=»thermal ahci ata_piix ata_generic processor fan»

Дополнительные модули указываются с помощью -m. Более подробная информация по mkinitrd выводится с помощью параметра -h, справки man mkinitrd, а также в исходном коде самого сценария (файл /sbin/mkinitrd).

Обновления ядра. Когда в дистрибутиве выполняется обновление ядра и при этом имя ядра меняется, необходимо соответствующим образом изменить и файл меню GRUB, а также создать Initrd-файл, подходящий для нового ядра. Во всех распространенных дистрибутивах эти операции выполняются автоматически в процессе обновления, и после перезапуска компьютера уже используется новое ядро. (В некоторых дистрибутивах в меню GRUB может также сохраняться и запись для старого ядра. Она пригодится, если с обновлениями возникнут проблемы, и систе-му придется далее использовать со старым ядром.)

Просмотр Initrd-файла. В версии ядра 2.6 и выше Initrd-файлы внутрисистемно представлены как файлы initramfs. Initrd-файл — это сжатый файл-архив (cpio), состоящий из различных каталогов и файлов. Если вы хотите просмотреть содержимое этого архива, сделайте так:

root# cd /boot

root# cp initrd-n.n initrd-test.gz

root# gunzip initrd-test

root# mkdir test

root# cd test

root# cpio -i < ../initrd-test

root# ls -lR

Базовая конфигурация

Grub.cfg. Меню GRUB определяется в файле grub.cfg, который в зависимости от дистрибутива может находиться в разных местах:

/boot/grub/grub.cfg — файл меню GRUB в Debian и Ubuntu;

/boot/grub2/grub.cfg — файл меню GRUB в Fedora и openSUSE версия 12.2 и выше;

/etc/grub2.cfg — ссылка на /boot/grub2/grub.cfg в Fedora и openSUSE.

/etc/grub.d/. В принципе возможность вручную вносить изменения в файл grub.cfg не предусмотрена. Поэтому права доступа к этому файлу указаны как «только для чтения». Если вы хотите изменить меню GRUB, то измените лежащие в его основе конфигурационные файлы. Не может не радовать, что в Debian, Ubuntu, openSUSE и Fedora эти файлы находятся в одном и том же месте:

/etc/grub.d/* — общие конфигурационные файлы GRUB;

/etc/default/grub — дополнения, специфичные для конкретных дистрибутивов.

Update-grub. Чтобы заново сгенерировать эти файлы после внесения изменений или после обновления ядра, нужно выполнить одну из следующих команд:

root# update-grub (Debian/Ubuntu)

root# grub2-mkconfig -o /boot/grub2/grub.cfg (Fedora)

Пример grub.cfg. Результирующий файл grub.cfg выглядит наподобие приведенного ниже примера. Этот листинг автоматически создан в Ubuntu 12.10 с помощью grub.cfg и сокращен ради экономии места. Кстати, пусть вас не смущает строка insmod ext2: этот модуль GRUB отвечает за работу со всеми файловыми системами ext, в том числе с ext3 и ext4. Детали синтаксиса grub.cfg будут объяснены ниже в этом разделе:

# Пример /boot/grub/grub.cfg

# из /etc/grub.d/00_header

# Управление переменными

if [ -s $prefix/grubenv ]; then

set have_grubenv=true

load_env

fi

set default=»0″

if [ «${prev_saved_entry}» ]; then

set saved_entry=»${prev_saved_entry}»

save_env saved_entry

set prev_saved_entry=

save_env prev_saved_entry

set boot_once=true

fi

# Определение различных функций

function savedefault { … }

function recordfail { … }

function load_video { … }

# Выбор раздела с установочными файлами GRUB

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)’

search —no-floppy —fs-uuid —set=root d45161e0-a9dd-421b-90e3-dc01887b140b

if loadfont /usr/share/grub/unicode.pf2 ; then

set gfxmode=auto

load_video

insmod gfxterm

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)’

search —no-floppy —fs-uuid —set=root d45161e0-a9dd-421b-90e3-

dc01887b140b

set locale_dir=($root)/boot/grub/locale

set lang=de_AT

insmod gettext

fi

terminal_output gfxterm

if [ «${recordfail}» = 1 ]; then

set timeout=-1

else

set timeout=10

fi

# из /etc/grub.d/10_linux

# Запуск Ubuntu

menuentry ‘Ubuntu, mit Linux 3.5.0-2-generic’ … {

recordfail

gfxmode $linux_gfx_mode

insmod gzio

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)’

search —no-floppy —fs-uuid

—set=root 474ef599-7665-4fe0-a4fd-97df765db80e

linux boot/vmlinuz-3.5.0-2-generic root=UUID=474e… ro quiet splash

initrd /boot/initrd.img-3.5.0-2-generic

}

menuentry ‘Ubuntu, с Linux 3.5.0-2-generic (режим восстановления)’ … {

linux /boot/vmlinuz-3.5.0-2-generic root=UUID=474e…

ro recovery nomodeset

}

# из /etc/grub.d/20_memtest86+

# Тест памяти

menuentry «Memory test (memtest86+)» {

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)’

search —no-floppy —fs-uuid —set=root d45161e0-a9dd-421b-90e3-

dc01887b140b

linux16 /boot/memtest86+.bin

}

# из /etc/grub.d/30_os-prober

# Запуск Windows

menuentry «Windows (loader) (on /dev/sda1)» {

insmod ntfs

set root='(hd0,1)’

search —no-floppy —fs-uuid —set 2ca80f2ba80ef35e

chainloader +1

}

Создание grub.cfg заново. В Debian и Ubuntu команда update-grub создает новую версию файла grub.cfg. В Fedora и openSUSE в аналогичном случае выполняется команда grub2-mkconfig -o /boot/grub2/grub.cfg. (Сценарий update-grub, специфичный для Debian/Ubuntu, так или иначе, содержит только эту команду.)

grub[2]-mkconfig интерпретирует описанные ниже конфигурационные файлы или сценарии. При этом, в частности в каталоге /boot меню GRUB, создаются ­записи для всех файлов ядра. Кроме того, просматриваются все доступные разделы жесткого диска. Если на диске есть и другие операционные системы, то записи в меню GRUB создаются и для них. Поэтому выполнение update-grub на компьютере с большим количеством сегментов на диске может длиться достаточно долго.

grub[2]-mkconfig автоматически выполняется при каждом обновлении ядра и удостоверяет, что в меню GRUB содержится новейшая версия ядра Linux.

/etc/default/grub. в файле /etc/default/grub содержатся некоторые глобальные настройки GRUB. Не забудьте, что вносимые здесь изменения вступают в силу лишь тогда, когда вы заново сгенерируете grub.cfg! В Ubuntu конфигурационный файл содержит следующие настройки:

# Файл /etc/default/grub

GRUB_DEFAULT=0

GRUB_HIDDEN_TIMEOUT=0

GRUB_HIDDEN_TIMEOUT_QUIET=true

GRUB_TIMEOUT=10

GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian `

GRUB_CMDLINE_LINUX_DEFAULT=»quiet splash»

GRUB_CMDLINE_LINUX=»»

# GRUB_TERMINAL=console

# GRUB_GFXMODE=640×480

# GRUB_DISABLE_LINUX_UUID=true

# GRUB_DISABLE_RECOVERY=»true»

# GRUB_INIT_TUNE=»480 440 1″

Стандартная конфигурация в Fedora выглядит так:

GRUB_TIMEOUT=5

GRUB_DISTRIBUTOR=»Fedora»

GRUB_DEFAULT=saved

GRUB_CMDLINE_LINUX=»rd.md=0 rd.dm=0 quiet SYSFONT=latarcyrheb-sun16 rhgb

rd.lvm.lv=vg_fedora16vbox/lv_root rd.luks=0 LANG=de_DE.UTF-8

rd.lvm.lv=vg_fedora16vbox/lv_swap KEYTABLE=de-latin1-nodeadkeys»

Далее объясняются значения многочисленных параметров.

Переменная GRUB_DEFAULT указывает, какая запись меню GRUB должна выбираться по умолчанию. Обратите внимание на то, что количество записей может изменяться после каждого вызова update-grub и особенно после каждого обновления ядра. Поэтому такая настройка, как GRUB_DEFAULT=5, обычно не подходит.

Настройка saved означает, что будет активизирована запись меню, которая использовалась последней. Правда, это работает лишь при условии, что файлы GRUB расположены в обычном разделе диска! Если же используется LVM или RAID, то после выбора из меню GRUB не сможет сохранять каких-либо переменных окружения.

Вы также можете присвоить GRUB_DEFAULT последовательность символов (строку) menuentry, где menuentry — желаемая строка меню. Но при этом строго соблюдайте порядок записи данной строки (в том числе все номера версий и устройств, которые могут находиться в записи меню).

Переменная GRUB_HIDDEN_TIMEOUT важна в тех случаях, когда при установке GRUB опознает на вашем компьютере только одну операционную систему (в нашем случае — Linux). В таком случае значение GRUB_HIDDEN_TIMEOUT задает, сколько времени будет у пользователя, чтобы отобразить меню GRUB нажатием клавиши Shift (в течение этого времени ожидания экран остается черным).

В Ubuntu значение параметра GRUB_HIDDEN_TIMEOUT=0 приводит к тому, что GRUB сразу запускает операционную систему. Чтобы вмешаться в процесс загрузки, нужно нажать Shift сразу же после запуска компьютера. Если на компьютере установлено несколько операционных систем, то GRUB игнорирует настройку GRUB_HIDDEN_TIMEOUT и сразу отображает меню.

Переменная GRUB_HIDDEN_TIMEOUT_QUIET=true отменяет показ счетчика с обратным отсчетом в период ожидания, заданный в GRUB_HIDDEN_TIMEOUT . Если вы хотите, чтобы меню GRUB отображалось (в том числе и тогда, когда на компьютере установлена только Ubuntu), закомментируйте строки GRUB_HIDDEN_TIMEOUT=… и GRUB_HIDDEN-TIMEOUT_QUIET=… (поставьте перед каждой из них символ комментария #).

Переменная GRUB_TIMEOUT=n указывает, в течение какого количества секунд GRUB дожидается выбора одной из записей меню. Если за это время не поступит ни- какого пользовательского ввода, GRUB запустит уже выбранную операционную систему. Указанное здесь время учитывается лишь в том случае, если меню GRUB вообще появляется на экране, то есть, если на компьютере установлено несколько операционных систем или пользователь нажал клавишу Shift во время периода ожидания, заданного в GRUB_HIDDEN_TIMEOUT.

Переменная GRUB_DISTRIBUTOR интерпретируется сценарием 10_linux (см. ниже), в ней содержится имя текущего дистрибутива (например, Fedora или Ubuntu).

Значения переменных GRUB_CMDLINE_LINUX и GRUB_CMDLINE_LINUX_DEFAULT также учитываются сценарием 10_linux. В них указывается, какие параметры должны быть сообщены ядру. Параметры GRUB_CMDLINE_LINUX действуют при каждом запуске, а параметры GRUB_CMDLINE_LINUX_DEFAULT дополнительно применяются при запуске, происходящем по умолчанию (но не в режиме восстановления).

По умолчанию меню GRUB отображается в графическом режиме с разрешением 640 × 480 пикселов. Если вы хотите работать с более высоким разрешением,его можно задать в переменной GRUB_GFXMODE (разумеется, в пределах возможностей вашей графической карты). Если вы желаете вообще отказаться от графического режима, активизируйте специально предусмотренную для этого настройку GRUB_TERMINAL=console. Обе переменные интерпретируются сценарием 00_header. При стандартных настройках значительные различия между текстовым и графическим режимами отсутствуют, но только в графическом режиме могут отображаться символы Unicode.

Как правило, GRUB передает ядру, которое предполагается запустить, корневой каталог в качестве UUID-номера. Если вы, напротив, предпочитаете указывать номер устройства (например, /dev/sda1), активизируйте строку GRUB_DISABLE_LINUX_UUID=true. Эта настройка влияет только на запуск активного дистрибутива (сценарий 10_linux), но не на другие дистрибутивы.

update-grub или grub-mkconfig создают, как правило, записи меню и для запуска Linux в режиме восстановления. При этом Linux запускается в однопользовательском режиме, без отображения экрана-заставки. Если вы хотите отказаться от записей, необходимых для восстановления, активизируйте строку GRUB_DISABLE_RECOVERY=»true».

С помощью GRUB_INIT_TUNE = можно сопроводить запуск GRUB звуковым сигналом.

Автоматическое создание файла grub.cfg. Основная идея конфигурации GRUB заключается в том, что сами вы задаете лишь ключевые данные этой конфигурации. Готовый конфигурационный файл grub.cfg создается специальным сценарием с учетом указанных вами параметров. Здесь важно подчеркнуть, что сценарии GRUB пытаются опознать все операционные системы, установленные на компьютере (Linux, Windows и т. д.) и сделать в файле grub.cfg соответствующие записи. Это же касается и тех операционных систем, которые могут быть позже добавлены на компьютер.

Для этого в каталоге /etc/grub.d содержатся исполняемые скриптовые (сценарные) файлы (табл.). Когда следует создать новую версию grub.cfg, программа update-grub по порядку выполняет все сценарии, содержащиеся в grub.d. Результат (стандартный вывод) сценариев сохраняется в grub.cfg. Но из-за такого метода работы конфигурационные файлы получаются довольно путаными: в коде то и дело встречаются команды вида cat » EOF, переадресующие в стандартный вывод все строки вплоть до аббревиатуры EOF. Сами эти строки часто содержат сценарный код, который интерпретируется GRUB только при запуске системы.

Два наиболее интересных сценария — 10_linux и 30_os-prober. Сценарий 10_linux выдает для каждой версии ядра, находящейся в каталоге /boot/, две записи меню: одну для обычного запуска и одну для восстановительного запуска в однопользовательском режиме, без экрана-заставки. Записи меню сортируются по номеру версии, причем в начале списка идет самая новая версия.

30_os-prober вызывает сценарий os-prober. Этот сценарий выводит список всех операционных систем (Linux, Windows, Mac OS X), расположенных на всех доступных сегментах жесткого диска. Для каждой из этих операционных систем создается своя запись в меню, причем, в случае с дистрибутивами Linux, может быть применен вариант конфигурации GRUB, который уже задан. При этом вызываются многочисленные сценарии, входящие в состав пакета os-prober.

Во время моих тестов распознавание различных дистрибутивов Linux и версий Windows на компьютерах BIOS функционировало великолепно. С EFI все было гораздо сложнее. Операционные системы, запускаемые через EFI, не находят входа в меню GRUB. В общем-то, в этом нет ничего удивительного: вы же можете выбрать операционную систему в меню EFI, зачем же GRUB решать ту же задачу? Но, по моему опыту, интеграция с меню GRUB все же является желательной. На многих компьютерах меню EFI отображается именно в тех случаях, когда при запуске компьютера в определенный момент времени нажато нужное сочетание клавиш. Я об этом не раз забывал и оказывался в операционной системе, в которую совершенно не собирался попадать! В автоматическом меню GRUB ошибку допустить намного сложнее.

Самостоятельное внесение дополнений в grub.cfg. Если вы хотите дополнить grub.cfg собственными записями, добавьте в каталог grub.d свои сценарии. Эти сценарии выполняются в том порядке, который определяется их нумерацией (при одинаковом порядковом номере — в алфавитном порядке). Не забудьте поставить бит исполнения (Execute-Bit). Обратите внимание и на то, что в grub.cfg попадает не сам файл, а его результат (стандартный вывод)!

В файле шаблона 40_custom показан пример подобной работы. Здесь к файлу применяется команда tail (параметр $0). Благодаря параметру -n +3, файл выводится, начиная с третьей строки, первые две строки не отображаются.

#!/bin/sh

exec tail -n +3 $0

# в этом файле показан пример добавления собственных записей

В другом варианте показан пример 41_custom. Содержащийся здесь код без изменений переносится в grub.cfg и интерпретируется только к моменту запуска (то есть при отображении меню GRUB). В этот момент проверяется, существует ли файл /boot/grub/custom.cfg (Ubuntu) или /boot/grub2/custom.cfg (Fedora, openSUSE). Если он существует, то этот файл добавляется в конфигурацию GRUB. Поскольку source исполняется при выполнении GRUB, изменения в custom.cfg вступают в силу и не приходится дополнительно создавать конфигурационный файл GRUB grub.cfg.

#!/bin/sh

cat <<EOF

if [ -f $prefix/custom.cfg ]; then

source $prefix/custom.cfg;

fi

EOF

Синтаксис и внутренняя организация

Размеры статьи не позволяют привести здесь полное описание синтаксиса всех ключевых слов, допустимых для использования в grub.cfg. Поэтому ниже я рас- скажу лишь о важнейших ключевых словах, которые употребляются в примерах из этого раздела. Официальный учебник по GRUB (PDF-документ содержит более 100 страниц!) находится по адресу http://www.gnu.org/software/grub/manual/. Переменные. С помощью set varname=value осуществляется присваивание переменных. Для считывания переменных применяется запись вида $varname . При интерактивном выполнении команд GRUB команда echo $varname отображает содержимое переменной, а set возвращает все определенные переменные.

Некоторые переменные обладают, кроме того, особым значением. К ним относятся, например, default, timeout , color_xxx, menu_color_xxx и особенно root: прлюбом доступе к файлам автоматически происходит считывание раздела, определенного в root.

GRUB может долговременно сохранять переменные на время работы. Для этого сначала (в Linux) должен быть создан файл /boot/grub[2]/grub-editenv (по умолчанию в большинстве дистрибутивов он уже создан).

root# grub-editenv /boot/grub[2]/grubenv create

Теперь во время работы GRUB может с помощью save_env имяпеременной сохранить в этом файле переменную либо считывать переменные из этого файла с помощью load_env. Перед этим необходимо настроить root так, чтобы эта переменная указывала на раздел с файлом окружения. В Linux вы также можете считывать или изменять переменные GRUB с помощью grub-editenv.

Разделы. В GRUB существует собственная номенклатура для обозначения жестких дисков и содержащихся на них разделов (табл.). Но нумерация при этом не совпадает: первый жесткий диск имеет номер 0, а первый раздел — номер 1!

Перед номером раздела допускается ставить сокращенное обозначение, указывающее способ секционирования: msdos для носителей, чья таблица секционирования записана в главной учетной записи, gpt — для носителей, применяющих таблицу разбиения GUID. Таким образом могут получаться названия вида (hd0,msdos3) или (hd0,gpt2).

Работа с номерами UUID. В grub.cfg часто встречается следующая последовательность команд:

set root=(hd1,1)

search —no-floppy —fs-uuid —set 12345678…

Первая команда инициализирует переменную root. Вторая команда ищет файловую систему с указанным номером UUID. Если поиск оканчивается успехом, то GRUB, на основании значения параметра —set, сохраняет соответствующее имя раздела в переменной root.

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

Модули. С помощью insmod name GRUB загружает во время работы модули расширений с дополнительными функциями. GRUB ищет файлы модулей name.mod в каталоге /boot/grub[2], в разделе, указанном в переменной root. Следует в частности отметить важные модули part_msdos и part_gpt (считывание таблиц секционирования), ext2 (файловые системы ext2 и ext4), raid, raid5rec, raid6rec и mdraid (программные массивы RAID), lvm, gfxterm (графическая консоль), vbe (графическая система), а также jpeg, tga и png для считывания графических файлов.

Записи меню GRUB

Menuentry. Записи меню GRUB вводятся ключевым словом menuentry. Следующий за ним текст записывается в кавычках, поэтому в нем допускаются интернациональные символы.

Подменю. В версии GRUB 2.00 и выше поддерживаются подменю (меню второго порядка). В файле grub.cfg подменю определяются так:

submenu ‘Подменю’ {

menuentry ‘Запись 1’ { … }

menuentry ‘Запись 2’ { … }

}

В некоторых дистрибутивах в подменю стали переноситься записи для старых версий ядра, а также для восстановления системы. Благодаря этому основное меню становится значительно нагляднее. При работе с GRUB для перехода из подменю в меню первого порядка нажмите клавишу Esc.

Запуск Linux. Запись в меню GRUB 2, предназначенная для запуска Linux, в минимальном варианте выглядит примерно так:

menuentry «Linux» {

set root=(hd0,3)

linux /boot/vmlinuz-n.n.n root=… ro quiet splash

initrd /boot/initrd.img-n.n.n

}

set root указывает раздел, в котором находится ядро и Initrd-файл. Ключевые слова linux и initrd задают имена файлов относительно раздела диска. Указанные параметры передаются ядру. Обязательно требуются root для указания системного раздела и ro, чтобы доступ к системному разделу был открыт сразу только для чтения. Все остальные параметры специфичны для конкретных дистрибутивов. Вот примеры:

Debian 6 — root=/dev/xxx ro quiet ;

Fedora 17 — root=/dev/xxx ro rhgb quiet LANG=… SYSFONT=… KEYTABLE=… ;

openSUSE 12.2 — root=UUID=xxx resume=/dev/xxx splash=silent showopts video=nxn quiet ;

Ubuntu 12.10 — root=UUID=xxx ro quiet splash .

Если в системе есть отдельный загрузочный раздел, то укажите его с помощью set root. В таком случае в linux и initrd уже не требуется задавать загрузочный каталог:

menuentry «Linux — Mit eigener Bootpartition» {

set root=(hd0,2)

linux /vmlinuz-n.n.n root=… ro quiet splash

initrd /initrd.img-n.n.n

}

Если раздел с ядром и Initrd-файлом входит в состав LVM-системы и/или программного массива RAID, то для работы потребуется загрузить соответствующие модули GRUB. В случае с RAID-5 и, соответственно, RAID-6 применяются модули raid5rec и raid6rec. В set root теперь можно указать системный раздел с помощью, соответственно, (lvname) и (mdn):

menuentry «Linux — Mit Software-RAID» {

insmod raid mdraid

set root=(md0)

linux /boot/vmlinuz-n.n.n root=… ro quiet splash

initrd /boot/initrd.img-n.n.n

}

menuentry «Linux — Mit LVM» {

insmod lvm

set root=(vg1-root)

linux /boot/vmlinuz-n.n.n root=… ro quiet splash

initrd /boot/initrd.img-n.n.n

}

menuentry «Linux — LVM auf RAID-5» {

insmod raid raid5rec mdraid lvm

set root=(vg1-root)

linux /boot/vmlinuz-n.n.n root=/dev/mapper/… ro quiet splash

initrd /boot/initrd.img-n.n.n

}

Если вы не хотите полагаться на номера устройств, вы можете также сами найти системный раздел в таблице UUID с помощью команды search. Если команда search сработает успешно, то GRUB-переменная root будет соответствующим образом изменена. Это работает и с LVM-, и с RAID-разделами, если предварительно загрузить нужные модули GRUB. В Ubuntu по умолчанию за set root следует подходящая команда search, позволяющая максимально снизить зависимость GRUB от номеров устройств.

menuentry » — настройка root-переменной Linux по UUID » {

set root=(hd0,3)

search —no-floppy —fs-uuid —set 12345678…

linux /boot/vmlinuz-n.n.n root=… ro quiet splash

initrd /boot/initrd.img-n.n.n

}

Запуск Windows. Для запуска Windows на компьютере с BIOS выберите с помощью set root системный раздел с Windows и запустите его загрузчик, используя chainloader +1. Обратите внимание на то, что Windows версии 7 и выше по умолчанию создает на диске два раздела: один загрузочный раздел размером около 100 Мбайт с файлами bootmgr и bootsect.bak и другой, значительно более крупный, системный раздел. В GRUB требуется указывать загрузочный раздел. Команда search остается опциональной. От drivemap, как правило, можно отказаться. Команда пытается «уверить» Windows в том, что система Windows расположена на первом жестком диске, даже если это совсем не так. Иногда требуется в первую очередь запускать именно Windows.

menuentry «Windows 7» {

set root=(hd0,1)

search —no-floppy —fs-uuid —set 12345678…

drivemap -s (hd0) $root

chainloader +1

}

О том, как запустить Windows на компьютере с EFI с помощью GRUB, рассказано в следующем разделе.

Ветвление и переход к работе с другим загрузчиком

Уже упоминавшаяся выше команда GRUB chainloader позволяет путем ветвления перейти к работе с другим загрузчиком. Соответствующие команды лучше всего вставить в конфигурационный файл, оформляемый по образцу /etc/grub.d/40_custom.

Запуск загрузчика из другого раздела диска. Если вы установите на компьютере еще один загрузчик в стартовом секторе раздела, то в меню GRUB 2 можно перейти к работе с этим загрузчиком. В таком случае укажите этот раздел с помощью set root (или search) и выполните chainloader +1:

menuentry «GRUB in /dev/sdb7» {

set root=(hd1,7)

search —no-floppy —fs-uuid —set 12345678…

chainloader +1

}

В данном случае у меня возникли проблемы, когда я пытался ветвлением перейти в другой установленный экземпляр GRUB. Система выдавала сообщение об ошибке invalid signature (недействительная подпись). Частично справиться с этой проблемой удавалось, дополнительно указав параметр —force:

menuentry «GRUB2 in /dev/sdb7» {

set root=(hd1,7)

chainloader +1 —force

}

К сожалению, это тоже работает не всегда. Особенно сложно переходить с GRUB 2 на GRUB 0.97. В этом случае целесообразно вообще отказаться от set root и задать желаемый раздел непосредственно с помощью chainloader:

menuentry «GRUB 0.97 in /dev/sdb7» {

chainloader (hd1,7)+1 —force

}

Если в другом дистрибутиве также используется GRUB 2, то ключевое слово config — file позволяет загрузить конфигурационный файл GRUB grub.cfg этого дистрибутива:

menuentry «GRUB in /dev/sdb7» {

set root=(hd1,7)

search —no-floppy —fs-uuid —set 12345678…

configfile /boot/grub/grub.cfg

}

Ветвление для работы с загрузчиком EFI. На компьютерах с EFI можно прямо из GRUB запускать другой загрузчик EFI. В приведенных далее примерах предполагается, что раздел с EFI является первым разделом первого жесткого диска; если это не так, то нужно соответствующим образом откорректировать set root.

menuentry » Запуск загрузчика Windows (EFI)» {

insmod part_gpt

set root='(hd0,1)’

chainloader /EFI/Microsoft/Boot/bootmgfw.efi

}

menuentry «Запуск загрузчика Fedora (EFI)» {

insmod part_gpt

set root='(hd0,1)’

chainloader /EFI/redhat/grub.efi

}

menuentry «Запуск загрузчика Ubuntu (EFI)» {

insmod part_gpt

set root='(hd0,1)’

chainloader /EFI/ubuntu/grubx64.efi

}

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

root# find /boot/efi -name ‘*.efi’ | sort

/boot/efi/EFI/Boot/bootx64.efi

/boot/efi/EFI/Microsoft/Boot/bootmgfw.efi

/boot/efi/EFI/Microsoft/Boot/bootmgr.efi

/boot/efi/EFI/Microsoft/Boot/memtest.efi

/boot/efi/EFI/redhat/grub.efi

/boot/efi/EFI/ubuntu/grubx64.efi

Индивидуальная конфигурация

GRUB 2 заранее сконфигурирован так, чтобы любые операционные системы можно было запускать на компьютере с BIOS. Стандартная конфигурация функционирует хорошо и, как правило, в большинстве случаев ее достаточно. Этот подраздел ориентирован только на тех пользователей Linux, которые хотят настроить GRUB под себя.

Деактивация os-probe. Если на жестком диске компьютера много разделов, то выполнение сценария 30_os-probe длится достаточно долго. Если данный сценарий вам не нужен (например, для запуска других дистрибутивов вы предпочитаете использовать самостоятельно определенные записи в меню GRUB), то добавьте в /etc/default/grub строку GRUB_DISABLE_OS_PROBER=true.

Фоновая графика. В качестве фона меню GRUB можно задать картинку. GRUB может работать с форматами JPG, PNG и TGA. Код, необходимый для интеграции фоновой картинки, в Debian и Ubuntu уже содержится в сценарии 05_debian_theme. Нужно всего лишь изменить три переменные и задать имя файла с вашим изображением, а также желаемые цвета для текста (рис.).

# в /etc/grub.d/05_debian_theme

WALLPAPER=»/boot/grub/myown.png»

COLOR_NORMAL=»white/black»

COLOR_HIGHLIGHT=»yellow/black»

Закрепление операционной системы по умолчанию. В файле /etc/default/grub можно закрепить номер определенной записи в меню GRUB. Операционная система, указанная под этой записью, будет запускаться автоматически. На практике пользы от этого немного. Если вы, например, хотите, чтобы по умолчанию запускалась система Windows XP, а в меню GRUB запись с Windows XP идет на десятом месте, то задайте параметр GRUB_DEFAULT=9 (отсчет начинается с нуля). Но не исключено, что после обновления ядра в меню GRUB появятся две дополнительные записи и ваша настройка станет неверной. Гораздо удобнее оставить параметр GRUB_DEFAULT=0, а желаемую запись меню GRUB разместить перед всеми остальными. Для этого лучше всего воспользоваться дополнительным сценарием в /etc/grub.d, причем имя файла должно начинаться с целого числа меньше 10. Возьмем следующие строки в качестве образца:

#!/bin/sh

exec tail -n +3 $0

# Файл /etc/grub.d/09_boot-windows-by-default

menuentry «Windows 7» {

set root=(hd0,1)

chainloader +1

}

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

GRUB_DEFAULT=’Windows 7 (loader) (on /dev/sda1)’

Но такой метод целесообразен лишь при условии, что при обновлениях GRUB номер этой записи в меню не изменяется. С Windows это работает хорошо, чего не скажешь о Linux, поскольку в автоматически генерируемых записях меню указана версия ядра — а она меняется при каждом обновлении ядра.

Установка вручную и первая помощь при работе с компьютерами с BIOS

Как правило, GRUB 2 правильно создается при установке вашего дистрибутива Linux. В дальнейшем вы, возможно, будете вносить изменения в конфигурацию GRUB, то есть в файл grub.cfg , но установкой GRUB как таковой заниматься больше не придется.

Этот подраздел о компьютерах с BIOS и следующий подобный подраздел о компьютерах с EFI актуален лишь в случаях, когда вы по каким-то причинам устанавливаете GRUB вручную либо когда хотите исправить поврежденную установку GRUB (например, если другая операционная система перезаписывает информацию в MBR).

Установка вручную с помощью grub-install. Сценарий grub-install (в Fedora и openSUSE он называется grub2-install ) устанавливает загрузчик в первый сектор указанного жесткого или твердотельного диска (то есть в MBR и во все остальные сектора, которые находятся на диске до начала первого раздела). Как правило, в качестве единственного параметра вы передаете в данном случае имя устройства, соответствующее носителю данных. При этом допускается запись как по принципу Linux (например, /dev/sda ), так и по принципу GRUB (например, (hd0) ):

root# grub-install /dev/sda

Теоретически возможно выполнить установку и в стартовом секторе сегмента (это записывалось бы как grub-install/dev/sda3 или (hd0,3)), но этого не рекомендуется делать, если вы не работаете с GRUB 0.97. В стартовом секторе слишком мало места для внедрения всего кода GRUB, а при применении блок-списков система считается нестабильной. (Блок-список содержит информацию о том, в каких блоках с данными на жестком/твердотельном диске находится следующая часть GRUB-кода.) Если эти аргументы кажутся вам неубедительными, можете произвести принудительную установку с помощью параметра —force.

Особый случай: ПК с BIOS и GPT. Linux можно инсталлировать на жестком/ твердотельном диске, на котором находится таблица секционирования GUID, а сам диск установлен на компьютере с BIOS. (Что касается Windows, то эта операционная система, напротив, может быть установлена только на ПК с EFI, если на жестком или твердотельном диске содержится таблица секционирования GPT.) Так или иначе, в подобном особом случае в учебнике по GRUB рекомендуется выделять для установки GRUB собственный раздел размером около 1 Мбайт, снабженный флагом bios_grub. Этот раздел предусмотрен только для установки BIOS-совместимых загрузчиков.

Такой раздел bios_grub не нуждается в форматировании. До сих пор Fedora 16 остается единственным дистрибутивом, самостоятельно создающим такой раздел при автоматическом сегментировании жестких дисков с таблицей GPT (в версии 17 Fedora снова отказалась от того, чтобы автоматически создавать GPT на пустых жестких дисках).

Разумеется, раздел диска можно создать и вручную. Для этого поставьте флаг bios_grub с parted, заменив n на желаемый номер раздела:

root# parted /dev/sda set n bios_grub on

Когда при установке GRUB обнаруживает наличие раздела bios_grub , этот загрузчик, как обычно, устанавливает первую часть кода GRUB в главную загрузочную запись, а остальной код — в раздел, помеченный как bios_grub . Применять именно такой подход при установке GRUB на жестких дисках с GPT, конечно, необязательно. Но этот подход считается достаточно надежным вариантом, особенно если на компьютере установлены другие операционные системы (Windows). Но у этого метода есть и свой недостаток: если на компьютере существует такой раздел, то на машине становится невозможно параллельно инсталлировать несколько экземпляров GRUB-2, поскольку при каждой новой установке GRUB содержимое раздела bios_grub перезаписывается. Более подробно о GRUB и GPT рассказано здесь: http://www.gnu.org/software/grub/manual/html_node/BIOS-installation.html и http://www.wensley.org.uk/gpt .

Ремонт GRUB с помощью «живого диска» (на компьютерах с BIOS). Если при установке GRUB что-то пошло не так либо загрузчик был стерт при установке другой операционной системы, то GRUB нужно переустановить с «живого диска», на котором находятся инструменты с актуальными инструментами GRUB 2. После запуска системы перейдите в режим администратора (root) (в Ubuntu — sudo -s), подключите системный раздел, а также активные каталоги /dev, /proc и /sys к файловой системе, а потом выполните chroot. Возможно, после этого понадобится также подключить загрузочный раздел к новой root-файловой системе. Затем обновите конфигурацию GRUB и запишите GRUB в желаемое место с помощью grub[2]-install (обычно для этого используется главная загрузочная запись первого жесткого диска). Как обычно, в следующих командах необходимо заменить /dev/sdan вашими номерами устройств.

root# mkdir /syspart

root# mount /dev/sda2 /syspart (Системный раздел)

root# mount -o bind /dev /syspart/dev

root# mount -o bind /proc /syspart/proc

root# mount -o bind /sys /syspart/sys

root# chroot /syspart

root# mount /dev/sda1 /boot/efi (Раздел с EFI)

root# update-grub

root# grub-install

root# exit

Вручную вводим команды GRUB для запуска Linux

Если GRUB удается запустить, но после выбора Linux из меню GRUB саму операционную систему запустить не получается, то можно, нажав клавишу C, перейти в меню GRUB в интерактивный режим, а затем выполнить следующие команды:

grub> set root=(hd0,1)

grub> linux /vmlinuz root=/dev/sda1

grub> initrd /initrd.img

grub> boot

Вместо (hd0,1) и /dev/sda1 задайте имя вашего системного раздела с Linux. В большинстве дистрибутивов файлы /vmlinuz и /initrd.img указывают на новейшую версию ядра и файла Initrd. Эти файлы находятся в каталоге /boot. Если в вашем случае это не так, нужно точно задать местоположение ядра и Initrd-файла. GRUB обеспечивает при этом функцию автозавершения, оно выполняется клавишей Tab.

Изменение загрузочных записей и настроек EFI вручную (efibootmgr)

Откуда EFI известно, какие операционные системы установлены на компьютере и, соответственно, какие загрузочные записи должны отображаться? На материнских платах с EFI эта информация хранится в энергонезависимой памяти (NVRAM).

Всякий раз при установке новой операционной системы, после создания *.efi -файла в EFI-разделе, соответствующая запись сохраняется в энергонезависимой памяти.

В Linux можно считывать и изменять EFI-данные, сохраненные таким образом, с помощью команды efibootmgr. Данная команда предполагает, что в системе загружен модуль ядра efivars. Если это не так, то выполните modprobe efivars. Обратите внимание: модуль efivars можно применять лишь в том случае, когда Linux был загружен в режиме EFI (а не в режиме BIOS!). Для восстановительных работ используйте по возможности «живой диск» с Linux, который можно запускать в EFI-режиме.

Если команда efibootmgr выполняется без дополнительных параметров, то она выводит список загрузочных записей EFI, а также некоторых других параметров загрузчика EFI. Следующий вывод, например, означает, что на компьютере установлены Ubuntu, Fedora и Windows в EFI-режиме. При перезапуске по истечении времени ожидания (около одной секунды) автоматически запустится Ubuntu (BootCurrent). В период ожидания можно отобразить меню EFI с помощью сочетания клавиш, специфичного для конкретной материнской платы (на моем компьютере требуется нажать F8).

root# efibootmgr

BootCurrent: 0000

Timeout: 1 seconds

BootOrder: 0000,0005,0003,0001,0002

Boot0000* ubuntu

Boot0001* Hard Drive

Boot0002* CD/DVD-drive

Boot0003* Windows Boot Manager

Boot0005* Fedora

Если вы хотите после перезапуска один раз запустить Fedora, отметьте загрузочную запись этого дистрибутива параметром -n:

root# efibootmgr -n 5

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

root# efibootmgr -o 5

Следующая команда создает новую загрузочную запись EFI. Путь задается относительно раздела с EFI (то есть /boot/efi), при этом должен использоваться разделитель каталогов . Удваивать символ необходимо потому, что оболочка интерпретирует одиночный слэш как указатель специальных символов. С помощью параметра -L можно указать имя, которое должно отображаться в меню EFI.

root# efibootmgr -c -l \EFI\test\abc.efi -L abc

Разумеется, загрузочные записи можно снова удалять. Для этого нужно указать номер записи с параметром -b:

root# efibootmgr -b 6 -dw

Другие параметры команды efibootmgr описаны на странице справки man по этой команде.

——

Теперь установка Grub не вызовет у вас проблем. Мы разобрали не только как установить Grub2 в MBR но и в EFI. Кроме того, всю приведенную здесь информацию вы можете использовать для восстановления Grub. Так вы будете лучше понимать что происходит во время восстановления.


Если Вам понравилась статья — поделитесь с друзьями

3 460 просмотров

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

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

/Для загрузки Linux-систем (как впрочем и любой другой UNIX-подобной системы) существует универсальный загрузчик GRUB – GRand Unified Boot loader. Он обладает довольно широким функционалом. Позволяющим не только осуществлять корректную загрузку операционных систем (ОС), но и управлять непосредственно конфигурацией и самим процессом загрузки в интерактивном режиме. В деятельности, связанной с системным администрированием знание возможностей GRUB и умение их применять очень часто экономит в различных и нестандартных ситуациях огромное количество времени системным администраторам.

Содержание

  1. Как работает GRUB?
  2. Настройка параметров ядра
  3. Мультисистемная конфигурация

Загрузчик GRUB – это GNU-проект, разработанный специально для использования в качестве загрузчика по-умолчанию для систем UNIX и Linux. Для подавляющего числа дистрибутивов GRUB давно поставляется «из коробки». Его главной задачей является работа со списком (который подготавливается заранее вручную или автоматически) вариантов загрузки, из которого выбирается нужный для последующей загрузки системного ядра с определёнными для выбранного варианта параметрами.

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

GRUB читает конфигурацию загрузки при каждом запуске компьютера. Сами файлы конфигурации (в зависимости от используемой версии и дистрибутива) следующие: /boot/grub/menu.lst, /boot/grub/grub.conf или /boot/grub/grub.cfg для версии 2. В системах Red Hat используются файлы grub.conf, а для Ubuntu, SUSE и Solaris – menu.lst. Эти файлы имеют незначительные различия в синтаксисе конфигурации. Для примера, содержимое grub.conf может быть таким:

default=0
timeout=10
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title Red Hat Enterprise Linux Server (2.6.18-92.1.10.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-92.1.10.el5 ro root=LABEL=/

В этом примере конфигурируется загрузка всего одной системы Red Hat, которая (согласно default=0) будет загружена автоматически по прошествии 10 секунд (timeout=10), если не будет нажата какая-либо клавиша на клавиатуре. При этом корневая файловая система должна искаться, согласно параметру (hd0,0) команды root, на первом разделе первого жесткого диска.

Для поиска файла ядра задаётся путь относительно загрузочного раздела, монтируемого в каталог /boot. Для приведённого примера ядро будет загружаться из файла /vmlinuz-2.6.18-92.1.10.el5. Затем загрузчик выведет на экран заставку из файла /boot/grub/splash.xpm.gz, находящегося, как указано в команде splashimage, на разделе (hd0,0).

Настраивать параметры загрузки можно и в интерактивном режиме, используя интерфейс командной строки. Для этого нужно на экране меню загрузки нажать клавишу «c».

После чего мы попадем в командную строку. В которой уже можно выполнять команды.

Таким образом с помощью командной строки возможны все те же действия, что выполняются по инструкциям из файлов конфигурации. Как можно видеть, для этого загрузчик предоставляет целый набор команд со своими параметрами. Это бывает очень полезным, когда необходимо загружать системы, не имеющие соответствующей конфигурации в конфигурационных файлах или когда нужно восстановить «сломанную» конфигурацию. Для ознакомления со списком самых главных команд используется клавиша <Tab> в режиме работы командной строки загрузчика. В следующей таблице представлены наиболее часто используемые команды GRUB:

Команда Назначение
reboot Перезагружает систему
find Производит поиск файла во всех смонтированных логических разделах
root Задаёт корневое устройство (логический раздел)
kernel Загружает ядро системы с корневого устройства
help Выводит интерактивную справку по команде
boot Загружает систему с указанного образа ядра

Настройка параметров ядра

Системное ядро во время его загрузки можно (и нужно) заставить вести себя определённым образом, например опрашивать определённые устройства, искать демон init по нестандартным путям, указывать корневое устройство и т. д. Всё это легко позволяет настроить загрузчик. Для этого он использует некоторые параметры, самые основные из которых приведены в следующей таблице:

Параметр Назначение
acpi=off Отключает системы Advanced Configuration и Power Interface (управление питанием)
init=/bin/bash Указывает ядру запускать только интерпретатор bash — обычно используется для восстановления системы после сбоев
root=/dev/foo Указывает ядру, что корневым устройством является /dev/foo
single Задает режим однопользовательской загрузки (только для Linux. Для систем Solaris используется ключ -s — предназначен для работы со стандартом OpenBoot

Важно заметить, что конфигурация, задаваемая при помощи интерфейса командной строки GRUB не сохраняется. Для задания постоянной конфигурации загрузки необходимо отредактировать файл grub.conf (grub.cfg для GRUB2) или menu.lst.

Мультисистемная конфигурация

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

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

Конфигурация GRUB для загрузки Windows-систем несколько отличается от Linux. Так, например конфигурация запуска Windows XP может быть такой:

title Windows 10
rootnoverify (hd0,0)
chainloader +1

Здесь команда chainloader предназначена для передачи управления Windows-загрузчику, расположенному в первом секторе (+1) первого раздела первого жёсткого диска (hd0,0). А команда rootnoverify указывает GRUB, что монтировать раздел (hd0,0) не нужно, т. к. должна загружаться «неродная» система Windows. Пример мультисистемной конфигурации:

default=0
timeout=5
splashimage=(hd0,2)/boot/grub/splash.xpm.gz
hiddenmenu
title Windows 10
rootnoverify (hd0,0)
chainloader +1
title Red Hat
root (hd0,1)
kernel /vmlinuz

В этом примере ОС Windows должна будет загружаться по-умолчанию (default=0). Через 5 секунд (в течение которых не нажата какая-либо клавиша на клавиатуре) с первого раздела первого жёсткого диска. А ОС Red Hat – со второго раздела того же диска.

Также важно отметить, что в процессе обновлений (как правило автоматических) системного ядра, файлы старых версий ядер не удаляются. Но при этом скрипты из пакета обновлений могут автоматически отредактировать конфигурацию загрузки. Добавив новый вариант загрузки для нового ядра. Которое устанавливается в систему независимо от уже имеющихся в ней других ядер. Поэтому ничего удивительного в том, что пунктов меню, отражающих варианты загрузки. Cо временем (после каждого обновления ядра) становится всё больше и больше. Это довольно удобно, т. к. в случае, если с новым ядром система стала работать некорректно. Или вовсе «сломалась» – есть возможность использовать старое ядро. Воспользовавшись соответствующим пунктом меню загрузки GRUB.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Понравилась статья? Поделить с друзьями:
  • Battery mate bm310 инструкция по применению на русском языке
  • Омепразол для собак дозировка инструкция по применению
  • Валокордин доксиламин инструкция по применению состав
  • Слова благодарности руководству города
  • Ruixin pro rx 009 инструкция на русском