Как запустить grub при загрузке windows

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

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

  • Процесс загрузки 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
}
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
}

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

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

По-умолчанию 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 (англ.)

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

  • Arch boot process
  • Boot debugging
  • grub-gfx (Русский)
  • Kernel parameters

GNU GRUB это Многосистемный загрузчик. Он является ответвлением от GRUB,(GRand Unified Bootloader), который был разработан Эриком Стефаном Болейном (Erich Stefan Boleyn).

Вкратце, загрузчик — это первая программа, которая загружается при старте компьютера. Она отвечает за загрузку и передачу управления ядру Linux. Ядро, в свою очередь, запускает остальную часть операционной системы.

В данный момент, GRUB де-факто является стандартным загрузчиком LINUX, и в скором времени будет заменён на GRUB2. Когда это случится, «GRUB» сменит свое текущее название на «GRUB Legacy».

Contents

  • 1 Установка
  • 2 Настройка
    • 2.1 Определение корневой директории для GRUB
    • 2.2 Двойная загрузка с Windows
    • 2.3 Двойная загрузка с GNU/Linux
    • 2.4 chainloader and configfile
  • 3 Установка загрузчика
    • 3.1 Установка в MBR
    • 3.2 Установка в раздел
    • 3.3 Альтернативный метод (grub-install)
  • 4 Советы и трюки
    • 4.1 Загрузка в графическом режиме
    • 4.2 Видеорежим
      • 4.2.1 vbetest
      • 4.2.2 hwinfo
      • 4.2.3 Видеорежимы, детектируемые GRUB
    • 4.3 Метки разделов
    • 4.4 Парольная защита
    • 4.5 Перезагрузка в ОС по выбору
    • 4.6 Взаимодействие LILO и GRUB
    • 4.7 Загрузочная дискета GRUB
  • 5 Решение проблем
    • 5.1 GRUB Error 17
    • 5.2 Случайная установка GRUB в раздел Windows
    • 5.3 Редактирование параметров GRUB из меню загрузки
    • 5.4 Ошибка device.map
    • 5.5 Выбор ОС при перезагрузке KDE не работает
  • 6 Внешние ресурсы

Установка

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

После установки пакета дополнительно необходимо установить загрузчик GRUB в загрузочный сектор или на раздел диска, чтобы он смог выполнять загрузку операционной системы(систем). Этот процесс описан в главе Установка загрузчика.

Настройка

Файл настроек расположен в /boot/grub/menu.lst. Отредактируйте этот файл в соответствии с Вашими требованиями.

  • timeout # — время ожидания (в секундах) перед загрузкой операционной системы по умолчанию (default).
  • default # — номер записи, соответствующий операционной системе, загружаемой по умолчанию по истечении времени timeout.

Пример файла настроек (директория /boot расположена на отдельном разделе):

# Конфигурационный файл для GRUB - The GNU GRand Unified Bootloader
# /boot/grub/menu.lst

# ПРЕОБРАЗОВАНИЕ ИМЕН УСТРОЙСТВ
#
#  Linux           Grub
# -------------------------
#  /dev/fd0        (fd0)
#  /dev/sda        (hd0)
#  /dev/sdb2       (hd1,1)
#  /dev/sda3       (hd0,2)
#

#  ВИДЕОРЕЖИМ - РАЗРЕШЕНИЕ ФРЕЙМБУФЕРА (FRAMEBUFFER RESOLUTION)
#     +-------------------------------------------------+
#          | 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
#     +-------------------------------------------------+
#  для более детальной информации о настройках видеорежима:
#  http://wiki.archlinux.org/index.php/GRUB#Framebuffer_Resolution
#
# Совет: Если Вам необходимо разрешение 1024x768, добавьте "vga=773" к строке kernel.
#

# Общие настройки:
timeout   5
default   0
color light-blue/black light-cyan/blue

# Неявная нумерация загрузочных секций начинается с 0

# (0) Arch Linux
title  Arch Linux
root   (hd0,0)
kernel /vmlinuz-linux root=/dev/sda3 ro
initrd /initramfs-linux.img

# (1) Windows
#title Windows
#rootnoverify (hd0,0)
#makeactive
#chainloader +1

Определение корневой директории для GRUB

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

Примечание: GRUB присваивает имена устройствам хранения данных иначе, чем это делает ядро.

  • Жесткие диски именуются как (hdX); также именуются и любые USB устройства хранения данных.
  • Нумерация устройств и разделов начинается с нуля. Например, первый обнаруженный BIOS-ом жесткий диск будет иметь имя (hd0). Второе устройство будет иметь имя (hd1). Тот же принцип верен и для разделов. Например, второй раздел на первом жестком диске будет именоваться (hd0,1).

Если Вы не уверены где в Вашем случае находится /boot, используйте команду find во встроенной командной оболочке GRUB. Для того чтобы открыть командную оболочку, наберите:

Ниже приведен пример для систем без отдельного раздела под /boot, т.е. когда /boot является обычной директорией внутри корневой директории /:

grub> find /boot/grub/stage1

Следующий пример для систем с отдельным разделом /boot:

GRUB найдет нужный файл и выведет местоположение файла stage1, нарпимер:

Полученное значение должно быть указано в строке root в Вашем файле настроек. Для выхода из командной оболочки наберите quit.

Двойная загрузка с Windows

Добавьте следующие строки в конец Вашего /boot/grub/menu.lst (подразумевается, что Windows установлена на первый раздел первого диска):

title Windows
rootnoverify (hd0,0)
makeactive #если Вы используете Windows 7, закомментируйте эту строку
chainloader +1

Примечание: Windows, начиная с версии 2000, НЕ требует для нормальной загрузки, чтобы система располагалась на первом разделе диска (вопреки распространенному заблуждению). Если по какой-либо причине изменился номер раздела с уже установленной Windows (например, если Вы добавили раздел перед существующим разделом с Windows), Вам необходимо внести соответствующие изменения в файл boot.ini (см. эту статью для более детальной информации).

Если Windows расположена на другом жестком диске, необходимо использовать команду map. Тогда Windows будет считать, что она установлена на первый жесткий диск. Предположим, что Windows установлена на первый раздел второго диска:

title Windows
map (hd0) (hd1)
map (hd1) (hd0)
rootnoverify (hd1,0)
makeactive #если Вы используете Windows 7, закомментируйте эту строку
chainloader +1

Двойная загрузка с GNU/Linux

Вы можете указать настройки, подобные тем, которые определяет сам Arch Linux во время установки, например:

title Other Linux
root (hd0,2)
kernel /path/to/kernel root=/dev/sda3 ro
initrd /path/to/initrd

Однако могут потребоваться дополнительные параметры, или может не использоваться начальный RAM диск. Проверьте содержимое файла /boot/grub/menu.lst в других установленных дистрибутивах, чтобы выяснить корректные значения параметров загрузки, но лучшим решением будет использование команд chainloader and configfile

chainloader and configfile

Для облегчения процесса дальнейшего сопровождения системы, рекомендуется использовать команды chainloader и configfile для загрузки дистрибутивов, имеющих механизмы «автоматической» настройки параметров GRUB (например, Debian, Ubuntu, OpenSUSE). Таким образом, дистрибутивы будут самостоятельно управлять параметрами своей загрузки, в т.ч. и menu.lst.

  • Команда загрузки chainloader выполнит вызов другого загрузчика, вместо того, чтобы загружать образ ядра. Эта функция удобна в случае, если в загрузочной записи раздела есть установленный загрузчик (например, GRUB). Таким образом, мы можем установить «главный» GRUB в главную загрузочную запись (MBR), и, дополнительно для каждого дистрибутива, установить GRUB в загрузочные записи разделов(PBR), на которых они установлены.

  • Команда configfile сообщает GRUB, что он должен загрузить определенный конфигурационный файл. Эта возможность используется для подгрузки файла menu.lst, который принадлежит другому дистрибутиву. При этом не требуется обязательное наличие отдельно установленного GRUB для этого дистрибутива. Однако главным недостатком такого подхода является возможная несовместимость установленного GRUB с «чужим»menu.lst, поскольку некоторые дистрибутивы вносят существенные модификации в свои версии GRUB.

Например, GRUB устанавливается в MBR, а другой загрузчик (это может быть GRUB или LILO) уже установлен в загрузочный сектор (hd0,2).

---------------------------------------------
|   |           |           |   %           |
| M |           |           | B %           |
| B |  (hd0,0)  |  (hd0,1)  | L %  (hd0,2)  |
| R |           |           |   %           |
|   |           |           |   %           |
---------------------------------------------
  |                           ^
  |       chainloading        |
  -----------------------------

В данном случае достаточно прописать в menu.lst:

title Other Linux
root (hd0,2)
chainloader +1

Если загрузчиком в (hd0,2) является GRUB, можно использовать команду configfile:

title Other Linux
root (hd0,2)
configfile /boot/grub/menu.lst

Команда chainloader также может быть использована для запуска загрузчика расположенного в MBR на другом диске.

title Other drive
rootnoverify (hd1)
chainloader +1

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

GRUB может быть установлен с отдельного носителя (например, с LiveCD), или путем установки из-под запущенного Arch Linux. Переустановка загрузчика GRUB требуется довольно редко, в ней нет необходимости, когда:

  • Изменился конфигурационный файл.
  • Обновлен пакет GRUB.

Установка/переустановка загрузчика необходима когда:

  • Загрузчик ещё не установлен.
  • Другая операционная система при установке затерла существующий загрузчик.
  • Загрузчик не стартует по неизвестным причинам.

Несколько замечаний, прежде чем мы продолжим:

  • Убедитесь, что Ваш файл настройки /boot/grub/menu.lst не содержит ошибок. Обратитесь к Определение корневой директории для GRUB для того, чтобы убедиться, что имена устройств заданы корректно.
  • Для того чтобы большинство версий BIOS корректно распознало наличие загрузчика, GRUB должен быть установлен в MBR (первый сектор жесткого диска), или в первом разделе первого устройства хранения данных. Для того чтобы позволить различным дистрибутивам управлять настройкой своих опций загрузки, можно использовать несколько экземпляров GRUB, см. chainloader and configfile .
  • Для некоторых случаев потребуется установка загрузчика GRUB из-под chroot окружения, например для установки загрузчика на RAID-тома, или в случае, когда загрузчик вышел из строя, и Вы не можете загрузить Вашу операционную систему. Для этого вам необходимо выполнить Change root из-под LiveCD, или другой инсталляции Linux.
  • Файлы *stage* должны находиться в /boot/grub, что может не соответствовать действительности, если загрузчик не был установлен в процессе установки системы. Данное затруднение может быть разрешено путем копирования необходимых файлов: cp -a /usr/lib/grub/i386-pc/* /boot/grub.

Сначала откройте командную оболочку GRUB:

Используйте команду root с параметром, полученным в результате команды find (см.Определение корневой директории для GRUB ), чтобы указать GRUB, какой из разделов содержит stage1 (и, соответственно, там же находится и /boot):

Tip: Командная оболочка GRUB поддерживает автодополнение по клавише Tab. Если Вы наберете ‘root (hd’ и нажмете Tab дважды, Вы увидите список доступных устройств, аналогично можно получить список доступных разделов. Автодополнение также работает и в загрузочном меню GRUB. Например, если Вы допустили ошибку в конфигурационном файле, вы можете позже в загрузочном меню отредактировать запись, используя автодополнение по клавише Tab, чтобы получить подсказку, какое имя устройства/раздела нужно указать вместо ошибочного. См. Редактирование параметров GRUB из меню загрузки.

Установка в MBR

Следующий пример устанавливает загрузчик GRUB в MBR первого жесткого диска:

Установка в раздел

Следущий пример устанавливает загрзчик GRUB в первый раздел первого жесткого диска:

После выполнения команды setup, введите команду quit, для того, чтобы выйти из командной оболочки. Если Вы используете chroot, выйдите из chroot окружения и отмонтируйте разделы (см. exit your chroot and unmount partitions). Теперь выполните перезагрузку системы.

Альтернативный метод (grub-install)

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

Используйте команду grub-install с именем целевого устройства для установки загрузчика. Например, для установки загрузчика в MBR первого диска:

grub-install сообщит, удачно ли прошел процесс установки. Если вонзникли проблемы, воспользуйтесь методом установки из командной оболочки GRUB.

Советы и трюки

Замечания по дополнительным параметрам.

Загрузка в графическом режиме

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

Видеорежим

Вы можете использовать один из видеорежимов, описанных в примере menu.lst, однако, если Вы решили задействовать широкоэкранный LCD монитор с использованием его родного разрешения, то нижеперечисленные советы помогут Вам достичь желаемого.

В статье Wikipedia, представлен расширенный список разрешений фреймбуфера (тех, которые не входят в стандарт VBE). Но при использовании разрешения 1440×900 (vga=867) возникают проблемы. Это связано с тем, что производители видеокарт не ограничены стандартом VBE 3, и они могут выбирать номера кодов для видеорежимов, как им заблагорассудится. Именно поэтому эти коды различаются для разных видеокарт (иногда даже и у одного и того же производителя).

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

vbetest

  1. Установите пакет lrmi, который содержит утилиту vbetest (пользователи системы x86_64 должны использовать #hwinfo вместо vbetest)
  2. Запустите vbetest от имени суперпользователя
  3. Запомните значение в [ ], соответствующее выбранному Вами видеорежиму
  4. Нажмите q для выхода из vbetest
    1. Вы можете проверить выбранный вами видеорежим, достаточно запустить от имени суперпользователя команду vbetest -m <ваш_код>. Вы должны увидеть таблицу такого плана
  5. Прибавьте 512 к значению, которое Вы получили на предыдущем шаге, и пропишите его в параметр vga для соответствующей записи menu.lst
  6. Перезагрузите машину и любуйтесь полученным результатом

Например, vbetest выдает на компьютере:

[356] 1440x900 (256 color palette)
[357] 1440x900 (8:8:8)

Значит искомое значение — это 357. Затем, 357 + 512 = 869, значит необходимо указать vga=869. Добавляем полученное значение к строке kernel в файле menu.lst, как показано ниже:

kernel /vmlinuz-linux root=/dev/sda1 ro **vga=869**

Примечание:

  • (8:8:8) Глубина цвета 24-bit (то же и для 32bit)
  • (5:6:5) Глубина цвета 16-bit
  • (5:5:5) Глубина цвета 15-bit

hwinfo

  1. Установите пакет hwinfo из [AUR].
  2. Запустите команду hwinfo --framebuffer с правами пользователя root.
  3. Выберите код, соответствующий желаемому разрешению.
  4. Используйте полученный 6-ти значный код с префиксом 0x для параметра vga= в соотв. записи kernel в menu.lst. Если Вы предпочитаете не использовать префикс 0x, тогда необходимо перевести значения кода из шестнадцатеричной системы в десятичную.

Пример вывода команды hwinfo:

Mode 0x0364: 1440x900 (+1440), 8 bits
Mode 0x0365: 1440x900 (+5760), 24 bits

Соответственно срока в menu.lst должна иметь вид:

kernel /vmlinuz-linux root=/dev/sda1 ro **vga=0x0365**

Примечание: vbetest выдает значения кодов в формате VESA, чтобы преобразовать их в соответствующие коды видеорежимов ядра — необходимо прибавить значение 512. Команда hwinfo, напротив, выдает коды видеорежимов ядра, и не требует дополнительных манипуляций с полученным значением (не считая необязательного перевода в десятичную систему).

Видеорежимы, детектируемые GRUB

Существует достаточно простой метод определения кода видеорежима с использованием соотв. возможностей самого GRUB.

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

kernel /vmlinuz-linux root=/dev/sda1 ro **vga=ask**

Теперь перезапустите систему. GRUB предложит на выбор список доступных основных видеорежимов, также доступна опция сканирования, для детектирования дополнительных видеорежимов.

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

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

Теперь замените значение параметра vga ask на десятичное значение кода видеорежима. Например, строка kernel для режима [369] 1680x1050x32 будет выглядеть:

kernel /vmlinuz-linux root=/dev/sda1 ro **vga=873**

Метки разделов

Если Вы периодически меняете (или планируете менять) расположение разделов на диске, или меняете местами сами устройства жестких дисков (вообще, любые действия, которые приводят к тому, что у одного и того же устройства может меняться имя в системе), тогда для Вас имеет смысл адресовать загрузочные устройства не по именам вида (hdX,Y) а по меткам. Для установки метки раздела формата ext2, ext3, ext4 используется команда:

e2label </dev/drive|partition> label

Задайте для устройства метку длиной не более 16 символов, и не содержащую пробелов, в противном случае GRUB не сможет корректно распознать подобную метку. Затем пропишите в menu.lst строку вида:

kernel /boot/vmlinuz-linux root=/dev/disk/by-label/Arch_Linux ro

Парольная защита

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

Сначала выберите пароль (постарайтесь его не забыть в дальнейшем), затем зашифруйте его:

# grub-md5-crypt
Password:
Retype password:
$1$ZOGor$GABXUQ/hnzns/d5JYqqjw

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

# general configuration
timeout   5
default   0
color light-blue/black light-cyan/blue

password --md5 $1$ZOGor$GABXUQ/hnzns/d5JYqqjw

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

# (0) Arch Linux
title  Arch Linux
lock
root   (hd0,1)
kernel /boot/vmlinuz-linux root=/dev/disk/by-label/Arch_Linux ro
initrd /boot/initramfs-linux.img

Важно: Если в BIOS отсутствует возможность загрузки с других устройств (таких как CD-привод), и паролем защищены все операционные системы, то будет достаточно проблематично возобновить загрузку в случае, если Вы забыли свой пароль.

Перезагрузка в ОС по выбору

Если Вам часто приходится перегружаться в другую ОС (например, Windows), иногда бывает утомительным следить за процессом перезагрузки, чтобы не пропустить момент выбора нужной ОС, и случайно, не загрузиться опять в систему по умолчанию. Для решения данной проблемы существует возможность назначения временной «ОС по умолчанию».

Предположим у нас есть файл menu.lst с подобными настройками:

# general configuration:
timeout 10
default 0
color light-blue/black light-cyan/blue

# (0) Arch
title  Arch Linux
root (hd0,1)
kernel /boot/vmlinuz-linux root=/dev/disk/by-label/ARCH ro
initrd /boot/initramfs-linux.img

# (1) Windows
title Windows XP
rootnoverify (hd0,0)
makeactive
chainloader +1

Текущей ОС по умолчанию является Arch (0). Измените значение default 0 на default saved — теперь при загрузке, номер ОС по умолчанию будет взят из файла default в папке GRUB. Запись в файл default выполняет команда savedefault, поэтому добавьте savedefault 0 в конец объявления параметров Windows. Таким образом, мы добьемся того, что когда загружается Windows — системой по умолчанию снова становится Arch (даже если до этого системой по умолчанию была Windows).

Теперь, всё, что нам нужно — это найти простой способ установки значения ОС по умолчанию. Такую возможность предоставляет команда grub-set-default. Например, чтобы из Arch перегрузиться сразу в Windows, наберите команду:

 sudo grub-set-default 1 && sudo shutdown -r now

Возможно Вы захотите разрешить пользователям выключение системы без необходимости ввода пароля root. Такую же процедуру необходимо выполнить и для команды grub-set-default.

Взаимодействие LILO и GRUB

Если в ваше системе установлен пакет LILO, удалите его.

При выполнении некоторых задач (например при компилировании ядра с командой make all) пакет LILO может значиться в зависимостях, и может быть автоматически установлен в систему, при этом загрузчик GRUB будет затерт.

Примечание: Команда pacman -R lilo удалит пакет из системы, но не удалит загрузчик LILO из MBR. Загрузчик LILO, находящийся в MBR может быть перезаписан только в процессе установки другого загрузчика (например, GRUB).

Загрузочная дискета GRUB

Для начала отформатируйте дискету:

 fdformat /dev/fd0
 mke2fs /dev/fd0

Затем подмонтируйте её:

 mount -t ext2 /dev/fd0 /mnt/fl

Установите GRUB на дискету:

 grub-install --root-directory=/mnt/fl '(fd0)'

Скопируйте Ваш menu.lst на дискету:

 cp /boot/grub/menu.lst /mnt/fl/boot/grub/menu.lst

И, в завершение, отмонтируйте дискету:

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

Дополнительная информация: Super GRUB Disk

Решение проблем

GRUB Error 17

В случае неразберихи с таблицей разделов, всё что Вы можете наблюдать при попытке загрузки системы — это лаконичное сообщение «GRUB error 17». Существует несколько причин, которые могут привести к искажению таблицы разделов. Чаще всего подобные проблемы связаны с изменением порядка разделов, в результате работы пользователя с программой GParted. Например, Вы удалили раздел /dev/sda6, затем изменили размер раздела /dev/sda7, и, наконец, создали заново раздел, который, как ожидалось, снова должен стать /dev/sda6. Однако этот новый раздел получит, например, имя /dev/sda9.

Исправить таблицу разделов достаточно легко. Для этого загрузитесь с Live-CD, войдите в систему как root и запустите команду:

Затем войдите в режим e[x]tra/expert. Далее [f]ix the partition order, и сохраните таблицу [w]rite. Затем выйдите из программы fdisk. Проверить состояние таблицы разделов после исправления можно с помощью команды fdisk -l. Теперь осталось исправить параметры GRUB, см. предыдущую секцию Установка загрузчика.

Обычно, всё что Вам нужно — это указать корректное расположение директории /boot и перезаписать загрузчик, находящийся в MBR. Например:

grub> root (hd0,6)
grub> setup (hd0)
grub> quit

Более детальная информация о «GRUB Error 17» доступна по ссылке

Случайная установка GRUB в раздел Windows

Если Вы случайно установили GRUB на раздел с Windows, GRUB запишет определенные данные в загрузочный сектор раздела, затерев при этом ссылку на загрузчик Windows.

Для восстановления загрузочной записи Вам понадобится загрузочный диск с консолью восстановления (Windows Recovery Console) для вашей версии Windows. Поскольку многие поставщики не предоставляют загрузочные диски для восстановления (а создают скрытые разделы для восстановления системы), Microsoft предоставляет возможность скачать эти инструменты. Если Вы использете XP, перейдите по этой ссылке, чтобы получить возможность использовать дискету в качестве диска восстановления (Recovery CD). Загрузитесь с диска Recovery CD (или войдите в режим Recovery c установочного диска), и запустите команду fixboot, чтобы восстановить загрузочный сектор. После этого вам снова придется устанавливать GRUB, —только теперь установите его в MBR, а не в раздел с Windows—.

Более детальная информация: ссылка.

Редактирование параметров GRUB из меню загрузки

Выбрав один из пунктов в меню загрузки, Вы можете отредактировать его нажав клавишу e. Использйте автодополнение по клавише Tab, чтобы получить подсказку по доступным именам устройств/разделов, используте клавишу Esc для выхода. После того, как Вы отредактировали запись, можете попытаться загрузить её, нажав клавишу b. Внесенные Вами изменения не будут сохранены.

Ошибка device.map

Если во время устаноки, или во время загрузки появляются ошибки с упоминанием файла /boot/grub/device.map, необходимо выполнить команду:

# grub-install --recheck /dev/sda

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

Выбор ОС при перезагрузке KDE не работает

Если в окне перезагрузки KDE Вы открыли подменю со списком операционных систем, выбрали нужную ОС, перегрузили компьютер, и по прежнему загрузились в ОС по умолчанию, вместо выбранной, тогда проверьте наличие строки

В Вашем /boot/grub/menu.lst.

Внешние ресурсы

  • GNU GRUB

  • GRUB Grotto

  • Linux Kernel Documentation :: kernel-perameters.txt

  • List of kernel parameters with further explanation and grouped by similar options

  • Изучите также примеры конфигурации GRUB

Содержание

  1. Загрузка операционной системы из командной строки Grub
  2. Аварийный запуск системы из командной строки GRUB
  3. Комментариев: 8
  4. Восстановление загрузчика GRUB в Linux
  5. Почему «ломается» загрузчик GRUB?
  6. Способы восстановления GRUB
  7. Загрузка и восстановление с помощью LiveCD
  8. Монтирование корневого и загрузочного раделов
  9. Подготовка программной среды для работы
  10. Восстановление загрузчика
  11. Загрузка из командной консоли GRUB
  12. Определение и выбор раздела загрузки
  13. Ручная загрузка ядра
  14. Заключение
  15. Содержание
  16. Первые шаги
  17. /etc/default/grub
  18. Изменение стандартного пункта загрузки
  19. Пример
  20. Изменение времени отображения меню
  21. «Скрытое» меню
  22. Убираем подменю
  23. Особые случаи
  24. Изменение стандартных параметров загрузки ядра
  25. Пример
  26. /etc/grub.d
  27. Пример
  28. Команды консоли GRUB
  29. linux
  30. initrd
  31. chainloader
  32. search
  33. lsfonts
  34. reboot
  35. background_image
  36. terminal_output.console
  37. Применение изменений
  38. Нюанс с нумерацией дисков и разделов
  39. Создание дополнительного меню загрузки
  40. Защита от зацикливания на перезагрузке
  41. Зачем это сделано
  42. А что если.
  43. А что если отключить?
  44. Отключаем.

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

У меня на домашнем компьютере стоит две операционные системы, Windows 7 и Linux (Arch). Причем вторая появилась относительно недавно. Да и особых знаний о новой (для меня) ОС не было. Тем не менее систему я поставил и даже относительно настроил под себя. Энтузиазм и программерское любопытство меня пересиливало, поэтому, в качестве ознакомления, стал экспериментировать с различного рода пакетами. К сожалению, не всегда вчитываясь в детали.
Решил я переставить Grub, а точнее обновиться до Grub2. (Слышал я такое мнение, что в духе Linux принято держать последнюю версию пакета… Про изменения Grub2 хорошо написано тут.)
Ну и как результат «спешной» установки — перестала грузиться система. Единственное за что можно было зацепиться — это приглашение командной строки:

По нажатию на Tab вываливается список возможных команд. Их существенно меньше чем в командной строке Linux, но их достаточно для загрузки системы. Почитав про grub тут я решил загрузить Windows, все-таки тут я пока себя чувствую увереннее. Для этого нужно было указать где находиться загрузчик ОС и передать ему управление:

grub> root (hd0,2) [Устанавливаем корневой раздел и монтируем. Тут главное помнить, на каком разделе стоит операционная система]

Запись (hd0,2) означает устройство диска номер 0 (мастер), раздел номер 2.
что соответствует устройству /dev/sda2 (в моем случае). У вас это может быть или /dev/hd2, или еще что-нибудь, в зависимости от дистрибутива. Нумерация устройств идет по-порядку и начинается с (hd0,1) или /dev/sda1.
Далее вводим:

NTLDR — это загрузчик Windows.
Система стала грузиться, а раз это дало результат — можно копаться дальше (все-таки не Windows теперь предмет изучений).
Перезагружаемся и вводим снова.

grub> root (hd0,6)
grub> linux /boot/vmlinuz26 root=/dev/sda6 [Загружает указанное linux-ядро (/boot/vmlinuz26) с параметрами(root=/dev/sda6)]

Тут стоит различать команду root (hd0,6) и параметр root=/dev/sda6. Первое монтирует раздел к среде выполнения. А второе указывает где находиться root загружаемой ОС. В моем случае ядро и корень оказались на одном разделе, хотя это может быть не так.

grub> initrd /boot/kernel26.img [Загружает указанный initrd-образ]
grub> boot

UPD: дописал про отличия загрузки с grub от grub2. Спасибо bliznezz

Источник

Аварийный запуск системы из командной строки GRUB

Краткая инструкция по загрузке Windows и Linux из командной строки GRUB на случай каких-либо неполадок. Сразу оговорюсь, что сам grub2 должен запускаться, если же вы не можете попасть в консоль grub2, то вам скорее всего потребуется переустановка grub.

Запуск Linux с помошью командной строки GRUB

Нам понадобится написать всего 3 строчки: «set root«, «linux» и «initrd» и в конце дать команду «boot».

set root=(hd0,5)
linux /boot/vmlinuz-2.6.32-generic root=/dev/sda5
initrd /boot/initrd.img-2.6.32-generic
boot

Далее, командой linux, указываем загружаемое ядро. Полное название ядра знать не обязательно, просто пишем «linux /boot/vmlinuz» и нажимаем tab. Консоль сама допишет правильный результат. У меня был предложен выбор между старым и новым ядром. Только в конце строки не забудьте дописать параметр root=/dev/sda5 или что там у вас.

Для старта системы этого уже должно хватить. Осталось выполнить команду boot. В некоторых случаях перед выполнением «boot» попробуйте дополнительно выполнить команду initrd, как описано выше в примере.

Запуск Windows из командной строки GRUB

Процесс запуска Windows из консоли GRUB ещё проще. Как и в случае с Linux в начале указываем корневой раздел, где находится Windows. В моем случае окошки установлены в /dev/sda1. После чего, отдаем команду chainloader +1, которая заставляет grub2 передать дальшейшее управление загрузкой Windows-загрузчику. Даем команду boot на запуск системы и наблюдаем загрузку винды. Пример:

set root=(hd0,1)
chainloader +1
boot

Если считаете статью полезной,
не ленитесь ставить лайки и делиться с друзьями.

Комментариев: 8

Единственный работающий мануал на весь рунет.

Если не знаете на каком разделе установлен Линукс (вдруг), можно каждый раздел проверить командой типа ls(hd0,1)/ (со слешем в конце).

Привет, а как сделать так, чтобы каждый раз это не прописывать?

Для этого нужно прописать соотвествующие изменения в загрузчик GRUB. Обычно нужные строки добавляются автоматически при установке системы.

Что делать, если видит только разделы msdos, но я знаю что там есть Linux

Что делать, если видит только разделы msdos, но я знаю что там есть Linux

У меня так пишет, хотя там Linux и ext4.

Что делать если на всех разделах не находит виндовс? пишет unknown filesystem

Источник

Восстановление загрузчика GRUB в Linux

Загрузчик GRUB является универсальным, гибким и достаточно надёжным инструментом для организации загрузки операционных систем (ОС). Однако при наличии некоторых обстоятельств и факторов. От которых не застрахована ни одна система. Могут возникать сбои, в результате которых загрузка системы может быть некорректной или вовсе невозможной. Если в данном случае точно установлено, что система не загружается из-за неработоспособности самого загрузчика. То в данной ситуации далеко не всё так сложно и безнадёжно. Как может показаться некоторым неопытным пользователям или системным администраторам. В большинстве случаев загрузку системы можно довольно быстро и относительно легко восстановить, не прибегая к переустановке системы. Для этого существуют давно проверенные способы, о которых будет рассказано в данной статье.

Почему «ломается» загрузчик GRUB?

Естественно, само по себе ничего не происходит. Если «сломалась» загрузка GRUB – значит что-то на это повлияло. Очень часто в подобных ситуациях пользователи говорят, что системную конфигурацию не изменяли, а GRUB вдруг перестал работать. И они отчасти правы.

На самом деле GRUB довольно чувствителен к любому изменению как своей, так и системной конфигурации, каким бы универсальным и удобным он ни был. Так, например, изменение идентификатора раздела, хранящего ядра (/boot), уже приведёт к невозможности загрузки системы. И GRUB здесь и ни причём. Нужно искать причину, по которой изменился идентификатор раздела. А они могут быть самыми разными. К примеру, даже если компьютер долгое время не использовался и на его платы не подавалось питание. То это также может быть причиной сброса некоторых настроек BIOS (по причине севшей батареи). Что может привести при последующем после длительного перерыва включении переопределению параметров оборудования. От которых зависит, в некоторых случаях, и идентификатор раздела. Это лишь одна из причин неработоспособности GRUB, самая неочевидная, которую не могут предусмотреть ни разработчики GRUB, ни создатели системных плат.

Наличие ошибок на разделах диска, человеческий фактор (особенно среди малоопытных пользователей) также очень часто являются причиной неработоспособности GRUB. Главное, что нужно понимать — это то, что в большинстве случаев причиной является внешний фактор. A GRUB – это довольно уязвимое место, чувствительное практически к любым внешним воздействиям, поскольку это программная среда, организующая передачу управления компьютером от BIOS (UEFI) к ОС.

Способы восстановления GRUB

В данной статье будут рассмотрены два самых эффективных способа восстановления GRUB:

Как нетрудно догадаться, восстановление GRUB напрямую связано с загрузкой системы. Основная работа по восстановлению именно в этом и заключается — загрузить родную системную среду альтернативными способами или вручную. Далее, в подавляющем большинстве случаев, восстановление GRUB осуществляется одной командой:

Существуют также и другие команды:

Последние стоит использовать, если не помогла команда grub-update. Первая из них устанавливает сам загрузчик GRUB на указанное устройство (не на раздел!). В данном случае вместо sdN может быть sda, sdb, и т. д. Но никак не sda1, sdb2 (т. е. на разделы — числовой индекс в конце означает номер раздела на устройстве) и т. д. — это очень важно, поскольку GRUB устанавливается только на устройство.

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

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

Примечание: вместо команд grub-install и grub-mkconfig могут использоваться команды grub2-install и grub2-mkconfig соответственно. Это зависит от используемой системы (дистрибутива).

Загрузка и восстановление с помощью LiveCD

При использовании любого из альтернативных вариантов загрузки «родной» системы очень полезно сначала узнать (или убедиться), с какого устройства происходит загрузка. Необходимо заранее это выяснить в настройках BIOS компьютера. Это необходимо, если придётся не просто обновить конфигурацию загрузчика, а полностью его переустановить. А для этого очень желательно устанавливать его на то устройство, которому из BIOS передаётся управление для дальнейшей загрузки ОС. Для BIOS материнских плат MSI это выглядит примерно следующим образом:

Как можно видеть, для данной системы загрузочным устройством является SSD-накопитель «Samsung SSD 860 EVO 250 GB». А пока это наименование можно запомнить или где-нибудь записать.

Теперь можно загрузиться с любого Live-образа используя для этого оптический CD/DVD-диск или накопитель USB-Flash. Опуская технические подробности, важно заметить, что для этого должны быть сделаны соответствующие настройки в BIOS компьютера. В качестве Live-образа рекомендуется использовать ту же систему, что и установлена на компьютере.
Итак, загрузившись в Live-режиме, первым делом следует запустить командную консоль. Далее, необходимо определить корневой раздел системы, для которой нужно восстановить загрузчик. Это нужно, чтобы войти в программную среду «родной» системы из непосредственно Live-режима и использовать весь доступный инструментарий, в том числе и команды по восстановлению GRUB.

Монтирование корневого и загрузочного раделов

С помощью команды fdisk определяем какой раздел и на каком устройстве используется родной системой как корневой:

Как можно видеть, в системе два диска — sda и sdb. Тут нужно сориентироваться и вспомнить, как размечался диск изначально при установке системы. И определить по данным вывода, какой раздел является корневым. В данном случае это раздел sda2. Его теперь нужно примонтировать командой mount:

Необходимо также примонтировать и раздел /boot. Но очень важно заметить, что если в качестве /boot используется отдельный раздел (а не подкаталог в корневом разделе, как в большинстве современных дистрибутивов, например Ubuntu), то его монтирование будет выглядеть следующим образом:

В данном случае последняя команда приведена условно, как пример. На самом деле файлы загрузчика для данного примера хранятся в подкаталоге /boot, который уже был примонтирован от sda2, и поэтому в последней команде в данном случае нет необходимости.

Подготовка программной среды для работы

Поскольку в Live-режиме загружено и работает ядро Live-системы, то оно же будет использоваться и для работы с примонтированными разделами (корневой и /boot). Но для этого необходимо к корневому разделу родной системы (которая уже смонтирована в /mnt) также примонтировать и другие файловые системы (ФС), без которых ядро Live-системы не сможет корректно работать — /sys, /dev и /proc, они же необходимы для взаимодействия с ядром. Другими словами, загруженное из Live-образа ядро нужно настроить на полноценную работу с корневой ФС родной системы, добавив к ней ФС из Live-системы:

Далее необходимо определить программное окружение среды, указав каталог /mnt и интерпретатор команд:

Эта команда указывает, где должны выполняться команды и какое программное окружение для этого должно использоваться. В данном случае, теперь ядро Live-образа может полноценно работать с ФС родной системы. Используя все её пакеты, команды, файлы и прочие доступные ресурсы.

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

Теперь нужно обновить MBR (главную загрузочную запись) диска, установив на него загрузчик GRUB. Здесь и нужно вспомнить, какой диск является загрузочным, исходя из конфигурации BIOS. Поскольку ранее это уже было определено, то теперь остаётся узнать, как это устройство обозначается в системе. Для этого полезно выполнить следующий скрипт:

Данный скрипт отработает, если в родной системе установлена утилита hdparm. Но поскольку в большинстве Linux-дистрибутивов она предустановлена и доступна «из коробки», то беспокоиться не о чем.

Создание файла конфигурации GRUB:

Ну и напоследок можно выполнить:

Если при выполнении команды grub-install возникают какие-либо ошибки, то можно выполнить её с ключом —recheck. Если же всё нормально, то можно выйти из режима chroot командой:

Далее необходимо отмонтировать все ранее примонтированные устройства и ФС:

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

Ну и наконец, необходимо отмонтировать также и корневой раздел:

Далее можно перезагрузиться без Live-образа (сделав соответствующие настройки в BIOS и снова указав в качестве загрузочного «Samsung SSD 860 EVO 250GB»). И проверить, что GRUB загружает родную систему.

Загрузка из командной консоли GRUB

Иногда бывает так, что GRUB установлен, но в результате каких-либо сбоев его рабочая конфигурация была повреждена и загрузка ОС в штатном режиме невозможна. Обычно в таких случаях в меню GRUB появляются сообщения об ошибках с приглашением перейти в режим командной консоли загрузчика по нажатию клавиши «C». В этом режиме GRUB предоставляет довольно большой набор полезных команд. С помощью которых можно, в частности произвести ручную загрузку системы. Эти же команды, кстати, выполняются загрузчиком при чтении его файла конфигурации.

Итак, первое, что нужно сделать после входа в командную консоль GRUB – это выполнить команду ls. В результате будет выведен список всех доступных в системе дисков и разделов.

Определение и выбор раздела загрузки

Примечание: префикс «gpt» в обозначении разделов в формате GRUB может быть другим. Например «msdos» (когда GRUB не смог определить тип разметки), но в данном примере разделы размечены в формате GPT.

Если известно, что /boot находится на разделе sda2, у которого пять разделов. То с большой степенью вероятности это будет (hd0,4) в формате GRUB. Префикс «gpt» для раздела можно не указывать. Ну а если же изначальную структуру разделов вспомнить или определить не представляется возможным. То остаётся только перебирать или угадывать.
Команда ls выведет примерно следующее:

Важно заметить, что если «угадано» верно, то будет загружена родная система так, как она загружалась в штатном режиме.

Ручная загрузка ядра

Пусть для ручной загрузки выбран раздел (hd0,4) — т. е. sda2. Нужно задать этот раздел в качестве корневой файловой системы:

Подключение модулей для работы с ФС Ext2/3/4:

Для других типов ФС нужно подключать соответствующие модули: bfs, xfs или zfs.
Подключение модуля normal для полноценного запуска и работы GRUB:

Если после этих команд штатная загрузка не начнётся, то остаётся её продолжить вручную. Для этого нужно попытаться найти доступные ядра и выбрать нужное для загрузки. Для этого следует ввести команду linux /boot/vmlinuz и нажать клавишу :

Как можно видеть, команда linux обнаружила в системе два ядра. И автоматически подготовила следующую команду для выбора нужного. Остаётся только дописать «1-generic», если нужно загрузить ядро версии 4.18.0-21-generic. Указать корневой раздел и выполнить команду:

Важно заметить, что указывается тот же корневой раздел, что и в команде set root, только уже в классическом формате.

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

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

Если всё сделано правильно и выбран нужный раздел загрузки, то будет загружена «родная» система так, как это происходит в штатном режиме. Ведь всё, что было проделано вручную — это основной набор команд, хранящихся в файле /boot/grub/grub.cf g и выполняемых GRUB автоматически.

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

Заключение

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

Содержание

Первые шаги

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

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

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

/etc/default/grub

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

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

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

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

Пример

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример

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

/etc/grub.d

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

Пример

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

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

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

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

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

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

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

linux

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

initrd

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

chainloader

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

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

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

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

search

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

lsfonts

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

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

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

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

reboot

background_image

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

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

terminal_output.console

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

А что если.

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

Отключаем.

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

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

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

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

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

Источник

Понравилась статья? Поделить с друзьями:
  • Как запустить grand theft auto san andreas на windows 10
  • Как запустить gpo на windows 10
  • Как запустить gpedit msc на windows 10 home
  • Как запустить gpedit msc в windows 10 от имени администратора
  • Как запустить gpcs4 эмулятор ps4 на пк windows 10 pkg