Как изменить grub debian

Translation(s): English - Français - Italiano - Русский

Translation(s): English — Français — Italiano — Русский


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

Debian содержит GRUB v1 (Legacy) и v2 (GRUB 2).

  • Grub v1 загрузчик по умолчанию на платформах x86 до Debian Lenny.
  • Grub v2 загрузчик по умолчанию в Debian Squeeze.

Contents

  1. Установка

    1. Lenny
    2. Squeeze
  2. Настройка

    1. v1
    2. v2
    3. Обновление с v1 до v2
  3. Переход от V1 до v2
  4. FAQ

    1. Двойная загрузка
  5. См. также

Установка


Lenny

Grub v1 для Debian может быть установлен командой:

aptitude install grub

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

См. также

  • Настройка GRUB: GrubConfiguration

  • Восстановление GRUB: GrubRecover

  • Инструкция GRUB

  • С LILO на GRUB: FromLiloToGrub

  • GRUB перезагрузка: GrubReboot

Squeeze

Grub v2 для Debian может быть установлен командой:

aptitude install grub

Если ваша система не является обычным ПК (например, если ваша система EFI или OpenFirmware, а не BIOS), вы можете установить другую версию GRUB (см. см. варианты GRUB 2).

Настройка


v1

Конфигурационный файл — /boot/grub/menu.lst

В Debian, файл конфигурации GRUB обновляется автоматически при установке нового ядра с помощью update-grub.

Вы можете изменить настройки в /boot/grub/menu.lst. Удостоверьтесь, что Вы читаете комментарии , /usr/share/doc/grub/README.Debian.gz for more information and the update-grub(8) manpage from your distribution)

v2

Конфигурационный файл — /boot/grub/grub.cfg, но вы не должны его редактировать напрямую. Grub v2 генерирует автоматически этот файл update-grub(8), основываясь на:

  1. Сниппетах скриптов в /etc/grub.d/

  2. Конфигурационном файле /etc/default/grub

Для конфигурации grub «v2», вы должны редактировать /etc/default/grub, затем запустить update-grub. Продвинутая конфигурация достигается измением сниппетов в /etc/grub.d/.

Обновление с v1 до v2

Для обновления до grub v2, вы должны:

  1. Установить grub v2 (но не удаляя, прежде, grub 1).
  2. Следовать инструкциям, отображаемым пакетом установки (т.н. grub v1 имеет запись для расположения каскадом с grub v2, таким образом перезагрузитесь и попробуйте эту возможность, затем вы можете действительно включить загрузчик grub2 запуском upgrade-from-grub-legacy).

Переход от V1 до v2


  • страничка для перехода версий Grub.

FAQ


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

  • Q : Will GRUB allow me to hibernate Linux and activate another ?operating_systems (such as Windows XP) that I hibernated earlier, i.e. a ?DualHibernate rather than a DualBoot?

    • A : Nothing will prevent you to hibernating (GRUB isn’t aware that your host is suspended). Howerever, make sure you don’t mount the same partition (RW) under any two suspended OS !

    Q : Is there a way to install GRUB in the MasterBootRecord from DOS or Windows XP, i.e. a utility similar to rawrite.exe or fdisk.exe that write a GRUB MBR? What I want here is to install Linux without having a bootable floppy.

    • A : There is/was a win32 Version of GRUB, i used it to install linux from Windows 2000 , but i am not sure what exactly the source is ;-) (google for grubwin32) Just unzip grubwin32 to c: then run c:bootgrubw32grub This would patch the necessary files(under XP, not linux). Then add :

       c:bootstage1="GRUB"

      to c:boot.ini And you now have a grub boot loader on your XP system.

См. также


  • Заставки Splash: ?/ru/Grub/SplashImage

  • Домашняя страничка GRUB

    • GRUB FAQ

    • GRUB Wiki

    • Несколько руководств по Grub были разработаны на wiki grub :
      http://grub.enbug.org/FranklinPiat/GrubManual

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

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

Настройка Grub с помощью Grub Customizer

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

Программа доступна в официальных репозиториях большинства дистрибутивов, и вы можете ее оттуда легко установить. Для установки в Ubuntu выполните:

sudo apt install grub-customizer

В Fedora, Red Hat и CentOS команда будет немного отличаться:

sudo yum install grub-customizer

После завершения установки вы можете запустить программу из главного меню или в терминале:

grub-customizer

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

grub

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

grub1

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

grub2

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

grub3

Последняя вкладка позволяет настроить внешний вид, тут вы можете выбрать одну из доступных тем, установить разрешение, или же задать пользовательские параметры цвета, шрифтов и фоновый рисунок:

grub4

grub5

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

grub7

Когда настройка Grub Customizer будет завершена просто нажмите кнопку Сохранить, чтобы применить все изменения.

grub8

Видео, где показана настройка GNU Grub в Linux с помощью Grub Customizer:

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

Сразу нужно сказать, что существует два способа настройки Grub Ubuntu, через конфигурационные файлы. Первый — через конфигурационный файл утилиты grub-mkconfig, который позволяет задать общие параметры для загрузчика и ручное редактирование /boot/grub/grub.cfg.

Первый — рекомендованный, и с помощью него можно настроить большинство параметров, в этом случае настройки не собьются, когда вы обновите ядро или загрузчик. Второй вариант еще более гибкий, но после любого обновления вы потеряете свои настройки. Так что то что можно настроить через /etc/default/grub настраиваем через него, все остальное — через /boot/grub/grub.cfg. Сначала рассмотрим первый вариант.

Настройка Grub через /etc/default/grub

Как я уже сказал, настройка загрузчика через файл /etc/default/grub, на основе которого будет автоматически создан /boot/grub/grub.cfg более желательна. Давайте рассмотрим параметры, которые вы можете здесь настроить.

  • GRUB_DEFAULT — указывает какой пункт нужно загружать по умолчанию. Может быть указан номер, или полное название или же строка saved, которая значит, что нужно загрузить пункт, указанный с помощью grub-reboot;
  • GRUB_SAVEDEFAULT — загружать последнюю использованную запись по умолчанию;
  • GRUB_HIDDEN_TIMEOUT — сколько секунд ждать перед тем, как вывести меню;
  • GRUB_HIDDEN_TIMEOUT_QUIET — если установлено true, то меню не будет показано;
  • GRUB_TIMEOUT — сколько секунд будет показано меню;
  • GRUB_CMDLINE_LINUX — добавить опции ядра для всех ядер, как обычных, так и режима восстановления;
  • GRUB_CMDLINE_LINUX_DEFAULT — добавить опции ядра только для обычных ядер;
  • GRUB_CMDLINE_LINUX_RECOVERY — опции ядра, только для режима восстановления;
  • GRUB_BADRAM — указать адреса оперативной памяти, которые не нужно использовать;
  • GRUB_TERMINAL — модуль терминала для Grub. Можно использовать console, только для текстового режима или gfxterm с поддержкой графики;
  • GRUB_GFXMODE — разрешение экрана в Grub, лучшие использовать auto, чтобы система выбрала сама то что ей нужно.
  • GRUB_DISABLE_RECOVERY — не включать в меню пункты восстановления;
  • GRUB_DISABLE_OS_PROBER — не искать другие операционные системы;
  • GRUB_BACKGROUND — адрес картинки для фона, должна находиться в той же папке что и файлы grub;
  • GRUB_THEME — устанавливает тему Grub.

Например, можно использовать такую конфигурацию:

GRUB_DISTRIBUTOR=""
GRUB_DEFAULT="saved"
GRUB_HIDDEN_TIMEOUT="0"
GRUB_HIDDEN_TIMEOUT_QUIET="true"
GRUB_TIMEOUT="8"
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/sda7 splash=silent quiet"

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

Настройка Grub через /boot/grub/grub.cfg

Файл /etc/boot/grub/grub.cfg управляет непосредственно работой загрузчика, здесь указаны все его параметры и настройки, а также сформировано меню. Поэтому, изменяя этот файл, мы можем настроить Grub как угодно. Сначала попытаемся разобраться с синтаксисом файла. Он очень напоминает синтаксис bash и состоит из нескольких команд, которые что-то делают, загружают и настраивают.

Команды могут быть объединены в функции или блоки с помощью инструкций if else, синтаксис которых аналогичен bash. Рассмотрим основные из этих команд:

  • load_env — загрузить переменные окружения из файла;
  • set — установить значение переменной окружения. Используется как set имя_переменной=значение;
  • insmod — загрузить модуль из папки с модулями Grub;
  • linux — загружает ядро Linux;
  • initrd — подготавливает образ initrd для загрузки ядра;
  • boot — пытается загрузить систему;
  • chainloader — запускает загрузчик из другого раздела;
  • search — установить значение переменной выполнив поиск по заданным параметрам, например, может найти диск по его UUID или метке;
  • menuentry — позволяет создать пункт меню;

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

Команда search используется для поиска дисков и имеет такой синтаксис:

$ search опции_поиска —set=имя_переменной —hint приметы_устройства основной_параметр

  • Опции поиска задают по какому критерию нужно искать, например, —fs-uuid — искать по UUID, —label — по метке, —no-floppy — не искать в схемных носителях.
  • Приметы устройства дают программе дополнительные подсказки для более быстрого поиска;
  • Основной параметр — значение, по которому будем выполнять поиск.

Например, команда может выглядеть вот так:

search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos5 --hint-efi=hd0,msdos5 --hint='hd0,msdos5' c52ca066-e48f-4df2-bc7e-4d885a354090

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

menuentry имя_пункта {
команды установки переменных окружения
загрузка модулей
linux файл_ядра параметры_ядра
initrd файл_initrd
}

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

menuentry "Ubuntu" {
set root=(hd0,1)
linux /casper/vmlinuz boot=casper noeject noprompt splash
initrd /casper/initrd.lz
}

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

# Время показа меню 5 секунд

set timeout=5

# Установим разрешение экрана и укажем что это же разрешение нужно сохранять для ядра:

set gfxmode=»1280×800″
set gfxpayload=keep

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

insmod vbe
insmod gfxterm
terminal_output gfxterm

# Установка шрифта с поддержкой Unicode:

font «/boot/grub2/fonts/unicode.pf2»
loadfont unicode

# Загрузим модуль работы с jpeg и зададим фоновый рисунок:

insmod jpeg
background_image «/boot/fon.jpg»

# Установим переменные окружения для настройки цвета меню:

set menu_color_normal=red/black
set menu_color_highlight=yellow/black
set color_normal=yellow/black

# Пункт меню для нашей операционной системы:

menuentry «Ubuntu» {
root=(hd0,1)
linux /casper/vmlinuz boot=casper noeject noprompt splash
initrd /casper/initrd.lz
}

menuentry «OpenSUSE» {
insmod gzio
insmod part_msdos
insmod ext2
set root=’hd0,msdos5′
linux /boot/vmlinuz-4.1.31-30-default root=UUID=c52ca066-e48f-4df2-bc7e-4d885a354090 resume=/dev/sda7 splash=silent quiet showopts
initrd /boot/initrd-4.1.31-30-default
}

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

Выводы

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

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

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

GRUB 2 (GRand Unified Bootloader / большой единый загрузчик) – это кроссплатформенный загрузчик операционных систем.

При старте системы, когда запускается GRUB 2 вы видите следующее меню:

GRUB 2 для Debian 11

GRUB 2 для Debian 11
GRUB 2 для Ubuntu 22.04

Хотя, по умолчанию в Ubuntu 22.04 вы не увидите это меню, так как система загружается сразу, не показывая его в отличие от Debian 11. А в Debian 11 по умолчанию это меню появляется на 5 секунд.

В обоих системах управление осуществляется следующими клавишами:

  • Стрелки “вверх/вниз” – переход по пунктам меню;
  • “Enter” – загрузка выбранного пункта;
  • “e” – редактирование выбранного пункта;
  • “c” – запуск командной строки.

Настройка GRUB 2

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

alex@deb-11:~$ head /boot/grub/grub.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true

Выше я использовал команду head, чтобы посмотреть первые строки из файла /boot/grub/grub.cfg. А вообще, работать с текстовыми файлами мы научимся чуть позже в этом курсе.

Основной конфигурационный файл, который нужно редактировать для настройки этого загрузчика, это /etc/default/grub.

Для Ubuntu 22.04 и Debian 11 настройки по умолчанию немного отличаются. Ниже я вывожу содержимое файлов без комментариев.

Для Debian 11:

alex@deb:~$ cat /etc/default/grub | grep -v '^#'

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

Для Ubuntu 22.04:

alex@ubu:~$ cat /etc/default/grub | grep -v '^#'

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="maybe-ubiquity"
GRUB_CMDLINE_LINUX=""

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

Давайте рассмотрим какими параметрами можно настроить наш загрузчик:

  • GRUB_DEFAULT – отвечает за номер строки, которая будет загружена по умолчанию. Отсчет начинается с нуля, то-есть 0 – это первая строчка меню, 1 – это вторая строчка меню и так далее.
  • GRUB_TIMEOUT – отвечает за время (в секундах), после истечения которого, если ничего не нажать, загрузится строка под номером указанным в GRUB_DEFAULT. Чтобы меню не появлялось следует указать 0, а чтобы выключить таймер то -1.
  • GRUB_TIMEOUT_STYLE – с помощью этого параметра можно скрыть или отобразить меню:
    • hidden – меню будет скрыто в течении GRUB_TIMEOUT, а затем начнется загрузка системы;
    • menu – меню будет отображаться, тоже самое будет если полностью удалить этот параметр.
  • GRUB_DISTRIBUTOR – описательное имя для строки меню. Здесь можно указать строку, но по умолчанию вместо строки используется команда `lsb_release -i -s 2> /dev/null || echo Debian` которая найдет имя операционной системы (Ubuntu или Debian GNU/Linux), а если не найдет то напишет Debian;
  • GRUB_CMDLINE_LINUX_DEFAULT – этот параметр позволяет передать опции загрузки ядра, добавляемые только к обычному режиму загрузки системы:
    • quiet – означает, не выводить сообщения во время загрузки;
    • splash – вывести заставку загрузки;
    • selinux=0 – выключить selinux;
    • rootfstype=ext4 – можем указать тип файловой системы, чтобы он не вычислялся.
  • GRUB_CMDLINE_LINUX – тоже самое что и GRUB_CMDLINE_LINUX_DEFAULT, только применяется и к обычному режиму загрузки, и к режиму восстановления системы;
  • GRUB_TERMINAL – задает устройство для вывода терминала:
    • console – отключает графический терминал, при этом меню будет показано в текстовом виде;
    • gfxterm – включает графический терминал;
  • GRUB_GFXMODE – позволяет задать разрешение и глубину цвета для графического терминала, например 640x480x32;
  • GRUB_HIDDEN_TIMEOUT – можно указать сколько секунд меню будет скрыто. При этом GRUB_TIMEOUT должен быть равным нулю. При такой настройке меню не будет показываться, а чтобы его увидеть нужно нажать клавишу «Esc».
  • GRUB_DISABLE_LINUX_UUID — выключает UUID (идентификатор диска), вместо него будет использоваться например /dev/sda;
  • GRUB_DISABLE_RECOVERY — выключает пункты меню режима восстановления;
  • GRUB_INIT_TUNE — звуковой сигнал при загрузке меню. Можете попробовать такой звук:
GRUB_INIT_TUNE="1750 523 1 392 1 523 1 659 1 784 1 1047 1 784 1 415 1 523 1 622 1 831 1 622 1 831 1 1046 1 1244 1 1661 1 1244 1 466 1 587 1 698 1 932 1 1195 1 1397 1 1865 1 1397 1"

После изменения настроек GRUB 2 нужно всегда выполнять команду update-grub2 для применения настроек. Но выполнять её нужно с правами администратора, поэтому в Debian переключаемся на root пользователя:

alex@deb:~$ su -
Пароль:

root@deb:~# update-grub2
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.10.0-13-amd64
Found initrd image: /boot/initrd.img-5.10.0-13-amd64
Found linux image: /boot/vmlinuz-5.10.0-10-amd64
Found initrd image: /boot/initrd.img-5.10.0-10-amd64
done

А в Ubuntu можем это выполнить с помощью команды sudo:

alex@ubu:~$ sudo update-grub2

На задний фон меню загрузки можно поместить какую-нибудь картинку. Для этого нужно положить файл картинки в /boot/grub и выполнить команду update-grub2. Файл должен быть обязательно в формате .png.

Вот пример для Ubuntu с использованием sudo, а в Debian вам нужно будет переключиться на пользователя root:

alex@ubu:~$ sudo cp ./пингвин.png /boot/grub/

alex@ubu:~$ sudo update-grub2
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found background image: пингвин.png
Found linux image: /boot/vmlinuz-5.15.0-30-generic
Found initrd image: /boot/initrd.img-5.15.0-30-generic
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
done

И после перезагрузки системы увидим нашу картинку (для перезагрузки используйте команду sudo reboot):

GRUB 2 меню с картинкой

Добавлять параметры ядра можно не только редактируя файл /etc/default/grub, но и в самом меню. Для этого нужно отредактировать выбранный пункт меню нажав клавишу “e”, после чего у вас откроется вот такой редактор:

GRUB 2. Добавление параметров загрузки ядра

GRUB 2. Добавление параметров загрузки ядра

Опции загрузки добавляются в строке начинающейся с linux, это строка выделена на рисунке выше.

Редактируя здесь параметры ядра можно например сбросить пароль root пользователя в системе. Для этого нужно ro изменить на rw, и дописать init=/bin/bash:

GRUB 2. Добавление параметров загрузки ядра

GRUB 2. Добавление параметров загрузки ядра

Дальше нажимаем Ctrl+x или F10 для загрузки и попадаем в систему под пользователем root, без ввода пароля.

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

Командная строка GRUB 2

Чтобы попасть в командную строку нажимаем клавишу “c”. Рассмотрим пока только две команды:

  • ls — позволяет просматривать файлы на файловой системе, а также блочные устройства;
  • search — позволяет производить поиск.
  • Команда ls без параметров покажет нам список разделов;
  • С помощью команды search -f /путь_к_файлу можем найти раздел, на котором лежит определённый файл;
  • Если к команде ls добавить раздел ls (hd0,gpt2), то получим информацию о нём;
  • А если после раздела поставить слеш ls (hd0,gpt2)/, то увидим содержимое этого раздела;
  • Ну и в конце концов можем посмотреть содержимое определённого каталога ls (hd0,gpt2)/boot/grub/;
  • Если вы хотите перезагрузить систему, то выполните reboot.

GRUB 2. Работа с командной строкой

GRUB 2. Работа с командной строкой

Если на компьютере установлено несколько систем, то меню GRUB 2 выглядит следующим образом:

Меню GRUB 2 с несколькими системами

Меню GRUB 2 с несколькими системами

Как установить 2-е системы на один компьютер и при этом использовать загрузчик GRUB 2 мы разберём в следующей статье.

Каталог со скриптами (/etc/grub.d/)

В каталоге /etc/grub.d/ находятся специальные скрипты написанные на языке сценариев “sh“. Они выполняются при обновлении GRUB 2, то есть когда мы выполняем команду “update-grub2“.

Скрипты для Debian 11:

alex@deb:~$ ls /etc/grub.d/
00_header  05_debian_theme  10_linux  20_linux_xen  30_os-prober  30_uefi-firmware  40_custom  41_custom  README

Скрипты для Ubuntu 22.04:

alex@ubu:~$ ls /etc/grub.d/
00_header  05_debian_theme  10_linux  10_linux_zfs  20_linux_xen  30_os-prober  30_uefi-firmware  35_fwupd  40_custom  41_custom  README

Рассмотрим предназначения некоторых из них:

  • 10_linux” – отвечает за поиск ядер linux;
  • 30_os-prober” – отвечает за поиск других ос;
  • 40_custom” – позволяет добавлять свои пункты загрузки.

Сводка

Загрузчик GRUB 2

Имя статьи

Загрузчик GRUB 2

Описание

В этой статье рассмотрим подробнее самый популярный загрузчик для операционных систем Linux, а именно GRUB 2

Listen to this article

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

Включение устройства

Программа GRUB — это так называемый загрузчик. Она запускается первой после включения компьютера и, как правило, отображает меню, в котором можно выбрать для загрузки операционную систему Windows или какой-либо дистрибутив Linux. В большинстве современных дистрибутивов применяется версия GRUB 2. В старых, особенно корпоративных, установках Linux, вы наверняка столкнетесь с устаревшей, не поддерживаемой уже несколько лет версией GRUB 0.97. Поэтому я кратко расскажу и об этой версии.

Аббревиатура GRUB означает Grand Unified Bootloader (Грандиозный унифици- рованный загрузчик). Программа запускает Linux и вообще очень полезна для работы с параллельными установками Windows и Linux, так как непосредственно после запуска компьютера позволяет выбрать для работы желаемую операционную систему.

Основы

Версии GRUB. C июня 2012 года используется версия GRUB 2.0. Разработка этой версии велась еще с 2005 года. Некоторые дистрибутивы не стали дожидаться полной доработки GRUB 2 и уже давно применяют новый загрузчик. Например, Ubuntu использует GRUB 2, начиная с версии 9.10, а Debian — с версии 6. Дистрибутив openSUSE перешел на GRUB 2 только в версии 12.2. Особый случай представляет дистрибутив Fedora: его разработчики перешли на GRUB 2 уже в 16 версии, но только в компьютерах, работающих с BIOS. Если же инсталлировать Fedora 16 или 17 с EFI, то вместе с дистрибутивом будет установлена EFI-сов­местимая версия GRUB 0.97!

Итак, версия, применявшаяся до GRUB 2, имеет название GRUB 0.97 legacy (устаревшая). Примечание «устаревшая» указывает на то, что эта версия не развивается уже несколько лет и ее технической поддержкой никто не занимается. А число 0,97 не оставляет сомнений, что данная разработка не достигла и никогда не достигнет уровня GRUB 1.0. Несмотря на это, производители многих дистрибутивов неоднократно применяли GRUB 0.97 legacy по собственному усмотрению, в результате реализация некоторых функций GRUB отличается от дистрибутива к дистрибутиву!

Хотя в новых дистрибутивах применяется преимущественно GRUB 2, GRUB 0.97 по-прежнему широко распространен. Во-первых, как уже было сказано, эта программа встретится вам в старых версиях Linux, во-вторых, в корпоративных дистрибутивах GRUB 0.97 сохраняет свои позиции основного загрузчика (например, в RHEL он задействуется вплоть до версии 6.3).

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

  • GRUB 2 совместим с менеджером логических томов и программным RAID. Таким образом, в установках LVM и RAID больше не требуется загрузочный раздел /boot.
  • GRUB 2 совместим с файловыми системами ext4 и btrfs.
  • GRUB 2 позволяет запрашивать разделы диска по уникальному идентификатору файловой системы.
  • GRUB 2 совместим с системами, альтернативными BIOS, — EFI и coreboot (ранее называлась LinuxBIOS).
  • GRUB 2 позволяет отображать в записях меню любые символы Unicode.

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

Конфигурация GRUB стала значительно сложнее. Конфигурационный файл grub.cfg является результатом исполнения различных конфигурационных сценариев. grub.cfg может и сам содержать сценарный код на shell-подобном языке либо на языке программирования LUA.

Компоненты и пакеты. Файлы, необходимые для работы GRUB 2, как правило, распределены по нескольким пакетам. Так, в Debian и Ubuntu в пакете grub-common содержатся различные платформозависимые конфигурационные файлы и команды, а в пакете grub-pc находятся файлы, специфичные для BIOS. Для компьютеров, использующих вместо BIOS EFI, coreboot и другие программы, вместо grub-pc требуются, соответственно, пакеты grub-efi-amd64, grub-efi-ia32 или grub-coreboot. Наконец, в пакете grub-rescue-pc имеется IMG-файл и файл образа диска, необхо- димые для того, чтобы сохранить систему аварийного восстановления GRUB на флешке или CD-диске. Таким образом, в критическом случае вы сможете запустить GRUB с такой флешки или диска, а потом запустить систему, вручную вводя команды GRUB или изменяя предусмотренные записи меню.

В Fedora удалось избежать такого разброса программ по разным пакетам. В пакете grub2 содержится GRUB для компьютеров, работающих с BIOS, а в пакете grub2-efi — версия, совместимая с EFI. Обновлением конфигурации GRUB (этот процесс необходимо выполнять после появления обновлений для ядра) занимаются Fedota-специфичные сценарии из пакета grubby.

Независимо от конкретного дистрибутива, для работы GRUB 2 требуется предварительно установить пакет os-prober. Одноименная команда просматривает все доступные разделы дисков на наличие операционных систем. Результат выполнения os-prober интегрируется в автоматически создаваемое меню GRUB.

Отличия, специфичные для конкретных дистрибутивов. К сожалению, в различных дистрибутивах GRUB 2 не только распределяется по разным пакетам, но и работает на основе не совсем идентичных конфигурационных файлов и механизмов. В этой главе описываются Debian версии 6 и выше, Fedora версии 16 и выше, openSUSE версии 12.2 и выше и Ubuntu версии 9.10 и выше.

Документация. Официальная документация по GRUB выдается по запросу справочной командой info grub.

Загрузка системы в BIOS

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

После включения компьютера с BIOS инициализируется базовая система ввода-вывода. В ходе этого процесса на экране обычно отображается несколько системных сообщений — например, каким объемом памяти располагает компьютер. Затем BIOS загружает содержимое первого сектора первого жесткого диска в память и выполняет код этого сектора. Такой специальный сектор называется MBR (Master Boot Record, главная загрузочная запись).

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

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

Альтернативный метод заключается в том, чтобы не трогать MBR и установить GRUB в загрузочном секторе системного раздела Linux, пометив этот раздел как «активный». Такой метод хотя и не противоречит правилам MBR, менее надежен и поэтому почти не используется.

Основная загрузочная запись имеет размер всего 512 Мбайт, поэтому загрузчик не сможет полностью поместиться в MBR. Чтобы можно было обойти это ограничение, MBR может вместить ровно такой фрагмент кода, который позволит вам запустить оставшуюся часть загрузчика уже с жесткого диска. Соответственно, код GRUB подразделяется на две или три части: stage1 находится в основной загрузочной записи и предназначена для того, чтобы загрузить первые сектора части stage1_5 или stage2. В части stage1_5 содержится дополнительный код, обеспечивающий доступ к файлам различных файловых систем. Наконец, в stage2 содержится сам загрузчик.

Когда запустится загрузчик, появится меню, в котором будут на выбор представлены все операционные системы, определенные в процессе конфигурации GRUB (обычно это Windows и Linux). Теперь с помощью клавиш управления курсором можно выбрать интересующую вас операционную систему и запустить ее, нажав Enter. Часто GRUB настроен так, чтобы по истечении определенного промежутка времени операционная система загружалась автоматически.

Запуск Linux. Если вы определяете в загрузчике, что необходимо запустить Linux, то загрузчик должен поместить в оперативную память файл ядра Linux и запустить этот файл. Обычно файл ядра Linux называется /boot/vmlinuz (последняя буква z указывает на то, что ядро архивировано). Иными словами, загрузчик должен быть в состоянии загрузить из файловой системы весь указанный файл.

Параметры ядра. Обычно ядру сообщается несколько параметров. Как минимум один параметр передается обязательно: имя устройства системного раздела (например, root=/dev/sdb13). Это делается для того, чтобы ядро знало, какой из разделов является системным. Когда ядро запустится, управление будет передано программе Linux /sbin/init, отвечающей за инициализацию системы Linux. Например, она отвечает за запуск сетевых служб.

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

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

Файл Initrd. Решение заключается в том, что GRUB должен загружать не только ядро, но и файл Initrd. Это специальный файл, в котором содержатся все модули ядра, необходимые для запуска системы. Ядро временно использует этот файл как псевдодиск, то есть оно может загрузить все модули сразу же после запуска псевдодиска (сокращение Initrd означает Initial RAM Disk — диск в оперативной памяти для начальной инициализации).

Обычно файл Initrd называется /boot/initrd или /boot/initrd.gz. В большинстве дистрибутивов имеются инструменты, позволяющие создать такой файл Initrd, который бы подошел к применяемому аппаратному обеспечению и к файловой системе, которая находится в системном разделе (команда mkinitrd).

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

Конфигурация GRUB протекает по-разному в зависимости от версии GRUB. В GRUB 0.97 применяется центральный конфигурационный файл /boot/grub/menu.lst. В GRUB 2 есть целая коллекция конфигурационных сценариев, находящихся в каталоге /etc/grub.d/. Благодаря исполнению этих сценариев создается сам конфигурационный файл GRUB 2 /boot/grub/grub.cfg.

Запуск системы с EFI

В Apple система EFI (Extensible Firmware, расширяемый интерфейс между операционной системой и микропрограммами) применяется уже много лет, но на рынке ПК с другими системами постепенный отказ от BIOS продлился значительно дольше.

EFI и GPT. Даже притом, что EFI заново разрабатывался практически с нуля, выгоды для конечного пользователя остаются довольно ограниченными. Но не может не радовать, что теперь есть гигантские жесткие диски с таблицей секционирования GUID (GPT), совершенно не доставляющие проблем при работе. Не забывайте, что применение GPT не является обязательным, в том числе и на компьютерах с EFI! EFI нормально работает и с такими жесткими и твердотельными дисками, чья таблица секционирования сохранена в главной загрузочной записи (MBR). Лично я считаю, что использовать GPT предпочтительно и на жестких и твердотельных дисках, которые не превышают по размеру 2 Тбайт, поскольку такая таблица значительно упрощает весь процесс секционирования диска.

Параллельная установка. С введением EFI значительно изменился весь загрузочный процесс. В то время как BIOS в принципе предусматривал установку только одной операционной системы и при любой параллельной установке приходилось задействовать менеджер загрузок, EFI сам по себе поддерживает установку нескольких операционных систем. Каждая операционная система может сохранить собственный загрузчик в специально предусмотренном для этого сегменте диска. При запуске компьютера сначала происходит инициализация EFI, а потом автоматически запускается загрузчик той операционной системы, которая была задана по умолчанию. (Как правило, по умолчанию задается та операционная система, которая была установлена последней.) Если при запуске компьютера нажать специальное сочетание клавиш (к сожалению, оно не стандартизировано и варьируется в зависимости от производителя EFI и ПК), то EFI отобразит меню со всеми загрузчиками.

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

В сущности, GRUB с EFI совершенно не нужен. Ядро Linux содержит все необходимые функции, позволяющие EFI-системе запускать Linux напрямую, то есть, минуя GRUB или другие загрузчики. Но на практике этот вариант пока не играет роли: GRUB или другие загрузчики позволяют выбирать одну из нескольких установленных версий ядра, передавать параметры ядра, изменять параметры загрузки и т.д. При запуске Linux непосредственно из EFI вся эта гибкость теряется. EFI и GRUB. Чтобы EFI и GRUB правильно взаимодействовали, нужно наст­роить специальную версию EFI, рассчитанную на работу с GRUB. Установочные программы распространенных дистрибутивов решают эту задачу автоматически. В любом случае такое взаимодействие предполагает, что установочная программа должна выполняться в EFI-режиме! (Многие варианты реализации EFI совместимы с BIOS. При запуске той или иной установки Linux решающее значение имеет то, в каком режиме происходит данная установка. На некоторых компьютерах один установочный носитель — то есть DVD или флешка — в меню EFI отображается как два: одно устройство в BIOS-режиме и одно в EFI-режиме. Вы должны выбирать именно ту запись, которая относится к EFI!)

Раздел EFI. На компьютерах с EFI код GRUB записывается не в главную загрузочную запись, а в каталог раздела с EFI. Это особый раздел диска, в котором применяется файловая система VFAT. Такой раздел должен быть помечен специальным идентификатором: (MBR) или (C12A7328-F81F-11D2-BA4B-00A0C93EC93B) (GPT).

Microsoft рекомендует создавать EFI-раздел как первый раздел жесткого диска, хотя стандарт EFI этого и не требует. Данный раздел не должен быть очень большим, вполне достаточно будет 100–200 Мбайт (в тех дистрибутивах, которые я протестировал, загрузчик EFI в каждом из случаев требовал менее 1 Мбайт. Windows 8 требует значительно больше места — ориентировочно порядка 25 Мбайт).

Раздел с EFI должен быть подключен к файловой системе Linux в каталоге /boot/efi! Если при установке Linux вы выполняете секционирование диска вручную, то об этом подключении должны позаботиться вы сами.

Ядро, файл Initrd. Если GRUB уже работает, то запуск Linux протекает точно так же, как и на компьютере с BIOS: GRUB загружает ядро и запускает его, и в ходе запуска происходит передача файла Initrd и параметров ядра.

Файлы Initrd

Ядро Linux содержит разнообразные модули. Многие дополнительные функции —  такие как управление SCSI-картой, доступ к определенным файловым системам, массивам RAID или сегментам LVM — обеспечиваются не самим ядром, а его модулями. Но при запуске системы это доставляет определенные проблемы. Действительно, как ядру загрузить модуль, если оно даже не имеет возможности получить доступ к файловой системе. Поэтому модули, которые требуются непосредственно для запуска системы, помещаются в диск оперативной памяти для начальной инициализации (Initial RAM Disk, сокращенно Initrd). Соответствующий Initrd-файл передает GRUB ядру (обратите внимание на ключевое слово initrd в конфигурационном файле GRUB).

Ядро и файл Initrd обычно находятся в каталоге /boot, но название самого Initrd— файла различается в зависимости от дистрибутива. В принципе, если применяется GRUB 0.97, то каталог /boot часто находится в собственном сегменте диска, вне системы RAID или LVM, поскольку GRUB 0.97 может обращаться только к обычным сегментам жесткого диска. В этом отношении GRUB 2 отличается значительно большей гибкостью.

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

Строго говоря, название «Initrd-файл» в большинстве современных дистрибутивов уже неприменимо. На самом деле мы работаем с initramfs -файлами, организация которых будет описана немного ниже. Но поскольку и в параметрах GRUB, и в различных командах для создания файлов используется понятие initrd, а само ядро правильно интерпретирует файл, несмотря на неверное название, я тоже не буду отступать от привычного названия Initrd — пусть оно и заведомо неверное.

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

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

Update-initramfs (Debian, Ubuntu). В Debian и Ubuntu для создания Initrd-файлов и их последующего администрирования предусмотрен сценарий updateinitramfs. В простейшем случае для обновления Initrd-файла новейшей установ-ленной версии ядра вы просто задаете параметр -u. Но если вы хотите обновить Initrd-файл не до новейшей, а до какой-то другой версии ядра, то укажите номер версии с помощью параметра -k. Параметр -k all обновляет Initrd-файлы для всех установленных версий ядра.

С помощью параметров -c или -d сценарий update-initramfs создает новый или удаляет имеющийся Initrd-файл. В таком случае обязательно требуется указать версию ядра с помощью параметра -k.

root# update-initramfs -c -k 3.5-13-generic

update-initramfs: Generating /boot/initrd.img-3.5-13-generic

«За кулисами» сценарий update-initramfs обращается для создания Initrd-файлов к сценарию mkinitramfs. Базовая конфигурация происходит в файле /etc/initramfstools/initramfs.conf, Кроме того, к Initrd-файлу добавляются все модули, перечисленные в каталоге /etc/initramfs-tools/modules (один модуль на строку).

В стандартной конфигурации (с MODULES=most в initramfs.conf) сценарий mkinitramfs создает довольно крупные Initrd-файлы, содержащие многочисленные дополнительные модули. В частности, здесь находятся важнейшие файловые системы Linux, драйверы для USB, SCSI и SATA, а также сетевые и NFS-драйверы.

При непосредственном вызове mkinitramfs (это приходится делать редко), нужно как минимум сообщить имя нового Initrd-файла (параметр -o). Если Initrd-файл должен быть создан не для актуальной версии ядра, то дополнительно укажите желаемую версию:

root# mkinitramfs -o myinitrd 3.5-13-generic

Dracut (Fedora, Red Hat). Fedora в версии 12 и выше и Red Hat Enterprise Linux в версии 6 и выше используют для создания Initrd-файла программу dracut. В более ранних версиях Fedora и RHEL вместо этого применяется программа mkinitrd. dracut автоматически выполняется при каждом обновлении ядра. Initrd-файлы, создаваемые с помощью dracut, содержат меньше дистрибутиво-специфичного кода, чем ранее, и в большей мере опираются на информацию из системы udev.

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

Команда dracut учитывает настройки, указанные в файле /etc/dracut.conf, и встраивает в Initrd-файл модули из каталога /usr/share/dracut/modules.d. Чтобы создать Initrd-файл для самостоятельно скомпилированного ядра версии 3.5.3 (файл /boot/vmlinuz-3.5.3), выполните следующую команду:

root# dracut /boot/initrd-3.5.3 3.5.3

Mkinitrd (SUSE). В дистрибутивах SUSE Initrd-файлы создаются с помощью команды mkinitrd. Как правило, этой команде не требуется передавать никаких параметров. Команда mkinitrd автоматически создает Initrd-файлы для всех файлов ядра, которые находит в каталоге /boot. Новые Initrd-файлы получают имя вида /boot/initrd-nnn, где nnn — версия ядра. Кроме того, mkinitrd создает ссылку, которая указывает c /boot/initrd на Initrd-файл, соответствующий vmlinuz.

Если вы хотите создать только один определенный Initrd-файл, то с помощью параметров –k и -i можете задать, соответственно, файл ядра и файл Initrd (по умолчанию, это делается в каталоге /boot). Команда mkinitrd интерпретирует переменную INITRD_MODULES из файла /etc/sysconfig/kernel. В этом файле содержатся все модули, необходимые для загрузки, он может иметь примерно следующий вид:

# в /etc/sysconfig/kernel

INITRD_MODULES=»thermal ahci ata_piix ata_generic processor fan»

Дополнительные модули указываются с помощью -m. Более подробная информация по mkinitrd выводится с помощью параметра -h, справки man mkinitrd, а также в исходном коде самого сценария (файл /sbin/mkinitrd).

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

Просмотр Initrd-файла. В версии ядра 2.6 и выше Initrd-файлы внутрисистемно представлены как файлы initramfs. Initrd-файл — это сжатый файл-архив (cpio), состоящий из различных каталогов и файлов. Если вы хотите просмотреть содержимое этого архива, сделайте так:

root# cd /boot

root# cp initrd-n.n initrd-test.gz

root# gunzip initrd-test

root# mkdir test

root# cd test

root# cpio -i < ../initrd-test

root# ls -lR

Базовая конфигурация

Grub.cfg. Меню GRUB определяется в файле grub.cfg, который в зависимости от дистрибутива может находиться в разных местах:

/boot/grub/grub.cfg — файл меню GRUB в Debian и Ubuntu;

/boot/grub2/grub.cfg — файл меню GRUB в Fedora и openSUSE версия 12.2 и выше;

/etc/grub2.cfg — ссылка на /boot/grub2/grub.cfg в Fedora и openSUSE.

/etc/grub.d/. В принципе возможность вручную вносить изменения в файл grub.cfg не предусмотрена. Поэтому права доступа к этому файлу указаны как «только для чтения». Если вы хотите изменить меню GRUB, то измените лежащие в его основе конфигурационные файлы. Не может не радовать, что в Debian, Ubuntu, openSUSE и Fedora эти файлы находятся в одном и том же месте:

/etc/grub.d/* — общие конфигурационные файлы GRUB;

/etc/default/grub — дополнения, специфичные для конкретных дистрибутивов.

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

root# update-grub (Debian/Ubuntu)

root# grub2-mkconfig -o /boot/grub2/grub.cfg (Fedora)

Пример grub.cfg. Результирующий файл grub.cfg выглядит наподобие приведенного ниже примера. Этот листинг автоматически создан в Ubuntu 12.10 с помощью grub.cfg и сокращен ради экономии места. Кстати, пусть вас не смущает строка insmod ext2: этот модуль GRUB отвечает за работу со всеми файловыми системами ext, в том числе с ext3 и ext4. Детали синтаксиса grub.cfg будут объяснены ниже в этом разделе:

# Пример /boot/grub/grub.cfg

# из /etc/grub.d/00_header

# Управление переменными

if [ -s $prefix/grubenv ]; then

set have_grubenv=true

load_env

fi

set default=»0″

if [ «${prev_saved_entry}» ]; then

set saved_entry=»${prev_saved_entry}»

save_env saved_entry

set prev_saved_entry=

save_env prev_saved_entry

set boot_once=true

fi

# Определение различных функций

function savedefault { … }

function recordfail { … }

function load_video { … }

# Выбор раздела с установочными файлами GRUB

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)’

search —no-floppy —fs-uuid —set=root d45161e0-a9dd-421b-90e3-dc01887b140b

if loadfont /usr/share/grub/unicode.pf2 ; then

set gfxmode=auto

load_video

insmod gfxterm

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)’

search —no-floppy —fs-uuid —set=root d45161e0-a9dd-421b-90e3-

dc01887b140b

set locale_dir=($root)/boot/grub/locale

set lang=de_AT

insmod gettext

fi

terminal_output gfxterm

if [ «${recordfail}» = 1 ]; then

set timeout=-1

else

set timeout=10

fi

# из /etc/grub.d/10_linux

# Запуск Ubuntu

menuentry ‘Ubuntu, mit Linux 3.5.0-2-generic’ … {

recordfail

gfxmode $linux_gfx_mode

insmod gzio

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)’

search —no-floppy —fs-uuid

—set=root 474ef599-7665-4fe0-a4fd-97df765db80e

linux boot/vmlinuz-3.5.0-2-generic root=UUID=474e… ro quiet splash

initrd /boot/initrd.img-3.5.0-2-generic

}

menuentry ‘Ubuntu, с Linux 3.5.0-2-generic (режим восстановления)’ … {

linux /boot/vmlinuz-3.5.0-2-generic root=UUID=474e…

ro recovery nomodeset

}

# из /etc/grub.d/20_memtest86+

# Тест памяти

menuentry «Memory test (memtest86+)» {

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)’

search —no-floppy —fs-uuid —set=root d45161e0-a9dd-421b-90e3-

dc01887b140b

linux16 /boot/memtest86+.bin

}

# из /etc/grub.d/30_os-prober

# Запуск Windows

menuentry «Windows (loader) (on /dev/sda1)» {

insmod ntfs

set root='(hd0,1)’

search —no-floppy —fs-uuid —set 2ca80f2ba80ef35e

chainloader +1

}

Создание grub.cfg заново. В Debian и Ubuntu команда update-grub создает новую версию файла grub.cfg. В Fedora и openSUSE в аналогичном случае выполняется команда grub2-mkconfig -o /boot/grub2/grub.cfg. (Сценарий update-grub, специфичный для Debian/Ubuntu, так или иначе, содержит только эту команду.)

grub[2]-mkconfig интерпретирует описанные ниже конфигурационные файлы или сценарии. При этом, в частности в каталоге /boot меню GRUB, создаются ­записи для всех файлов ядра. Кроме того, просматриваются все доступные разделы жесткого диска. Если на диске есть и другие операционные системы, то записи в меню GRUB создаются и для них. Поэтому выполнение update-grub на компьютере с большим количеством сегментов на диске может длиться достаточно долго.

grub[2]-mkconfig автоматически выполняется при каждом обновлении ядра и удостоверяет, что в меню GRUB содержится новейшая версия ядра Linux.

/etc/default/grub. в файле /etc/default/grub содержатся некоторые глобальные настройки GRUB. Не забудьте, что вносимые здесь изменения вступают в силу лишь тогда, когда вы заново сгенерируете grub.cfg! В Ubuntu конфигурационный файл содержит следующие настройки:

# Файл /etc/default/grub

GRUB_DEFAULT=0

GRUB_HIDDEN_TIMEOUT=0

GRUB_HIDDEN_TIMEOUT_QUIET=true

GRUB_TIMEOUT=10

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

GRUB_CMDLINE_LINUX_DEFAULT=»quiet splash»

GRUB_CMDLINE_LINUX=»»

# GRUB_TERMINAL=console

# GRUB_GFXMODE=640×480

# GRUB_DISABLE_LINUX_UUID=true

# GRUB_DISABLE_RECOVERY=»true»

# GRUB_INIT_TUNE=»480 440 1″

Стандартная конфигурация в Fedora выглядит так:

GRUB_TIMEOUT=5

GRUB_DISTRIBUTOR=»Fedora»

GRUB_DEFAULT=saved

GRUB_CMDLINE_LINUX=»rd.md=0 rd.dm=0 quiet SYSFONT=latarcyrheb-sun16 rhgb

rd.lvm.lv=vg_fedora16vbox/lv_root rd.luks=0 LANG=de_DE.UTF-8

rd.lvm.lv=vg_fedora16vbox/lv_swap KEYTABLE=de-latin1-nodeadkeys»

Далее объясняются значения многочисленных параметров.

Переменная GRUB_DEFAULT указывает, какая запись меню GRUB должна выбираться по умолчанию. Обратите внимание на то, что количество записей может изменяться после каждого вызова update-grub и особенно после каждого обновления ядра. Поэтому такая настройка, как GRUB_DEFAULT=5, обычно не подходит.

Настройка saved означает, что будет активизирована запись меню, которая использовалась последней. Правда, это работает лишь при условии, что файлы GRUB расположены в обычном разделе диска! Если же используется LVM или RAID, то после выбора из меню GRUB не сможет сохранять каких-либо переменных окружения.

Вы также можете присвоить GRUB_DEFAULT последовательность символов (строку) menuentry, где menuentry — желаемая строка меню. Но при этом строго соблюдайте порядок записи данной строки (в том числе все номера версий и устройств, которые могут находиться в записи меню).

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

В Ubuntu значение параметра GRUB_HIDDEN_TIMEOUT=0 приводит к тому, что GRUB сразу запускает операционную систему. Чтобы вмешаться в процесс загрузки, нужно нажать Shift сразу же после запуска компьютера. Если на компьютере установлено несколько операционных систем, то GRUB игнорирует настройку GRUB_HIDDEN_TIMEOUT и сразу отображает меню.

Переменная GRUB_HIDDEN_TIMEOUT_QUIET=true отменяет показ счетчика с обратным отсчетом в период ожидания, заданный в GRUB_HIDDEN_TIMEOUT . Если вы хотите, чтобы меню GRUB отображалось (в том числе и тогда, когда на компьютере установлена только Ubuntu), закомментируйте строки GRUB_HIDDEN_TIMEOUT=… и GRUB_HIDDEN-TIMEOUT_QUIET=… (поставьте перед каждой из них символ комментария #).

Переменная GRUB_TIMEOUT=n указывает, в течение какого количества секунд GRUB дожидается выбора одной из записей меню. Если за это время не поступит ни- какого пользовательского ввода, GRUB запустит уже выбранную операционную систему. Указанное здесь время учитывается лишь в том случае, если меню GRUB вообще появляется на экране, то есть, если на компьютере установлено несколько операционных систем или пользователь нажал клавишу Shift во время периода ожидания, заданного в GRUB_HIDDEN_TIMEOUT.

Переменная GRUB_DISTRIBUTOR интерпретируется сценарием 10_linux (см. ниже), в ней содержится имя текущего дистрибутива (например, Fedora или Ubuntu).

Значения переменных GRUB_CMDLINE_LINUX и GRUB_CMDLINE_LINUX_DEFAULT также учитываются сценарием 10_linux. В них указывается, какие параметры должны быть сообщены ядру. Параметры GRUB_CMDLINE_LINUX действуют при каждом запуске, а параметры GRUB_CMDLINE_LINUX_DEFAULT дополнительно применяются при запуске, происходящем по умолчанию (но не в режиме восстановления).

По умолчанию меню GRUB отображается в графическом режиме с разрешением 640 × 480 пикселов. Если вы хотите работать с более высоким разрешением,его можно задать в переменной GRUB_GFXMODE (разумеется, в пределах возможностей вашей графической карты). Если вы желаете вообще отказаться от графического режима, активизируйте специально предусмотренную для этого настройку GRUB_TERMINAL=console. Обе переменные интерпретируются сценарием 00_header. При стандартных настройках значительные различия между текстовым и графическим режимами отсутствуют, но только в графическом режиме могут отображаться символы Unicode.

Как правило, GRUB передает ядру, которое предполагается запустить, корневой каталог в качестве UUID-номера. Если вы, напротив, предпочитаете указывать номер устройства (например, /dev/sda1), активизируйте строку GRUB_DISABLE_LINUX_UUID=true. Эта настройка влияет только на запуск активного дистрибутива (сценарий 10_linux), но не на другие дистрибутивы.

update-grub или grub-mkconfig создают, как правило, записи меню и для запуска Linux в режиме восстановления. При этом Linux запускается в однопользовательском режиме, без отображения экрана-заставки. Если вы хотите отказаться от записей, необходимых для восстановления, активизируйте строку GRUB_DISABLE_RECOVERY=»true».

С помощью GRUB_INIT_TUNE = можно сопроводить запуск GRUB звуковым сигналом.

Автоматическое создание файла grub.cfg. Основная идея конфигурации GRUB заключается в том, что сами вы задаете лишь ключевые данные этой конфигурации. Готовый конфигурационный файл grub.cfg создается специальным сценарием с учетом указанных вами параметров. Здесь важно подчеркнуть, что сценарии GRUB пытаются опознать все операционные системы, установленные на компьютере (Linux, Windows и т. д.) и сделать в файле grub.cfg соответствующие записи. Это же касается и тех операционных систем, которые могут быть позже добавлены на компьютер.

Для этого в каталоге /etc/grub.d содержатся исполняемые скриптовые (сценарные) файлы (табл.). Когда следует создать новую версию grub.cfg, программа update-grub по порядку выполняет все сценарии, содержащиеся в grub.d. Результат (стандартный вывод) сценариев сохраняется в grub.cfg. Но из-за такого метода работы конфигурационные файлы получаются довольно путаными: в коде то и дело встречаются команды вида cat » EOF, переадресующие в стандартный вывод все строки вплоть до аббревиатуры EOF. Сами эти строки часто содержат сценарный код, который интерпретируется GRUB только при запуске системы.

Два наиболее интересных сценария — 10_linux и 30_os-prober. Сценарий 10_linux выдает для каждой версии ядра, находящейся в каталоге /boot/, две записи меню: одну для обычного запуска и одну для восстановительного запуска в однопользовательском режиме, без экрана-заставки. Записи меню сортируются по номеру версии, причем в начале списка идет самая новая версия.

30_os-prober вызывает сценарий os-prober. Этот сценарий выводит список всех операционных систем (Linux, Windows, Mac OS X), расположенных на всех доступных сегментах жесткого диска. Для каждой из этих операционных систем создается своя запись в меню, причем, в случае с дистрибутивами Linux, может быть применен вариант конфигурации GRUB, который уже задан. При этом вызываются многочисленные сценарии, входящие в состав пакета os-prober.

Во время моих тестов распознавание различных дистрибутивов Linux и версий Windows на компьютерах BIOS функционировало великолепно. С EFI все было гораздо сложнее. Операционные системы, запускаемые через EFI, не находят входа в меню GRUB. В общем-то, в этом нет ничего удивительного: вы же можете выбрать операционную систему в меню EFI, зачем же GRUB решать ту же задачу? Но, по моему опыту, интеграция с меню GRUB все же является желательной. На многих компьютерах меню EFI отображается именно в тех случаях, когда при запуске компьютера в определенный момент времени нажато нужное сочетание клавиш. Я об этом не раз забывал и оказывался в операционной системе, в которую совершенно не собирался попадать! В автоматическом меню GRUB ошибку допустить намного сложнее.

Самостоятельное внесение дополнений в grub.cfg. Если вы хотите дополнить grub.cfg собственными записями, добавьте в каталог grub.d свои сценарии. Эти сценарии выполняются в том порядке, который определяется их нумерацией (при одинаковом порядковом номере — в алфавитном порядке). Не забудьте поставить бит исполнения (Execute-Bit). Обратите внимание и на то, что в grub.cfg попадает не сам файл, а его результат (стандартный вывод)!

В файле шаблона 40_custom показан пример подобной работы. Здесь к файлу применяется команда tail (параметр $0). Благодаря параметру -n +3, файл выводится, начиная с третьей строки, первые две строки не отображаются.

#!/bin/sh

exec tail -n +3 $0

# в этом файле показан пример добавления собственных записей

В другом варианте показан пример 41_custom. Содержащийся здесь код без изменений переносится в grub.cfg и интерпретируется только к моменту запуска (то есть при отображении меню GRUB). В этот момент проверяется, существует ли файл /boot/grub/custom.cfg (Ubuntu) или /boot/grub2/custom.cfg (Fedora, openSUSE). Если он существует, то этот файл добавляется в конфигурацию GRUB. Поскольку source исполняется при выполнении GRUB, изменения в custom.cfg вступают в силу и не приходится дополнительно создавать конфигурационный файл GRUB grub.cfg.

#!/bin/sh

cat <<EOF

if [ -f $prefix/custom.cfg ]; then

source $prefix/custom.cfg;

fi

EOF

Синтаксис и внутренняя организация

Размеры статьи не позволяют привести здесь полное описание синтаксиса всех ключевых слов, допустимых для использования в grub.cfg. Поэтому ниже я рас- скажу лишь о важнейших ключевых словах, которые употребляются в примерах из этого раздела. Официальный учебник по GRUB (PDF-документ содержит более 100 страниц!) находится по адресу http://www.gnu.org/software/grub/manual/. Переменные. С помощью set varname=value осуществляется присваивание переменных. Для считывания переменных применяется запись вида $varname . При интерактивном выполнении команд GRUB команда echo $varname отображает содержимое переменной, а set возвращает все определенные переменные.

Некоторые переменные обладают, кроме того, особым значением. К ним относятся, например, default, timeout , color_xxx, menu_color_xxx и особенно root: прлюбом доступе к файлам автоматически происходит считывание раздела, определенного в root.

GRUB может долговременно сохранять переменные на время работы. Для этого сначала (в Linux) должен быть создан файл /boot/grub[2]/grub-editenv (по умолчанию в большинстве дистрибутивов он уже создан).

root# grub-editenv /boot/grub[2]/grubenv create

Теперь во время работы GRUB может с помощью save_env имяпеременной сохранить в этом файле переменную либо считывать переменные из этого файла с помощью load_env. Перед этим необходимо настроить root так, чтобы эта переменная указывала на раздел с файлом окружения. В Linux вы также можете считывать или изменять переменные GRUB с помощью grub-editenv.

Разделы. В GRUB существует собственная номенклатура для обозначения жестких дисков и содержащихся на них разделов (табл.). Но нумерация при этом не совпадает: первый жесткий диск имеет номер 0, а первый раздел — номер 1!

Перед номером раздела допускается ставить сокращенное обозначение, указывающее способ секционирования: msdos для носителей, чья таблица секционирования записана в главной учетной записи, gpt — для носителей, применяющих таблицу разбиения GUID. Таким образом могут получаться названия вида (hd0,msdos3) или (hd0,gpt2).

Работа с номерами UUID. В grub.cfg часто встречается следующая последовательность команд:

set root=(hd1,1)

search —no-floppy —fs-uuid —set 12345678…

Первая команда инициализирует переменную root. Вторая команда ищет файловую систему с указанным номером UUID. Если поиск оканчивается успехом, то GRUB, на основании значения параметра —set, сохраняет соответствующее имя раздела в переменной root.

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

Модули. С помощью insmod name GRUB загружает во время работы модули расширений с дополнительными функциями. GRUB ищет файлы модулей name.mod в каталоге /boot/grub[2], в разделе, указанном в переменной root. Следует в частности отметить важные модули part_msdos и part_gpt (считывание таблиц секционирования), ext2 (файловые системы ext2 и ext4), raid, raid5rec, raid6rec и mdraid (программные массивы RAID), lvm, gfxterm (графическая консоль), vbe (графическая система), а также jpeg, tga и png для считывания графических файлов.

Записи меню GRUB

Menuentry. Записи меню GRUB вводятся ключевым словом menuentry. Следующий за ним текст записывается в кавычках, поэтому в нем допускаются интернациональные символы.

Подменю. В версии GRUB 2.00 и выше поддерживаются подменю (меню второго порядка). В файле grub.cfg подменю определяются так:

submenu ‘Подменю’ {

menuentry ‘Запись 1’ { … }

menuentry ‘Запись 2’ { … }

}

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

Запуск Linux. Запись в меню GRUB 2, предназначенная для запуска Linux, в минимальном варианте выглядит примерно так:

menuentry «Linux» {

set root=(hd0,3)

linux /boot/vmlinuz-n.n.n root=… ro quiet splash

initrd /boot/initrd.img-n.n.n

}

set root указывает раздел, в котором находится ядро и Initrd-файл. Ключевые слова linux и initrd задают имена файлов относительно раздела диска. Указанные параметры передаются ядру. Обязательно требуются root для указания системного раздела и ro, чтобы доступ к системному разделу был открыт сразу только для чтения. Все остальные параметры специфичны для конкретных дистрибутивов. Вот примеры:

Debian 6 — root=/dev/xxx ro quiet ;

Fedora 17 — root=/dev/xxx ro rhgb quiet LANG=… SYSFONT=… KEYTABLE=… ;

openSUSE 12.2 — root=UUID=xxx resume=/dev/xxx splash=silent showopts video=nxn quiet ;

Ubuntu 12.10 — root=UUID=xxx ro quiet splash .

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

menuentry «Linux — Mit eigener Bootpartition» {

set root=(hd0,2)

linux /vmlinuz-n.n.n root=… ro quiet splash

initrd /initrd.img-n.n.n

}

Если раздел с ядром и Initrd-файлом входит в состав LVM-системы и/или программного массива RAID, то для работы потребуется загрузить соответствующие модули GRUB. В случае с RAID-5 и, соответственно, RAID-6 применяются модули raid5rec и raid6rec. В set root теперь можно указать системный раздел с помощью, соответственно, (lvname) и (mdn):

menuentry «Linux — Mit Software-RAID» {

insmod raid mdraid

set root=(md0)

linux /boot/vmlinuz-n.n.n root=… ro quiet splash

initrd /boot/initrd.img-n.n.n

}

menuentry «Linux — Mit LVM» {

insmod lvm

set root=(vg1-root)

linux /boot/vmlinuz-n.n.n root=… ro quiet splash

initrd /boot/initrd.img-n.n.n

}

menuentry «Linux — LVM auf RAID-5» {

insmod raid raid5rec mdraid lvm

set root=(vg1-root)

linux /boot/vmlinuz-n.n.n root=/dev/mapper/… ro quiet splash

initrd /boot/initrd.img-n.n.n

}

Если вы не хотите полагаться на номера устройств, вы можете также сами найти системный раздел в таблице UUID с помощью команды search. Если команда search сработает успешно, то GRUB-переменная root будет соответствующим образом изменена. Это работает и с LVM-, и с RAID-разделами, если предварительно загрузить нужные модули GRUB. В Ubuntu по умолчанию за set root следует подходящая команда search, позволяющая максимально снизить зависимость GRUB от номеров устройств.

menuentry » — настройка root-переменной Linux по UUID » {

set root=(hd0,3)

search —no-floppy —fs-uuid —set 12345678…

linux /boot/vmlinuz-n.n.n root=… ro quiet splash

initrd /boot/initrd.img-n.n.n

}

Запуск Windows. Для запуска Windows на компьютере с BIOS выберите с помощью set root системный раздел с Windows и запустите его загрузчик, используя chainloader +1. Обратите внимание на то, что Windows версии 7 и выше по умолчанию создает на диске два раздела: один загрузочный раздел размером около 100 Мбайт с файлами bootmgr и bootsect.bak и другой, значительно более крупный, системный раздел. В GRUB требуется указывать загрузочный раздел. Команда search остается опциональной. От drivemap, как правило, можно отказаться. Команда пытается «уверить» Windows в том, что система Windows расположена на первом жестком диске, даже если это совсем не так. Иногда требуется в первую очередь запускать именно Windows.

menuentry «Windows 7» {

set root=(hd0,1)

search —no-floppy —fs-uuid —set 12345678…

drivemap -s (hd0) $root

chainloader +1

}

О том, как запустить Windows на компьютере с EFI с помощью GRUB, рассказано в следующем разделе.

Ветвление и переход к работе с другим загрузчиком

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

Запуск загрузчика из другого раздела диска. Если вы установите на компьютере еще один загрузчик в стартовом секторе раздела, то в меню GRUB 2 можно перейти к работе с этим загрузчиком. В таком случае укажите этот раздел с помощью set root (или search) и выполните chainloader +1:

menuentry «GRUB in /dev/sdb7» {

set root=(hd1,7)

search —no-floppy —fs-uuid —set 12345678…

chainloader +1

}

В данном случае у меня возникли проблемы, когда я пытался ветвлением перейти в другой установленный экземпляр GRUB. Система выдавала сообщение об ошибке invalid signature (недействительная подпись). Частично справиться с этой проблемой удавалось, дополнительно указав параметр —force:

menuentry «GRUB2 in /dev/sdb7» {

set root=(hd1,7)

chainloader +1 —force

}

К сожалению, это тоже работает не всегда. Особенно сложно переходить с GRUB 2 на GRUB 0.97. В этом случае целесообразно вообще отказаться от set root и задать желаемый раздел непосредственно с помощью chainloader:

menuentry «GRUB 0.97 in /dev/sdb7» {

chainloader (hd1,7)+1 —force

}

Если в другом дистрибутиве также используется GRUB 2, то ключевое слово config — file позволяет загрузить конфигурационный файл GRUB grub.cfg этого дистрибутива:

menuentry «GRUB in /dev/sdb7» {

set root=(hd1,7)

search —no-floppy —fs-uuid —set 12345678…

configfile /boot/grub/grub.cfg

}

Ветвление для работы с загрузчиком EFI. На компьютерах с EFI можно прямо из GRUB запускать другой загрузчик EFI. В приведенных далее примерах предполагается, что раздел с EFI является первым разделом первого жесткого диска; если это не так, то нужно соответствующим образом откорректировать set root.

menuentry » Запуск загрузчика Windows (EFI)» {

insmod part_gpt

set root='(hd0,1)’

chainloader /EFI/Microsoft/Boot/bootmgfw.efi

}

menuentry «Запуск загрузчика Fedora (EFI)» {

insmod part_gpt

set root='(hd0,1)’

chainloader /EFI/redhat/grub.efi

}

menuentry «Запуск загрузчика Ubuntu (EFI)» {

insmod part_gpt

set root='(hd0,1)’

chainloader /EFI/ubuntu/grubx64.efi

}

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

root# find /boot/efi -name ‘*.efi’ | sort

/boot/efi/EFI/Boot/bootx64.efi

/boot/efi/EFI/Microsoft/Boot/bootmgfw.efi

/boot/efi/EFI/Microsoft/Boot/bootmgr.efi

/boot/efi/EFI/Microsoft/Boot/memtest.efi

/boot/efi/EFI/redhat/grub.efi

/boot/efi/EFI/ubuntu/grubx64.efi

Индивидуальная конфигурация

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

Деактивация os-probe. Если на жестком диске компьютера много разделов, то выполнение сценария 30_os-probe длится достаточно долго. Если данный сценарий вам не нужен (например, для запуска других дистрибутивов вы предпочитаете использовать самостоятельно определенные записи в меню GRUB), то добавьте в /etc/default/grub строку GRUB_DISABLE_OS_PROBER=true.

Фоновая графика. В качестве фона меню GRUB можно задать картинку. GRUB может работать с форматами JPG, PNG и TGA. Код, необходимый для интеграции фоновой картинки, в Debian и Ubuntu уже содержится в сценарии 05_debian_theme. Нужно всего лишь изменить три переменные и задать имя файла с вашим изображением, а также желаемые цвета для текста (рис.).

# в /etc/grub.d/05_debian_theme

WALLPAPER=»/boot/grub/myown.png»

COLOR_NORMAL=»white/black»

COLOR_HIGHLIGHT=»yellow/black»

Закрепление операционной системы по умолчанию. В файле /etc/default/grub можно закрепить номер определенной записи в меню GRUB. Операционная система, указанная под этой записью, будет запускаться автоматически. На практике пользы от этого немного. Если вы, например, хотите, чтобы по умолчанию запускалась система Windows XP, а в меню GRUB запись с Windows XP идет на десятом месте, то задайте параметр GRUB_DEFAULT=9 (отсчет начинается с нуля). Но не исключено, что после обновления ядра в меню GRUB появятся две дополнительные записи и ваша настройка станет неверной. Гораздо удобнее оставить параметр GRUB_DEFAULT=0, а желаемую запись меню GRUB разместить перед всеми остальными. Для этого лучше всего воспользоваться дополнительным сценарием в /etc/grub.d, причем имя файла должно начинаться с целого числа меньше 10. Возьмем следующие строки в качестве образца:

#!/bin/sh

exec tail -n +3 $0

# Файл /etc/grub.d/09_boot-windows-by-default

menuentry «Windows 7» {

set root=(hd0,1)

chainloader +1

}

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

GRUB_DEFAULT=’Windows 7 (loader) (on /dev/sda1)’

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

Установка вручную и первая помощь при работе с компьютерами с BIOS

Как правило, GRUB 2 правильно создается при установке вашего дистрибутива Linux. В дальнейшем вы, возможно, будете вносить изменения в конфигурацию GRUB, то есть в файл grub.cfg , но установкой GRUB как таковой заниматься больше не придется.

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

Установка вручную с помощью grub-install. Сценарий grub-install (в Fedora и openSUSE он называется grub2-install ) устанавливает загрузчик в первый сектор указанного жесткого или твердотельного диска (то есть в MBR и во все остальные сектора, которые находятся на диске до начала первого раздела). Как правило, в качестве единственного параметра вы передаете в данном случае имя устройства, соответствующее носителю данных. При этом допускается запись как по принципу Linux (например, /dev/sda ), так и по принципу GRUB (например, (hd0) ):

root# grub-install /dev/sda

Теоретически возможно выполнить установку и в стартовом секторе сегмента (это записывалось бы как grub-install/dev/sda3 или (hd0,3)), но этого не рекомендуется делать, если вы не работаете с GRUB 0.97. В стартовом секторе слишком мало места для внедрения всего кода GRUB, а при применении блок-списков система считается нестабильной. (Блок-список содержит информацию о том, в каких блоках с данными на жестком/твердотельном диске находится следующая часть GRUB-кода.) Если эти аргументы кажутся вам неубедительными, можете произвести принудительную установку с помощью параметра —force.

Особый случай: ПК с BIOS и GPT. Linux можно инсталлировать на жестком/ твердотельном диске, на котором находится таблица секционирования GUID, а сам диск установлен на компьютере с BIOS. (Что касается Windows, то эта операционная система, напротив, может быть установлена только на ПК с EFI, если на жестком или твердотельном диске содержится таблица секционирования GPT.) Так или иначе, в подобном особом случае в учебнике по GRUB рекомендуется выделять для установки GRUB собственный раздел размером около 1 Мбайт, снабженный флагом bios_grub. Этот раздел предусмотрен только для установки BIOS-совместимых загрузчиков.

Такой раздел bios_grub не нуждается в форматировании. До сих пор Fedora 16 остается единственным дистрибутивом, самостоятельно создающим такой раздел при автоматическом сегментировании жестких дисков с таблицей GPT (в версии 17 Fedora снова отказалась от того, чтобы автоматически создавать GPT на пустых жестких дисках).

Разумеется, раздел диска можно создать и вручную. Для этого поставьте флаг bios_grub с parted, заменив n на желаемый номер раздела:

root# parted /dev/sda set n bios_grub on

Когда при установке GRUB обнаруживает наличие раздела bios_grub , этот загрузчик, как обычно, устанавливает первую часть кода GRUB в главную загрузочную запись, а остальной код — в раздел, помеченный как bios_grub . Применять именно такой подход при установке GRUB на жестких дисках с GPT, конечно, необязательно. Но этот подход считается достаточно надежным вариантом, особенно если на компьютере установлены другие операционные системы (Windows). Но у этого метода есть и свой недостаток: если на компьютере существует такой раздел, то на машине становится невозможно параллельно инсталлировать несколько экземпляров GRUB-2, поскольку при каждой новой установке GRUB содержимое раздела bios_grub перезаписывается. Более подробно о GRUB и GPT рассказано здесь: http://www.gnu.org/software/grub/manual/html_node/BIOS-installation.html и http://www.wensley.org.uk/gpt .

Ремонт GRUB с помощью «живого диска» (на компьютерах с BIOS). Если при установке GRUB что-то пошло не так либо загрузчик был стерт при установке другой операционной системы, то GRUB нужно переустановить с «живого диска», на котором находятся инструменты с актуальными инструментами GRUB 2. После запуска системы перейдите в режим администратора (root) (в Ubuntu — sudo -s), подключите системный раздел, а также активные каталоги /dev, /proc и /sys к файловой системе, а потом выполните chroot. Возможно, после этого понадобится также подключить загрузочный раздел к новой root-файловой системе. Затем обновите конфигурацию GRUB и запишите GRUB в желаемое место с помощью grub[2]-install (обычно для этого используется главная загрузочная запись первого жесткого диска). Как обычно, в следующих командах необходимо заменить /dev/sdan вашими номерами устройств.

root# mkdir /syspart

root# mount /dev/sda2 /syspart (Системный раздел)

root# mount -o bind /dev /syspart/dev

root# mount -o bind /proc /syspart/proc

root# mount -o bind /sys /syspart/sys

root# chroot /syspart

root# mount /dev/sda1 /boot/efi (Раздел с EFI)

root# update-grub

root# grub-install

root# exit

Вручную вводим команды GRUB для запуска Linux

Если GRUB удается запустить, но после выбора Linux из меню GRUB саму операционную систему запустить не получается, то можно, нажав клавишу C, перейти в меню GRUB в интерактивный режим, а затем выполнить следующие команды:

grub> set root=(hd0,1)

grub> linux /vmlinuz root=/dev/sda1

grub> initrd /initrd.img

grub> boot

Вместо (hd0,1) и /dev/sda1 задайте имя вашего системного раздела с Linux. В большинстве дистрибутивов файлы /vmlinuz и /initrd.img указывают на новейшую версию ядра и файла Initrd. Эти файлы находятся в каталоге /boot. Если в вашем случае это не так, нужно точно задать местоположение ядра и Initrd-файла. GRUB обеспечивает при этом функцию автозавершения, оно выполняется клавишей Tab.

Изменение загрузочных записей и настроек EFI вручную (efibootmgr)

Откуда EFI известно, какие операционные системы установлены на компьютере и, соответственно, какие загрузочные записи должны отображаться? На материнских платах с EFI эта информация хранится в энергонезависимой памяти (NVRAM).

Всякий раз при установке новой операционной системы, после создания *.efi -файла в EFI-разделе, соответствующая запись сохраняется в энергонезависимой памяти.

В Linux можно считывать и изменять EFI-данные, сохраненные таким образом, с помощью команды efibootmgr. Данная команда предполагает, что в системе загружен модуль ядра efivars. Если это не так, то выполните modprobe efivars. Обратите внимание: модуль efivars можно применять лишь в том случае, когда Linux был загружен в режиме EFI (а не в режиме BIOS!). Для восстановительных работ используйте по возможности «живой диск» с Linux, который можно запускать в EFI-режиме.

Если команда efibootmgr выполняется без дополнительных параметров, то она выводит список загрузочных записей EFI, а также некоторых других параметров загрузчика EFI. Следующий вывод, например, означает, что на компьютере установлены Ubuntu, Fedora и Windows в EFI-режиме. При перезапуске по истечении времени ожидания (около одной секунды) автоматически запустится Ubuntu (BootCurrent). В период ожидания можно отобразить меню EFI с помощью сочетания клавиш, специфичного для конкретной материнской платы (на моем компьютере требуется нажать F8).

root# efibootmgr

BootCurrent: 0000

Timeout: 1 seconds

BootOrder: 0000,0005,0003,0001,0002

Boot0000* ubuntu

Boot0001* Hard Drive

Boot0002* CD/DVD-drive

Boot0003* Windows Boot Manager

Boot0005* Fedora

Если вы хотите после перезапуска один раз запустить Fedora, отметьте загрузочную запись этого дистрибутива параметром -n:

root# efibootmgr -n 5

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

root# efibootmgr -o 5

Следующая команда создает новую загрузочную запись EFI. Путь задается относительно раздела с EFI (то есть /boot/efi), при этом должен использоваться разделитель каталогов . Удваивать символ необходимо потому, что оболочка интерпретирует одиночный слэш как указатель специальных символов. С помощью параметра -L можно указать имя, которое должно отображаться в меню EFI.

root# efibootmgr -c -l \EFI\test\abc.efi -L abc

Разумеется, загрузочные записи можно снова удалять. Для этого нужно указать номер записи с параметром -b:

root# efibootmgr -b 6 -dw

Другие параметры команды efibootmgr описаны на странице справки man по этой команде.

——

Теперь установка Grub не вызовет у вас проблем. Мы разобрали не только как установить Grub2 в MBR но и в EFI. Кроме того, всю приведенную здесь информацию вы можете использовать для восстановления Grub. Так вы будете лучше понимать что происходит во время восстановления.


Если Вам понравилась статья — поделитесь с друзьями

2 915 просмотров

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

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

При первом сравнении 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». Рассмотрим их подробнее.

/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

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

Понравилась статья? Поделить с друзьями:
  • Как изменить grt том
  • Как изменить gpu на ноутбуке
  • Как изменить gpu memory
  • Как изменить gpt на mrb
  • Как изменить gpt на mbr через акронис