Grub2 настройка меню загрузчика для windows

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

Наверняка почти у каждого пользователя ОС Linux и ОС Windows, а я имею в виду именно тех, у кого, в силу ряда причин, установлены обе системы, время от времени возникал вопрос: «А нельзя ли, черт возьми, придумать способ, с помощью которого можно было бы устанавливать эти системы в произвольном порядке? Без порчи настроек загрузчика?» Ведь если ставим сначала Windows а потом Linux всё хорошо — линуксовый загрузчик (например GRUB) обычно подхватывает bootmgr. Если ставить в обратном порядке то увы. Даже с использованием GPT + EFI. В случае с EFI нет опасности перезаписи MBR, зато таки есть один нюанс, который лично мне не нравится — установщик Windows в режиме EFI хоть и не перезаписывает сектора диска своим кодом, но зато переопределяет NVRAM, подсовывая туда путь к своему загрузчику. Так что функционал GBUB всё равно приходится восстанавливать. В настройках штатного установщика нет опций для кастомизации процесса установки загрузчика. А что если… не использовать стандартный установщик?! Ну, или почти не использовать…

И такой способ есть. И основан он на технологии установки Windows, которую мы имеем в её дистрибутивах начиная с «семерки». Способ работает для случая Windows версий 7/8/8.1/10, как в случае с MBR + BIOS системы, так в случае с EFI + GPT. Установить систему можно как в раздел HDD, так и на VHD. При этом функционал установщика нужен нам в общем-то для запуска программы настройки BCD-хранилища конфигурации загрузчика. Вместо установочного диска можно использовать загрузочный носитель на основе WinPE. Если бы утилитам bcdedit.exe и BootICE была *nix альтернатива, весь процесс развертывания системы можно было бы вообще выполнить в среде Linux.

Предположим у вас имеется компьютер, с установленным на HDD загрузчиком GRUB2 и свободным разделом, отформатированном в NTFS. Устанавливать будем Windows 7 Ultimate SP1. Для этого потребуются:

  1. Установочный диск с виндой
  2. Чистая флешка объемом >= 4 Gb
  3. Архиватор 7-zip соответствующей разрядности
  4. Утилита BootICE, желательна, но совершенно не обязательна, можно обойтись и bcdedit.exe, входящим в дистрибутив винды

1. Создаем загрузочную флешку

Дело в том, что семерка не хочет устанавливаться в EFI-режиме с DVD. Вот не хочет и всё. К тому же, на установочном носителе нам понадобятся дополнительные утилиты, которые туда надо поместить, а в случае с флешкой это несколько проще, чем в случае с DVD.

Монтируем установочный образ с виндой, допустим он лежит у нас в /home/$USER/install с именем win7-setup.iso

$ mkdir ~/iso
$ sudo mount -t udf ~/install/win7-setup.iso ~/iso

Вставляем флешку в USB-порт. Допустим, она получила имя устройства /dev/sdb. Выполним её разметку в формате MBR

$ sudo fdisk /dev/sdb

Создем на флешке один единственный раздел. После чего форматируем её в FAT
$ sudo mkfs.vfat /dev/sdb1

Копируем содержимое дистрибутива винды на флешку
$ mkdir /tmp/flash
$ sudo mount /dev/sdb1 /tmp/flash -o uid=1000,gid=100,fmask=113,dmask=002
$ cp -rv ~/iso/* /tmp/flash/

Скопируем конфиги EFI-загрузчика на уровень выше

$ cp -rv ~/tmp/flash/efi/microsoft/* ~/tmp/flash/efi/

Теперь нам нужен EFI-загрузчик винды. Его придется выцарапать из дистрибутива. Это легко сделать с помощью архиватора 7-zip, который имеется в репозитории extra/p7zip. Все содержимое дистрибутива винды сжато в образ wim-формата находится на установочном DVD в файле source/install.wim. Обычно этот образ имеет следующую структуру

В каталогах с именами в виде цифр 1-4 находятся разные редакции винды. Чтобы выбрать нужную надо посмотреть внутрь файла с именем [1].xml. Распакуем его в /tmp

$ cd /tmp
$ 7z e ~/iso/sources/install.wim [1].xml

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

где нода EDITIONID указывает на редакцию. Параметр INDEX — как раз номер каталога, в котором валяется нужная редакция. Итак, мне нужна Ultimate, а это индекс 4. Соответсвенно выковыриваем загрузчик оттуда

$ 7z e ~/iso/sources/install.wim 4/Windows/Boot/EFI/bootmgfw.efi

Оки, теперь перенесем полученный файл на флешку

$ mv bootmgfwm.efi /tmp/flash/efi/boot/bootx64.efi

Порядок, теперь у нас в наличии загрузочная флешка для установки винды. Теперь добавим на неё необходимые для установки утилиты — виндозную версию архиватора 7-zip и утилиту BootICE. Архиватор качаем с официального сайта и распаковываем на флешку в каталог utils

$ mkdir -p /tmp/flash/utils/7-Zip/
$ cd /tmp/flash/utils/7-Zip/
$ 7z x ~/downloads/7z1602-x64.exe

Туда же помещаем и bootice

$ cp ~/install/BOOTICEx64.exe /tmp/flash/utils

Уф, всё, отмонтируем флешку
$ cd ~
$ sudo umount /tmp/flash/

Перезагружаемся. Если у вас система с EFI и съемные диски стоят в приоритете загрузки, то компьютер загрузится в установку винды автоматом. Если же появилось таки меню GRUB, ничего страшного, жмем «С» и в консоли набиваем команду exit. Вас вывалит в меню EFI, где выбираем загрузку с флешки. Если же ваша система с BIOS, то тут чуть сложнее, ибо мы не стали заморачиваться с настройкой MBR на флешке. Тогда в консоли GRUB даем команду ls — появится список всех дисков и разделов. Находим нашу флешку, она отобразится в виде (hdX, msdosY), где X, Y — номер диска и раздела соответственно. Теперь вбиваем в консоли команды

grub> set root=hdX,Y
grub> ntldr /bootmgr
grub> boot

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

2. О развертывании Windows из WIM-образа и капризном нраве Sysprep

Начиная с семерки установка Windows заключается в следующих этапах

  1. Разметка диска в соответствии с архитектурой системы инициализации оборудования. Если BIOS — установщик размечает диск в MBR. При наличии активной EFI — разметка будет GPT.
  2. Распаковка образа install.wim в выбранный для установки раздел
  3. Установка загрузчика и перезагрузка
  4. Инициализация оборудования. Ребут
  5. Локализация, ввод ключа, окончание настройки системы

Это стандартный путь. У нас же диск уже размечен. И нам не нужна автоматическая установка загрузчика — мы поставим его вручную. Разметка диска должна удовлетворять следующим требованиям

  • Если система с EFI на диске должен присутствовать FAT-раздел с типом 0xEF. Если у нас уже установлен линукс с EFI-загрузчиком, то таковой раздел уже имеется
  • Если система с BIOS, то раздел, в котором располагается загрузчик, а это наш NTFS-раздел должен быть активным. Это очень важно! Почему, будет объяснено ниже.

Таким образом, перед распаковкой системы мы должны убедится в том, что перечисленные требования выполнены. После того, как мы распакуем все файл системы и установим загрузчик, система перезагрузиться. После перезагрузки запустится утилита Sysprep, среди прочего настраивающая оборудования и проверяющая конфигурацию системы. Так вот, если в режиме EFI Sysprep не найдет загрузчик и его конфигурацию в EFI-разделе по пути EFI/microsof/boot, а в системе с BIOS каталог Boot и bootmgr будут лежать в неактивном разделе, то Sysprep завершится с ошибкой sysprep generalize error, а в лог, расположенный по адресу WindowsPanthersysperr.log выплюнет что-то похожее на

2015-03-11 16:55:42, Error [0x0e00b3] TOOL Sysprep_Specialize_Bcd: There was an error opening the system store. Status=[0xC0000098]
2015-03-11 16:55:42, Error [0x0f0082] SYSPRP LaunchDll:Failure occurred while executing 'c:WindowsSystem32spbcd.dll,Sysprep_Specialize_Bcd', returned error code 1006
2015-03-11 16:55:42, Error [0x060435] IBS Callback_Specialize: An error occurred while either deciding if we need to specialize or while specializing; dwRet = 0x3ee

и никакие танцы с бубном нам уже не помогут. Винда требует, чтобы загручик лежал в загрузочном разделе и точка. В случае с BIOS просто делаем активным раздел NTFS в котором лежит винда и туда же кладем и загрузчик. Грузится будем всё равно с помощью GRUB, а ему все равно, какой раздел будет активным. В случае с EFI загрузчик придется положить рядом с GRUB в EFI-разделе.

3. Распаковка системы

Итак, определимся, куда мы хотим ставить винду. Можно поставить в NTFS-раздел, а можно и в VHD-диск. Это уж как вам хочется. Я буду показывать процесс на примере с виртуальной машиной EFI, имеющей следующую разметку

The protective MBR's 0xEE partition is oversized! Auto-repairing.

Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): p
Disk /dev/loop1: 104857600 sectors, 50.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 0D217C93-6699-435A-9BBB-61DFAA6F30B7
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 104857566
Partitions will be aligned on 2048-sector boundaries
Total free space is 4029 sectors (2.0 MiB)

Number Start (sector) End (sector) Size Code Name
1 2048 206847 100.0 MiB EF00 EFI system partition
2 206848 104855551 49.9 GiB 0700 Basic data partition

На этом диске нет линукса, установлен только GRUB в раздел с EFI. Если мы ставим систему непосредственно в NTFS-раздел, то загружаемся с флешки, дожидаемся запуска программы установки и жмем Shift + F10, чтобы вызвать консоль. Запускаем утилиту diskpart и смотрим список подключенных томов

X:sources> diskpart
DISKPART> list vol

Видим, что флешка (объемом 8 Гб) подключена как диск C:, а раздел для установки вовсе не смонтирован. Непорядок. Делаем так

DISKPART> sel vol 3
DISKPART> remove
DISKPART> assign letter=E
DISKPART> sel vol 1
DISKPART> assign letter=C
DISKPART> list vol
DISKPART> sel vol 2
DISKPART> assign letter=F

Вот теперь порядок, диск на который будем ставить винду стал диском C:, флешка — диском E:, а EFI-раздел — диском F:

Если же мы хотим поставить систему на VHD, то делаем так

DISKPART> sel vol 3
DISKPART> remove
DISKPART> assign letter=E
DISKPART> sel vol 1
DISKPART> assign letter=G
DISKPART> exit

Для порядка создаем каталог с образами
X:sources> md G:vhd
X:sources> diskpart

Создаем виртуальный диск, создаем на нем разметку GPT и раздел NTFS и монтируем его к C:

DISKPART> create vdisk file="G:vhdwin7.vhd" maximum=25600 type=fixed
DISKPART> attach vdisk
DISKPART> clean
DISKPART> convert gpt
DISKPART> create part primary
DISKPART> format fs=ntfs quick
DISKPART> assign letter=C

EFI-раздел монтируем к F:

DISKPART> sel vol 2
DISKPART> assign letter=F

Получаем такую картину

Очень важно! Убеждаемся в том, что EFI-раздел отформатирован именно в FAT, а не в FAT32. Иначе Sysprep не простит нам этой ошибки. Если на компе уже есть линукс, то настройки будут верны.

Теперь распаковываем дистрибутив на диск C:

X:sources> E:
E:> utils7-Zip7zFM.exe

Откроется GUI архиватора 7-zip. В нем открываем каталог E:sources, находим там файл install.wim

Правой кнопкой на этом файле вызываем контектстное меню и переходим по 7-zip -> Открыть архив. Появится содержимое образа.

Лезем в папку 4 — там лежит Ultimate

Выделяем всё Ctrl + A и жмем кнопку «Извлечь». Появится окно, где нам предложат указать путь распаковки

Указываем корень диска C: и жмем ОК.

Ну и теперь, как говорится: «Откиньтесь на спинку кресла и…»

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

Итак, после некоторого время ожидания распаковка окончена. И вот тут, вот в этом месте винда обчно делает бяку, а именно портит MBR или перенастраивает NVRAM. Но мы не дадим ей этого сделать — мы установим загрузчик вручную.

В случае с EFI, переходим на раздел EFI, смонтированный к F: и создаем необходимые пути и копируем файлы загрузчика

E:> F:
F:> mkdir EFImicrosoftboot
F:> xcopy C:WindowsBootEFI* F:EFImicrosoftboot /s /e
F:> mkdir EFImicrosoftbootFonts
F:> xcopy C:WindowsBootFonts* F:EFImicrosoftbootFonts /s /e
F:> copy C:WindowsSystem32configBCD-Template F:EFImicrosoftbootBCD

Отлично, загрузчик скопирован. Теперь настроим его

F:> E:utilsBOOTICEx64.exe

Открываем файл F:EFIMicrosoftBootBCD. В случае установки на раздел, его параметры задаются так

Если же мы устанавливали систему на VHD, то настройки будут такими

Важно! Имя вторичного загрузчика для EFI-системы winload.efi, для BIOS-системы — winload.exe.

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

F:> mkdir C:Boot
F:> xcopy C:WindowsBootPCAT* C:Boot /s /e
F:> mkdir C:BootFonts
F:> xcopy C:WindowsBootFonts* C:BootFonts /s /e
F:> copy C:Bootbootmgr C:bootmgr
F:> copy C:WindowsSystem32configBCD-Template C:BootBCD

Важно! Раздел, смонтированный к C: (там где размещен загрузчик) обязан быть активным! Убедитесь в этом перед перезагрузкой!

Настройку выполняем так же точно, используя BootICE.

Ну, вроде все. Закрываем все окна и идем в ребут. Флешку можно вытащить из компа.

5. Скрестим пальцы да вознесем молитвы тебе, о Великий и Ужасный Sysprep…!

GRUB у нас еще не настроен пункта для винды в меню нет. Как только появится меню GRUB жмем «C». В консоли набираем

grub> set root=hdX,Y
grub> chainloader /EFI/Microsoft/Boot/bootmgfw.efi
grub> boot

X, Y — соответственно диск и раздел, где лежит загрузчик. Это в случае EFI. В случае с BIOS делаем так

grub> set root=hdX,Y
grub> ntldr /bootmgr
grub> boot

X, Y — диск и раздел с NTFS. Там где распакована винда и лежит её загрузчик.

В режиме EFI вместо логотипа винды я увидел черный экран, так как не нашел в дистрибутиве билиотеки bootres.dll, которую надо поместить в папку EFIMictosoftBootResourses. В случае с BIOS всё в порядке — знакомая эмблема «семерки». А потом в обоих случаях увидим это

Это работает Sysprep. На 57% моргнет экран — настраивается видяха. И если мы все сделали верно, то надпись «Применение параметров системы» повисит довольно долго, потом система сообщит, что установка будет продолжена после перезагрузки. Если мы где-то напортачили с установкой загрузчика — неправильный EFI раздел или неактивный NTFS, то тогда будет ошибка :( Но мы молодцы и у нас все получится, и после очередной перезагрузки мы увидим это

а потом, наконец вот это

Дальше все как при обычной, штатной установке.

6. Настраиваем GRUB

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

menuentry 'Windows 7 Ultimate SP1 (EFI)' {

set root=hdX,Y
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

в случае EFI. Или

menuentry 'Windows 7 Ultimate SP1' {

set root=hdX,Y
ntldr /bootmgr
}

в случае BIOS. Применяем настройки GRUB и перезагружаемся и видем систему в пункте меню загрузки

после выбора которого получаем загруженную Windows

Заключение

Упреждая гнев профессиональных win-админов, скажу сразу — я знаю о DISM. Именно информация об этой системе и привела меня к описанному решению. Цель была одна — выяснить сколько нужно возможностей собственно Windows для установки Windows.

Оказалось вот что — для установки Windows её среда необходима только для одного — настройки BCD-хранилища. Всё. Остальное можно сделать из среды любой другой операционной системы.

Если написать аналог bcdedit.exe под Linux, то установить Windows можно будет с линуксового Live-носителя.

Customizing the /etc/default/grub file

There are two ways of doing this using editing a grub file. These are described in the Ubuntu Community Documentation Grub2 page

The two ways are:

  • Boot which ever operating system you booted last time, the «saved method»
    • This is the one I use. It lets me decide which one I going to use and will allow me to reboot into that system, handy when I’m updating.
  • Boot a specific operating system by default.
    • The answer to your exact question.

Finding the menuentry to set as the new default

To start we need to find out what we are booting or want to boot. Open a terminal with Ctrl+Alt+t and type in

sudo grep menuentry /boot/grub/grub.cfg
user@YourComputer:~$ grep menuentry /boot/grub/grub.cfg
[sudo] password for user:
menuentry 'Ubuntu, with Linux 2.6.35-31-generic' --class ubuntu --class gnu-linux --class gnu --class os {
menuentry 'Ubuntu, with Linux 2.6.35-31-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
menuentry 'Ubuntu, with Linux 2.6.35-30-generic' --class ubuntu --class gnu-linux --class gnu --class os {
menuentry 'Ubuntu, with Linux 2.6.35-30-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
menuentry "Memory test (memtest86+)" {
menuentry "Memory test (memtest86+, serial console 115200)" {
menuentry "Windows NT/2000/XP (loader) (on /dev/sda1)" {
menuentry "Ubuntu, with Linux 2.6.32-34-generic (on /dev/sdb1)" {
menuentry "Ubuntu, with Linux 2.6.32-34-generic (recovery mode) (on /dev/sdb1)" {
menuentry "Ubuntu, with Linux 2.6.32-33-generic (on /dev/sdb1)" {
menuentry "Ubuntu, with Linux 2.6.32-33-generic (recovery mode) (on /dev/sdb1)" {
menuentry "Windows Vista (loader) (on /dev/sdc1)" {

You can see that the «saved» method can come in handy when booting multiple operating systems. Save the name of the entry you want e.g. Windows NT/2000/XP (loader) (on /dev/sda1), we need it later.

Editing the /etc/default/grub file

Type in the terminal

sudo nano -B /etc/default/grub

and your password if asked. The nano editor will open.

A. Saved method — In my preferred way, I made the following changes from the standard grub file.

  • I changed the value of GRUB_DEFAULT to saved:

    GRUB_DEFAULT=saved
    
  • I enabled the SAVEDEFAULT functionality by adding the following line:

    GRUB_SAVEDEFAULT=true
    

B. Specific menuentry — In the way you are asking for

  • Change the value of GRUB_DEFAULT to the name of the Windows system you want to always boot. The name of the corresponding Grub menuentry can be found as described in the previous section.

  • I wanted to have Window XP always set as default at boot, I would set GRUB_DEFAULT to "Windows NT/2000/XP (loader) (on /dev/sda1)":

    GRUB_DEFAULT="Windows NT/2000/XP (loader) (on /dev/sda1)"
    

Note: Some versions of Ubuntu require single quote (‘) vice double quote («).

You could also set GRUB_DEFAULT to the line number in the menu entry list (with 0 being the first), but when the kernel in Ubuntu is updated grub adds the new kernel to the top of the list, you would have to change the number, since Windows is the last one in the menu entry list. You can see this in my menu entry list.

Update the boot configuration

Now you have to run

sudo update-grub

to update the system generated grub.cfg file in the /boot/grub/ directory.

user@YourComputer:~$ sudo update-grub
Generating grub.cfg ...
Found background: /usr/share/images/grub/Apollo_17_The_Last_Moon_Shot_Edit1.tga
Found linux image: /boot/vmlinuz-2.6.35-31-generic
Found initrd image: /boot/initrd.img-2.6.35-31-generic
Found linux image: /boot/vmlinuz-2.6.35-30-generic
Found initrd image: /boot/initrd.img-2.6.35-30-generic
Found memtest86+ image: /boot/memtest86+.bin
Found Windows NT/2000/XP (loader) on /dev/sda1
Found Ubuntu 10.04.3 LTS (10.04) on /dev/sdb1
Found Windows Vista (loader) on /dev/sdc1
done

Addendum

Notes on nano

nano is especally easy to use in the terminal. Move around with the arrow keys. Type in you addtions, delete the unwanted.

The -B or --backup option backs up the previous version of it to the current filename suffixed with a ~. Very handy in case of the dreaded Fat pfinger effect.

When you are through, Ctrl+o will allow you to save your edits by hitting Enter and Ctrl+x will close. These and other options are shown at the bottom of the terminal screen with the ^ indicating Ctrl.

^G Get Help    ^O WriteOut    ^R Read File   ^Y Prev Page   ^K Cut Text    ^C Cur Pos
^X Exit        ^J Justify     ^W Where Is    ^V Next Page   ^U UnCut Text  ^T To Spell

Notes about nano, sudoeditor and other editors

Some in the Ubuntu community suggest sudoedit instead of nano. I recommend nano — which is the default sudoedit editor in later distributions of Ubuntu — instead of sudoedit, because the default can be overridden in non-obvious ways, unless you are an administrator. sudoedit is safer in that it automatically saves a backup copy of the edited file, but the -B command line option in nano does the same thing. nano is more intuitive than editors like vi or emacs, which are very flexible but require learning a lot of commands, shortcuts or different modes.

If you prefer not to use the nano editor and prefer the Gnome Text Editor, instead of sudo nano -B use gksu gedit. I generally do this for large files, and /etc/default/grub could easily be considered a large file. Thus type in gksu gedit /etc/default/grub instead of sudo nano -B /etc/default/grub. Note that the Gnome text editor does not automatically make a backup!

Notes on my grub file

I made some changes to grub for my personal needs. Such as the background picture of the moon launch. How to do these are discussed at the Ubuntu Community Documentation page on Grub2, recommended.

Good luck!

GRUB2 was designed with an improved chainload mode when compared to GRUB Legacy.

Another grub.cfg

It is possible to load a grub configuration file from another filesystem, using the UUID of that filesystem as it is visible from /dev/disk/by-uuid/.

FILE grub.cfgChainloading another GRUB configuration file

search --no-floppy --fs-uuid --set=root 00000000-0000-0000-0000-000000000000
set prefix=($root)/grub
configfile /grub/grub.cfg

ISO images

The new ISO (or loop) chainload mechanism makes chainloading a breeze. It is possible to chainload ISO images (LiveCD/DVDs) with GRUB Legacy, however there exists no way to pass kernel cmdline arguments before boot. In any case, the ISO images in question should be built keeping kernel cmdline arguments in mind.

Without kernel cmdline options, booting ISO images with GRUB2 will fail in the physical media check/test stage of the ISOs boot process. Gentoo liveCD is handy because it has a minimal shell which lets the user mount the squashed image to the correct location and then press the Esc key to continue the boot process. This makes it possible to have a handy way to install an operating system with everything in RAM, especially for «light weight» LiveCDs. No more need to listen to a whining CD/DVD drive on each new command!

To chainload an ISO with custom or default kernel command line arguments, an entry similar to the following can be added to GRUB2’s grub.cfg file:

FILE /boot/grub/grub.cfgExample entry for chainloading an ISO file

menuentry "SYSRESCUECD" {
	set iso=/systemrescuecd-x86-3.8.1.iso
	loopback loop ${iso}
	linux  (loop)/isolinux/rescue64 nomodeset vga=791 docache setkmap=fr isoloop=${iso}
	initrd (loop)/isolinux/initram.igz
}

For a permanent and automatic entry to GRUB2’s grub.cfg file, a custom script could be added to the /etc/grub.d script location:

FILE /etc/grub.d/40_customCustom script to load a CD

#!/bin/sh
exec tail -n +3 $0

menuentry "GRUB4DOS" {
	linux /grub4dos-0.4.4/grub.exe --config-file=/menu.lst
}

menuentry "SYSRESCUECD" {
	set iso=/systemrescuecd-x86-3.8.1.iso
	loopback loop ${iso}
	linux  (loop)/isolinux/rescue64 nomodeset vga=791 docache setkmap=fr isoloop=${iso}
	initrd (loop)/isolinux/initram.igz
}

menuentry "STG3-AMD64" {
	set cmdline="dokeymap looptype=squashfs loop=/image.squashfs cdroot"
	loopback loop /stg3-amd64-<DATE>.iso
	linux  (loop)/isolinux/gentoo $cmdline root=/dev/ram0 init=/linuxrc initrd=gentoo.igz
	initrd (loop)/isolinux/gentoo.igz
}

menuentry "gentoo installation iso" {
        set iso=/install-x86-minimal-DATETIME.iso
        bootoptions="isoboot=$iso root=/dev/ram0 init=/linuxrc dokeymap looptype=squashfs loop=/image.squashfs cdroot vga=791"
        loopback loop ${iso}
        linux  (loop)/boot/gentoo $bootoptions
        initrd (loop)/boot/gentoo.igz
}

Do not forget to make the script executable:

root #chmod +x /etc/grub.d/40_custom

Finally regenerate GRUB2’s grub.cfg file using grub2-mkconfig command.

Another bootloader

Chainloading another bootloader to GRUB2 is fairly easy.

Something as simple as the following example is enough to boot another disk that uses a «Custom Super Bootloader»:

FILE /etc/grub.d/40_customChainloading another bootloader

menuentry "Custom Super Bootloader Example" {
     insmod part_msdos
     insmod chain
     chainloader (hd1,1)+1
}

TrueCrypt

Chainloading the TrueCrypt bootloader on a separate disk is relatively simple and can be done in GRUB2 like any other bootloader:

FILE /etc/grub.d/40_customChainloading TrueCrypt bootloader on a separate disk

title Windows7-TrueCrypt-BIOS/MBR
find --set-root /truecrypt_rescue_image.iso
map --mem /truecrypt_rescue_image.iso (hd32)
map (hd0) (hd1)
map (hd1) (hd0)
map --hook
root (hd32)
chainloader (hd32)

Note
The remapping may not be necessary if the system has a single boot disk. The mapping is necessary before chainloading TrueCrypt bootloader in the case that the boot disk (hd1 as shown in the example above) should appear as the primary boot device (hd0), otherwise TrueCrypt would fail to boot because the correct disk will not be found.

Chainloading a disk with TrueCrypt in the MBR or a rescue CD image located in encrypted partitions is not possible with GRUB2 (see bug #385619). Use either GRUB Legacy or GRUB4DOS as workaround. GRUB4DOS has an interface very similar to GRUB Legacy and a menu.lst entry which can be used to chainload the TrueCrypt bootloader or to boot a rescue CD (from an encrypted partition on the same disk).

Another workaround is to boot from TrueCrypt as the main boot loader and then hit the Esc to chainload the following partition (if one exists) or the following disk. Then have GRUB2 installed on the partition instead of in the MBR itself so that GRUB2 is chainloaded.

Windows (MSDOS based boot loaders)

When Windows (or another MS DOS based boot loader) is installed on another disk, then regular chainloading in the grub.cfg may be sufficient to boot it. However, if Windows is on the same disk on a different partition, or if regular chainloading doesn’t work, then read on.

Microsoft Windows 8 (and above versions) are no longer installed using MSDOS partitions by default, however they do maintain backwards compatibility with BIOS MBR systems. In order to specify Windows 8 (and above) to use MSDOS partitioning the Windows installation DVD needs to be booted in BIOS mode (a non-UEFI boot mode) in order for Windows to install into MSDOS partitions. Manually create a MSDOS partition layout, then manually boot the Windows DVD using a BIOS option in the boot menu list. Sometimes it is necessary in the BIOS firmware configuration tool to disable UEFI mode completely in order to force BIOS MBR mode.

The simplest way to dual boot Windows (or MS-DOS) is to add an MBR menu entry to GRUB2’s grub.cfg file for each Windows operating system installed.

For instance, to boot Windows 7, add the following to the grub.cfg file:

FILE /etc/grub.d/40_customWindows 7 example

menuentry "Windows 7 BIOS MBR" {
     insmod part_msdos
     insmod ntldr
     insmod ntfs
     ntldr (hd0,msdos1)/bootmgr
}

A Windows XP example:

FILE /etc/grub.d/40_customWindows XP example

menuentry "Windows XP BIOS MBR" {
     insmod part_msdos
     insmod ntldr
     insmod ntfs
     ntldr (hd0,msdos1)/ntldr
}

Instead of using GRUB2’s device syntax, the UUID of the partition containing the Windows bootloader can be used like so:

FILE /etc/grub.d/40_customUUID example

menuentry "Windows 10" {
     insmod ntfs
     insmod ntldr
     insmod part_msdos
     insmod search_fs_uuid
     search --no-floppy --fs-uuid --set=root 1AECC5A1ECC57811
     ntldr /bootmgr
}

Filesystem UUIDs can be obtained with blkid.

Note
Some users report the above method using UUIDs works better for Windows 7 or 10.

An entry for a GPT hybrid MBR works a bit different than the previous BIOS-MBR examples. Booting multiple versions of Windows can be achieved with remapping and/or hiding partitions with GRUB2’s parttool option:

FILE /etc/grub.d/40_customExample for GPT hybrid MBR

menuentry "Windows 7 BIOS MBR" {
     insmod part_msdos
     insmod chain
     parttool hd1,msdos1 hidden+ boot-
     parttool hd1,msdos2 hidden- boot+
     chainloader (hd1,msdos2)+1
}

Note
Remapping the disk with parttool in the manner above is only required if multiple Windows systems are installed on the same disk.

Remapping the devices to set the primary boot disk to other disks can be achieved by using the drivemap option like so:

FILE /etc/grub.d/40_customRemapping devices example

menuentry "Windows 7 BIOS MBR" {
     insmod part_msdos
     insmod chain
     drivemap hd0 hd1
     chainloader (hd1,msdos2)+1
}

Probing

GRUB2 is capable of automatically finding Windows partitions and assigning the root partitions. The Windows partition must first be mounted before the probe will be successful. See notes at the end of this section concerning missing C:bootmgr and C:Boot files and folders; it is wise to make sure these folders do exist before trying to boot Windows using GRUB2.

GRUB2’s probing feature requires the sys-boot/os-prober package which is not initially pulled in when installing GRUB2.

root #emerge --ask --newuse sys-boot/os-prober

root #grub2-probe --target=hints_string /mnt/windows7/bootmgr

--hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1

root #grub2-probe --target=fs_uuid /mnt/windows7/bootmgr

2ABF87DC395CFC02

From the output provided by the above two commands, the search line within GRUB2’s grub2.cfg file (below) can be constructed. Remapping the drive and partition as the first hard drive and first partition will make Windows XP or Windows 8 more free of silent errors while loading.

FILE /etc/grub.d/40_customConstructing the search line

menuentry 'Microsoft Windows 7 or Windows 8 (on sdb1)' --class windows {
        insmod part_msdos
        insmod ntfs
        insmod search_fs_uuid
        insmod ntldr
        search --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1 2ABF87DC395CFC02
        drivemap (hd1,msdos1) (hd0,msdos1)
        #Or, "drivemap (hd1,msdos2) (hd0,msdos1)" for those with Windows installed on sdb2)
        ntldr /bootmgr
}

Important
If the C:bootmgr and the C:Boot folders through which the bootmgr file is linked do not exist, then the files need to be installed using an Administrator cmd.exe shell (escalated command prompt). Regeneration should be possible by using this command:

C:>bcdboot c:Windows /s c:

Seeing a boot error message concerning a missing bootmgr file after attempting to boot one of the previously mentioned grub.cfg entries is the indication the C:Boot folder is missing. This happens when using Windows 8 since the C:Boot folder does not seem to be generated by default.

Dual-booting Windows on UEFI with GPT

In the case the Windows bootloader was overwritten with GRUB2 or if bootmgr doesn’t do the trick, a UEFI dual boot could be achieved using the following menu entry:

FILE /etc/grub.d/40_customUEFI dual-boot

menuentry "Windows 7 UEFI/GPT" {
    insmod part_gpt
    insmod search_fs_uuid
    insmod chain
    search --fs-uuid --no-floppy --set=root 28cf-35de
    chainloader ($root)/EFI/MICROSOFT/BOOT/bootmgfw.efi
}

See also

  • UEFI Dual boot with Windows 7/8 — describes how to dual boot Microsoft Windows on a UEFI computer.

Related articles

  • Arch boot process
  • Master Boot Record
  • GUID Partition Table
  • Unified Extensible Firmware Interface
  • GRUB Legacy
  • /EFI examples
  • /Tips and tricks
  • Multiboot USB drive

GRUB (GRand Unified Bootloader) is a boot loader. The current GRUB is also referred to as GRUB 2. The original GRUB, or GRUB Legacy, corresponds to versions 0.9x. This page exclusively describes GRUB 2.

Note: In the entire article esp denotes the mountpoint of the EFI system partition aka ESP.

UEFI systems

Note:

  • It is recommended to read and understand the Unified Extensible Firmware Interface, Partitioning#GUID Partition Table and Arch boot process#Under UEFI pages.
  • When installing to use UEFI it is important to boot the installation media in UEFI mode, otherwise efibootmgr will not be able to add the GRUB UEFI boot entry. Installing to the fallback boot path will still work even in BIOS mode since it does not touch the NVRAM.
  • To boot from a disk using UEFI, an EFI system partition is required. Follow EFI system partition#Check for an existing partition to find out if you have one already, otherwise you need to create it.
  • This whole article assumes that inserting additional GRUB2 modules via insmod is possible. As discussed in Unified Extensible Firmware Interface/Secure Boot#shim with key and GRUB, this is not the case on UEFI systems with Secure Boot enabled. If you want to use any additional GRUB module that is not included in the standard GRUB EFI file grubx64.efi on a Secure Boot system, you have to re-generate the GRUB EFI grubx64.efi with grub-mkstandalone with the additional GRUB modules included.

Installation

Note:

  • UEFI firmwares are not implemented consistently across manufacturers. The procedure described below is intended to work on a wide range of UEFI systems but those experiencing problems despite applying this method are encouraged to share detailed information, and if possible the workarounds found, for their hardware-specific case. A /EFI examples article has been provided for such cases.
  • The section assumes you are installing GRUB for x86_64 systems. For IA32 (32-bit) UEFI systems (not to be confused with 32-bit CPUs), replace x86_64-efi with i386-efi where appropriate..

First, install the packages grub and efibootmgr: GRUB is the boot loader while efibootmgr is used by the GRUB installation script to write boot entries to NVRAM.

Then follow the below steps to install GRUB to your disk:

  1. Mount the EFI system partition and in the remainder of this section, substitute esp with its mount point.
  2. Choose a boot loader identifier, here named GRUB. A directory of that name will be created in esp/EFI/ to store the EFI binary and this is the name that will appear in the UEFI boot menu to identify the GRUB boot entry.
  3. Execute the following command to install the GRUB EFI application grubx64.efi to esp/EFI/GRUB/ and install its modules to /boot/grub/x86_64-efi/.

Note:

  • Make sure to install the packages and run the grub-install command from the system in which GRUB will be installed as the boot loader. That means if you are booting from the live installation environment, you need to be inside the chroot when running grub-install. If for some reason it is necessary to run grub-install from outside of the installed system, append the --boot-directory= option with the path to the mounted /boot directory, e.g --boot-directory=/mnt/boot.
  • Some motherboards cannot handle bootloader-id with spaces in it.
# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB

https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface/Secure_Boot#sbctl
After the above installation completed, the main GRUB directory is located at /boot/grub/. Read /Tips and tricks#Alternative install method for how to specify an alternative location. Note that grub-install also tries to create an entry in the firmware boot manager, named GRUB in the above example – this will, however, fail if your boot entries are full; use efibootmgr to remove unnecessary entries.

Remember to #Generate the main configuration file after finalizing the configuration.

Tip: If you use the option --removable then GRUB will be installed to esp/EFI/BOOT/BOOTX64.EFI (or esp/EFI/BOOT/BOOTIA32.EFI for the i386-efi target) and you will have the additional ability of being able to boot from the drive in case EFI variables are reset or you move the drive to another computer. Usually you can do this by selecting the drive itself similar to how you would using BIOS. If dual booting with Windows, be aware Windows usually places an EFI executable there, but its only purpose is to recreate the UEFI boot entry for Windows. If you are installing GRUB on a Mac, you will have to use this option.

Note:

  • --efi-directory and --bootloader-id are specific to GRUB UEFI, --efi-directory replaces --root-directory which is deprecated.
  • You might note the absence of a device_path option (e.g.: /dev/sda) in the grub-install command. In fact any device_path provided will be ignored by the GRUB UEFI install script. Indeed, UEFI boot loaders do not use a MBR bootcode or partition boot sector at all.

See UEFI troubleshooting in case of problems. Additionally see /Tips and tricks#UEFI further reading.

Secure Boot support

Grub fully supports secure boot utilising either CA keys or shim, the installation command however is different depending on which you intend to use.

To make use of CA Keys the command is

# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB --modules="tpm" --disable-shim-lock

To make use of shim-lock the command is

# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB--modules="normal test efi_gop efi_uga search echo linux all_video gfxmenu gfxterm_background gfxterm_menu gfxterm loadenv configfile tpm"

After installation see Secure Boot for instructions on implementing it

Warning:

  • Incorrectly configuring Secure Boot can render your system unbootable. If for any reason you cannot boot after enabling secure boot then you should disable it in firmware and reboot the system.
  • Loading unnecessary modules in your bootloader has the potential to present a security risk, only use these commands if you need them.

BIOS systems

GUID Partition Table (GPT) specific instructions

On a BIOS/GPT configuration, a BIOS boot partition is required. GRUB embeds its core.img into this partition.

Note:

  • Before attempting this method keep in mind that not all systems will be able to support this partitioning scheme. Read more on Partitioning#GUID Partition Table.
  • The BIOS boot partition is only needed by GRUB on a BIOS/GPT setup. On a BIOS/MBR setup, GRUB uses the post-MBR gap for the embedding the core.img. On GPT, however, there is no guaranteed unused space before the first partition.
  • For UEFI systems this extra partition is not required, since no embedding of boot sectors takes place in that case. However, UEFI systems still require an EFI system partition.

Create a mebibyte partition (+1M with fdisk or gdisk) on the disk with no file system and with partition type GUID 21686148-6449-6E6F-744E-656564454649.

  • Select partition type BIOS boot for fdisk.
  • Select partition type code ef02 for gdisk.
  • For parted set/activate the flag bios_grub on the partition.

This partition can be in any position order but has to be on the first 2 TiB of the disk. This partition needs to be created before GRUB installation. When the partition is ready, install the boot loader as per the instructions below.

The space before the first partition can also be used as the BIOS boot partition though it will be out of GPT alignment specification. Since the partition will not be regularly accessed performance issues can be disregarded, though some disk utilities will display a warning about it. In fdisk or gdisk create a new partition starting at sector 34 and spanning to 2047 and set the type. To have the viewable partitions begin at the base consider adding this partition last.

Master Boot Record (MBR) specific instructions

Usually the post-MBR gap (after the 512 byte MBR region and before the start of the first partition) in many MBR partitioned systems is 31 KiB when DOS compatibility cylinder alignment issues are satisfied in the partition table. However a post-MBR gap of about 1 to 2 MiB is recommended to provide sufficient room for embedding GRUB’s core.img (FS#24103). It is advisable to use a partitioning tool that supports 1 MiB partition alignment to obtain this space as well as to satisfy other non-512-byte-sector issues (which are unrelated to embedding of core.img).

Installation

Install the grub package. (It will replace grub-legacyAUR if that is already installed.) Then do:

# grub-install --target=i386-pc /dev/sdX

where i386-pc is deliberately used regardless of your actual architecture, and /dev/sdX is the disk (not a partition) where GRUB is to be installed. For example /dev/sda or /dev/nvme0n1, or /dev/mmcblk0. See Device file#Block device names for a description of the block device naming scheme.

Now you must generate the main configuration file.

If you use LVM for your /boot, you can install GRUB on multiple physical disks.

See grub-install(8) and GRUB Manual for more details on the grub-install command.

Configuration

On an installed system, GRUB loads the /boot/grub/grub.cfg configuration file each boot. You can follow #Generated grub.cfg for using a tool, or #Custom grub.cfg for a manual creation.

Generated grub.cfg

This section only covers editing the /etc/default/grub configuration file. See /Tips and tricks for more information.

Note: Remember to always generate the main configuration file after making changes to /etc/default/grub and/or files in /etc/grub.d/.

Warning: Update/reinstall the boot loader (see #UEFI systems or #BIOS systems) if a new GRUB version changes the syntax of the configuration file: mismatching configuration can result in an unbootable system.

Generate the main configuration file

After the installation, the main configuration file /boot/grub/grub.cfg needs to be generated. The generation process can be influenced by a variety of options in /etc/default/grub and scripts in /etc/grub.d/.

If you have not done additional configuration, the automatic generation will determine the root filesystem of the system to boot for the configuration file. For that to succeed it is important that the system is either booted or chrooted into.

Note:

  • The default file path is /boot/grub/grub.cfg, not /boot/grub/i386-pc/grub.cfg.
  • If you are trying to run grub-mkconfig in a chroot or systemd-nspawn container, you might notice that it does not work: grub-probe: error: failed to get canonical path of /dev/sdaX. In this case, try using arch-chroot as described in the BBS post.

Use the grub-mkconfig tool to generate /boot/grub/grub.cfg:

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

By default the generation scripts automatically add menu entries for all installed Arch Linux kernels to the generated configuration.

Tip:

  • After installing or removing a kernel, you just need to re-run the above grub-mkconfig command.
  • For tips on managing multiple GRUB entries, for example when using both linux and linux-lts kernels, see /Tips and tricks#Multiple entries.

To automatically add entries for other installed operating systems, see #Detecting other operating systems.

You can add additional custom menu entries by editing /etc/grub.d/40_custom and re-generating /boot/grub/grub.cfg. Or you can create /boot/grub/custom.cfg and add them there. Changes to /boot/grub/custom.cfg do not require re-running grub-mkconfig, since /etc/grub.d/41_custom adds the necessary source statement to the generated configuration file.

Tip: /etc/grub.d/40_custom can be used as a template to create /etc/grub.d/nn_custom, where nn defines the precedence, indicating the order the script is executed. The order scripts are executed determine the placement in the GRUB boot menu. nn should be greater than 06 to ensure necessary scripts are executed first.

See #Boot menu entry examples for custom menu entry examples.

Detecting other operating systems

To have grub-mkconfig search for other installed systems and automatically add them to the menu, install the os-prober package and mount the partitions from which the other systems boot. Then re-run grub-mkconfig. If you get the following output: Warning: os-prober will not be executed to detect other bootable partitions then edit /etc/default/grub and add/uncomment:

GRUB_DISABLE_OS_PROBER=false

Then try again.

Note:

  • The exact mount point does not matter, os-prober reads the mtab to identify places to search for bootable entries.
  • Remember to mount the partitions each time you run grub-mkconfig in order to include the other operating systems every time.
Windows

For Windows installed in UEFI mode, make sure the EFI system partition containing the Windows Boot Manager (bootmgfw.efi) is mounted. Run os-prober as root to detect and generate an entry for it.

For Windows installed in BIOS mode, mount the Windows system partition (its file system label should be System Reserved or SYSTEM). Run os-prober as root to detect and generate an entry for it.

Note: For Windows installed in BIOS mode:

  • NTFS partitions may not always be detected when mounted with the default Linux drivers. If GRUB is not detecting it, try installing NTFS-3G and remounting.

Tango-view-refresh-red.pngThis article or section is out of date.Tango-view-refresh-red.png

Reason: Since Windows 7, bootmgr is placed in the system partition which is not encrypted. (Discuss in Talk:GRUB)

  • Encrypted Windows partitions may need to be decrypted before mounting. For BitLocker, this can be done with cryptsetup or dislockerAUR. This should be sufficient for os-prober to add the correct entry.

Additional arguments

To pass custom additional arguments to the Linux image, you can set the GRUB_CMDLINE_LINUX + GRUB_CMDLINE_LINUX_DEFAULT variables in /etc/default/grub. The two are appended to each other and passed to kernel when generating regular boot entries. For the recovery boot entry, only GRUB_CMDLINE_LINUX is used in the generation.

It is not necessary to use both, but can be useful. For example, you could use GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=uuid-of-swap-partition quiet" where uuid-of-swap-partition is the UUID of your swap partition to enable resume after hibernation. This would generate a recovery boot entry without the resume and without quiet suppressing kernel messages during a boot from that menu entry. Though, the other (regular) menu entries would have them as options.

By default grub-mkconfig determines the UUID of the root filesystem for the configuration. To disable this, uncomment GRUB_DISABLE_LINUX_UUID=true.

For generating the GRUB recovery entry you have to ensure that GRUB_DISABLE_RECOVERY is not set to true in /etc/default/grub.

See Kernel parameters for more info.

By default, grub-mkconfig sorts the included kernels using sort -V and uses the first kernel in that list as the top-level entry. This means that, for example, since /boot/vmlinuz-linux-lts is sorted before /boot/vmlinuz-linux, if you have both linux-lts and linux installed, the LTS kernel will be the top-level menu entry, which may not be desirable. This can be overridden by specifying GRUB_TOP_LEVEL=path_to_kernel" in /etc/default/grub. For example, to make the regular kernel be the top-level menu entry, you can use GRUB_TOP_LEVEL="/boot/vmlinuz-linux".

LVM

Merge-arrows-2.pngThis article or section is a candidate for merging with #Installation.Merge-arrows-2.png

Notes: grub-mkconfig is capable of detecting that it needs the lvm module, specifying it in GRUB_PRELOAD_MODULES is not required. Move warning to #Installation & #Installation_2 or create a Known issues section and document it there. (Discuss in Talk:GRUB)

Warning: GRUB does not support thin-provisioned logical volumes.

If you use LVM for your /boot or / root partition, make sure that the lvm module is preloaded:

/etc/default/grub
GRUB_PRELOAD_MODULES="... lvm"

RAID

Merge-arrows-2.pngThis article or section is a candidate for merging with #Installation.Merge-arrows-2.png

Notes: grub-mkconfig is capable of detecting that it needs the mdraid09 and/or mdraid1x modules, specifying them in GRUB_PRELOAD_MODULES is not required. Summarize the double grub-install in a note and move it to #Installation; move set root stuff to #Custom grub.cfg. (Discuss in Talk:GRUB)

GRUB provides convenient handling of RAID volumes. You need to load GRUB modules mdraid09 or mdraid1x to allow you to address the volume natively:

/etc/default/grub
GRUB_PRELOAD_MODULES="... mdraid09 mdraid1x"

For example, /dev/md0 becomes:

set root=(md/0)

whereas a partitioned RAID volume (e.g. /dev/md0p1) becomes:

set root=(md/0,1)

To install grub when using RAID1 as the /boot partition (or using /boot housed on a RAID1 root partition), on BIOS systems, simply run grub-install on both of the drives, such as:

# grub-install --target=i386-pc --debug /dev/sda
# grub-install --target=i386-pc --debug /dev/sdb

Where the RAID 1 array housing /boot is housed on /dev/sda and /dev/sdb.

Note: GRUB supports booting from Btrfs RAID 0/1/10, but not RAID 5/6. You may use mdadm for RAID 5/6, which is supported by GRUB.

Encrypted /boot

GRUB also has special support for booting with an encrypted /boot. This is done by unlocking a LUKS blockdevice in order to read its configuration and load any initramfs and kernel from it. This option tries to solve the issue of having an unencrypted boot partition.

Tip: /boot is not required to be kept in a separate partition; it may also stay under the system’s root / directory tree.

Warning: GRUB 2.06 has limited support for LUKS2. See the #LUKS2 section below for details.

To enable this feature encrypt the partition with /boot residing on it using LUKS as normal. Then add the following option to /etc/default/grub:

/etc/default/grub
GRUB_ENABLE_CRYPTODISK=y

This option is used by grub-install to generate the grub core.img.

Make sure to install grub after modifying this option or encrypting the partition.

Without further changes you will be prompted twice for a passphrase: the first for GRUB to unlock the /boot mount point in early boot, the second to unlock the root filesystem itself as implemented by the initramfs. You can use a keyfile to avoid this.

Warning:

  • If you want to generate the main configuration file, make sure that /boot is mounted.
  • In order to perform system updates involving the /boot mount point, ensure that the encrypted /boot is unlocked and mounted before performing an update. With a separate /boot partition, this may be accomplished automatically on boot by using crypttab with a keyfile.

Note:

  • If you use a special keymap, a default GRUB installation will not know it. This is relevant for how to enter the passphrase to unlock the LUKS blockdevice. See /Tips and tricks#Manual configuration of core image for early boot.
  • If you experience issues getting the prompt for a password to display (errors regarding cryptouuid, cryptodisk, or «device not found»), try reinstalling GRUB and appending --modules="part_gpt part_msdos" to the end of your grub-install command.

Tip: You can use pacman hooks to automount your /boot when upgrades need to access related files.

LUKS2
  • GRUB 2.06 has limited support for LUKS2. See GRUB bug #55093.
  • Argon2id (cryptsetup default) and Argon2i PBKDFs are not supported (GRUB bug #59409), only PBKDF2 is.
  • grub-install does not support creating a core image that could be used for unlocking LUKS2. See the comments below or on grub-gitAUR for a workaround.

Tip: You can use grub-improved-luks2-gitAUR that has been patched for LUKS2 as well as Argon support.

  • Use grub-install as described in the #Installation section to populate the GRUB module directory. Do not forget to edit /etc/default/grub and run grub-mkconfig -o /boot/grub/grub.cfg, as described above. The generated EFI binary does not support LUKS2 and will be replaced in the next step.
  • Create /boot/grub/grub-pre.cfg. Replace UUID with the LUKS encrypted device UUID. Use lvm/NameOfVolumeGroup-NameOfLogicalVolume instead of crypto0 if your root drive is on an LVM logical volume inside the LUKS volume, otherwise do not change crypto0, this is how GRUB names encrypted volumes.
/boot/grub/grub-pre.cfg
set crypto_uuid=UUID
cryptomount -u $crypto_uuid
set root=crypto0
set prefix=($root)/boot/grub
insmod normal
normal

Note: Whenever you make changes to grub-pre.cfg, you will have to do the following steps again.

Warning: If using Btrfs and /boot/grub is located on a subvolume, the prefix must include the full path from the top level Btrfs subvolume (subvolid = 5). For example, if /boot/grub is located on a subvolume called my_subvolume (subvolid ≠ 5), set the line to set prefix=($root)/my_subvolume/boot/grub. This is true even if you have set my_subvolume as default with btrfs subvolume set-default before.

  • Add lvm if you use LVM. Replace ext2 with btrfs or another filesystem module, if needed. Depending on the settings of your key slot, replace gcry_sha256 with gcry_sha512 or gcry_whirlpool if need be:
$ grub-mkimage -p /boot/grub -O x86_64-efi -c grub-pre.cfg -o /tmp/grubx64.efi luks2 part_gpt cryptodisk gcry_rijndael pbkdf2 gcry_sha256 ext2

If it cannot find grub-pre.cfg, simply change to -c /boot/grub/grub-pre.cfg above.

  • Copy to ESP:
# install -v /tmp/grubx64.efi esp/EFI/GRUB/grubx64.efi

If you enter an invalid passphrase during boot and end up at the GRUB rescue shell, try cryptomount -a to mount all (hopefully only one) encrypted partitions or use cryptomount -u $crypto_uuid to mount a specific one. Then proceed with insmod normal and normal as usual.

If you enter a correct passphrase, but an Invalid passphrase error is immediately returned, make sure that the right cryptographic modules are specified. Use cryptsetup luksDump /dev/nvme0n1p2 and check whether the hash function (SHA-256, SHA-512) matches the modules (gcry_sha256, gcry_sha512) installed and the PBKDF algorithm is pbkdf2. The hash and PBDKDF algorithms can be changed for existing keys by using cryptsetup luksConvertKey --hash sha256 --pbkdf pbkdf2 /dev/nvme0n1p2. Under normal circumstances it should take a few seconds before the passphrase is processed.

Custom grub.cfg

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

This section describes the manual creation of GRUB boot entries in /boot/grub/grub.cfg instead of relying on grub-mkconfig.

A basic GRUB config file uses the following options:

  • (hdX,Y) is the partition Y on disk X, partition numbers starting at 1, disk numbers starting at 0
  • set default=N is the default boot entry that is chosen after timeout for user action
  • set timeout=M is the time M to wait in seconds for a user selection before default is booted
  • menuentry "title" {entry options} is a boot entry titled title
  • set root=(hdX,Y) sets the boot partition, where the kernel and GRUB modules are stored (boot need not be a separate partition, and may simply be a directory under the «root» partition (/)

Tip: These boot entries can also be used when using a /boot/grub/grub.cfg generated by grub-mkconfig. Add them to /etc/grub.d/40_custom and re-generate the main configuration file or add them to /boot/grub/custom.cfg.

For tips on managing multiple GRUB entries, for example when using both linux and linux-lts kernels, see /Tips and tricks#Multiple entries.

For Archiso and Archboot boot menu entries see Multiboot USB drive#Boot entries.

GRUB commands
menuentry "System shutdown" {
	echo "System shutting down..."
	halt
}
menuentry "System restart" {
	echo "System rebooting..."
	reboot
}
if [ ${grub_platform} == "efi" ]; then
	menuentry 'UEFI Firmware Settings' --id 'uefi-firmware' {
		fwsetup
	}
fi
EFI binaries

When launched in UEFI mode, GRUB can chainload other EFI binaries.

Tip: To show these menu entries only when GRUB is launched in UEFI mode, enclose them in the following if statement:

if [ ${grub_platform} == "efi" ]; then
	place UEFI-only menu entries here
fi
UEFI Shell

You can launch UEFI Shell by placing it in the root of the EFI system partition and adding this menu entry:

menuentry "UEFI Shell" {
	insmod fat
	insmod chain
	search --no-floppy --set=root --file /shellx64.efi
	chainloader /shellx64.efi
}
gdisk

Download the gdisk EFI application and copy gdisk_x64.efi to esp/EFI/tools/.

menuentry "gdisk" {
	insmod fat
	insmod chain
	search --no-floppy --set=root --file /EFI/tools/gdisk_x64.efi
	chainloader /EFI/tools/gdisk_x64.efi
}
Chainloading a unified kernel image

If you have a unified kernel image generated from following Secure Boot or other means, you can add it to the boot menu. For example:

menuentry "Arch Linux" {
	insmod fat
	insmod chain
	search --no-floppy --set=root --fs-uuid FILESYSTEM_UUID
	chainloader /EFI/Linux/Arch-linux.efi
}
Dual-booting
GNU/Linux

Assuming that the other distribution is on partition sda2:

menuentry "Other Linux" {
	set root=(hd0,2)
	linux /boot/vmlinuz (add other options here as required)
	initrd /boot/initrd.img (if the other kernel uses/needs one)
}

Alternatively let GRUB search for the right partition by UUID or file system label:

menuentry "Other Linux" {
        # assuming that UUID is 763A-9CB6
	search --no-floppy --set=root --fs-uuid 763A-9CB6

        # search by label OTHER_LINUX (make sure that partition label is unambiguous)
        #search --no-floppy --set=root --label OTHER_LINUX

	linux /boot/vmlinuz (add other options here as required, for example: root=UUID=763A-9CB6)
	initrd /boot/initrd.img (if the other kernel uses/needs one)
}

If the other distribution has already a valid /boot folder with installed GRUB, grub.cfg, kernel and initramfs, GRUB can be instructed to load these other grub.cfg files on-the-fly during boot. For example, for hd0 and the fourth GPT partition:

menuentry "configfile hd0,gpt4"  {
        insmod part_gpt
        insmod btrfs
        insmod ext2
        set root='hd0,gpt4'
        configfile /boot/grub/grub.cfg
}

When choosing this entry, GRUB loads the grub.cfg file from the other volume and displays that menu. Any environment variable changes made by the commands in file will not be preserved after configfile returns. Press Esc to return to the first GRUB menu.

Windows installed in UEFI/GPT mode

This mode determines where the Windows boot loader resides and chain-loads it after GRUB when the menu entry is selected. The main task here is finding the EFI system partition and running the bootloader from it.

if [ "${grub_platform}" == "efi" ]; then
	menuentry "Microsoft Windows Vista/7/8/8.1 UEFI/GPT" {
		insmod part_gpt
		insmod fat
		insmod chain
		search --no-floppy --fs-uuid --set=root $hints_string $fs_uuid
		chainloader /EFI/Microsoft/Boot/bootmgfw.efi
	}
fi

where $hints_string and $fs_uuid are obtained with the following two commands.

The $fs_uuid command determines the UUID of the EFI system partition:

# grub-probe --target=fs_uuid esp/EFI/Microsoft/Boot/bootmgfw.efi
1ce5-7f28

Alternatively one can run lsblk --fs and read the UUID of the EFI system partition from there.

The $hints_string command will determine the location of the EFI system partition, in this case harddrive 0:

# grub-probe --target=hints_string esp/EFI/Microsoft/Boot/bootmgfw.efi
--hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1

These two commands assume the ESP Windows uses is mounted at esp. There might be case differences in the path to Windows’s EFI file, what with being Windows, and all.

Windows installed in BIOS/MBR mode

Note: GRUB supports booting bootmgr directly and chainloading of partition boot sector is no longer required to boot Windows in a BIOS/MBR setup.

Warning: It is the system partition that has /bootmgr, not your «real» Windows partition (usually C:). The system partition’s filesystem label is System Reserved or SYSTEM and the partition is only about 100 to 549 MiB in size. See Wikipedia:System partition and boot partition for more information.

Throughout this section, it is assumed your Windows partition is /dev/sda1. A different partition will change every instance of hd0,msdos1.

In both examples XXXX-XXXX is the filesystem UUID which can be found with command lsblk --fs.

For Windows Vista/7/8/8.1/10:

if [ "${grub_platform}" == "pc" ]; then
	menuentry "Microsoft Windows Vista/7/8/8.1/10 BIOS/MBR" {
		insmod part_msdos
		insmod ntfs
		insmod ntldr
		search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 XXXX-XXXX
		ntldr /bootmgr
	}
fi

For Windows XP:

if [ "${grub_platform}" == "pc" ]; then
	menuentry "Microsoft Windows XP" {
		insmod part_msdos
		insmod ntfs
		insmod ntldr
		search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 XXXX-XXXX
		ntldr /ntldr
	}
fi

Note: In some cases, GRUB may be installed without a clean Windows 8, in which case you cannot boot Windows without having an error with bootbcd (error code 0xc000000f). You can fix it by going to Windows Recovery Console (cmd.exe from install disk) and executing:

X:> bootrec.exe /fixboot
X:> bootrec.exe /RebuildBcd

Do not use bootrec.exe /Fixmbr because it will wipe GRUB out.
Or you can use Boot Repair function in the Troubleshooting menu — it will not wipe out GRUB but will fix most errors.
Also you would better keep plugged in both the target hard drive and your bootable device ONLY. Windows usually fails to repair boot information if any other devices are connected.

Using labels

It is possible to use file system labels, human-readable strings attached to file systems, by using the --label option to search. First of all, make sure your file system has a label.

Then, add an entry using labels. An example of this:

menuentry "Arch Linux, session texte" {
  search --label --set=root archroot
  linux /boot/vmlinuz-linux root=/dev/disk/by-label/archroot ro
  initrd /boot/initramfs-linux.img
}

Using the command shell

Since the MBR is too small to store all GRUB modules, only the menu and a few basic commands reside there. The majority of GRUB functionality remains in modules in /boot/grub/, which are inserted as needed. In error conditions (e.g. if the partition layout changes) GRUB may fail to boot. When this happens, a command shell may appear.

GRUB offers multiple shells/prompts. If there is a problem reading the menu but the bootloader is able to find the disk, you will likely be dropped to the «normal» shell:

grub>

If there is a more serious problem (e.g. GRUB cannot find required files), you may instead be dropped to the «rescue» shell:

grub rescue>

The rescue shell is a restricted subset of the normal shell, offering much less functionality. If dumped to the rescue shell, first try inserting the «normal» module, then starting the «normal» shell:

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

GRUB supports pager for reading commands that provide long output (like the help command). This works only in normal shell mode and not in rescue mode. To enable pager, in GRUB command shell type:

sh:grub> set pager=1

Using the command shell environment to boot operating systems

grub>

The GRUB’s command shell environment can be used to boot operating systems.
A common scenario may be to boot Windows / Linux stored on a drive/partition via chainloading.

Chainloading means to load another boot-loader from the current one, ie, chain-loading.

The other bootloader may be embedded at the start of a partitioned disk (MBR), at the start of a partition or a partitionless disk (VBR), or as an EFI binary in the case of UEFI.

Chainloading a partition’s VBR

set root=(hdX,Y)
chainloader +1
boot

X=0,1,2…
Y=1,2,3…

For example to chainload Windows stored in the first partition of the first hard disk,

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

Similarly GRUB installed to a partition can be chainloaded.

Chainloading a disk’s MBR or a partitionless disk’s VBR

set root=hdX
chainloader +1
boot

Chainloading Windows/Linux installed in UEFI mode

insmod fat
set root=(hd0,gpt4)
chainloader (${root})/EFI/Microsoft/Boot/bootmgfw.efi
boot

insmod fat is used for loading the FAT file system module for accessing the Windows bootloader on the EFI system partition.
(hd0,gpt4) or /dev/sda4 is the EFI system partition in this example.
The entry in the chainloader line specifies the path of the .efi file to be chain-loaded.

Normal loading

See the examples in #Using the rescue console

Using the rescue console

See #Using the command shell first. If unable to activate the standard shell, one possible solution is to boot using a live CD or some other rescue disk to correct configuration errors and reinstall GRUB. However, such a boot disk is not always available (nor necessary); the rescue console is surprisingly robust.

The available commands in GRUB rescue include insmod, ls, set, and unset. This example uses set and insmod. set modifies variables and insmod inserts new modules to add functionality.

Before starting, the user must know the location of their /boot partition (be it a separate partition, or a subdirectory under their root):

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

where X is the physical drive number and Y is the partition number.

Note: With a separate boot partition, omit /boot from the path (i.e. type set prefix=(hdX,Y)/grub).

To expand console capabilities, insert the linux module:

grub rescue> insmod i386-pc/linux.mod

or simply

grub rescue> insmod linux

This introduces the linux and initrd commands, which should be familiar.

An example, booting Arch Linux:

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

With a separate boot partition (e.g. when using UEFI), again change the lines accordingly:

Note: Since boot is a separate partition and not part of your root partition, you must address the boot partition manually, in the same way as for the prefix variable.

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

Note: If you experienced error: premature end of file /YOUR_KERNEL_NAME during execution of linux command, you can try linux16 instead.

After successfully booting the Arch Linux installation, users can correct grub.cfg as needed and then reinstall GRUB.

To reinstall GRUB and fix the problem completely, changing /dev/sda if needed. See #Installation for details.

GRUB removal

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: Migrating from BIOS booting to UEFI is not the only case where GRUB could be removed. Section needs to either cover how to remove GRUB installed for UEFI booting or it should be removed altogether as too trivial. (Discuss in Talk:GRUB)

In general, in order to remove grub, one has to do the installation steps in reverse order. Perhaps cleaning any left over at the end. However, before doing anything, one has to decide if, and how, the machine will boot after the removal. Assuming one removes grub because they would like to use another boot loader, a safe, though a bit difficult, method is to make sure the other boot loader is working before removing grub.

In any case, even when removing grub before installing another boot loader, for the UEFI case, run:

$ efibootmgr

And verify the other boot loader is listed in the BootOrder line. If grub was not removed, the other boot loader should be listed before grub. If grub is already removed, grub should not be mentioned in that line. But note this is only a necessary, but not sufficient, condition for the machine to boot with the other boot loader. Neither it is a sufficient condition for the full removal of grub.

For both UEFI and non UEFI machines, grub-install was manually run as part of the installation of grub. One of its jobs for the UEFI case was to run the equivalent of efibootmgr --create. As part of grub removal, one has to remove the products of grub-install. The opposite of efibootmgr --create is efibootmgr --delete-bootnum, or an equivalent program. One way to obtain the number of the boot entry for the efibootmgr --delete-bootnum command is from the output of efibootmgr (with no arguments).

grub-install creates the /boot/grub directory that needs to be removed manually. Though some users will want to keep it, should they want to install grub again.

After migrating to GPT/UEFI one may want to remove the MBR boot code using dd:

# dd if=/dev/zero of=/dev/sdX bs=440 count=1

Troubleshooting

Unsupported file systems

In case that GRUB does not support the root file system, an alternative /boot partition with a supported file system must be created. In some cases, the development version of GRUB grub-gitAUR may have native support for the file system.

If GRUB is used with an unsupported file system it is not able to extract the UUID of your drive so it uses classic non-persistent /dev/sdXx names instead. In this case you might have to manually edit /boot/grub/grub.cfg and replace root=/dev/sdXx with root=UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. You can use the blkid command to get the UUID of your device, see Persistent block device naming.

While GRUB supports F2FS since version 2.0.4, it cannot correctly read its boot files from an F2FS partition that was created with the extra_attr flag enabled.

Enable debug messages

Note: This change is overwritten when #Generate the main configuration file.

Add:

set pager=1
set debug=all

to grub.cfg.

msdos-style error message

grub-setup: warn: This msdos-style partition label has no post-MBR gap; embedding will not 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.

This error may occur when you try installing GRUB in a VMware container. Read more about it here. It happens when the first partition starts just after the MBR (block 63), without the usual space of 1 MiB (2048 blocks) before the first partition. Read #Master Boot Record (MBR) specific instructions

UEFI

Common installation errors

  • If you have a problem when running grub-install with sysfs or procfs and it says you must run modprobe efivarfs or it returns an error like Could not prepare Boot variable: Read-only file system, try mounting the efivarfs. Also see the Gentoo Wiki on installing the boot loader.
  • Without --target or --directory option, grub-install cannot determine for which firmware to install. In such cases grub-install will print source_dir does not exist. Please specify --target or --directory.
  • If after running grub-install you are told your partition does not look like an EFI partition then the partition is most likely not Fat32.

Create a GRUB entry in the firmware boot manager

grub-install automatically tries to create a menu entry in the boot manager. If it does not, then see UEFI#efibootmgr for instructions to use efibootmgr to create a menu entry. However, the problem is likely to be that you have not booted your CD/USB in UEFI mode, as in UEFI#Create UEFI bootable USB from ISO.

As another example of creating a GRUB entry in the firmware boot manager, consider efibootmgr -c. This assumes that /dev/sda1 is the EFI System Partition, and is mounted at /boot/efi. Which are the default behavior of efibootmgr. It creates a new boot option, called «Linux», and puts it at the top of the boot order list. Options may be passed to modify the default behavior. The default OS Loader is EFIarchgrub.efi.

Drop to rescue shell

If GRUB loads but drops into the rescue shell with no errors, it can be due to one of these two reasons:

  • It may be because of a missing or misplaced grub.cfg. This will happen if GRUB UEFI was installed with --boot-directory and grub.cfg is missing,
  • It also happens if the boot partition, which is hardcoded into the grubx64.efi file, has changed.

GRUB UEFI not loaded

An example of a working UEFI:

# efibootmgr -v
BootCurrent: 0000
Timeout: 3 seconds
BootOrder: 0000,0001,0002
Boot0000* GRUB HD(1,800,32000,23532fbb-1bfa-4e46-851a-b494bfe9478c)File(EFIGRUBgrubx64.efi)
Boot0001* Shell HD(1,800,32000,23532fbb-1bfa-4e46-851a-b494bfe9478c)File(shellx64.efi)
Boot0002* Festplatte BIOS(2,0,00)P0: SAMSUNG HD204UI

If the screen only goes black for a second and the next boot option is tried afterwards, according to this post, moving GRUB to the partition root can help. The boot option has to be deleted and recreated afterwards. The entry for GRUB should look like this then:

Boot0000* GRUB HD(1,800,32000,23532fbb-1bfa-4e46-851a-b494bfe9478c)File(grubx64.efi)

Default/fallback boot path

Some UEFI firmwares require a bootable file at a known location before they will show UEFI NVRAM boot entries. If this is the case, grub-install will claim efibootmgr has added an entry to boot GRUB, however the entry will not show up in the VisualBIOS boot order selector. The solution is to install GRUB at the default/fallback boot path:

# grub-install --target=x86_64-efi --efi-directory=esp --removable

Alternatively you can move an already installed GRUB EFI executable to the default/fallback path:

# mv esp/EFI/grub esp/EFI/BOOT
# mv esp/EFI/BOOT/grubx64.efi esp/EFI/BOOT/BOOTX64.EFI

Invalid signature

If trying to boot Windows results in an «invalid signature» error, e.g. after reconfiguring partitions or adding additional hard drives, (re)move GRUB’s device configuration and let it reconfigure:

# mv /boot/grub/device.map /boot/grub/device.map-old
# grub-mkconfig -o /boot/grub/grub.cfg

grub-mkconfig should now mention all found boot options, including Windows. If it works, remove /boot/grub/device.map-old.

Boot freezes

If booting gets stuck without any error message after GRUB loading the kernel and the initial ramdisk, try removing the add_efi_memmap kernel parameter.

Arch not found from other OS

Some have reported that other distributions may have trouble finding Arch Linux automatically with os-prober. If this problem arises, it has been reported that detection can be improved with the presence of /etc/lsb-release. This file and updating tool is available with the package lsb-release.

Warning when installing in chroot

When installing GRUB on a LVM system in a chroot environment (e.g. during system installation), you may receive warnings like

/run/lvm/lvmetad.socket: connect failed: No such file or directory

or

WARNING: failed to connect to lvmetad: No such file or directory. Falling back to internal scanning.

This is because /run is not available inside the chroot. These warnings will not prevent the system from booting, provided that everything has been done correctly, so you may continue with the installation.

GRUB loads slowly

GRUB can take a long time to load when disk space is low. Check if you have sufficient free disk space on your /boot or / partition when you are having problems.

error: unknown filesystem

GRUB may output error: unknown filesystem and refuse to boot for a few reasons. If you are certain that all UUIDs are correct and all filesystems are valid and supported, it may be because your BIOS Boot Partition is located outside the first 2 TiB of the drive [1]. Use a partitioning tool of your choice to ensure this partition is located fully within the first 2 TiB, then reinstall and reconfigure GRUB.

This error might also be caused by an ext4 filesystem having unsupported features set:

  • large_dir — unsupported.
  • metadata_csum_seed — will be supported in GRUB 2.11 (commit).

Warning: Make sure to check GRUB support for new file system features before you enable them on your /boot file system.

grub-reboot not resetting

GRUB seems to be unable to write to root Btrfs partitions [2]. If you use grub-reboot to boot into another entry it will therefore be unable to update its on-disk environment. Either run grub-reboot from the other entry (for example when switching between various distributions) or consider a different file system. You can reset a «sticky» entry by executing grub-editenv create and setting GRUB_DEFAULT=0 in your /etc/default/grub (do not forget grub-mkconfig -o /boot/grub/grub.cfg).

Old Btrfs prevents installation

If a drive is formatted with Btrfs without creating a partition table (eg. /dev/sdx), then later has partition table written to, there are parts of the BTRFS format that persist. Most utilities and OS’s do not see this, but GRUB will refuse to install, even with —force

# grub-install: warning: Attempting to install GRUB to a disk with multiple partition labels. This is not supported yet..
# grub-install: error: filesystem `btrfs' does not support blocklists.

You can zero the drive, but the easy solution that leaves your data alone is to erase the Btrfs superblock with wipefs -o 0x10040 /dev/sdx

Windows 8/10 not found

A setting in Windows 8/10 called «Hiberboot», «Hybrid Boot» or «Fast Boot» can prevent the Windows partition from being mounted, so grub-mkconfig will not find a Windows install. Disabling Hiberboot in Windows will allow it to be added to the GRUB menu.

VirtualBox EFI mode

For VirtualBox < 6.1, install GRUB to the default/fallback boot path.

See also VirtualBox#Installation in EFI mode on VirtualBox < 6.1.

GRUB rescue and encrypted /boot

When using an encrypted /boot, and you fail to input a correct password, you will be dropped in grub-rescue prompt.

This grub-rescue prompt has limited capabilities. Use the following commands to complete the boot:

grub rescue> cryptomount <partition>
grub rescue> insmod normal
grub rescue> normal

See this blog post for a better description.

Check /etc/default/grub if GRUB_TIMEOUT is set to 0, in which case set it to a positive number: it sets the number of seconds before the default GRUB entry is loaded. Also check if GRUB_TIMEOUT_STYLE is set to hidden and set it to menu, so that the menu will be shown by default. Then regenerate the main configuration file and reboot to check if it worked.

See also

  • Wikipedia:GNU GRUB
  • Official GRUB Manual
  • Ubuntu wiki page for GRUB
  • GRUB wiki page describing steps to compile for UEFI systems
  • Wikipedia:BIOS Boot partition
  • How to configure GRUB
  • Detecting efi files and booting them from grub

IV. Advanced
даунгрейд до grub-legacy (возврат старой версии).
в случае, если ваша дружба с grub2 так и не состоялась, вы можете заменить его на старый grub (ныне известный как grub-legacy), который на текущий момент более стабилен. и привычен для многих.
для начала, конечно же, сделаем бэкап важных файлов. создайте резервную копию файлов конфигурации как описано конце I-ой главы. также желательно забэкапить папку «/boot/grub». для этого выполните

sudo cp -R /boot/grub{,.bak}теперь мы можем приступить к удалению grub2. для этого удаляем пакеты «grub-pc» и «grub2» (последний может быть не установлен):

sudo apt-get purge grub2 grub-pcзаметьте: удаление пакетов не приведет к полной очистке папки «boot/grub».
теперь установим grub версии 0.97:

sudo apt-get install grubно после установки нам необходимо создать файл menu.lst и другие файлы загрузчика. для этого нужно выполнить еще две команды:

sudo update-grubэта команда создаст файл меню загрузки. на заданные ей вопросы отвечайте «yes».

sudo grub-install /dev/sdaсоздаст остальные файлы загрузчика и запишет информацию в загрузочный раздел диска (MBR). вместо «/dev/sda» в конце укажите тот жесткий диск, который используется в качестве загрузочного (установлен загрузочным в bios)
если установка прошла успешно — перезагружаемся и видим старый добрый grub с его menu.lst и без лишних хитростей

создание аварийно-спасательного GRUB2-liveUSB
здесь мы рассмотрим, как создать загрузочную флэшку с установленным на нее grub2, через который можно будет загрузиться в случае, если grub2 на жестком диске безнадежно испорчен. есть, конечно, возможность восстановления с liveCD, но никогда не помешает дополнительная страховка на случай, если это не спасет. тем более, что потребуется для этого не так уж много.
итак, имеем флэшку. на этой самой флэшке нужно будет создать небольшой раздел для установки туда grub2. здесь подразумевается, что вы уметее создавать и форматировать разделы. если нет установите gparted, почитайте его справку и другую доступную информацию.
итак, откусим кусок свободного места и создадим небольшой раздел. 100 мб будет более чем достаточно (впрочем, хватит и 50). в качестве файловой системы выберите ext4/ext3. причина проста; reiserfs займет на 100-мегабайтном разделе 32 мб, а ext4 — всего 8. закончив с разделом, загрузитесь с liveCD.
примонтируйте свежесозданный раздел как папку «/boot/grub» запущенной live-системы. (здесь и далее будем считать, что раздел именуется «/dev/sdb1». подставляйте свое значение, если это не так)

sudo mount /dev/sdb1 /boot/grubтеперь выполним собственно процедуру установки grub2. для этого запустите

sudo grub-install /dev/sdbне забывайте, что при установке мы указываем диск (/dev/sdb в нашем примере), а не раздел! мы по сути скомандовали системе установить grub2 на саму себя, прописав grub2 в MBR указанного диска, но вместо «/boot/grub» файлы загрузчика попадут на флэшку, «что и требовалось доказать».
отмонтируем флэшку

sudo umount /boot/grubперезагружаемся.
в принципе, вышеописанных операций достаточно для того, чтобы загрузиться с флэшки в работающий grub2. однако, меню загрузки вы не увидете, а попадете сразу в консоль. если у вас нет опыта работы с консолью grub2, или вы просто хотите сделать процесс более удобным, придется совершить еще несколько действий, чтобы получить полноценный grub2 с менюшкой.
грузимся с жесткого диска, запускаем обычную систему.
монтируем раздел с grub2. по умолчанию он смонтируется автоматом в «/media», причем в качестве точки монтирования будет использован uuid раздела. отмонтируйте его через апплет или значок на рабочем столе и примонтируйте в «/mnt»:

sudo mount /dev/sdb1 /mntсоздадим папки, в которых будут храниться настройки:

sudo mkdir -p /mnt/config/{default,grub.d}скопируем туда файлы настроек

sudo cp -p /etc/grub.d/* /mnt/config/grub.d/и

sudo cp -p /etc/default/grub /mnt/config/defaultтеперь настроим наш новый grub2. если в вашем обычном grub2 вы используете фоновое изображение — отредактируйте «/mnt/config/grub.d/05_debian_theme», указав в качестве картинки имя несуществующего файла, тем самым отключив картинку на фоне. также можете поправить «/mnt/config/default/grub» — например, отключить секундомер, выставив параметр «GRUB_TIMEOUT» в «-1».
после внесения необходимых правок мы можем приступить к созданию «grub.cfg» на нашем разделе. для этого потребуется еще несколько манипуляций. нижеприведенные команды вы можете выполнить по отдельности, но я рекомендую для дальнейшего удобства сохранить эти строки в виде скрипта, поместив файл, например, в «/mnt/config/grub-usb-update» и установив ему права 755.

sudo mount --bind /mnt/config/default/grub /etc/default/grub
sudo mount --bind /mnt/config/grub.d /etc/grub.d
sudo grub-mkconfig -o /mnt/grub.cfg
sudo umount /etc/default/grub
sudo umount /etc/grub.d
что мы только что сделали? примонтировали файлы конфигурации grub2 в качестве «родных» настроек основной системы. и исходя из них создали grub.cfg, поместив его на флэшку. команда «grub-mkconfig» идентична привычному «update-grub» (на самом деле, «update-grub» лишь запускает «grub-mkconfig», указав, куда сохранить файл), с помощью ключа «-o» мы указали, куда поместить результат трудов команды. после чего мы отмонтируем наши файлы с настройками, возвращая родные файлы на законное место.
если вы последовали совету выше и сохранили скрипт, достаточно будет его запустить одной командой:

/mnt/config/grub-usb-updateтеперь когда вы решите обновить grub2 на флэшке (например, после обновления ядра), достаточно будет примонтровать раздел в «/mnt», выполнить скрипт и отмонтировать флэшку обратно.
ну а сейчас отмонтируем флэшку

sudo umount /mntи перезагружаемся. грузимся с флэшки и видим меню загрузки со всеми нашими системами. радуемся.

загрузка другого grub2 из текущего.
как выяснилось в ходе экспериментов, все весьма просто. загружаемся в grub2, переходим в консоль нажатием «c». загрузка другого grub2 происходит по методу «set root — chainloader — boot». для начала определимся с диском, в MBR которого прописан grub2, который мы собираемся загрузить. выполните команду

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

set root=(hd1)или же

root (hd1)во втором случае видим сообщение, что файловая система незивестна. это нормально.
передаем управление по цепочке

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

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

консоль grub2 — команды и хитрости.
здесь мы рассмотрим некоторые команды консоли grub2. все мы разбирать не будем, а изучим лишь самые необходимые и полезные. напомню, чтобы попасть в консоль, нужно нажать «c» во время отображения меню загрузки. итак, начнем!

  • ls

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

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

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

  • cat

данная команда аналогична своей тезке в linux — она выводит содержимое заданного файла. используется в формате

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

  • linux

загружает указанное linux-ядро. аналог команды «kernel» в grub-legacy. используется в формате

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

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

  • initrd

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

initrd /boot/initrd.img-2.6.32-020632-genericобратите внимание: версия initrd должна соответствовать версии загружаемого ядра!

  • chainloader

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

chainloader /путь/имя_файлаоднако, для NTLDR (загрузчика Windows) можно использовать

chainloader +1

  • boot

производит загрузку указанного ядра (заданного с «linux» и «initrd») или же другого загрузчика (заданного через «chainloader»). используется без параметров

  • root

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

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

  • set

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

set переменная=значениенаиболее необходимое ее применение — для задания root-раздела. для этого изменяется переменная «root», в качестве значения задается необходимый раздел, например:

set root=(hd0,5)(именно такая технология используется в «grub.cfg»)
также с ее помощью можно, например, «на лету» изменить цвет текста в меню и консоли, что позволяет опробовать цветовую схему перед установкой ее в качестве основной. для этого изменяем переменные «color_normal» и «color_highlight» для обычного пункта (и текста в консоли) и выделенного пункта соответсвенно. например, попробуем такой вариант:

set color_normal=magenta/green
set color_highlight=light-blue/black
(подробнее о цветах читайте в главе II, раздел «настройка цвета пунктов меню»)

  • search

пожалуй, одна из самых полезных команд. потомок «find» и «uuid» из grub-legacy. служит для поиска раздела по UUID, метке или заданному файлу.
имеет следующие ключи:
-u (или —fs-uuid) — поиск раздела по UUID
-l (или —label) — поиск по метке раздела
-f (или —file) — поиск по указанному файлу
-n (или —no-floppy) — не проверять флоппи-дисковод (чтоб не трещал)
-s (или —set) — установить найденный раздел в качестве значения заданной переменной.
зачем это нужно? дело в том, что при подключении/отключении жестких дисков (и в некоторых других случаях) нумерацию дисков и разделов может «поехать», и тогда наша команда «set root=(hd0,5)» в «grub.cfg» будет вести или в никуда или на раздел не того диска. поэтому в «grub.cfg» вы найдете строчку с «search».
для поиска раздела с известным нам uuid запустим «search» с ключом -«u»:

search -u uuid_нужного_разделакоманда сообщит нам, какой раздел соответствует заданному UUID.
однако, UUID длинный, и хотя его и можно узнать, вводить вручную такое количество символов проблематично, и существует большой шанс сделать ошибку. вместо этого мы воспользуемя поиском по файлу, который точно имеется на нужном разделе. допустим, мы ищем раздел boot-раздел нашей системы. найдем его по файлу «grub.cfg»:

search -f /grub/grub.cfgобратите внимание, что при использовании такого способа указанный файл должен иметься только на одном разделе!
получив искомое, можно вручную задать нужный раздел в качестве root-раздела, но гораздо проще воспользоваться ключом «-s». если после него не указана переменная, будет использована «root», то есть найденный раздел как раз и будет задан в качестве корневого. допустим, раздел с Windows имеет метку «C_drive». установим его в качестве корневого для загрузки с него:

search -l C_drive -s

  • lsfonts

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

  • help

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

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

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

  • halt

выключит компьютер (в теории) или введет его в ступор (у меня  ;)).

  • reboot

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

  • background_image

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

background_image /путь/имя_файладает замечательную возможность посмотреть на выбранную картинку в действии, избегая лишних перезагрузок. в сочетнии с заменой цветов через «set» позволит довольно быстро подобрать подходящий вариант оформления.
при использовании без параметров сбросит текущее фоновое изображение. однако, заданные цвета останутся, так что если у вас черный цвет текста — на черном фоне вы его не увидите.
примечание: данная команда не заменит ваши настройки оформления, фон будет изменен лишь на текущий сеанс

  • vbeinfo

выедет список поддерживаемых видеорежимов. этой командой полезно будет воспользоваться перед настройкой разрешения в «/etc/default/grub»

  • configfile

потомок одноименной команды в grub-legacy. позвоялет загрузить другой файл конфигурации с другим меню вместо текущего «grub.cfg». создав новый файл, вы можете сделать другое меню с другими настройками, оформлением и пунктами, не захламаляя основное меню. используется так:

configfile /путь/другой_файл_менюсоздание и использование новых меню позже будет рассмотрено отдельно.

  • terminal_output.console

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

menuentry "black&white mode"{
terminal_output.console
}

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

  • уже упомянутое автодополнение команд (как в bash) по нажатию tab. tab в пустой строке выведет полный список доступных команд
  • это самое автодополнение имеет нетривиальный способ изспользования. если вы не помните, какой раздел вам нужен, напишите «root (hd0,» (или «root (hd1.» и далее по списку) и нажмите tab. будет выведен список разделов заданного диска с указанием файловых систем, UUID и времени последнего изменения.
  • имя раздела вида «(hd*,*)» можно использовать в начале пути к файлу, например, вот так:

cat (hd0,6)/home/username/папка/файлеще один полезный пример

ls (hd0,3)/позволяет просмотреть содержимое заданного раздела без переключения root.

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

sudo cp /boot/grub/{grub,custom}.cfgпоскольку файл скопируется с правами 444, выставим ему права на запись:

sudo chmod 744 /boot/grub/custom.cfgтеперь открываем его в любимом текстовом редакторе и начинаем ковырять. если вы в достаточной мере знаете структуру «grub.cfg» и понимаете, какие строки что делают, можно значительно сократить свой файл, вырезав лишнее, и привести его к более удобочитаемому виду. однако же, можно и не трогать руками все подряд, а изменить лишь интересующие параметры, что мы и проделаем.
для начала найдем строку «set default=….» (у меня это 13-я строка). здесь можно задать пункт меню по умолчанию, указав или его номер или точное название. далее отыщем строку «set gfxmode….» (24-я в моем случае). здесь задается разрешение экрана в привычном формате WxH. можно также указать глубину цвета, например «1024x768x32». можно указать несколько вариантов, при этом если первый не сможет быть установлен, будет загружен второй, если и он не сработает — третий и т.д. варианты перечисляются через запятую и без пробелов:

set gfxmode=1024x768x32,1024x768x24,1024x768теперь зададим время отображения меню. для этого ищем строку «set timeout», но именно ту, которая идет после «else» (36). здесь и задается задержка в секундах. установите -1 для отключения таймера.
настроим оформление нашего меню. для задания фонового изображения найдем строку с «if background_image…..» (45). (здесь подразумевается, что в вашем grub.cfg используется фоновое изображение. если нет — смотрите пример файла в конце этого раздела). после команды background_image прописан путь к файлу картинки. поменяйте его на нужный файл. (обратите внимание, что разрешение картинки должно соответствовать заданному выше разрешению экрана!).
строкой ниже мы можем задать цвета текста. правятся они точно так же, как и в «/etc/grub.d/05_debian_theme» (подробнее о цветах читайте в главе II, раздел «настройка цвета пунктов меню»). еще можно проделать один интересный трюк: уберите строки с «set color_highlight» и «else». теперь настройка будет такой:

color_normal

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

menu_color_normal

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

menu_color_higlight

задает цвет/фон выделенного пункта меню.
закончив с настройкой, перейдем собственно к пунктам. ниже идут пункты из вашего «grub.cfg». измените их, удалите ненужные и добавьте новые, пересортируйте на свой вкус. ниже будет приведен пример с немного отредактированными тремя пунктами загрузки.
настроив свой файл, сохраните его. теперь нам нужно добавить возможность загрузить его вместо «grub.cfg». для этого в последний нужно будет добавить еще один пункт, что мы сделаем через «/etc/grub.d/40_custom». для смены файла конфигурации в grub2 используется команда «configfile». ей мы и воспользуемся, добавив в «40_custom» запись такого вида:

menuentry "my very custom menu"{
configfile /boot/grub/custom.cfg
}
если ваш путь к файлу отличается — исправьте его. если вы используете отдельный boot-раздел, путь будет таким: «/grub/custom.cfg». также учтите, что «40_custom» должен заканчиваться пустой строкой!
если вы хотите, чтобы ваше новое меню загружалось вместо стандартного «grub.cfg», установите новый пункт в качестве пункта по умолчанию. также можете установить таймаут для «grub.cfg» в 0 (в «/etc/default/grub»), но перед этим рекомендую протестировать свежеиспеченное меню на работоспособность.
обновите свой «grub.cfg» выполнив

sudo update-grubтеперь пункт перехода в новое меню появится в обычном. для того чтобы выйти обратно в первое меню, достаточно нажать escape.
вот, в принципе, и вся премудрость. таких файлов можете насоздавать себе хоть десять штук, тут уж зависит от потребностей. ниже я приведу в качестве образца то, что получилось у меня (файл сильно урезан до необходимого минимума):

MBR — бэкап, восстановление и загрузка через образ.
для тех, кто не знает, поясню: MBR — фрагмент первого сектора жесктого диска, в котором прописан код, запускающий загрузчик. при загрузке с диска оттуда считывается информация о том, как запустить загрузчик. grub2 прописывает свой код в MBR при установке (и это же мы делаем, выполняя «grub-install … /dev/sda»).
на случай повреждения MBR (причины бывают разными) и для возможности быстрого восстановления работоспособности grub2 полезно будет иметь резервную копию MBR жесткого диска. чтобы создать ее, сначала нужно определиться, с какого из жестких дисков производится загрузка (можно посмотреть с помощью «sudo fdisk -l»). после этого скопируем первый сектор (первые 512 байт) диска в файл с помощью команды dd:

sudo dd if=/dev/sda of=mbr.bin bs=512 count=1если ваш загрузочный диск — не sda, поменяйте значение на свое. (на самом деле, код загрузчика занимает первые 446 байт, а дальше записана таблица разделов, но для загрузки нашего образа он должен быть не меньше 512 байт).
наш образ готов! данные сохранена в файл «mbr.bin» в вашей домашней директории.
используя полученный образ можно загрузить основной grub2 из-под другого при поврежденном MBR диска. если у вас есть другая установленная linux-система с grub2 на другом жестком диске или загрузочная флэшка с grub2 (создание таковой описано выше) — можете попробовать на практике нижеприведенный совет.
итак, в моем примере я загружаюсь со своей спасительной флэшки с grub2, на которую я предварительно закинул образ MBR своего жесткого диска.
загрузившись в gurb2, выходим в консоль (нажав «c»). указываем в качестве корневого раздела тот жесткий диск, на котором по сценарию попорчен MBR, и с которого мы хотим запустить grub2. можно указать сам диск или любой из его разделов, например так:

set root=(hd1)проверим результат командой

rootесли все верно — загружаем наш образ с помощью chainloader. здесь нужно указать полный путь, начиная с раздела, на котором лежит наш файл. флэшка, с которой я загружен именуется (hd0), так что команда будет выглядеть так:

chainloader (hd0,1)/mbr.binесли все тихо — даем команду на запуск:

bootи наслаждаемся родным grub2.
примечание: в MBR (и, соответственно, в полученном образе) нет четкого указания жесткого диска, поэтому через наш образ загрузится grub2 с того раздела, который был указан в качестве корневого (root) в консоли grub2.
загрузив родную систему, мы можем восстановить ид-под нее MBR диска. но если лишнего grub2 у вас под рукой нет, действовать мы будем с livecd.
грузимся с livecd любой linux-системы (в данном случае поддержка grub2 роли не играет). для восстановления MBR нам нужно будет «раскатать» ранее созданный образ обратно в первый сектор диска. но для начала проверим таблицу разделов, ведь вполне возможно, что grub2 не грузился и из-за нее. для этого выполните

sudo fdisk -lесли fdisk видит разделы — таблицу разделов трогать не будем, а восстановим только код загрузчика. в этом случае нам нужно перезаписать лишь первые 446 байт. если же «убита» и таблица разделов — все 512. определившись, что именно мы делаем, копируем нужное количество байт из образа в первый сектор диска. в примере ниже таблица разделов в порядке, восстанавливаем только grub2:

sudo dd if=/mnt/mbr.bin of=/dev/sda bs=446 count=1если нужно восстановить и таблицу разделов — укажите 512 вместо 446. в качестве значения if пропишите путь к файлу образа, в of — тот диск, загрузочный сектор которого мы восстанавливаем. если все прошло успешно — перезагружаемся, грузимся с починенного диска и радуемся.
еще одна полезная возможность — полученный образ можно использовать для загрузки grub2 через NTLDR (в случае, если grub2 не загружает нормально Windows, и вы хотите сделать NTLDR основным загрузчиком). но об этом как-нибудь позже.


продолжение — в 10-м посте

It looks like you’ve followed an old guide that expects Windows to use MBR partitioning.

The «invalid signature» error suggests Secure Boot is enabled. When Secure Boot is enabled, all bootloaders must be signed with a private key, and a matching public key must be included in the Secure Boot variables in the firmware NVRAM. GRUB is dutifully reading the first sector of the partition you’ve specified, but since it does not contain the appropriate Secure Boot signature, the firmware refuses to execute it.

Secure Boot requires native UEFI-style boot as a prerequisite. You may be able to disable Secure Boot on your system, but since GRUB already starts for you, there is probably no need to do that.

Your insmod part_gpt suggest you expect the disk to have a GPT-style partitioning which usually goes together with UEFI boot style, but on the other hand, set root=(hd0,msdos2) expects a MBR partition.

On my Debian system with GPT partitioning, the set root line reads: set root='hd0,gpt1'. If your system uses GPT partitioning, use the gptN partition identifiers instead of msdosN.

Also chainloader +1 tells GRUB to read the boot block from the first block of the partition; in UEFI native boot, there is no such thing. To boot Windows in UEFI mode, the set root line should point to the EFI System Partition that contains the Windows bootloader, and the chainloader line should be chainloader /EFI/Microsoft/Boot/bootmgfw.efi.

It looks like you’ve followed an old guide that expects Windows to use MBR partitioning.

The «invalid signature» error suggests Secure Boot is enabled. When Secure Boot is enabled, all bootloaders must be signed with a private key, and a matching public key must be included in the Secure Boot variables in the firmware NVRAM. GRUB is dutifully reading the first sector of the partition you’ve specified, but since it does not contain the appropriate Secure Boot signature, the firmware refuses to execute it.

Secure Boot requires native UEFI-style boot as a prerequisite. You may be able to disable Secure Boot on your system, but since GRUB already starts for you, there is probably no need to do that.

Your insmod part_gpt suggest you expect the disk to have a GPT-style partitioning which usually goes together with UEFI boot style, but on the other hand, set root=(hd0,msdos2) expects a MBR partition.

On my Debian system with GPT partitioning, the set root line reads: set root='hd0,gpt1'. If your system uses GPT partitioning, use the gptN partition identifiers instead of msdosN.

Also chainloader +1 tells GRUB to read the boot block from the first block of the partition; in UEFI native boot, there is no such thing. To boot Windows in UEFI mode, the set root line should point to the EFI System Partition that contains the Windows bootloader, and the chainloader line should be chainloader /EFI/Microsoft/Boot/bootmgfw.efi.

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

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

И об этом нас предупреждают не просто так. Ведь «grub.cfg» генерируется автоматически с использованием нескольких скриптов, поэтому после следующего обновления grub2 ваш «grub.cfg» будет создан заново, и все ваши правки будут утрачены, но это мы подробнее рассмотрим чуть ниже. Перейдем к основным файлам конфигурации grub2. Как и упомянуто выше, главным файлом, собственно, отвечающим за загрузочное меню, является «/boot/grub/grub.cfg»; кроме него имеются файл «/etc/default/grub» и директория «/etc/grub.d». Рассмотрим их подробнее.

Содержание

  • Файлы GRUB2
    • /etc/default/grub
      • Что делать, если файла /etc/default/grub нет
      • Изменение стандартного пункта загрузки
        • Пример
      • Изменение времени отображения меню
      • «Скрытое» меню
      • Изменение стандартных параметров загрузки ядра
        • Пример
      • Остальные настройки файла /etc/default/grub
    • /etc/grub.d
        • Пример
    • Применение изменений
    • Нюанс с нумерацией дисков и разделов
    • Резервная копия
  • Оформление
    • Установка фонового изображения
      • Способ №2:
    • Настройка цвета пунктов меню
        • Пример
  • Восстановление GRUB2
    • Восстановление GRUB2 с LiveCD
    • Восстановление GRUB2 с LiveCD. способ 2 (без chroot)
    • Восстановление GRUB2 с LiveCD. способ 3 (совсем простой)
    • Копирование рабочего GRUB 2 в нужный раздел
    • Загрузка системы при частичной неработоспособности GRUB2
    • Совет
    • Загрузка Windows систем
  • Advanced
    • Cоздание аварийно-спасательного GRUB2-liveUSB
    • Консоль grub2 — команды и хитрости
      • ls
      • cat
      • linux
      • initrd
      • chainloader
      • boot
      • root
      • set
      • search
      • lsfonts
      • help
      • halt
      • reboot
      • background_image
      • vbeinfo
      • configfile
      • terminal_output.console
    • Премудрости  ;)
    • Загрузка другого grub2 из текущего
    • Создание дополнительных меню загрузки
        • Пример файла «custom.cfg»
    • MBR — бэкап, восстановление и загрузка через образ
    • Создание LiveCD с GRUB2
        • Пример файла «grub.cfg»
    • Создание LiveCD с GRUB2 на базе имеющегося дистрибутива
    • Добавление в меню пункта загрузки с CD/DVD & USB
      • Способ 1. Загрузка с CD & USB посредством Plop Boot Manager
      • Способ 2. Загрузка с CD посредством Smart Boot Manager

/etc/default/grub

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

GRUB_DEFAULT=6
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT="2"
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entrys
#GRUB_DISABLE_LINUX_RECOVERY="true"

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

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

Начинающие пользователи внимательно читают этот замечательный учебник, и пытаются следовать описанным здесь сведениям. Однако тут же натыкаются на грабли: файла /etc/default/grub нет. 1) У вас версия Grub1 2) Проверить, есть ли файл /etc/sysconfig/grub2. Править его аналогичным образом. В этом разделе будет написано, почему этого файла нет и как настраивать загрузчик в этом случае.

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

По умолчанию стандартный пункт (выделенный при показе меню) — верхний в списке. После установки Ubuntu она окажется наверху, а Windows, например, будет последним пунктом. После обновления ядра первым пунктом списка становится загрузка с новым ядром. это происходит потому, что именно первый пункт загрузки является стандартным по умолчанию. За это, собственно, отвечает параметр «GRUB_DEFAULT». Значением его является номер пункта в меню загрузки, который должен быть выбран стандартным, причем нумерация начинается с нуля. Значение по умолчанию — 0, поэтому и выбирается первый пункт. Для того, чтобы выбрать другой пункт, нам нужно узнать, каким по счету он будет в списке. Тут есть два варианта: просмотреть содержимое «/boot/grub/grub.cfg» и сосчитать, какой по счету окажется нужная запись, или же перезагрузиться и более наглядно посмотреть то же самое в меню загрузки (перед этим побегайте стрелочками по меню, чтобы остановить таймер). Второй вариант отличается более наглядным представлением, что проще для неопытного пользователя. В обоих случаях не забывайте о порядке нумерации — 0, 1, 2, 3 и так далее, то есть пятому сверху пункту будет соответствовать значение 4, второму — 1, первому — 0. В вышеприведенном примере установлено значение 6, то есть стандартным задан седьмой пункт меню. Кроме задания конкретного пункта есть еще другие интересные варианты. Например, если в качестве значения указать «saved»(без кавычек) и добавить строку GRUB_SAVEDEFAULT=true — тогда при загрузке будет выбран тот пункт, который был загружен в прошлый раз. Или же можно указать точное название пункта. В данном случае оно должно быть именно таким, каким мы его видим в «/boot/grub/grub.cfg». При этом значение должно указываться в кавычках. Данный способ удобен тем, что после обновления ядра не придется изменять настройки из-за сбившейся нумерации.

Пример

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

menuentry "Ubuntu, Linux 2.6.32-020632rc6-generic" {
        recordfail=1
....
}

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

GRUB_DEFAULT="Ubuntu, Linux 2.6.32-020632rc6-generic"

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

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

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

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

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

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

Пример

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

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

на

GRUB_CMDLINE_LINUX_DEFAULT=""

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

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

GRUB_CMDLINE_LINUX=""

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

GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`

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

GRUB_TERMINAL=console

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

GRUB_DISABLE_LINUX_UUID=true

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

GRUB_GFXMODE=640x480

— этот пункт отвечает за разрешение графического меню GRUB2. Данный параметр предоставляет разрешение, которое поддерживается видеокартой пользователя (например: 640×480, 800×600, 1024×768, 1600×1200 — для соотношения сторон 4:3. И 640×400, 800×500, 1024×640, 1280×800, 1680×1050 — для широкоформатных мониторов с соотношением сторон 16:10). Настройки применимы только для меню загрузки. Так же у нас есть возможность увидеть все доступные разрешения для экрана из меню GRUB2. Для этого, находясь в меню, жмем «с», затем в строке grub> пишем vbeinfo.

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

Несколько советов: — Настройка одинакового разрешения в меню GRUB2 и вашей операционной системы, позволит немного уменьшить время загрузки. — В качестве дополнительной опции пользователь может задать битность изображения, просто добавив необходимые данные в настройку разрешения. Например так: 1280x1024x24 или 640x480x32. — Пользователь может добавить одновременно несколько разрешений. Как это работает? А вот так, если GRUB2 не может использовать первое заданное разрешение, тогда он будет пробовать следующее и т.д. Перечень разрешений необходимо разделять запятыми. Пример: 1280x1024x16,800x600x24,640×480. — Если используется строка GRUB_GFXMODE= и при выполнении команды sudo update-grub вам выдается сообщение not found, просто попробуйте или добавить или изменить битность изображения.

GRUB_DISABLE_LINUX_RECOVERY=true

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

GRUB_DISABLE_OS_PROBER="true"

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

/etc/grub.d

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

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

Пример

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

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

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

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

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

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

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

sudo update-grub

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

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

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

В grub2 имеется еще одно важное отличие от старого grub. Связано оно с нумерацией жестких дисков и их разделов. В grub нумерация физических дисков и нумерация разделов начинались одинаково — с нуля. Первый физический диск (sda в системе) обозначался «hd0», второй (sdb) — «hd1», и так далее. Это же осталось и в grub2. нумерация же разделов диска изменилась. Если в grub первый раздел первого диска (sda1) именовался «hd0,0», четвертый (sda4) — «hd0,3», то теперь, в grub2, цифра раздела соответствует цифре раздела в системе. То есть, sda1 теперь будет «hd0,1» (а не «hd0,0»), sdb4 — «hd1,4». Проще говоря, нумерация дисков идет с нуля, а нумерация разделов — с единицы!

Резервная копия

Перед каким-либо редактированием обязательно сделайте бэкап файлов конфигурации. например, выполнив последовательно эти строки:

datev=$(date +%Y_%m_%d)
mkdir -p ~/.grub.bak/$datev
cd ~/.grub.bak/$datev
mkdir -p boot/grub etc/default
cp /boot/grub/grub.cfg boot/grub
cp -Rp /etc/grub.d etc
cp /etc/default/grub etc/default

(можно сохранить данный скрипт в /usr/bin, назвать, к примеру, «grub-backup» и дать права 755. Теперь для резервного копирования grub2 достаточно будет выполнить команду «grub-backup»)

Оформление

Установка фонового изображения

Вы можете выбрать и установить полноцветное изображение в качестве фона в меню загрузки grub2. Размер изображения должен соответствовать разрешению grub2 (по умолчанию — 640×480, задается в «/etc/default/grub»), формат файла — png или tga. Вы можете установить готовый набор из нескольких подходящих для grub2 изображений, выполнив команду

sudo apt-get install grub2-splashimages

(не путайте пакет grub2-splashimages с пакетом grub-splashimages, который не совместим с grub2!). Эти изображения будут помещены в каталог «/usr/share/images/grub», который нужно будет добавить в файл конфигурации (см. ниже). Фоновое изображение задается в файле «/etc/grub.d/05_debian_theme». Найдите в нем строку такого вида:

for i in {/boot/grub,/usr/share/images/desktop-base}/moreblue-orbit-grub.{png,tga} ; do

Те, кто более-менее знаком с bash, узнают прием с перечислением в фигурных скобках. Для остальных: все не так сложно, как может показаться. В первых фигурных скобках (в нашем примере — «{/boot/grub,/usr/share/images/desktop-base}») перечислены каталоги, в которых grub2 будет искать подходящие для установки изображения. Далее (после слэша) указано имя файла изображения (без расширения!), которое мы хотим установить в качестве фона (здесь — «moreblue-orbit-grub»). Вторые фигурные скобки («{png,tga}») определяют расширения файлов, которые grub2 будет пытаться использовать в качестве фона. Заметьте, что пункты в фигурных скобках перечисляются через запятую и не разделяются пробелами! По умолчанию изображения ищутся в каталогах «/boot/grub» и «/usr/share/images/desktop-base». Изображения из пакета grub2-splashimages у нас распаковались в «/usr/share/images/grub», поэтому мы должны добавить этот каталог в список мест, где grub2 будет искать изображения. Добавим еще один пункт в первые фигурные скобки. Сразу же определимся с выбором картинки. Я выбрал последнюю, переименовав файл для удобства в «winter.tga». Заменим имя («moreblue-orbit-grub») на имя выбранной картинки (в моем случае — «winter»). В итоге получим такую строку:

for i in {/boot/grub,/usr/share/images/desktop-base,/usr/share/images/grub}/winter.{png,tga} ; do

Заметьте, что между именем файла и вторыми фигурными скобками должна стоять точка! Как это работает: grub2 последовательно просматривает заданные каталоги и ищет в них файл с заданным именем и одним из перечисленных расширений. Цикл прекращается как только найдено первое подходящее изображение. Таким образом, файл с подходящим именем присутствует в нескольких каталогах, будет взят файл из того каталога, который указан раньше других в списке. Аналогично, если изображение представлено в разных форматах (например, «image.png» и «image.tga») — выбран будет файл с тем расширением, которое первым указано во вторых фигурных скобках. Интересности: вы можете добавить любой каталог с изображениями, владельцем которой вы являетесь. Это упростит добавление/изменение изображений. Однако, заметьте: при этом root должен иметь как минимум права r-x на этот каталог. Также не стоит добавлять каталоги с шифрованного home-раздела, т.к. на момент загрузки он еще не примонтирован. Лучше просто сделайте себя владельцем каталога «/usr/share/images/grub» и храните все картинки там. Помимо PNG и TGA поддерживается также формат JPEG. Но на текущий момент реализована только поддержка jpeg с 8-битным цветом. Поэтому используйте jpeg-файлы только если вы понимаете, что такое глубина цвета и как сохранить изображение в 8-битном цвете. Для того, чтобы добавить поддержку jpeg-файлов, приведите вторые фигурные скобки к такому виду: «{png,tga,jpg,jpeg}».

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

WALLPAPER="/usr/share/images/desktop-base/moreblue-orbit-grub.png"

указать в кавычках путь к файлу с одним из перечисленных выше расширений (.png,.tga,.jpg) и разрешением 640×480. После чего обновить конфигурацию:

sudo update-grub

Способ №2:

В файле /etc/default/grub определить константу GRUB_BACKGROUND и передать ей путь к файлу с картинкой.

Настройка цвета пунктов меню

Цвета пунктов меню также задаются в файле «/etc/grub.d/05_debian_theme». В самом начале файла нужно всего-навсего изменить значения переменных:

COLOR_NORMAL=
COLOR_HIGHLIGHT=

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

black - черный; blue - синий; brown - коричневый; cyan - голубой; dark-gray - темно-серый; green - зеленый; light-cyan - светло-голубой; light-blue - светло-синий; light-green - ярко-зеленый; light-gray - серый; light-magenta - розовый; light-red - светло-красный; magenta - пурпурный; red - красный; white - белый; yellow - желтый.

Заметьте, что black (черный) при использовании в качестве второго параметра (т.е. цвета фона) в результате даст прозрачный фон, без какой-либо заливки, текст прямо поверх картинки. Использование black в качестве цвета текста дает черный текст.

Пример
 COLOR_NORMAL=black/black
 COLOR_HIGHLIGHT=black/light-gray

В моем случае заданы следующие параметры: обычный пункт — черный текст, прозрачный фон; выделенный пункт — черный текст, серая подсветка строки.

Восстановление GRUB2

После, например, установки Windows, вы можете столкнуться с тем, что при загрузке будет отображаться только меню загрузки Windows, а меню grub2 вы не увидите вовсе, что приведет к невозможности загрузить что-либо кроме Windows. Такое происходит из-за того, что Windows при установке затирает загрузочную область жесткого диска (так назывемый MBR-раздел), удаляя оттуда код загрузчика grub2. Для восстановления grub2 вам понадобится liveCD Ubuntu 10.04 или любой другой современной системы, включающей grub2 в свой дистрибутив.

Восстановление GRUB2 с LiveCD

Загрузитесь с вашего LiveCD (предварительно выберите меню устройств загрузки при наличии такового или же установите cd-привод первым boot device в BIOS). Запустите консоль. Для начала нам нужно будет узнать, на каком диске и на каком разделе установлена Ubuntu. Если вы не помните этого — воспользуйтесь командой

sudo fdisk -l

Для работы нам понадобится /-раздел (root). Примонтируйте его командой

sudo mount /dev/sda5 /mnt

В моем случае корневой раздел системы — /dev/sda5, вы же используйте свое значение. Если у вас /boot сделан отдельным разделом, его также надо будет примонтировать. Я не использую отдельный boot-раздел, но предположим, что sda3 выделен под /boot. Монтируем его:

sudo mount /dev/sda3 /mnt/boot

Также монтируем каталог /dev нашей live-системы как /dev нашего root-раздела:

sudo mount --bind /dev /mnt/dev

и /proc live-системы как /proc root-раздела:

sudo mount --bind /proc /mnt/proc

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

sudo chroot /mnt

Теперь вы — root-пользователь в системе, корневым разделом которой считается /mnt, то есть корневой раздел вашей настоящей системы. И вот мы готовы обновить MBR-раздел жесткого диска, переустановив grub2. Но для начала нам нужно определиться, с какого физического диска загружается наш компьютер. Если у вас один жесткий диск, разбитый на разделы — он будет именоваться sda. Если несколько — первый из них — sda, второй — sdb, и так далее. Определить загрузочный диск снова поможет команда

sudo fdisk -l

В полученной таблице есть столбец «загрузочный». В моем случае напротив раздела sda1 стоит звездочка, означающая, что у меня загрузочным является первый жесткий диск, то есть sda. Определившись с загрузочным диском, ставим на него grub2:

grub-install /dev/sda

Если вы столкнетесь с какими-либо ошибками — попробуйте перезапустить команду с ключом —recheck:

grub-install --recheck /dev/sda

Также в некоторых случаях может помочь вариант

grub-install --recheck --no-floppy /dev/sda

Обратите внимание: мы устанавливаем grub2 на физический диск (sda, sdb…) т.е. в mbr, а не на раздел (sda3, sdb1…)! Если все прошло успешно, выходим из chroot командой

exit

Отмонтируем наши диски и каталоги: /dev нашей live-системы:

sudo umount /mnt/dev

/proc:

sudo umount /mnt/proc

boot-раздел, если таковой монтировался отдельно:

sudo umount /mnt/boot

И собственно, корневой раздел:

sudo umount /mnt

Все! Перезагружаемся, восстанавливаем порядок загрузки в BIOS (ставим жесткий диск на первое место) и смотрим результат.

Восстановление GRUB2 с LiveCD. способ 2 (без chroot)

Нам опять же понадобится LiveCD Ubuntu 9.10 или другой системы с поддержкой grub2. В отличие от предыдущего способа, мы не будем запускать установщик через chroot, что позволит сократить количество требуемых действий. Итак, загружаемся с выбранного LiveCD, запускаем консоль. Вместо использования chroot мы воспользуемся ключом «—root-directory». Но для начала убедимся, что данная опция поддерживается нашей live-системой. Если вы работаете с Ubuntu 9.10 Desktop, можно не волноваться. В ином случае выполните

man grub-install

Если в описании опций присутствует вышеупомянутый ключ «—root-directory» — все в порядке. Теперь нам нужно примонтировать корневой раздел системы. Если вы не помните, на каком разделе стоит система, вам поможет

sudo fdisk -l

или же можно глянуть

sudo blkid

Разница лишь в форме вывода информации. Определившись с корневым разделом, монтируем его. Пусть в нашем примере это будет sda5:

sudo mount /dev/sda5 /mnt

Если у вас выделен отдельный boot-раздел, примонтируйте и его. Допустим это sda2

sudo mount /dev/sda2 /mnt/boot

Теперь переходим собственно к установке grub2. Ключ «—root-directory» позволяет указать, что использовать в качестве корневой директории. Нам нужен корневой раздел нашей системы, который примонтирован в /mnt. Поэтому выполняем:

sudo grub-install --root-directory=/mnt /dev/sda

Как и в предыдущем способе, grub2 устанавливается на физический диск, а не на раздел! В качестве диска нужно указать тот диск, который установлен загрузочным в bios. Если все пройдет успешно, установщик выведет сообщение об успешном завершении и список обнаруженных разделов, которые были добавлены в «device.map». Если все это есть — отмонтируем диски и перезагружаемся. Если будет выведен неполный список разделов — отредактируйте файл «device.map» в корневом каталоге установленной системы (в описанном примере — «/mnt/boot/grub/device.map») поправляем его, добавив остальные диски и скорректировав нумерацию. Файл должен иметь вид

(hd0) /dev/sda
(hd1) /dev/sdb

При необходимости повторяем операции для всех жестких дисков. Сохраняем файл и повторно выполняем команду grub-install, как описано выше. Теперь должен отобразиться правильный список дисков. Отмонтируем диски и перезагружаемся.

Восстановление GRUB2 с LiveCD. способ 3 (совсем простой)

В случае, если нужно только восстановить MBR диска (например, после (пере)установки Windows), все можно сделать еще проще, вообще ничего не монтируя. Грузимся с LiveCD. Определяем нужный жесткий диск с помощью «sudo fdisk -l». Если он единственный — значит, sda. Вводим команду

sudo grub-install --root-directory=/tmp /dev/sda

изменив /dev/sda на нужный диск. Можно снова грузиться с этого диска.

Копирование рабочего GRUB 2 в нужный раздел

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

grub-setup -d /.../boot/grub /dev/sdX

от имени root, например:

sudo grub-setup -d /.../boot/grub /dev/sdX

Где:

  • /…/boot/grub — полный путь до файлов GRUB 2, которые необходимо использовать,
  • /dev/sdX — основной раздел диска в главную загрузочную запись (MBR) которого необходимо установить GRUB 2, а X — буква основного раздела диска, её нужно заменить на необходимую, уточнить которую можно например, выполнив в терминале:
sudo fdisk -l

После чего выполнить непосредственно инсталляцию GRUB 2 на выбранный ранее раздел командой терминала update-grub, например:

sudo update-grub

При этом программа инсталляции найдет и установит соответствующие пункты загрузки всех совместимых со спецификациями Multiboot операционных систем и, вероятно, загрузчиков других операционных систем (например Windows, OS/2 и т.п.).

Загрузка системы при частичной неработоспособности GRUB2

В некоторых случаях может оказаться так, что отдельнные файлы grub2 будут повреждены (например, в результате сбоя при выполнении «update-grub»). Однако, иногда есть шанс загрузиться в свою систему и восстановить grub2 из нее без необходимости полной переустановки оного. Если при загрузке grub2 вы видите сообщения об ошибках — не спешите предаваться панике. Все может быть еще вполне поправимо. На данный момент наша главная цель — попасть в консоль grub2. Вы можете сразу увидеть ее на экране, или же будет предложено что-либо нажать или выбрать для запуска консоли. В любом случае, если вам удалось запустить консоль — радуйтесь, шансы на спасение увеличены! Консоль grub2 похожа на более привычную оболочку bash. Здесь также поддерживается автодополнение команд по нажатию tab. Если же нажать tab в пустой строке — мы увидим полный список доступных команд. Что ж, приступим к процедуре запуска системы. Для начала нам нужно задать root-раздел, то есть раздел, на который установлена наша система. В моем случае это «/dev/sda5» (в grub2 разделы задаются в виде «hd*,*». Если вы мало знакомы с нумерацией разделов в grub2 — почитайте пункт «нюанс с нумерацией дисков и разделов» в I главе). root-раздел задается командой

set root=(hd0,5)

В моем случае это «hd0,5», он же «/dev/sda5», то есть пятый раздел первого диска. Полный список доступных разделов можно получить уже знакомой многим командой «ls». Она выдаст что-то вроде

(hd0,1) (hd0,2) (hd1.1) (hd2,1)

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

(hd0,5): filesystem is ext2

Некоторых, наверно, смутит упоминание ext2. Не волнуйтесь, так и должно быть. так же происходит каждый раз при нормальной загрузке системы. После того, как задан root-раздел, мы должны указать, какое ядро следует загрузить. Это задается командой «linux». Укажите то ядро, с которым вы обычно загружаетесь. В моем случае команда будет выглядеть так:

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

Не пугайтесь, если вы не помните номер вашего ядра. Просто напишите «linux /boot/vmlinuz» и нажмите tab. На экран будет выведен список доступных ядер. Обратите внимание на параметр «root=/dev/sda5» в конце строки! Здесь также нужно указать ваш root-раздел, но уже в более привычном формате. Без этого система может не загрузиться. Указав ядро и корневой раздел, мы готовы к загрузке системы. Для этого выполняем команду

boot

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

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

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

Совет

Вы можете легко и быстро сделать себе инструкцию по аварийному запуску системы. Откройте ваш «/boot/grub/grub.cfg», найдите там пункт, который вы обычно загружаете, и скопируйте его оттуда. Допустим, он выглядит так:

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

Нам нужно оставить только три строки: «set root», «linux» и «initrd». Чтобы не забыть, допишем в конце команду «boot». В строке linux заменим «UUID=….» на ваш корневой раздел и уберем лишние параметры. В итоге получим такие строки:

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

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

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

Загрузка Windows систем

В случае неработоспособности Ubuntu вы можете загрузить другую установленную систему при наличии таковой. Для linux-систем схема будет той же: set root — linux — initrd — boot. Для Windows же все будет даже проще. Для начала так же укажем корневой раздел. На этот раз уже тот, на котором установлена Windows. В моем случае это «/dev/sda1», и команда будет иметь такой вид:

set root=(hd0,1)

После этого мы скомандуем grub2 передать управление загрузкой Windows-загрузчику NTLDR. Для этого просто выполним

chainloader +1

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

boot

Если все прошло успешно — наслаждаемся загрузкой Windows. В случае, если на разных разделах установлено более одной версии Windows, нам нужно узнать, на каком из разделов находится NTLDR-загрузчик. Это лучше сделать заранее, посмотрев строку «set root» в пункте загрузки Windows файла «/boot/grub/grub.cfg»

Advanced

Даунгрейд до grub-legacy (возврат старой версии). В случае, если ваша дружба с grub2 так и не состоялась, вы можете заменить его на старый grub (ныне известный как grub-legacy), который на текущий момент более стабилен и привычен для многих. Для начала, конечно же, сделаем бэкап важных файлов. Создайте резервную копию файлов конфигурации как описано в конце I-ой главы. Также желательно забэкапить каталог «/boot/grub». Для этого выполните

sudo cp -R /boot/grub{,.bak}

Теперь мы можем приступить к удалению grub2. Для этого удаляем пакеты «grub-pc» и «grub2» (последний может быть не установлен):

sudo apt-get purge grub2 grub-pc

Заметьте: удаление пакетов не приведет к полной очистке каталога «boot/grub». Теперь установим grub версии 0.97:

sudo apt-get install grub

Но после установки нам необходимо создать файл menu.lst и другие файлы загрузчика. Для этого нужно выполнить еще две команды:

sudo update-grub

Эта команда создаст файл меню загрузки. На заданные ей вопросы отвечайте «yes».

sudo grub-install /dev/sda

создаст остальные файлы загрузчика и запишет информацию в загрузочный раздел диска (MBR). Вместо «/dev/sda» в конце укажите тот жесткий диск, который используется в качестве загрузочного (установлен загрузочным в bios) Если установка прошла успешно — перезагружаемся и видим старый добрый grub с его menu.lst и без лишних хитростей

Из оригинального руководства не понятно, что делать с пакетом «grub-common». Данный пакет является зависимостью пакета «grub-pc», но вместе с последним не удаляется. Однако же, использование его вместе со старой версией grub — не лучшее решение. Наиболее безопасный вариант — после удаления «grub-pc» выполнить

sudo apt-get autoremove

Если будет предложено удалить «grub-common» как ненужный — значит, можно удалять.

Cоздание аварийно-спасательного GRUB2-liveUSB

Здесь мы рассмотрим, как создать загрузочную флэшку с установленным на нее grub2, через который можно будет загрузиться в случае, если grub2 на жестком диске испорчен. Делается это всего тремя командами (в примере /dev/sdb — флешка, в своей системе предварительно выясните точно, какой /dev/sd* соответстует флешке, набрав fdisk -l):

sudo mount /dev/sdb1 /mnt
sudo grub-install --root-directory=/mnt /dev/sdb
sudo grub-mkconfig -o /mnt/boot/grub/grub.cfg

На выбранном разделе (/dev/sdb1) будут созданы каталоги и скопированы файлы, необходимые для загрузчика, в MBR диска будет записан код, передающий управление на выбранный раздел. Загрузившись с флеш-диска, попадаем в меню grub2. Для его изменения достаточно вручную править файл конфигурации grub.cfg.

Консоль grub2 — команды и хитрости

Здесь мы рассмотрим некоторые команды консоли grub2. Все мы разбирать не будем, а изучим лишь самые необходимые и полезные. Напомню, чтобы попасть в консоль, нужно нажать «c» во время отображения меню загрузки. Итак, начнем!

ls

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

ls /boot/grub

выведет содержимое каталога «/boot/grub» на разделе, который сейчас указан в качестве корневого (об этом чуть ниже). Еще одно полезное свойство комадны «ls» — она позволят получить информацию о любом разделе:

ls (hd0,5)

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

cat

Данная команда аналогична своей тезке в linux — она выводит содержимое заданного файла. Используется в формате

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

linux

Загружает указанное linux-ядро. Аналог команды «kernel» в grub-legacy. Используется в формате

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

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

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

initrd

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

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

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

chainloader

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

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

Однако, для NTLDR (загрузчика Windows) можно использовать

chainloader +1

boot

производит загрузку указанного ядра (заданного с «linux» и «initrd») или же другого загрузчика (заданного через «chainloader»). Используется без параметров

root

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

root (hd0,5)

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

set

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

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

Наиболее необходимое ее применение — для задания root-раздела. Для этого изменяется переменная «root», в качестве значения задается необходимый раздел, например:

set root=(hd0,5)

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

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

(Подробнее о цветах читайте в главе II, раздел «настройка цвета пунктов меню»).

search

Пожалуй, одна из самых полезных команд. Потомок «find» и «uuid» из grub-legacy. Служит для поиска раздела по UUID, метке или заданному файлу. Имеет следующие ключи:

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

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

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

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

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

Зачем это нужно? Дело в том, что при подключении/отключении жестких дисков (и в некоторых других случаях) нумерацию дисков и разделов может «поехать», и тогда наша команда «set root=(hd0,5)» в «grub.cfg» будет вести или в никуда или на раздел не того диска. Поэтому в «grub.cfg» вы найдете строчку с «search». Для поиска раздела с известным нам uuid запустим «search» с ключом -«u»:

search -u uuid_нужного_раздела

Команда сообщит нам, какой раздел соответствует заданному UUID. Однако, UUID длинный, и хотя его и можно узнать, вводить вручную такое количество символов проблематично, и существует большой шанс сделать ошибку. Вместо этого мы воспользуемя поиском по файлу, который точно имеется на нужном разделе. Допустим, мы ищем раздел boot-раздел нашей системы. Найдем его по файлу «grub.cfg»:

search -f /grub/grub.cfg

Обратите внимание, что при использовании такого способа указанный файл должен иметься только на одном разделе! Получив искомое, можно вручную задать нужный раздел в качестве root-раздела, но гораздо проще воспользоваться ключом «-s». Если после него не указана переменная, будет использована «root», то есть найденный раздел как раз и будет задан в качестве корневого. Допустим, раздел с Windows имеет метку «C_drive». Установим его в качестве корневого для загрузки с него:

search -l C_drive -s

В качестве послесловия отмечу, что остается неясным, зачем разработчики используют в «grub.cfg» строку с «set root», если вполне можно обойтись «search …».

«search …» может не хватить если хочется явно задать устройство для загрузки.

lsfonts

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

help

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

help r

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

help search

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

halt

Выключит компьютер (в теории) или введет его в ступор (у меня ).

reboot

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

background_image

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

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

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

vbeinfo

Выведет список поддерживаемых видеорежимов. Этой командой полезно будет воспользоваться перед настройкой разрешения в «/etc/default/grub».

configfile

Потомок одноименной команды в grub-legacy. Позвоялет загрузить другой файл конфигурации с другим меню вместо текущего «grub.cfg». Создав новый файл, вы можете сделать другое меню с другими настройками, оформлением и пунктами, не захламаляя основное меню. Используется так:

configfile /путь/другой_файл_меню

Создание и использование новых меню позже будет рассмотрено отдельно.

terminal_output.console

Позволяет переключиться на обычную черно-белую цветовую гамму. Весьма полезно при работе с консолью в том случае, если у вас установлено фоновое изображение. Картинка на фоне — это, конечно, красиво, но на некоторых участках фона может быть не виден текст (если картинка не везде однородная). Выполнив эту команду, вы получите контрастную схему (белый текст на черном фоне) и хороший крупный шрифт. Если вы часто используете консоль grub2, имеет смысл добавить в 40_custom пункт с этой командой, например:

menuentry "black&white mode"{
terminal_output.console
}

Премудрости  ;)

Ну и для полного счастья ниже я приведу небольшой список премудростей, которые помогут вам облегчить работу в консоли: уже упомянутое автодополнение команд (как в bash) по нажатию tab. tab в пустой строке выведет полный список доступных команд. Это самое автодополнение имеет нетривиальный способ использования. Если вы не помните, какой раздел вам нужен, напишите «root (hd0,» (или «root (hd1.» и далее по списку) и нажмите tab. Будет выведен список разделов заданного диска с указанием файловых систем, UUID и времени последнего изменения. Имя раздела вида «(hd*,*)» можно использовать в начале пути к файлу, например, вот так:

cat (hd0,6)/home/username/каталог/файл

Еще один полезный пример

ls (hd0,3)/

позволяет просмотреть содержимое заданного раздела без переключения root.

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

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

ls

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

set root=(hd1)

или же

root (hd1)

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

chainloader +1

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

boot

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

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

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

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

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

sudo chmod 744 /boot/grub/custom.cfg

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

set gfxmode=1024x768x32,1024x768x24,1024x768

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

menuentry "my very custom menu"{
configfile /boot/grub/custom.cfg
}

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

sudo update-grub

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

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

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

have_grubenv=true
load_env

### выбранный пункт по умолчанию
set default=0
### таймаут меню
set timeout=2
### разрешение
set gfxmode=800x600x32,800x600x24,800x600

insmod ext2
search -u 0e717c2a-24bd-4abe-acfe-ecf98fc814f8 -s
insmod gfxterm
insmod vbe
if terminal_output gfxterm ; then true ; else terminal gfxterm; fi
insmod png

### фоновое изображение
background_image /usr/share/images/grub/yellow.png
### настройка цветов
set color_normal=black/black
set menu_color_normal=green/light-blue
set menu_color_highlight=red/blue

menuentry "9.10 @ 2.6.32" {
search -u 0e717c2a-24bd-4abe-acfe-ecf98fc814f8 -s
linux /boot/vmlinuz-2.6.32-020632-generic root=UUID=0e717c2a-24bd-4abe-acfe-ecf98fc814f8 ro quiet splash
initrd /boot/initrd.img-2.6.32-020632-generic
}
menuentry "9.10 @ 2.6.32 (recovery)" {
search -u 0e717c2a-24bd-4abe-acfe-ecf98fc814f8 -s
linux /boot/vmlinuz-2.6.32-020632-generic root=UUID=0e717c2a-24bd-4abe-acfe-ecf98fc814f8 ro single 
initrd /boot/initrd.img-2.6.32-020632-generic
}
menuentry "windooz"{
search -u AC9C75E59C75AA8A -s
chainloader +1
}

MBR — бэкап, восстановление и загрузка через образ

Для тех, кто не знает, поясню: MBR — фрагмент первого сектора жесктого диска, в котором, в том числе, прописан код, запускающий загрузчик. При загрузке с диска оттуда считывается информация о том, как запустить загрузчик. grub2 прописывает свой код в MBR при установке (и это же мы делаем, выполняя «grub-install … /dev/sda»). На случай повреждения MBR (причины бывают разными) и для возможности быстрого восстановления работоспособности grub2 полезно будет иметь резервную копию MBR жесткого диска. Чтобы создать ее, сначала нужно определиться, с какого из жестких дисков производится загрузка (можно посмотреть с помощью «sudo fdisk -l»). После этого скопируем первый сектор (первые 512 байт) диска в файл с помощью команды dd:

sudo dd if=/dev/sda of=mbr.bin bs=512 count=1

Если ваш загрузочный диск — не sda, поменяйте значение на свое (на самом деле, код загрузчика занимает первые 446 байт, а дальше записана таблица разделов, но для загрузки нашего образа он должен быть не меньше 512 байт). Наш образ готов! Данные сохранены в файл «mbr.bin» в вашей домашней директории. Используя полученный образ, можно загрузить основной grub2 из-под другого при поврежденном MBR диска. Если у вас есть другая установленная linux-система с grub2 на другом жестком диске или загрузочная флэшка с grub2 (создание таковой описано выше) — можете попробовать на практике нижеприведенный совет. Итак, в моем примере я загружаюсь со своей спасительной флэшки с grub2, на которую я предварительно закинул образ MBR своего жесткого диска. Загрузившись в grub2, выходим в консоль (нажав «c»). Указываем в качестве корневого раздела тот жесткий диск, на котором по сценарию попорчен MBR, и с которого мы хотим запустить grub2. Можно указать сам диск или любой из его разделов, например так:

set root=(hd1)

Проверим результат командой

root

Если все верно — загружаем наш образ с помощью chainloader. Здесь нужно указать полный путь, начиная с раздела, на котором лежит наш файл. Флэшка, с которой я загружен именуется (hd0), так что команда будет выглядеть так:

chainloader (hd0,1)/mbr.bin

Если все тихо — даем команду на запуск:

boot

и наслаждаемся родным grub2.
Примечание: в MBR (и, соответственно, в полученном образе) нет четкого указания жесткого диска, поэтому через наш образ загрузится grub2 с того раздела, который был указан в качестве корневого (root) в консоли grub2. Загрузив родную систему, мы можем восстановить ид-под нее MBR диска. Но если лишнего grub2 у вас под рукой нет, действовать мы будем с LiveCD.
Грузимся с LiveCD любой linux-системы (в данном случае поддержка grub2 роли не играет). Для восстановления MBR нам нужно будет «раскатать» ранее созданный образ обратно в первый сектор диска. Но для начала проверим таблицу разделов, ведь вполне возможно, что grub2 не грузился и из-за нее. Для этого выполните

sudo fdisk -l

Если fdisk видит разделы — таблицу разделов трогать не будем, а восстановим только код загрузчика. В этом случае нам нужно перезаписать лишь первые 446 байт. Если же «убита» и таблица разделов — все 512. Определившись, что именно мы делаем, копируем нужное количество байт из образа в первый сектор диска. В примере ниже таблица разделов в порядке, восстанавливаем только grub2:

sudo dd if=/mnt/mbr.bin of=/dev/sda bs=446 count=1

Если нужно восстановить и таблицу разделов — укажите 512 вместо 446. В качестве значения if пропишите путь к файлу образа, в of — тот диск, загрузочный сектор которого мы восстанавливаем. Если все прошло успешно — перезагружаемся, грузимся с починенного диска и радуемся.
Еще одна полезная возможность — полученный образ можно использовать для загрузки grub2 через NTLDR (в случае, если grub2 не загружает нормально Windows, и вы хотите сделать NTLDR основным загрузчиком). Но об этом как-нибудь позже.

Создание LiveCD с GRUB2

В случае, если ваш компьютер не поддреживает загрузку с usb, можно создать cd-диск с grub2, через который можно будет загрузить свою систему при неисправности основного grub2. Для начала создадим в удобном месте каталог, в котором будем собирать наш диск, а в ней вложенные каталоги «/boot» и «/boot/grub»:

mkdir -p tmp/iso/boot/grub

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

cp /usr/share/grub/unicode.pf2 tmp/iso/boot/grub

Теперь нам нужно написать файл конфигурации «grub.cfg», содержащий загрузочное меню и настройки. Вы можете взять за основу ваш «/boot/grub/grub.cfg» и изменить его под текущие нужды, а можете написать его с нуля — оба варианта подходят если вы понимаете структуру «grub.cfg». В противном случае вы можете взять готовый шаблон, помещенный в конце этого раздела и отредактировать его. Для тех же, кто избрал «путь самурая» — подробнее о создании собственного «grub.cfg» вы можете почитать выше, в разделе «создание дополнительных меню загрузки». Здесь же опишу лишь некоторые специфичные для LiveCD вещи. Если вы берете за основу «/boot/grub/grub.cfg» — уберите из него строки, задающие ваш рут-раздел системы в качестве root («search…. uuid_раздела….»). Корневым разделом должен быть cd-диск! Если вы выбрали вариант с графическим меню — нужно обязательно подгрузить скопированный ранее шрифт. Кроме того, следует, собственно, включить графический режим. Для этого добавьте такие строки:

loadfont /boot/grub/unicode.pf2
insmod gfxterm
insmod vbe
if terminal_output gfxterm ; then true ; else terminal gfxterm; fi

И еще один очень важный момент: в начале файла должна иметься такая строка: insmod part_msdos загрузка данного модуля обязательна! Без него полученный grub2 увидит только жесткий диск, но не увидит таблицу разделов на нем, и такой LiveCD будет бесполезен. Про настройки цветов/разрешения и всего прочего читайте в вышеупомянутом разделе. А теперь же перейдем к созданию самого меню. Вы можете скопировать нужные пункты из «/boot/grub/grub.cfg», но я рекомендую написать их с нуля, ибо для корректной работы тамошних пунктов потребуется загрузка дополнительных модулей. А написать их несложно, для Linux-системы пункт меню должен иметь такой вид:

menuentry "9.10 @ 2.6.32" {
search -u uuid_раздела -s
linux /boot/vmlinuz-xxxxxxx root=/dev/sdXY quiet splash single или_что_там_еще
initrd /boot/initrd.img-xxxxxx
}

В качестве uuid нужно задать тот раздел, где находится ваш /boot (если у вас общий / — пишите его, если отдельный /boot-раздел — именно его и указываем, а не /. В случае с отдельным /boot пути будут выглядеть как «/vmlinuz….» и «/initrd….») Для Windows будет что-то такое:

menuentry "winxp" {
searсh -u uuid_раздела_с_win -s
chainloader +1
}

Закончив с файлом, сохраняем его как «grub.cfg» в целевом каталоге (в моем случае — «~/tmp/iso/boot/grub/grub.cfg»). Теперь мы готовы к созданию iso-образа нашего LiveCD. В этом нам поможет утилита grub-mkrescue. команда будет выглядеть так:

grub-mkrescue --overlay=tmp/iso/ tmp/grub.iso

Вместо «tmp/iso» укажите свой каталог, а вместо «tmp/grub.iso» — путь, куда сохранить полученный iso-образ. Если все успешно — получаем на выходе очень небольшой iso-шник (~2.8M), прожигаем его на rw-шку и пробуем грузиться!

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

Как и обещал, привожу пример файла «grub.cfg», корректно работающего на LiveCD с комментариями:

### модуль файловой системы iso9660 (cd-диск)
insmod iso9660
### модуль для распознавания таблицы разделов жесткого диска! must have!!
insmod part_msdos

### выбранный пункт по умолчанию
set default=0
### таймаут меню
set timeout=2
### разрешение
set gfxmode=800x600x32,800x600x24,800x600

### модуль файловой системы ext2/3/4
insmod ext2
### загружаем шрифт и включаем графическое меню
loadfont /boot/grub/unicode.pf2
insmod gfxterm
insmod vbe
if terminal_output gfxterm ; then true ; else terminal gfxterm; fi

### настройка цветов
set color_normal=white/black
set menu_color_normal=green/black
set menu_color_highlight=light-blue/black

#0
menuentry "9.10 @ 2.6.33rc1" {
search -u 0e717c2a-24bd-4abe-acfe-ecf98fc814f8 -s
linux /boot/vmlinuz-2.6.33-020633rc1-generic root=UUID=0e717c2a-24bd-4abe-acfe-ecf98fc814f8 ro quiet splash
initrd /boot/initrd.img-2.6.33-020633rc1-generic
}
#1
menuentry "9.10 @ 2.6.33rc1 (recovery)" {
search -u 0e717c2a-24bd-4abe-acfe-ecf98fc814f8 -s
linux /boot/vmlinuz-2.6.33-020633rc1-generic root=UUID=0e717c2a-24bd-4abe-acfe-ecf98fc814f8 ro single 
initrd /boot/initrd.img-2.6.33-020633rc1-generic
}
#2
menuentry "windooz"{
search -u AC9C75E59C75AA8A -s
chainloader +1
}

menuentry "ubuntu-11.04.iso" {
loopback loop (hd0,2)/ubuntu-11.04.iso
linux (loop)/install/vmlinuz boot=install iso-scan/filename=/ubuntu-11.04.iso
initrd (loop)/install/initrd.gz
}

menuentry "linuxmint-12-kde-dvd-64bit.iso" {
search -l FAT -s
#set root=(hd0,msdos1)
loopback loop /linuxmint-12-kde-dvd-64bit.iso
linux   (loop)/casper/vmlinuz file=(loop)/preseed/mint.seed boot=casper iso-scan/filename=/linuxmint-12-kde-dvd-64bit.iso quiet splash --
initrd  (loop)/casper/initrd.lz
}

menuentry "ubuntu-12.04-beta2-desktop-i386.iso" {
search -l FAT -s
#set root=(hd0,msdos1)
loopback loop /ubuntu-12.04-beta2-desktop-i386.iso
linux   (loop)/casper/vmlinuz file=(loop)/preseed/ubuntu.seed boot=casper iso-scan/filename=/ubuntu-12.04-beta2-desktop-i386.iso quiet splash --
initrd  (loop)/casper/initrd.lz
}

menuentry "ubuntu live-dvd" {
loopback loop (hd0,2)/ubuntudvd.iso
linux (loop)/install/vmlinuz boot=install iso-scan/filename=/ubuntudvd.iso
initrd (loop)/install/initrd.gz
}

menuentry "Mint live-cd" {
loopback loop (hd0,2)/mint.iso
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/mint.iso
initrd (loop)/casper/initrd.gz
}

menuentry "pmagic-4.10.iso" {
loopback loop (hd0,2)/pmagic-4.10.iso
linux (loop)/pmagic/bzImage boot=casper iso-scan/filename=/pmagic-4.10.iso
initrd (loop)/pmagic/initramfs
}

menuentry "Plop.bin" {
root (hd0,2)
linux16 (hd0,2)/boot/grub/plpbt.bin
}

menuentry "Plop.com" {
root (hd0,2)
linux16 (hd0,2)/boot/grub/plpinstc.com                                         
}

menuentry "ubuntu-11.10-desktop-i386.iso" {
loopback loop /boot/iso/ubuntu-11.10-desktop-i386.iso
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/boot/iso/ubuntu-11.10-desktop-i386.iso noeject noprompt --
initrd (loop)/casper/initrd.lz
}

menuentry "linuxmint-12-gnome-dvd-32bit.iso" {
loopback loop /boot/iso/linuxmint-12-gnome-dvd-32bit.iso
linux   (loop)/casper/vmlinuz file=(loop)/preseed/mint.seed boot=casper iso-scan/filename=/boot/iso/linuxmint-12-gnome-dvd-32bit.iso quiet splash --
initrd  (loop)/casper/initrd.lz
}

menuentry "Lucid ISO" {
loopback loop (hd0,1)/boot/iso/ubuntu-10.04-desktop-i386.iso
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/iso/ubuntu-10.04-desktop-i386.iso noprompt noeject
initrd (loop)/casper/initrd.lz
}

menuentry "ubuntu-9.10-desktop-amd64.iso" {
loopback loop (hd0,1)/boot/iso/ubuntu-9.10-desktop-amd64.iso
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/iso/ubuntu-9.10-desktop-amd64.iso noprompt quiet splash
initrd (loop)/casper/initrd.lz
}

menuentry "gparted-live-0.6.1-2.iso" {
loopback loop (hd0,1)/boot/iso/gparted-live-0.6.1-2.iso
linux (loop)/live/vmlinuz boot=live union=aufs noswap noprompt ip=frommedia findiso=/boot/iso/gparted-live-0.6.1-2.iso toram=filesystem.squashfs
initrd (loop)/live/initrd.img
}

menuentry "systemrescuecd-x86-1.5.8.iso" {
loopback loop (hd0,1)/boot/iso/systemrescuecd-x86-1.5.8.iso
linux (loop)/isolinux/rescue64 setkmap=us isoloop=/systemrescuecd-x86-1.5.8.iso
initrd (loop)/isolinux/initram.igz
}

menuentry "pmagic-5.2.iso" {
loopback loop (hd0,1)/boot/iso/pmagic-5.2.iso
linux (loop)/pmagic/bzImage iso_filename=/boot/iso/pmagic-5.2.iso boot=live load_ramdisk=1 prompt_ramdisk=0 noeject noprompt
initrd (loop)/pmagic/initramfs
}

menuentry "Boot IMG - Seagate Tools" {
linux16 /memdisk bigraw
initrd16 /SeaTools.img
}

# Live Gparted удалось загрузить, только распаковав диск и скопировав его на флешку (директорию live)
menuentry "Gparted" {
linux /live/vmlinuz boot=live config noswap ip=frommedia nosplash --
initrd /live/initrd.img
}

#А если не LiveCD, а что-то полезное установить?
menuentry "debian-6.0.3-amd64-netinst.iso" {
loopback loop /boot/iso/debian-6.0.3-amd64-netinst.iso
linux (loop)/install.amd/vmlinuz vga=normal --
initrd (loop)/install.amd/initrd.gz
}

menuentry "debian installer amd64 netboot" {
linux /boot/debian/linux auto preseed/url=http://www.panticz.de/pxe/preseed/xen.seed locale=en_US console-setup/layoutcode=de netcfg/choose_interface=eth0 debconf/priority=critical --
initrd /boot/debian/initrd.gz
}

# У "ванильной" убунты и alternate способы установки (и пути к ядрам) отличаются. Так что отдельный пример для "alternate":
menuentry "Xubuntu 12.04 64 bit" {
   loopback loop /xubuntu-12.04-alternate-amd64.iso
   linux (loop)/install/vmlinuz iso-scan/filename=/xubuntu-12.04-alternate-amd64.iso vga=normal noeject noprompt nosplash --
   initrd (loop)/install/initrd.gz

#FreeDOS - ностальгирующая экзотика!
menuentry "FreeDOS 1.0" {
loopback loop /boot/iso/fdbasews.iso
linux16 (loop)/isolinux/data/memdisk
initrd16 (loop)/isolinux/data/fdboot.img
}

### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" {
        linux16 /boot/memtest86+.bin
}

menuentry "Memory test (memtest86+, serial console 115200)" {
        linux16 /boot/memtest86+.bin console=ttyS0,115200n8
}

Создание LiveCD с GRUB2 на базе имеющегося дистрибутива

(за идею спасибо тов. komix)
Поскольку тратить целую болванку ради записи iso-шника с grub2 в 3 мегабайта было бы глупо, можно совместить приятное с полезным, а именно: LiveCD с grub2 и установочный диск какой-нибудь системы. Исходить мы будем из того, что имеется iso некоего LiveCD, к которому мы хотим прикрутить grub2. Порядок действий будет в целом аналогичен описанному в предыдущем пункте. Первым делом создадим каталог, в котором будем собирать наш новый диск. В нём же создадим каталог /boot/grub и каталог, в который будут помещены файлы нашей live-системы (я назову ее live):

mkdir -p tmp/iso/{boot/grub,live}

Теперь нам нужно примонтировать iso-образ нашей системы в свежесозданный каталог для нее:

sudo mount -o loop downloads/some-live-system.iso tmp/iso/live

Теперь создайте «grub.cfg», как это описано в предыдущем пункте (не забудьте скопировать файл шрифта, если хотите использовать графическое меню). Здесь все аналогично вышеописанному способу, но с той лишь разницей, что в меню мы добавим пункт для загрзуки нашей live-системы. Как именно нужно запускать «живое ядро»? На этот вопрос нет универсального ответа. Узнать это можно, покопавшись в настройках прилагаемого загрузчика (обычно это isolinux или же старый grub — в обоих случаях понять логику несложно). Приведу конкретный пример для мини-дистрибутива Parted Magic:

menuentry "Parted Magic" {
linux /live/bzImage
initrd /live/initramfs
}

В данном случае этого будет достаточно. Для других систем могут потребоваться дополнительные параметры загрузки ядра. Ядро же может лежать в «/live/boot» или в другом каталоге в зависимости от конкретного дистрибутива. Обратите внимание на то, что здесь не используются строки вида «set root…» или «search…». Если вы создали правильный «grub.cfg», то корневым разделом при загрузке устанавливается cdrom, поэтому нет нужды его задавать повторно. После того, как «grub.cfg» готов, можно приступить к созданию iso-образа:

sudo grub-mkrescue --overlay=tmp/iso tmp/my-live-system-grub2.iso

Продолжительность процесса зависит от размера оригинального дистрибутива. По окончании получаем свежеиспеченный iso-образ с оригинальным дистрибутивом и бонусом в виде grub2. Отмонтируем оригинальный iso:

sudo umount tmp/iso/live

и прожигаем новый iso-шник на болванку. Грузимся и проверяем результат.

Добавление в меню пункта загрузки с CD/DVD & USB

Средствами исключительно GRUB загрузиться с CD-ROM/USB не получится, но «мир не без добрых людей». Существуют мультизагрузчики, не такие многофункциональные, как GRUB, но, зато, умеющие грузить систему с CD-ROM/USB, даже если BIOS такой возможности не предоставляет.

Способ 1. Загрузка с CD & USB посредством Plop Boot Manager

Сама загрузка будет осуществляться посредством Plop Boot Manager. Для этого качаем архив Plop’а, откуда извлекаем файл plpbt.bin, и кидаем его в каталог /boot/ нашей системы. Далее открываем файл /etc/grub.d/40_custom:

nano /etc/grub.d/40_custom

И добавляем в него следующие строчки (мой системный раздел — (hd0,1)):

menuentry "Boot CD/DVD & USB -> Plop Boot Manager" {
    set root=(hd0,1)
    linux16 /boot/plpbt.bin
}

Затем обновляем grub.cfg:

sudo update-grub

Перезагружаемся, смотрим результат.

Способ 2. Загрузка с CD посредством Smart Boot Manager

В этом случае загрузка будет осуществляться посредством Smart Boot Manager. Итак, качаем два файлика: memdisk.bin — «крохотный» файлик из пакета Питера Анвина syslinux и sbootmgr.dsk — образ загружаемой дискеты из Smart Boot Manager. Кидаем оба файлика в каталог /boot/ нашей системы. Далее открываем файл /etc/grub.d/40_custom:

nano /etc/grub.d/40_custom

И добавляем в него следующие строчки (мой системный раздел — (hd0,1)):

menuentry "Boot CD/DVD" {
    set root=(hd0,1)
    linux16 /boot/memdisk.bin
    initrd16 /boot/sbootmgr.dsk
}

Затем обновляем grub.cfg:

sudo update-grub

Перезагружаемся, смотрим результат.

Материал из Пингвиньи радостей

Перейти к: навигация, поиск

Статья о загрузчике операционных сред GRUB2

Grub2 это универсальный загрузчик операционных сред.

Grub2 может быть легко установлен и на floppy-, usb-, cd/dvd-, hdd диски, а также использоваться в качестве PXE-загрузчика.
В операционной системе Debian от версии Squeeze и выше Grub2 устанавливается загрузчиком по умолчанию.

Сайт проекта www.gnu.org/software/grub/.

Содержание

  • 1 Установка в linux
  • 2 Сборка файла конфигурации
  • 3 Команды консоли
  • 4 Создание собственного пункта меню
  • 5 Изменение пункта загрузки по умолчанию
  • 6 Создание GRUB PXE-загрузчика
  • 7 Загрузка из ISO образов
  • 8 Создание тем загрузки
  • 9 Восстановление Grub2
  • 10 Установка Grub2 в Windows 7
  • 11 Запуск других загрузчиков из Grub2
  • 12 Запоминание выбранного пункта меню
  • 13 Литература
  • 14 Справочная информация

Установка в linux

Пакет присутствует в хранилище пакетов debian.
Для установки пакета

  • в командной строке: следует выполнить команду # apt-get install grub2
  • в графическом режиме: воспользоваться специализированной программой управления пакетами

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

  Замечание:
  Если ранее была установлена младшая версия Grub 1xx , то в целях обеспечения преемственности
  прежний файл конфигурации будет сохранён и организована загрузка по цепочке.
  Впоследствии от прежнего файла - файла конфигурации Grub 1xx и возникшей цепочки можно
  будет отказаться, например с помощью команды
     # upgrade-from-grub-legacy

Некоторые часто используемые команды

  # sudo update-grub2                     - обновление файла конфигурации

Сборка файла конфигурации

Для формирования меню Grub2 использует файл конфигурации /etc/boot/grub.cfg.
В Debian данный файл формируется автоматически скриптом сборки update-grub2 из правил-скриптов, расположенных в каталоге /etc/grub.d/.
При выполнении скрипта считываются файлы из каталога /etc/grub.d/, файл /etc/default/grub и создаётся новый файл конфигурации /etc/boot/grub.cfg.
Правила сборки например предусматривают автоматический поиск установленных ядер Linux-систем, других операционных сред и добавление их в пункты меню.

  Замечание
  Существуют и графические утилиты управления меню загрузки Grub2, например Startupmanager.
  Startupmanager также позволяет осуществить и сборку файла конфигурации, и установку некоторых параметров загрузки.

Параметры файла /etc/default/grub

  GRUB_DEFAULT=0                        - пункт меню по умолчанию, если указано saved то Grub2 будет сохранять выбранную позицию
  GRUB_TIMEOUT=5                        - указание времени задержки до старта пункта по умолчанию в сек
  GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
  GRUB_CMDLINE_LINUX_DEFAULT="quiet"
  GRUB_CMDLINE_LINUX=""                 - параметры загрузки ядра
  #GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"      - разрешение фильтрации плохой памяти,
                                          параметр работает с любым ядром получающем информацию о памяти от Grub
  GRUB_TERMINAL=console                 - запрет графического терминала = переключение в текст
  GRUB_GFXMODE=640x480                  - разрешение графического терминала, допустимые режимы могут быть получены командой vbeinfo
  GRUB_DISABLE_LINUX_UUID=true          - запрет передаче ядру Linux параметра корневой системы в виде "root=UUID=xxx"
  GRUB_DISABLE_RECOVERY="true"          - запрет создания в меню Grub2 пункта с режимом восстановления
  GRUB_INIT_TUNE="480 440 1"            - указание параметров звукового сигнала при старте Grub2
  WALLPAPER="/boot/grub/splash.png"     - указание фоновой картинки, поддерживаются только png, jpeg (jpg), tga
  COLOR_NORMAL="black/black"            - указание цвета меню для не выделенного пункта меню
  COLOR_HIGHLIGHT="magenta/black"       - указание цвета меню для выделенного пункта меню

Назначение правил-скриптов сборки /etc/grub.d/

  00_header                             - скрипт считывания установки GRUB из /etc/default/grub
  05_debian_theme                       - скрипт темы GRUB, определяет фон, цвета и прочее
  10_linux                              - скрипт определения конфигурации меню для установленного дистрибутива
  20_memtest86+                         - скрипт добавления пункта меню для утилиты тестирования памяти memtest86, если она установлена
  30_os-prober                          - скрипт поиска на жестких дисках других операционных систем и добавления их в меню
  40_custom                             - шаблон, для создания дополнительных пользовательских пунктов меню
  Замечание
  Запуск скриптов, а соответственно и появление пунктов в меню GRUB, происходит в порядки их нумерации.

Ссылки

  • Переходим на GRUB2
  • Настройка внешнего вида меню GRUB 2

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

Grub2 позволяет осуществить переход в командую консоль управления.
Для этого в момент отображения меню загрузки следует нажать клавишу C.

В консоли управления доступны команды

  > ls                      - отображение списка жестких дисков и  разделов
  > ls (hd0,1)              - отображение информацию об указанном разделе, например
                           тип файловой системы, метку, UUID и дату последнего изменения данных
  > ls /boot/grub           - отображение содержимого папки
  > cat /путь/имя_файла     - вывод содержимого указанного файла
  > linux файл_ядра параметры   - загрузка ядра linux с указанными параметрами
  > initrd файл                 - загрузка образа стартовой файловой системы initrd
  > chainloader +1          - передача управления загрузкой по цепочке другому MBR с установленного командой root раздела
  > chainloader /путь/имя_файла - передача управления загрузкой по цепочке другому загрузчику
  > root                    - вывод информации о текущем корневом карзделе
  > root (hd0,1)            - установка корневого раздела
                            Внимание! Во избежание несовместимостей более правильным является использование команды «set root» 
  > set переменная=значение     - задание значений переменных например
  > set root=(hd0,1)            - (пример) установка корневым разделом, второго раздела первого жёсткого диска
  > set color_normal=magenta/green        - установка цвета для обычного пункта меню (и текста в консоли) 
  > set color_highlight=light-blue/black  - установка цвета для выделенного пункта меню
  > search                  - поиск раздела по UUID, метке или заданному файлу.
   Имеет следующие ключи:
   -u (или –fs-uuid)      - поиск раздела по UUID
   -l (или –label)        - поиск по метке раздела
   -f (или –file)         - поиск по указанному файлу
   -n (или –no-floppy)    - не проверять флоппи-дисковод 
   -s (или –set)          - установить найденный раздел в качестве значения заданной переменной
  > lsfonts                 - отображение списка загруженных в настоящий момент шрифтов
  > help                    - вывод списка доступных команд
    help l                  - вывод справки по всем командам, начинающимся на «l»
    help search             - вывод справки о команде «search»
  > halt                    - выключение питания компьютера
  > reboot                  - перезагрузка компьютера
  > background_image /путь/имя_файла      - изменение фонового изображения в текущем сеансе
     background_image позволяет изменить изображение "на лету" - избегая перезагрузки.
     В сочетании с установкой цветов командой set позволяет подобрать подходящий вариант
     оформления в интерактивном режиме.
    background_image        - (при использовании без параметров) сброс текущего фонового изображениия
  > terminal_output.console - переключение на черно-белую цветовую гамму.

Ссылки:

  • help.ubuntu.ru: GRUB — загрузчик системы

Создание собственного пункта меню

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

Для добавления собственного пункта меню загрузки, например

  • в файл правил /etc/grub.d/40_custom добавляются строки
  menuentry "etherboot loader" {    # пункт меню для добавления загрузчика PXE
     set root=(hd0,1)
     linux16 /boot/eb-net.lil
  }
  • осуществляется обновление файла конфигурации

Ссылки:

  • StartUp Manager – редактор настроек GRUB, GRUB2 и Usplash

Изменение пункта загрузки по умолчанию

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

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

  • в файле параметров сборки /etc/default/grub изменяется строка
 GRUB_DEFAULT=0
 например на
 GRUB_DEFAULT=2
  • осуществляется обновление файла конфигурации

Создание GRUB PXE-загрузчика

Grub2 может быть трансформирован и использован для осуществления загрузки компьютера по сети по PXE-протоколу вместо обычно применяемого в этих случаях PXELinux.

Для создания Grub2 PXE-загрузчика

  • выполняются команды
  # grub-mkimage --output=core.img --format=i386-pc --prefix="(pxe)/grub-loader" pxe pxecmd   - создание загрузчика grub2pxe
  # cat /usr/lib/grub/i386-pc/pxeboot.img core.img > grub2pxe                                 - добавление к grub2pxe PXE-модуля
  или
  # grub-mkimage -d /usr/lib/grub/i386-pc/ -p "(pxe)/" -O i386-pc-pxe -o /<ПУТЬ>/grub2.pxe pxe pxecmd

Для использования Grub2 PXE-загрузчика

  • загрузчик вместе с необходимыми файлами копируется в корневой каталог TFTP сервера <TFTPROOT>
  # cp grub2pxe <TFTPROOT>                     - копирование самого загрузчика
  # cp /boot/* <TFTPROOT>/grub-loader          - копирование необходимых для загрузки модулей
  • в файл конфигурации DHCP-сервера /etc/dhcp3/dhcpd.conf в необходимое место добавляются например строки
  group   {
     filename  "grub2pxe";
     #option pxelinux.configfile    "/grub-loader/grub.cfg";                - файл конфигурации для изменения порядка загрузки
     option root-path        	"<IP-SERVER>:/tftpboot/grub-loader";
     ...
  }
  • осуществляется обновление файла конфигурации

Ссылки:

  • Build PXE boot image
  • GRUB PXE network boot
  • PXE
  • Wyse 3150SE: Linux: Network Booting Grub

Загрузка из ISO образов

Grub2 умеет осуществлять подключение/монтирование ISO-образа и передавать загрузку на находящиеся в нём ядра.

  Внимание!
  Grub2 не передаёт управление загрузчику ISO-образа, а просто распаковывает его на лету.
  В связи с этим формирование меню и установка параметров загружаемого ядра должны быть произведены самостоятельно.

Для загрузки из ISO образов в Grub2

  • ISO-образ размещается в доступном для загрузчика месте, например в каталоге /boot на жёстком диске
  • в файл правил /etc/grub.d/40_custom добавляются например строки
  menuentry "Gparted live" {                          # на примере Gparted Live версии 0.18.0-1-i486
     set root=(hd0,1)
     set isofile="/boot/gparted-live-0.18.0-1-i486.iso"
     loopback loop $isofile
     linux (loop)/live/vmlinuz boot=live config union=aufs noswap noprompt vga=788 ip=dhcp toram=/live/filesystem.squashfs findiso=$isofile
     initrd (loop)/live/initrd.img
  }
  • осуществляется обновление файла конфигурации

Ссылки:

  • Статья о том, как с помощью Grub 2 загрузиться с образов iso и/или img
  • ISO Booting with Grub 2

Создание тем загрузки

Grub2 поддерживает установку пользовательских тем загрузки.
В качестве фона для тем могут быть использованы графические файлы расширений jpg/jpeg, png, tga.

  Замечание:
  Для добавления дополнительных тем загрузки оптимизированных для Grub2 в Debian может быть использован пакет
  grub2-splashimages. Установленные темы размещаются в папку /usr/share/images/grub/.

Графический файл для использования в качестве фона

  • может находиться в каталоге /boot/grub/
  • может быть указан в виде переменной WALLPAPER
  • может быть указан прямо в файле /etc/grub.d/05_debian_theme

Для внесения изменений в файла конфигурации /boot/grub/grub.cfg

  • выполняется команда
  # update-grub2
  Замечание:
  Просмотр наличия графических файлов осуществляется в указанном выше порядке.
  В качестве фона Добавляется первый из найденных.

Для изменения темы загрузки путём размещения файла в каталоге /boot/grub/

  • копируется (или создаётся ссылка на) графический файл установленного формата в каталоге /boot/grub/
  • осуществляется обновление файла конфигурации

Для изменения темы загрузки путём изменения переменной WALLPAPER

  • в файл /etc/grub.d/05_debian_theme добавляется строчка
  WALLPAPER="/usr/share/wallpapers/At_Night/contents/screenshot.png"
  строка добавляется перед командами set_background_image  и set_default_theme 
  • осуществляется обновление файла конфигурации

Для изменения темы загрузки путём изменения файла /etc/grub.d/05_debian_theme

  • либо изменяется ссылка /usr/share/images/desktop-base/desktop-grub.png или /etc/alternatives/desktop-grub на нужный файл фона в формате png
  • либо изменяется имя файла (расширение) путём редактирования строки в файле /etc/grub.d/05_debian_theme
  set_background_image "/usr/share/images/desktop-base/desktop-grub.png" ||
  • осуществляется обновление файла конфигурации

Ссылки:

  • Смотри /usr/share/doc/grub2-splashimages/README
  • Изменение фоновой картинки в меню GRUB 2
  • Splashimages.html Splashimages for GRUB2

Восстановление Grub2

Повреждение загрузчика Grub2 и прекращение с его помощью процесса загрузки может быть связано с установкой / попыткой установки другого загрузчика, например Syslinux или при установке ОС семейства Windows, либо при изменении структуры жёсткого диска, например именования раздела на котором установлен загрузчик, либо в иных случаях.
В связи с этим может возникнуть потребность восстановления загрузчика Grub2.
Для Grub2 разрушение может выглядеть как полное или частичное с различием между ними в том, что старт загрузчика не происходит вовсе или он запускается, но в Rescue mode.

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

При появлении экрана Rescue mode Grub2 существует возможность старта системы и последующего восстановления загрузчика без привлечения внешних ресурсов.
При полном разрушении загрузчика (разрушении MBR) на носителе информации остаются файл конфигурации и модули Grub2, но для восстановления требуется предварительная загрузка с внешнего «источника».
Восстановления Grub2 при полном разрушении может быть осуществлено двумя способами:

  • Первый способ заключается в загрузке «внешней» операционной среды с установленным загрузчиком Grub2, например с CD/DVD привода, USB-флешки или по сети через PXE/Etherboot, и последующей его «установкой» на целевой жёсткий диск.
  • Второй способ использует возможность загрузки целевой операционной системе с установленным загрузчиком Grub2 минуя разрушенный MBR с последующим восстановлением Grub2 из «родной» среды.

Для восстановления Grub2 в Rescue mode

  • в окне Rescue mode Grub2 выполняются команды
  # ls (hd0,1)/                        - устанавливается раздел с установленным загрузчиком
  # set root=(hd0,1)                   - установка пути корневой файловой системы
  # set prefix=(hd0,1)/boot/grub       - установка пути к модулям загрузчика
  # insmod /boot/grub/linux.mod        - загрузка модуля загрузки linux
  # linux /vmlinuz root=/dev/sda1 ro   - установка расположения модуля ядра linux
  # initrd /initrd.img                 - установка стартовой файловой системы ядра linux
  # boot                               - загрузка установленной linux-системы
  • после загрузки операционной среды осуществляется восстановление Grub2, например командой
  # dpkg-reconfigure grub-pc

Для восстановления Grub2 при разрушении MBR из внешней «живой» (Live) системы

  • запускается «живая» (Live CD) система с внешнего носителя
  Замечание:
  В качестве загружаемой "живой" операционной среды могут быть использованы различные Linux Live системы,
  например такие как Debian Live, Parted Magic, SystemRescueCD, Rescatux, а также 
  операционная система Debian запускаемая по сети, например с сервера терминалов NFS.
  • устанавливается загрузчик с помощью команд
  # su                                           - получение прав суперпользователя
  # mount        /dev/sda1 /mnt                  - подключение носителя с разрушенным Grub
  # mount --bind /dev      /mnt/dev              - подключение устройств для выполнения команды chroot
  # mount --bind /proc     /mnt/proc
  # mount --bind /sys      /mnt/sys
  # chroot /mnt                                  - перехода в chroot-режим
  $ grub-install --recheck --no-floppy /dev/sda  - установка Grub2
  $ exit                                         - выход из chroot-режима
  # umount -l /mnt/dev                           - отмонтирование служебных папок 
  # umount -l /mnt/proc
  # umount -l /mnt/sys
  # umount -l /mnt                               - отмонтирование носителя, Grub2 установлен
  Замечание:
  Существует и возможность осуществить проверку загрузочного меню Grub2 без перезапуска компьютера.
  Например с помощью команд
  # sync
  # echo 3 > /proc/sys/vm/drop_caches
  # qemu -hda /dev/sda

Для восстановления Grub2 при разрушении MBR с загрузкой минуя носитель

  • запускается целевая операционная система минуя разрушенный MBR
  Замечание:
  Для загрузки операционной системы с установленным загрузчиком Grub2 минуя разрушенный MBR
  могут быть использованы такие средства как SuperGRUB2 disk, специальные ядра altker32/altker64 распространяемые
  на LiveCD диске проекта Systemrescue, а также ручная загрузка из любого загрузчика, позволяющего осуществлять это
  вручную, например те же Grub2 или Syslinux запускаемые с CD/DVD привода или флешки.
  • устанавливается загрузчик с помощью команд
  # su                                           - получение прав суперпользователя
  # grub-install /dev/sda                        - или
  # grub-install --recheck --no-floppy --root-directory=/ /dev/sda
                                                 - установка Grub2 на жёсткий диск /dev/sda
                                                 с (во)созданием каталога /boot/grub
                                                 в точке подключения носителя /

Ссылки:

  • Аварийная загрузка Grub2 (rescue mode)
  • Восстановление GRUB

Установка Grub2 в Windows 7

Grub2 может быть установлен в операционных системах Windows.
Особенно хорошо он «вписывается» в Windows 7′ в связи с тем, что эта ОС выделяет под загрузку специальный скрытый раздел.

Для установки в Grub2 в Windows 7

  • запускается современный LiveCD диск с установленной Linux системой и последней версий загрузчика, например Parted Magic
  • монтируется раздел жёсткого диска с установленной Windows 7
  # mount -t ntfs /dev/sda1 /media/sda1
  # mount -t ntfs /dev/sda2 /media/sda2
  • перемещаются загрузочные файлы Windows 7 — bootmgr, bootsect.bak и каталог Boot/ — со скрытого раздела жёсткого диска (/dev/sda1) на системный (/dev/sda2)
  • устанавливается Grub2 на первый (скрытый) раздел жёсткого диска и в MBR
  # grub-install --modules=ntfs --recheck --no-floppy --root-directory=/media/sda1 /dev/sda
  на устройстве /media/sda1 появляются файлы Grub2 в каталоге /media/sda1/boot
  • добавляется файл конфигурации Grub2 в подкаталог grub /boot/grub/grub.cfg
  • добавляется новая секция в файле конфигурации
  menuentry "Windows 7" {
     set root=(hd0,2)
     chainloader +1
  }

Теперь при перезапуске появится меню Grub2 с пунктом выбора «по цепочке» загрузчика Windows 7.

Ссылки:

  • Installing GRUB using grub-install
  • Проинсталлировать GRUB, можно ли из Knoppix’a ?

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

Grub2 поддерживает загрузку «по цепочке» ОТ СЕБЯ на множество других загрузчиков напрямую или через по-цепочке на MBR разделы, на котором они установлены.

Примеры организации запуска других загрузчиков приведены в статьях

  • Загрузка Grub4dos из Grub2

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

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

Для добавления запоминания выбранного пункта Grub2

  • в файл конфигурации /etc/default/grub добавляются строки
  GRUB_SAVEDEFAULT=true
  GRUB_DEFAULT=saved
  Замечание:
  При добавлении пунктов меню вручную с использованием файла /etc/grub.d/40_custom
  и желании запоминать их выбор тоже, следует в необходимые секции меню
  добавить строку savedefault, например
  menuentry "etherboot loader" {
     savedefault
     set root=(hd0,1)
     linux16  /boot/ipxe.lkrn
  }
  • осуществляется пересборка файла конфигурации /boot/grub/grub.cfg
  # update-grub

Ссылки:

  • Grub2: запоминание последней загруженной ОС

Литература

  • wikipedia.org: GRUB
  • wikibooks.org: Grub 2 от А до Я
  • wikibooks.org: Grub 2
  • Руководство пользователя
  • GRUB bootloader — Full tutorial
  • GNU GRUB Manual 2.00
  • Wiki GRUB 2 и GRUB Legacy
  • GRUB2 (Русский)
  • Автор статьи: Azteka :Grub2 — файл настроек /etc/default/grub
  • Начальный загрузчик GRUB 2 — полное руководство

Справочная информация

  • 01.10.2009: Grub2: создание статьи на примере для debian lenny amd64
  • 11.10.2010: Grub2: последняя правка — добавлено описание изменения тем загрузки
  • 20.01.2011: Grub2: правка внешнего вида, расширено и актуализировано описание установки собственных тем загрузки
  • 12.10.2011: Grub2: добавлено описание установки в Windows 7
  • 23.03.2014: Grub2: добавлено описание Загрузки из ISO образов
  • 06.04.2014: Grub2: добавлено описание Параметров файла /etc/default/grub
  • 31.01.2015: Grub2: добавлено описание Восстановления Grub2
  • 17.02.2016: Grub2: добавлено описание Запоминание выбранного пункта меню
  • 22.02.2016: Grub2: добавлено описание Команд консоли

Понравилась статья? Поделить с друзьями:
  • Grub2 add windows 10 to boot menu
  • Grub не отображается загружается сразу windows 10
  • Grub не видит загрузчик windows 10
  • Grub не видит windows 10 на другом жестком диске
  • Grub не видит windows 10 uefi