Перейти к содержанию

6.2 Настройка загрузчика (Configuring the Bootloader)

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

Как и во многих других аспектах Linux, здесь можно выбирать из различных загрузчиков. Однако для сдачи экзамена LPIC-1/Linux+ вам необходимо знать только два: GRUB Legacy и GRUB2. Поэтому в этой части главы мы подробно рассмотрим следующие темы:

  • Настройка GRUB Legacy
  • Настройка GRUB2

Начнём с GRUB Legacy.

Настройка GRUB Legacy (Configuring GRUB Legacy)

GRUB. Странное название для загрузчика! Аббревиатура GRUB звучит не очень привлекательно, не правда ли? Тем не менее как загрузчик GRUB великолепен. GRUB расшифровывается как GRand Unified Bootloader. GRUB — это загрузчик, который может загружать ядро Linux (а также ядро любой другой операционной системы) с жёсткого диска системы.

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

В этой части главы мы рассмотрим следующие темы:

  • Принцип работы GRUB Legacy
  • Установка GRUB Legacy
  • Настройка GRUB Legacy

Начнём с принципа работы GRUB Legacy.

Принцип работы GRUB Legacy (How GRUB Legacy Works)

Загрузчик GRUB Legacy разделён на отдельные части, называемые этапами (stages). К ним относятся следующие:

  • Этап 1 (Stage 1) Этот этап GRUB обычно хранится в MBR. Его единственная задача — указывать на расположение этапа 1.5 или этапа 2.
  • Этап 1.5 (Stage 1.5) Этот этап GRUB расположен в первых 30 КБ жёсткого диска сразу после MBR, но перед первым разделом. Этап 1.5 содержит все драйверы, необходимые для загрузки этапа 2.

Совет

Этап 1 может пропустить этап 1.5 и загрузить этап 2 напрямую, однако обычно он настроен на предварительную загрузку этапа 1.5.

  • Этап 2 (Stage 2) Этот этап GRUB хранится в разделе диска. Будучи загруженным этапом 1 или этапом 1.5, этап 2 выводит на экран графическое меню, позволяющее пользователю выбрать образ ядра для загрузки. Вы можете настроить GRUB с образом по умолчанию и значением таймаута. Если пользователь не выберет пункт меню в течение заданного времени, система автоматически загрузит образ ядра по умолчанию. Типичный вид меню GRUB показан на рис. 6-5.

Примечание

GRUB также поддерживает установку этапа 1 в загрузочный раздел.

Рис. 6-5. Меню загрузки GRUB.

Рис. 6-5. Меню загрузки GRUB.

Имея общее представление о принципе работы, перейдём к установке GRUB.

Установка GRUB Legacy (Installing GRUB Legacy)

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

Для первоначальной установки GRUB необходимо сначала убедиться, что пакеты grub установлены в системе. На rpm-based дистрибутивах это можно проверить, введя rpm -q grub в приглашении командной строки, как показано ниже:

fs2:~ # rpm -q grub
grub-0.97-171.1.x86_64

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

Чтобы установить сам загрузчик GRUB, введите grub-install устройство в приглашении командной строки. Параметр устройство — это имя устройства, в чью MBR нужно записать этап 1. Например, чтобы установить этап 1 GRUB в MBR первого жёсткого диска системы, следует ввести grub-install /dev/sda, как показано в данном примере:

fs2:~ # grub-install /dev/sda
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script 'grub-install'.

(fd0) /dev/fd0
(hd0) /dev/sda

После установки GRUB можно приступать к его настройке. Рассмотрим, как это делается.

Настройка GRUB (Configuring GRUB)

Для настройки GRUB необходимо отредактировать текстовый конфигурационный файл. При этом имя редактируемого файла может варьироваться в зависимости от дистрибутива. В таблице 6-1 приведены наиболее распространённые варианты для различных дистрибутивов.

Таблица 6-1. Конфигурационные файлы GRUB

Конфигурационный файл GRUB Дистрибутив
/boot/grub/grub.conf Fedora
/boot/grub/menu.lst SUSE Linux, Debian

В некоторых дистрибутивах, например в Fedora, файл /boot/grub/menu.lst является символьной ссылкой на /boot/grub/grub.conf, поэтому изменения вносятся в правильное место независимо от того, какой из двух файлов вы редактируете. В Fedora также создаётся символьная ссылка /etc/grub.conf на /boot/grub/grub.conf, так что для изменения конфигурации GRUB можно открывать и этот файл. Самый простой способ определить, какой файл следует использовать для настройки GRUB, — перейти в каталог /boot/grub и найти в нём либо grub.conf, либо menu.lst, как показано ниже:

fs2:~ # ls /boot/grub/ -l
total 216
-rw------- 1 root root      30 Jan 19 10:37 device.map
-rw-r--r-- 1 root root      29 Jan 19 10:24 device.map.old
-rw-r--r-- 1 root root    8608 Jul 5 2010 e2fs_stage1_5
-rw-r--r-- 1 root root    7872 Jul 5 2010 fat_stage1_5
-rw-r--r-- 1 root root    7136 Jul 5 2010 ffs_stage1_5
-rw-r--r-- 1 root root    7136 Jul 5 2010 iso9660_stage1_5
-rw-r--r-- 1 root root    8576 Jul 5 2010 jfs_stage1_5
-rw------- 1 root root    1088 Jan 19 10:37 menu.lst
-rw-r--r-- 1 root root     983 Jan 19 10:24 menu.lst.old
-rw-r--r-- 1 root root    7296 Jul 5 2010 minix_stage1_5
-rw-r--r-- 1 root root    9632 Jul 5 2010 reiserfs_stage1_5
-rw-r--r-- 1 root root     512 Jul 5 2010 stage1
-rw-r--r-- 1 root root 102026 Feb 11 12:18 stage2
-rw-r--r-- 1 root root    7456 Jul 5 2010 ufs2_stage1_5
-rw-r--r-- 1 root root    6688 Jul 5 2010 vstafs_stage1_5
-rw-r--r-- 1 root root    9288 Jul 5 2010 xfs_stage1_5

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

fs2:~ # cat /boot/grub/menu.lst
# Modified by YaST2. Last modification on Wed Jan 19 10:37:45 MST 2011
# THIS FILE WILL BE PARTIALLY OVERWRITTEN by perl-Bootloader
# Configure custom boot parameters for updated kernels in
/etc/sysconfig/bootloader

default 0
timeout 8
##YaST - generic_mbr
gfxmenu (hd0,1)/boot/message
##YaST - activate

###Don't change this comment - YaST2 identifier: Original name: linux###
title Desktop -- openSUSE 11.3 - 2.6.34-12
    root (hd0,1)
    kernel /boot/vmlinuz-2.6.34-12-desktop root=/dev/sda2 resume=/dev/sda1
splash=silent quiet showopts vga=0x317
    initrd /boot/initrd-2.6.34-12-desktop

###Don't change this comment - YaST2 identifier: Original name: failsafe###
title Failsafe -- openSUSE 11.3 - 2.6.34-12
    root (hd0,1)
    kernel /boot/vmlinuz-2.6.34-12-desktop root=/dev/sda2 showopts apm=off
noresume edd=off powersaved=off nohz=off highres=off processor.max_cstate=1
nomodeset x11failsafe vga=0x317
    initrd /boot/initrd-2.6.34-12-desktop

###Don't change this comment - YaST2 identifier: Original name: floppy###
title Floppy
    rootnoverify (fd0)
    chainloader +1

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

номер_диска,номер_раздела

Например, первый раздел первого жёсткого диска (/dev/sda1) обозначается в GRUB как hd0,0. Не имеет значения, является ли первый диск IDE, SATA или SCSI — GRUB обращается к нему как к hd0.

Ещё одна особенность, которая может поставить вас в тупик, — это то, что GRUB вводит собственный «корень» под названием корень GRUB (GRUB root). Это не обязательно корневая файловая система, смонтированная в точке /. Вместо этого корнем GRUB является раздел, на котором находится каталог /boot (то есть там, где установлен этап 2). Запутанность здесь заключается в следующем: если при первоначальном разбиении диска вы не создавали отдельный раздел для /boot, GRUB будет использовать полный путь при обращении к корню GRUB, который обычно имеет вид /boot/grub. Если же вы создали отдельный раздел для /boot (что является хорошей практикой), этот раздел и становится корнем GRUB. В таком случае GRUB обращается к файлам в корне GRUB, не включая в путь элемент /boot. Поначалу это вызывает путаницу, и привыкнуть к этому непросто. Необходимо разобраться в этих двух особенностях до продолжения работы — иначе многие записи в конфигурационном файле GRUB будут непонятны.

В таблице 6-2 рассмотрены строки конфигурационного файла GRUB и описание каждой из них.

Таблица 6-2. Параметры конфигурационного файла GRUB

Секция Параметр Описание
Глобальная Color Задаёт цвета, используемые в меню GRUB.
default Задаёт пункт меню, который будет загружен автоматически, если пользователь не сделает выбор вручную. В примере из этой главы при отсутствии выбора автоматически загрузится первый пункт меню (0).
timeout Задаёт количество секунд ожидания до автоматической загрузки пункта меню по умолчанию. В примере из этой главы таймаут установлен на 8 секунд.
gfxmenu Задаёт расположение файла изображения, используемого для отображения графического меню загрузки GRUB. В примере из этой главы для меню загрузки GRUB используется файл /boot/message на втором разделе (1) первого жёсткого диска (hd0).
Title title Задаёт название пункта в меню загрузки GRUB.
root Задаёт расположение раздела, который будет смонтирован как корень GRUB. В примере из этой главы это hd0,1 — второй раздел (1) первого жёсткого диска (hd0).
kernel Задаёт расположение ядра Linux. В примере из этой главы меню GRUB указывает на /boot/vmlinuz-2.6.34-12-desktop. В некоторых дистрибутивах вместо этого указывается просто /boot/vmlinuz — символьная ссылка на реальный файл ядра. Параметр root= задаёт раздел, который будет смонтирован как корневая файловая система. Параметр vga= задаёт режим VGA, используемый системой при загрузке. Параметр resume= указывает на раздел подкачки системы.
initrd Задаёт образ initrd, который GRUB должен использовать для создания начального RAM-диска при загрузке. В примере из этой главы указан /boot/initrd-2.6.34-12-desktop. В некоторых дистрибутивах вместо него указывается просто образ /boot/initrd. Следует помнить, что, как и в случае с vmlinuz, файл initrd в /boot является ссылкой на реальный файл образа initrd.

Одна из удобных возможностей GRUB — управление процессом загрузки в интерактивном режиме. Вместо того чтобы использовать то, что настроено в файле menu.lst или grub.conf, можно на лету задать собственные параметры загрузки. Для этого выполните следующие действия:

  1. В меню GRUB нажмите клавишу Esc.
  2. Когда появится запрос о выходе из графического меню загрузки, нажмите OK. После этого на экране отобразится текстовое меню GRUB, как показано на рис. 6-6.
  3. Если вы хотите изменить пункт меню, нажмите e. После этого отобразится экран, как на рис. 6-7.

На этом экране можно перемещаться по строкам с помощью стрелок и нажимать e для редактирования выбранной строки. Для добавления новой строки нажмите o. Для удаления строки нажмите d. Когда будете готовы начать процесс загрузки, нажмите b. Для возврата в меню GRUB нажмите Esc.

  1. Также можно открыть приглашение командной строки GRUB, нажав c. После этого откроется экран, как на рис. 6-8.

В приглашении grub> можно ввести help для получения справки по созданию строк меню GRUB. Можно также нажать Tab для отображения списка доступных команд. Для возврата в меню GRUB нажмите Esc.

Примечание

К приглашению grub> можно получить доступ и из работающей системы Linux. Для этого введите grub в приглашении командной строки.

Рис. 6-6. Текстовое меню GRUB.

Рис. 6-6. Текстовое меню GRUB.

Рис. 6-7. Редактирование пункта меню GRUB.

Рис. 6-7. Редактирование пункта меню GRUB.

Меню GRUB может быть чрезвычайно полезным инструментом. В большинстве дистрибутивов в меню GRUB по умолчанию отображается поле «Boot Options» (параметры загрузки). Пример показан на рис. 6-9.

Это поле позволяет передавать ядру Linux параметры загрузки, не включённые ни в один пункт меню GRUB, тем самым настраивая поведение ядра. Для этого сначала выберите нужный пункт меню GRUB, а затем введите нужные параметры ядра в поле «Boot Options». Например, если система Linux перестала загружаться по неизвестной причине, с помощью поля «Boot Options» можно указать ядру не загружать процесс init при запуске, а загрузить другую программу.

Примечание

Процесс init мы рассмотрим подробнее далее в этой главе.

Для этого введите init=имя_программы в поле «Boot Options». Например, чтобы пропустить загрузку процесса init и вместо него загрузить оболочку bash, следует ввести init=/bin/bash в поле «Boot Options». После загрузки системы запустится оболочка bash, и у вас будет полный доступ с правами суперпользователя root, что позволит выявить и устранить причину, препятствующую нормальной загрузке системы. Этот вариант показан на рис. 6-10.

Совет

Система не потребует ввести пароль суперпользователя root. Именно поэтому данный приём можно использовать для восстановления системы, если вы забыли пароль root.

Рис. 6-8. Приглашение командной строки GRUB.

Рис. 6-8. Приглашение командной строки GRUB.

Рис. 6-9. Передача параметров загрузки ядру Linux.

Рис. 6-9. Передача параметров загрузки ядру Linux.

Следует, однако, учитывать, что в некоторых дистрибутивах корневая файловая система (/) монтируется в режиме «только для чтения». В этом случае перед внесением изменений в конфигурационный файл её необходимо перемонтировать в режиме чтения-записи, введя mount -o remount,rw,sync -t файловая_система имя_устройства точка_монтирования в приглашении командной строки. После внесения необходимых изменений можно возобновить нормальный процесс загрузки через init, введя exec /sbin/init в приглашении командной строки.

Хотя возможность настройки GRUB и его пунктов меню весьма полезна, она также сопряжена с определёнными рисками безопасности. Как уже было отмечено, она потенциально позволяет любому желающему получить доступ к системе с правами суперпользователя root без ввода пароля. Это может создать серьёзные проблемы, особенно на системах Linux, содержащих конфиденциальные или проприетарные данные.

Рис. 6-10. Замена init оболочкой bash.

Рис. 6-10. Замена init оболочкой bash.

Для повышения безопасности меню GRUB можно задать пароль GRUB. После такой настройки изменение параметров загрузки GRUB будет возможно только после ввода правильного пароля. Самый простой способ — отредактировать конфигурационный файл GRUB (menu.lst или grub.conf) и добавить следующую строку:

password пароль

Пример:

password natasha01

Учтите, что добавление этого параметра в конфигурационный файл приведёт к тому, что GRUB будет отображать меню только в текстовом режиме. Пример показан на рис. 6-11.

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

fs2:~ # cat /boot/grub/menu.lst
# Modified by YaST2. Last modification on Wed Jan 19 10:37:45 MST 2011
# THIS FILE WILL BE PARTIALLY OVERWRITTEN by perl-Bootloader
# Configure custom boot parameters for updated kernels in
/etc/sysconfig/bootloader

default 0
timeout 8
##YaST - generic_mbr
gfxmenu (hd0,1)/boot/message
##YaST - activate
password natasha01

###Don't change this comment - YaST2 identifier: Original name: linux###
title Desktop -- openSUSE 11.3 - 2.6.34-12
    lock
    root (hd0,1)
    kernel /boot/vmlinuz-2.6.34-12-desktop root=/dev/sda2 resume=/dev/sda1
splash=silent quiet showopts vga=0x317
    initrd /boot/initrd-2.6.34-12-desktop

###Don't change this comment - YaST2 identifier: Original name: failsafe###
title Failsafe -- openSUSE 11.3 - 2.6.34-12
    lock
    root (hd0,1)
    kernel /boot/vmlinuz-2.6.34-12-desktop root=/dev/sda2 showopts apm=off
noresume edd=off powersaved=off nohz=off highres=off processor.max_cstate=1
nomodeset x11failsafe vga=0x317
    initrd /boot/initrd-2.6.34-12-desktop

###Don't change this comment - YaST2 identifier: Original name: floppy###
title Floppy
    lock
    rootnoverify (fd0)
    chainloader +1

При такой конфигурации пользователи должны ввести заданный пароль для выбора пункта меню GRUB. Для этого нажмите p и введите соответствующий пароль. Если пароль не введён, отображается экран, как на рис. 6-12.

Рис. 6-11. Использование пароля в конфигурационном файле GRUB.

Рис. 6-11. Использование пароля в конфигурационном файле GRUB.

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

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

Рис. 6-12. Запрет доступа к пункту меню GRUB.

Рис. 6-12. Запрет доступа к пункту меню GRUB.

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

  1. Откройте сеанс терминала и переключитесь на суперпользователя root.
  2. В приглашении командной строки введите grub-md5-crypt.
  3. Когда появится запрос, введите пароль, который вы хотите назначить меню GRUB. После завершения на экране будет отображён хешированный пароль. Пример:
    fs2:~ # grub-md5-crypt
    Password:
    Retype password:
    $1$WLZwz/$DP3wgbtInP1KJOL.Wg3t00
    
  4. Откройте конфигурационный файл GRUB в текстовом редакторе.

!!! tip "Совет" Скопировать и вставить хеш удобнее в gedit, но это можно сделать и в vi.

  1. В конфигурационном файле GRUB введите password --md5 хешированный_пароль. Пример:
    password --md5 $1$WLZwz/$DP3wgbtInP1KJOL.Wg3t00
    
  2. Сохраните изменения в файле и перезагрузите систему.

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

Упражнение 6-1. Работа с GRUB

В этом упражнении вы попрактикуетесь в настройке меню GRUB. Упражнение предполагает, что у вас установлен дистрибутив, использующий GRUB. Его можно выполнить на виртуальной машине, прилагаемой к этой книге. Запустите снимок состояния 6-1 для правильно настроенной среды.

VIDEO Посмотрите видео упражнения 6-1 с демонстрацией выполнения этого задания.

Выполните следующее:

  1. Загрузите систему Linux и войдите в систему под учётной записью student с паролем student.
  2. Откройте сеанс терминала.
  3. Переключитесь на суперпользователя root, введя su - и затем пароль root (student).
  4. В приглашении командной строки введите ls -l /boot/grub. Определите, какой файл использует ваш дистрибутив для настройки GRUB: grub.conf или menu.lst.
  5. Создайте зашифрованный пароль для меню GRUB, введя grub-md5-crypt в приглашении командной строки.
  6. Когда появится запрос, введите пароль для меню GRUB.
  7. Запишите хешированный пароль, отображённый на экране.
  8. В приглашении командной строки введите vi /boot/grub/menu.lst или vi /boot/grub/grub.conf — в зависимости от того, какой файл использует ваша система.
  9. Нажмите Insert.
  10. Прокрутите до строки timeout и поставьте перед ней символ #, чтобы отключить эту функцию. Поскольку мы собираемся требовать ввод пароля для загрузки, нет необходимости в автоматической загрузке системы через GRUB.
  11. После строки gfxmenu добавьте глобальный пароль для меню GRUB, введя password --md5 хешированный_пароль.
  12. Добавьте директиву lock к каждому элементу title в конфигурационном файле GRUB. Это заставит GRUB требовать ввод пароля для выбора пункта меню.
  13. Нажмите Esc.
  14. Сохраните изменения и выйдите из vi, введя :exit.
  15. В приглашении командной строки введите reboot. Дождитесь перезапуска системы.
  16. Обратите внимание, что теперь в меню GRUB для загрузки системы требуется ввод пароля.
  17. Нажмите p и введите пароль.
  18. Выберите нужный пункт меню GRUB для загрузки системы.

Теперь перейдём к рассмотрению GRUB2.

Настройка GRUB2 (Configuring GRUB2)

Как следует из названия, GRUB2 — это новая версия оригинального загрузчика GRUB. GRUB2 работает принципиально иначе, чем GRUB Legacy. Следует знать, что GRUB версии 1.98 и выше считается «GRUB2», а любая версия ниже 1.98 — «GRUB Legacy». Для определения версии GRUB, установленной в вашей системе Linux, можно выполнить одну из двух команд в приглашении командной строки (с правами суперпользователя root):

  • grub-install -v
  • grub2-install -v

Пример:

openSUSE:/boot # grub2-install -v
grub2-install (GRUB2) 2.00

Знание GRUB2 важно по двум причинам:

  • Это загрузчик по умолчанию в большинстве современных дистрибутивов Linux.
  • Он работает принципиально иначе, чем GRUB Legacy.

GRUB2 использует совершенно другой набор конфигурационных файлов по сравнению с GRUB Legacy. Вот конфигурационные файлы GRUB2:

  • Файл /boot/grub/grub.cfg
  • Файлы в каталоге /etc/grub.d
  • Файл /etc/default/grub

При работе с GRUB Legacy все изменения конфигурации вносились в файл menu.lst. В GRUB2 файла menu.lst нет. Вместо него используется файл /boot/grub2/grub.cfg.

Совет

В некоторых дистрибутивах файл grub.cfg находится в каталоге /boot/grub, а не /boot/grub2.

Однако, в отличие от menu.lst, файл grub.cfg обновляется автоматически каждый раз, когда вы вносите изменения в конфигурацию и затем выполняете одну из следующих команд:

  • В некоторых дистрибутивах (например, в Ubuntu) используется команда update-grub.
  • В других дистрибутивах (например, в openSUSE) используется команда grub2-mkconfig -o /boot/grub2/grub.cfg.

Не следует редактировать grub.cfg напрямую. Вместо этого при необходимости изменить конфигурацию загрузчика GRUB2 нужно отредактировать соответствующий конфигурационный файл, а затем выполнить команду update-grub или grub2-mkconfig.

Совет

После внесения изменений в конфигурацию загрузчика GRUB2 необходимо выполнить команду update-grub или grub2-mkconfig. До этого изменения не вступят в силу.

Хотя grub.cfg аналогичен menu.lst по назначению, он не содержит сведений о меню GRUB2 непосредственно. Вместо этого данные хранятся в нескольких конфигурационных файлах в каталоге /etc/grub.d. Все файлы в /etc/grub.d являются исполняемыми сценариями. При изменении одного из них и последующем выполнении команды update-grub или grub2-mkconfig файл grub.cfg автоматически обновляется с новыми настройками GRUB. Таким образом, файл /etc/default/grub содержит параметры конфигурации меню GRUB, а файлы сценариев в /etc/grub.d — это те файлы, которые вы фактически редактируете для внесения изменений. Пример создания конфигурационного файла GRUB2 с помощью команды grub2-mkconfig показан ниже:

openSUSE:~ # grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub.cfg ...
Found theme: /boot/grub2/themes/openSUSE/theme.txt
Found linux image: /boot/vmlinuz-3.11.10-21-desktop
Found initrd image: /boot/initrd-3.11.10-21-desktop
Found linux image: /boot/vmlinuz-3.11.6-4-desktop
Found initrd image: /boot/initrd-3.11.6-4-desktop
done

Примечание

Ещё одна особенность GRUB2 — несколько изменённый синтаксис нумерации разделов. В GRUB Legacy первый жёсткий диск системы обозначается как hd0, а первый раздел этого диска — как hd0,0. В GRUB2 это правило изменено. Первый жёсткий диск по-прежнему обозначается как hd0, однако первому разделу присваивается номер 1, а не 0. Таким образом, в GRUB2 первый раздел первого жёсткого диска обозначается как hd0,1, а не hd0,0.

Если открыть содержимое файла grub.cfg, можно увидеть, что он разделён на множество секций. Каждая секция начинается с текста ###BEGIN, как показано ниже:

### BEGIN /etc/grub.d/10_linux ###
menuentry 'openSUSE 13.1' --class 'opensuse-13-1' --class gnu-linux
--class gnu --class os $menuentry_id_option
'gnulinux-simple-7a115a99-8e42-49b3-a1db-db5a79437b95' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='hd0,msdos2'

Каждая из секций ссылается на конкретный сценарий в каталоге /etc/grub.d, на основе которого она была сгенерирована командой update-grub или grub2-mkconfig. При просмотре файлов в /etc/grub.d можно заметить, что их имена, как правило, начинаются с цифры, как показано ниже:

openSUSE:/etc/grub.d # ls
00_header 20_linux_xen    20_ppc_terminfo                40_custom     90_persistent
10_linux   20_memtest86+ 30_os-prober                    41_custom     README

Такое соглашение об именовании важно, поскольку порядок пунктов меню в файле grub.cfg определяется числовым порядком имён файлов сценариев в /etc/grub.d. Файлы с меньшими номерами выполняются первыми командой update-grub или grub2-mkconfig. Таким образом, в данном примере сначала выполняется 00_header, затем 10_linux и так далее. Файлы сценариев с нечисловыми именами выполняются после всех файлов с числовыми именами. Это определяет порядок, в котором информация из этих файлов сценариев появится в /boot/grub2/grub.cfg.

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

Первый файл, с которым необходимо ознакомиться, — 00_header. Этот файл настраивает различные параметры меню загрузки GRUB2: начальный вид, графический режим, выбор по умолчанию, значения таймаутов и прочее.

Следующий файл — 10_linux. Этот файл выявляет каждое ядро Linux, установленное в системе. При наличии нескольких ядер сценарий 10_linux выполнит поиск в каталоге /boot и найдёт все установленные ядра Linux. Для каждого найденного ядра будет создан отдельный пункт меню GRUB.

Следующий файл — 30_os-prober. Этот сценарий выполняет поиск других операционных систем, установленных в системе. Если установлен только Linux, сценарий найдёт ядро Linux и создаст для него пункт меню. Однако если в системе установлены и Linux, и Windows, сценарий 30_os-prober обнаружит обе операционные системы и автоматически создаст отдельный пункт меню GRUB для каждой из них.

Последний файл, на который следует обратить внимание, — 40_custom. Этот файл предназначен для настройки поведения меню GRUB под ваши нужды. По сути, он является шаблоном для добавления пользовательских пунктов меню, которые будут включены в файл grub.cfg.

Наконец, рассмотрим конфигурационный файл /etc/default/grub. Этот файл содержит информацию, которая ранее располагалась в верхней части файла menu.lst GRUB Legacy, как показано ниже:

openSUSE:/etc/grub.d # cat /etc/default/grub
GRUB_DISTRIBUTOR="openSUSE 13.1"
GRUB_DEFAULT=saved
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=8

Этот файл можно редактировать и вносить необходимые изменения, которые будут включены в grub.cfg при выполнении команды update-grub или grub2-mkconfig. В файле есть несколько параметров, позволяющих изменить поведение и внешний вид GRUB:

  • GRUB_DEFAULT Этот параметр задаёт пункт меню по умолчанию. Например, при установке GRUB_DEFAULT=0 первый пункт меню становится пунктом по умолчанию. Если задан таймаут и пользователь не делает выбор, автоматически будет выбран первый пункт меню. Можно указать как номер пункта, так и его название.
  • GRUB_SAVED DEFAULT Если этот параметр установлен в значение true, GRUB будет автоматически выбирать последнюю выбранную операционную систему в качестве системы по умолчанию при следующей загрузке. Как видно, этот параметр может конфликтовать с GRUB_DEFAULT, поэтому следует использовать только один из них.
  • GRUB_HIDDEN_TIMEOUT Этот параметр позволяет на заданное число секунд приостановить процесс загрузки и отобразить пустой экран (или экран приветствия, если он настроен). По окончании таймаута система загрузится. Параметр GRUB_HIDDEN_TIMEOUT определяет продолжительность отображения пустого экрана в секундах. Пока экран пуст, пользователь может нажать клавишу Shift для отображения меню. Если эта возможность нежелательна, установите параметр в значение 0. Если установить пустое значение, меню будет отображаться в течение числа секунд, заданного параметром GRUB_TIMEOUT.

!!! note "Примечание" По умолчанию GRUB2 скрывает меню, если в системе установлена только одна операционная система. Если установлено две операционные системы, по умолчанию меню отображается с пунктами для обеих систем.

  • GRUB_HIDDEN_TIMEOUT_QUIET Этот параметр работает совместно с GRUB_HIDDEN_TIMEOUT. Если установлен в значение true, обратный отсчёт не отображается. Если установлен в значение false, на пустом экране в течение времени, заданного в GRUB_HIDDEN_TIMEOUT, будет отображаться счётчик.
  • GRUB_TIMEOUT Этот параметр задаёт, сколько секунд у пользователя есть для выбора пункта меню GRUB перед автоматической загрузкой операционной системы по умолчанию. Если установить значение -1, таймер отключается и GRUB будет ожидать выбора пользователя.
  • GRUB_CMDLINE_LINUX Этот параметр используется для передачи параметров ядру. В GRUB Legacy для этого параметры добавлялись в конец строки kernel. В GRUB2 то же самое можно сделать с помощью параметра GRUB_CMDLINE_LINUX.
  • GRUB_GFX MODE Этот параметр задаёт разрешение графического меню, отображаемого GRUB2. При необходимости можно также указать глубину цвета. Например, чтобы меню GRUB использовало разрешение 1440×900 и 24-битную глубину цвета, следует установить значение 1440x900x24. Для этого параметра можно указать несколько разрешений. Сначала укажите предпочтительное разрешение, затем через запятую — следующее и так далее. GRUB2 будет сначала пробовать первое разрешение. Если монитор его поддерживает, оно будет использовано, а остальные проигнорированы. Если нет — GRUB перейдёт ко второму разрешению и будет перебирать список, пока не найдёт поддерживаемое. Если параметр закомментирован или указанное разрешение не поддерживается, GRUB2 использует стандартный графический режим, заданный в файле /etc/grub.d/00_header.
  • GRUB_INIT_TUNE Этот параметр позволяет воспроизвести одиночный звуковой сигнал непосредственно перед отображением меню GRUB2. Синтаксис: знак равенства, затем открывающая кавычка и три числа. Первое число — темп. Второе число — высота звука. Третье число — длительность звука. Завершается параметр закрывающей кавычкой.
  • GRUB_BACKGROUND Этот параметр задаёт фоновое изображение, используемое в меню GRUB2.
  • GRUB_DISABLE_OSPROBER Установка этого параметра в значение true отключает проверку os-prober. Эта функция выполняет поиск разделов на жёстком диске с другими операционными системами, такими как Windows или другие дистрибутивы Linux.

Упражнение 6-2. Работа с GRUB2

В этом упражнении вы попрактикуетесь в настройке меню GRUB2. Его можно выполнить на виртуальной машине, прилагаемой к этой книге. Запустите снимок состояния 6-2 для правильно настроенной среды.

VIDEO Посмотрите видео упражнения 6-2 с демонстрацией выполнения этого задания.

Выполните следующее:

  1. Загрузите систему Linux и войдите в систему под учётной записью student с паролем student.
  2. Откройте сеанс терминала.
  3. Переключитесь на суперпользователя root, введя su - и затем пароль root (student).
  4. В приглашении командной строки введите vi /etc/default/grub.
  5. Измените значение GRUB_TIMEOUT на 15 секунд.
  6. Измените параметр GRUB_DEFAULT так, чтобы при отсутствии выбора в течение таймаута автоматически загружался первый пункт меню.
  7. Сохраните изменения и выйдите из редактора vi.
  8. Примените изменения, введя grub2-mkconfig -o /boot/grub2/grub.cfg в приглашении командной строки.
  9. Перезагрузите систему и убедитесь, что изменения применены к загрузчику.