Difference between revisions of "GRUB (Русский)"

From ArchWiki
Jump to: navigation, search
(Ручная конфигурация: source вместо configfile)
m (Графическая тема оформления)
Line 401: Line 401:
 
  terminal_output gfxterm      # включаем графику
 
  terminal_output gfxterm      # включаем графику
  
Некоторые темы оформления GRUB можно в AUR.
+
Некоторые темы оформления GRUB можно найти в AUR.
  
 
=== Другие настойки ===
 
=== Другие настойки ===

Revision as of 17:58, 22 January 2014

Template:Article summary start Template:Article summary text Template:Article summary end

GRUB2 - не путать с GRUB Legacy - это следующее поколение GRand Uniform Bootloader. GRUB2 основывается на PUPA, который является исследовательским проектом, изучающим следующее поколение того, что сейчас является GRUB Legacy. GRUB был переписан с нуля, чтобы исключить мусор и внедрить модульность и портативность.

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

Contents

Предисловие

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

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

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

  • Существуют различия между командами GRUB Legacy и GRUB2. Изучите команды GRUB2.
  • GRUB2 теперь модульный и больше не требует "stage 1.5". В результате, загрузчик сам по себе ограничен -- модули загружаются с жёсткого диска по надобности для расширения функциональности.
  • Наименования устройств изменились между GRUB Legacy и GRUB2. Разделы нумеруются с 1, приводы с 0. Например, /dev/sda1 будет ссылаться на (hd0,1) в GRUB2.
  • Для GRUB2 существует утилита автоматической генерации конфига grub-mkconfig, её использование рекомендуется новичкам, непривычным к шелл-коду, для быстрого создания типового меню.

Установка

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

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

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

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

pacman -S grub

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

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

где /dev/sda это место установки загрузочных образов GRUB (в данном случае это MBR первого диска SATA). Файлы загрузчика будут установлены в каталог /boot. Если требуется установить файлы в другой каталог, его можно указать в опции --boot-directory=. Если вы используете LVM для вашего /boot, вы можете установить GRUB2 на различные физические диски.

Если при выполнении команды происходит ошибка:

grub-probe: error: Cannot get the real path of '/dev/fd0'
Auto-detection of a filesystem module failed.
Please specify the module with the option '--modules' explicitly.

попробуйте добавить --recheck в аргументы как показано ниже:

grub-install --recheck /dev/sda
  • Если вы не собираетесь конфигурировать GRUB вручную, сгеренируйте файл grub.cfg командой:
grub-mkconfig -o /boot/grub/grub.cfg

Эта команда читает конфигурационный файл /etc/default/grub, поэтому следует проверить его настройки, а при установке Arch не забыть о команде arch-chroot

Настройка

Файл настройки находится в /boot/grub/grub.cfg.

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

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

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

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

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

Для настройки автоконфигуратора используйте файл /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, но и проверит конфигурацию на наличие ошибок.

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

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

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

Ручная конфигурация

Конфиг GRUB2 (обычно grub.cfg) представляет собой скрипт на шелл-подобном командном языке, который выполняется загрузчиком до запуска операционной системы. Этот скрипт отвечает за генерацию меню и загрузку ОС. Блоки кода внутри секций menuentry выполняются после выбора соответствующего пункта меню.

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

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

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

В pacman.conf добавьте конфиг GRUB в строку NoUpgrade :

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

После правки конфига, присвойте ему атрибут immutable

chattr +i /boot/grub/grub.cfg

блокирующий любые изменения файла, до снятия атрибута командой

chattr -i /boot/grub/grub.cfg

Чтобы избавиться от надобности выполнять команду chattr перед любой правкой конфига и после неё, можно оставить в файле grub.cfg только одну строку со ссылкой на другой файл, например menu.cfg

/boot/grub/grub.cfg
. /boot/grub/menu.cfg

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

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

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

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

В командах могут использоваться обозначения дисков вида (hdX) и разделов вида (hdX,Y) , где X номер диска, Y номер раздела на нём. Нумерация разделов начинается с единицы (как в ядре Linux), нумерация дисков с нуля.

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

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

set root=(hd0,1) # задаём раздел с другой ОС или другим загрузчиком
chainloader +1 # загружаем его бут-сектор

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

menuentry "Заголовок" {
# команды
}

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

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

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

Команда initrd указывает путь к образу начальной корневой ФС.

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

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

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

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

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

(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" {
set root=(hd0,1)
chainloader +1
}

Если у вас нет отдельного раздела boot, '/boot' должен присутствовать в указании пути в grub.cfg. Пример:

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

Мультизагрузка

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

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

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

С GNU/Linux

Если другой дистрибутив Linux на разделе sda2:

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

С Windows

В данном примере загрузчик Windows находится на разделе sda3.

menuentry "Windows 7" {
set root=(hd0,3)
chainloader +1
}

С Windows при помощи EasyBCD и NeoGRUB

До тех пор, пока EasyBCD's NeoGRUB не совместимы с форматом меню GRUB2, установите цепную загрузку через них, заменив содержимое файла C:\NST\menu.lst на строки, подобные следующим:

default 0
timeout 1
title       Chainload into GRUB v2
root        (hd0,7)
kernel      /boot/grub/core.img

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

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 имеет смысл ДО секций menuentry.

Скрытое меню

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, чтобы отсчёт не начался повторно после показа меню.

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

Установка VESA-режима экрана

GRUB2 позволяет задать VESA-режим экрана для самого загрузчика в переменной gfxmode , и отдельно VESA-режим, который будет использоваться ядром 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

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

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

Режим VESA для ядра Linux будет установлен в начале загрузки ядра, никаких модулей GRUB для этого специально загружать не требуется. Существует также другой способ задать 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 |
+-----+--------------------------------------------+

или получить из вывода команды vbeinfo в консоли GRUB. Эта команда выводит полный список доступных для вашей видеокарты режимов VESA. Использовать в GRUB возможно только те режимы, которые "видит" эта команда.

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

Установка переменной gfxmode сама по себе НЕ переключает GRUB в графический режим. Чтобы перейти в графику, требуется:
1) задать режим в переменной gfxmode
2) загрузить командой loadfont хотя бы один шрифт
3) загрузить модуль VESA-режимов vbe и модуль графического терминала gfxterm
4) запустить графический терминал командой 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 loadfont $prefix/fonts/unicode.pf2 ; then
  set gfxmode=auto                    # только после успешной загрузки шрифта
  insmod gfxterm                      # загружаем модули
  insmod vbe
  terminal_output gfxterm             # эта команда запускает графику
  insmod png                          # для этих обой требуется модуль png
  background_image $prefix/themes/starfield/starfield.png
fi

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

Note: Не пытайтесь использовать русский язык в текстовом режиме! Если требуется возврат в текстовый терминал командой 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 не подходит, требуется скачать с официального сайта его исходники, они как раз в формате 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/

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

if loadfont $prefix/fonts/ter-u16b.pf2 ; then
  set gfxmode=auto
  set lang=ru      # включаем русский язык
  insmod gfxterm
  insmod vbe
  terminal_output gfxterm
fi

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

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

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

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

GRUB_BACKGROUND=/boot/grub/themes/starfield/theme.txt

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

Пример загрузки дефолтной темы оформления:

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.

Другие настойки

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

  • С в конфиге автогенератора это делается так:
/etc/default/grub
GRUB_DEFAULT="saved"
GRUB_SAVEDEFAULT="true"
  • Пример конфига GRUB с реализацией запоминания:
set timeout=5
set default=0
load_env # восстанавливаем переменную из файла

function savedef { # Создаём функцию по имени savedef
 set default="$1"    # записываем первый параметр в переменную default
 save_env default  # сохраняем переменную до следующего раза
}                  # конец функции

menuentry "Arch Linux" {
    savedef 0  # при выборе этого пункта сохранится его номер 0
    linux /boot/vmlinuz-linux root=LABEL=Arch_r rw
    initrd /boot/initramfs-linux.img
}

menuentry "Arch Linux LTS" {
    savedef 1  # в этом случае сохранится номер 1
    linux /boot/vmlinuz-linux-lts root=LABEL=Arch_r rw
    initrd /boot/initramfs-linux-lts.img
}

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

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

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

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

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

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

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

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

В 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
opts="root=LABEL=Arch_root rw"

load_env

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

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

# Описываем функцию запоминания
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

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 true
   else 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

LVM

Если вы используете LVM для /boot, добавьте следующую строку после до строк menuentry:

insmod lvm

и обозначьте ваш root в menuentry как:

set root=(lvm_group_name-lvm_logical_boot_partition_name)

Пример:

# (0) Arch Linux
menuentry "Arch Linux" {
insmod lvm
set root=(VolumeGroup-lv_boot)
# you can only set following two lines
linux /vmlinuz-linux root=/dev/mapper/VolumeGroup-root rw
initrd /initramfs-linux.img
}

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

UUID

Чтобы просмотреть UUIDs, наберите:

# blkid

Замените строку linux следующей:

linux /vmlinuz-linux root=/dev/disk/by-uuid/<UUID> rw

или проще

linux /vmlinuz-linux root=UUID=<UUID> rw

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

search --fs-uuid <UUID> --set=root

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

menuentry "Arch Linux" {
    # search --fs-uuid 355ccb5c-99e1-400d-b612-451f9247e35e --set root # не нужно, если ядро в том же разделе, что GRUB
    linux /boot/vmlinuz-linux root=UUID=355ccb5c-99e1-400d-b612-451f9247e35e rw
    initrd /boot/initramfs-linux.img
}
Метки

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

# tune2fs -L a <LABEL> <PARTITION>

Затем, добавьте содержимое используя метки. Например:

menuentry "Arch Linux, session texte" {
    # search --label archroot --set root # не нужно, если ядро в том же разделе, что GRUB
    linux /boot/vmlinuz-linux root=LABEL=archroot rw
    initrd /boot/initramfs-linux.img
}

Использование командной строки

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

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

sh:grub>

Если проблема серьёзная, (например GRUB не может найти требуемые файлы),вас перебросит в консоль "восстановления".

grub rescue>

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

grub rescue> set prefix=(hdX,Y)/boot/grub
grub rescue> insmod (hdX,Y)/boot/grub/normal.mod
rescue:grub> normal

Использование консоли восстановления

Сначала прочтите #Использование командной строки. Если невозможно активировать нормальную консоль, возможным решением может стать загрузка с Живого CD (LiveCD), или с других дисков восстановления чтобы исправить настройки и переустановить GRUB. Тем не менее, загрузочные диски не всегда доступны или необходимы.

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

Перед началом, пользователь должен знать местоположение своей папки /boot (будь она отдельным разделом, или подпапкой в корневом разделе):

grub rescue> set prefix=(hdX,Y)/boot/grub

Где Х - это номер физического диска и Y - номер раздела.

Чтобы расширить возможности консоли, загрузите модуль "linux":

grub rescue> insmod (hdX,Y)/boot/grub/linux.mod
Note: Если у вас отдельный boot раздел, исключите /boot из пути, (например, пишите set prefix=(hdX,Y)/grub и insmod (hdX,Y)/grub/linux.mod).

Это описание "linux" и "initrd" команд, которые должны быть вам знакомы (смотри #Настройка).

Например, загрузка Arch Linux:

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

С отдельным разделом boot измените пути, как было описано выше. Например:

set root=(hd0,5)
linux /vmlinuz-linux root=/dev/sda6
initrd /initramfs-linux.img
boot

После успешной загрузки Arch Linux, пользователь сможет подкорректировать grub.cfg и затем запустить:

# grub-install /dev/sda

для того, чтобы переустановить GRUB2 и полностью устранить проблему. Измените /dev/sda, если требуется. Смотрите #Установка загрузчика для детальной информации.

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

Добавьте сюда сами.

Сообщение об ошибке msdos-style

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 блоков перед первым разделом.

Grub-install вызывает зависание grub2 / legacy grub

Отключите флоппи дисковод в биосе, даже если у вас его нет. Попробуйте использовать также --no-floppy и удалить fd0 строку из /boot/grub/device.map. Тем не менее, без отключения его в биосе, GRUB2 может всё равно не работать.

Прочее

Я не нашёл, как удалять grub1, и установил grub2 в MBR, но после этого он не стал по умолчанию загружаться. Загружался по умолчанию grub1. Лёгкий способ это исправить, это переименовать menu.lst.pacsave или подобное, в menu.lst (в /boot/grub/) для каждой строки меню, для которой вы хотите использовать grub2. В конце введите "chainloader +1". Это даст команду grub1 вернуть контроль к grub2.

Возможное решение: Допустим, boot раздел (hd0,1), и корневой раздел (hd0,3) (grub2 наименование). grub-setup ищет (hd0,3)/boot/grub/core.img. Он не может его найти просто потому, что он в (hd0,1)/grub/core.img. Я скопировал папку grub в мою корневую дерикторию, и всё заработало отлично:

Например (от root:)

# mount /boot
# cp -a /boot/grub /
# umount /boot
# mv /grub /boot/
# grub-install /dev/sda