Загрузчик GRUB в Linux
Общие сведения
При включении компьютера первым запускается загрузчик. Это фрагмент кода, единственная задача которого — загрузить ядро операционной системы и передать ему управление. Ядро загружает необходимые драйверы, инициализирует оборудование, а затем загружает остальную часть операционной системы.
GRUB — это загрузчик, используемый в большинстве дистрибутивов Linux. Он может загружать ядро Linux или другие операционные системы, например Windows, а также работать с несколькими образами ядра и параметрами в виде отдельных пунктов меню. Выбор ядра при загрузке осуществляется с помощью клавиатуры, а для редактирования параметров загрузки предусмотрен интерфейс командной строки.
Системному администратору важно знать, как управлять процессом загрузки, чтобы, например, восстановить систему после сбоя при обновлении ядра.
GRUB Legacy в сравнении с GRUB 2
GRUB 2 — это полностью переработанная версия GRUB, которая стала более чистой, безопасной, надежной и мощной
Среди многочисленных преимуществ GRUB Legacy — гораздо более гибкий файл конфигурации (с большим количеством команд и условных операторов, напоминающий язык сценариев), более модульная структура и улучшенная локализация/интернационализация.
Также добавлена поддержка тем и графических загрузочных меню с заставками, возможность загрузки ISO-образов LiveCD непосредственно с жесткого диска, улучшенная поддержка архитектур, отличных от x86, универсальная поддержка UUID (упрощающая идентификацию дисков и разделов) и многое другое.
GRUB Legacy больше не поддерживается (последний выпуск — 0.97, 2005 год), и сегодня в большинстве основных дистрибутивов Linux в качестве загрузчика по умолчанию используется GRUB 2.
Раздел boot
Исторически сложилось так, что жёсткие диски в системах, совместимых с IBM PC, разбивались на разделы по схеме MBR, созданной в 1982 году для IBM PC-DOS (MS-DOS) 2.0.
В этой схеме первый 512-байтовый сектор диска называется главной загрузочной записью и содержит таблицу, описывающую разделы на диске (таблицу разделов), а также загрузочный код, называемый загрузчиком.
При включении компьютера этот минимальный (из-за ограничений по размеру) код загрузчика загружается, выполняется и передает управление вторичному загрузчику на диске, который обычно располагается в области размером 32 КБ между MBR и первым разделом.
Вторичный загрузчик, в свою очередь, загружает операционную систему (или системы).
На диске с MBR-разделом загрузочный код GRUB устанавливается в MBR. Он загружается и передает управление «основному» образу, установленному между MBR и первым разделом. С этого момента GRUB может загружать с диска остальные необходимые ресурсы (определения меню, файлы конфигурации и дополнительные модули).
Однако MBR имеет ограничения по количеству разделов (первоначально — максимум 4 основных раздела, позже — максимум 3 основных раздела и 1 расширенный раздел, разделенный на несколько логических разделов) и максимальному размеру диска в 2 ТБ. Чтобы преодолеть эти ограничения, была создана новая схема разметки под названием GPT (таблица разделов GUID), являющаяся частью стандарта UEFI (унифицированный расширяемый интерфейс встроенного ПО).
Диски с GPT-разметкой можно использовать как на компьютерах с традиционной BIOS, так и на компьютерах с прошивкой UEFI. На компьютерах с BIOS вторая часть GRUB хранится в специальном загрузочном разделе BIOS.
В системах с прошивкой UEFI GRUB загружается прошивкой из файлов grubia32.efi (для 32-разрядных систем) или grubx64.efi (для 64-разрядных систем) из раздела, называемого ESP (системный раздел EFI).
В Linux файлы, необходимые для процесса загрузки, обычно хранятся в загрузочном разделе, подключенном к корневой файловой системе и в просторечии называемом /boot.
В современных системах загрузочный раздел не нужен, поскольку загрузчики, такие как GRUB, обычно могут монтировать корневую файловую систему и искать нужные файлы в каталоге /boot, но это хорошая практика, поскольку она позволяет отделить файлы, необходимые для загрузки, от остальной файловой системы.
Этот раздел обычно является первым на диске. Это связано с тем, что в оригинальной BIOS IBM PC диски адресаровались с помощью цилиндров, головок и секторов (CHS), при этом максимальное количество цилиндров составляло 1024, головок — 256, а секторов — 63, что позволяло использовать диски размером до 528 МБ (504 МБ в MS-DOS).
Поэтому для обеспечения максимальной совместимости раздел /boot обычно располагается в начале диска и заканчивается перед 1024-м цилиндром (528 МБ), чтобы компьютер всегда мог загрузить ядро. Рекомендуемый размер этого раздела на современном компьютере — 300 МБ.
Другие причины для создания отдельного /boot раздела — шифрование и сжатие, поскольку некоторые методы пока не поддерживаются GRUB 2, а также необходимость отформатировать корневой раздел системы (/) с использованием неподдерживаемой файловой системы.
Содержимое раздела /boot может различаться в зависимости от архитектуры системы или используемого загрузчика, но в системах на базе x86 обычно можно найти следующие файлы.
Большинство из них имеют суффикс -VERSION, где -VERSION — это версия соответствующего ядра Linux. Например, файл конфигурации для ядра Linux версии 4.15.0-65-generic будет называться config-4.15.0-65-generic
Конфигурационный файл - В этом файле, который обычно называется config-VERSION (см. пример выше), хранятся параметры конфигурации ядра Linux. Этот файл создается автоматически при компиляции или установке нового ядра и не должен изменяться пользователем напрямую
Системная карта - Этот файл представляет собой справочную таблицу, в которой имена символов (например, переменных или функций) сопоставляются с их расположением в памяти. Это полезно при отладке системных сбоев, известных как паника ядра, поскольку позволяет пользователю узнать, какая переменная или функция вызывалась в момент сбоя. Как и в случае с файлом конфигурации, имя файла обычно начинается с System.map-VERSION (например, System.map-4.15.0-65-generic).
Ядро Linux - Это собственно ядро операционной системы. Обычно оно называется vmlinux-VERSION (например, vmlinux-4.15.0-65-generic). Вы также можете встретить название vmlinuz вместо vmlinux, где z в конце означает, что файл был сжат.
Начальный диск оперативной памяти - Обычно она называется initrd.img-VERSION и содержит минимальную корневую файловую систему, загруженную на RAM-диск, с утилитами и модулями ядра, необходимыми для того, чтобы ядро могло подключить настоящую корневую файловую систему.
Файлы, связанные с загрузчиком - В системах с установленным GRUB они обычно находятся в папке /boot/grub и включают в себя файл конфигурации GRUB (/boot/grub/grub.cfg для GRUB 2 или /boot/grub/menu.lst для GRUB Legacy), модули (в /boot/grub/i386-pc), файлы переводов (в /boot/grub/locale) и шрифты (в /boot/grub/fonts).
Установка GRUB 2
GRUB 2 можно установить с помощью утилиты grub-install . Если ваша система не загружается, вам нужно загрузиться с Live CD или аварийного диска, определить загрузочный раздел вашей системы, смонтировать его и запустить утилиту.
Первый диск в системе обычно является загрузочным устройством, и вам может понадобиться узнать, есть ли на диске загрузочный раздел. Это можно сделать с помощью утилиты fdisk
#просмотреть список всех разделов
fdisk -l /dev/sda
#Загрузочный раздел обозначается * в столбце boot
/dev/sda1 * 2048 2000895 1998848 976M 83 Linux
#создайте временную папку в /mnt и смонтируйте в ней раздел:
mkdir -p /mnt/tmp
mount /dev/sda1 /mnt/tmp
#запустите grub-install, указав загрузочное устройство (не раздел) и каталог, в котором смонтирован загрузочный раздел.
grub-install --boot-directory=/mnt/tmp /dev/sda
#Если нет загрузочного раздела, а есть только каталог /boot в корневой файловой системе
grub-install --boot-directory=/boot /dev/sda
Настройка GRUB 2
Файл конфигурации GRUB 2 по умолчанию — /boot/grub/grub.cfg. Этот файл генерируется автоматически, и его не рекомендуется редактировать вручную. Чтобы внести изменения в конфигурацию GRUB, нужно отредактировать файл /etc/default/grub, а затем запустить утилиту update-grub, чтобы сгенерировать файл, соответствующий требованиям.
update-grub Обычно является сокращением от grub-mkconfig -o /boot/grub/grub.cfg, поэтому они дают одинаковый результат.
В файле /etc/default/grub есть несколько параметров, которые управляют поведением GRUB 2, например ядро для загрузки по умолчанию, время ожидания, дополнительные параметры командной строки и т. д. Наиболее важные из них:
GRUB_DEFAULT= Пункт меню по умолчанию для загрузки. Это может быть числовое значение (например, 0, 1, и т. д.), название пункта меню (например, debian) или saved, которое используется в сочетании с GRUB_SAVEDEFAULT=, как описано ниже.
GRUB_SAVEDEFAULT= Если для этого параметра установлено значение true и для GRUB_DEFAULT= установлено значение saved, то по умолчанию будет загружаться последний выбранный в меню загрузки вариант.
GRUB_TIMEOUT= Тайм-аут в секундах до выбора пункта меню по умолчанию. Если установлено значение 0, система загрузит пункт меню по умолчанию без отображения меню. Если установлено значение -1, система будет ждать, пока пользователь не выберет пункт меню, сколько бы времени это ни заняло
GRUB_CMDLINE_LINUX= Здесь перечислены параметры командной строки, которые будут добавлены в записи для ядра Linux.
GRUB_CMDLINE_LINUX_DEFAULT= По умолчанию для каждого ядра Linux создаются две записи в меню: одна с параметрами по умолчанию, а другая — для восстановления. С помощью этой опции вы можете добавить дополнительные параметры, которые будут использоваться только в записи по умолчанию.
GRUB_ENABLE_CRYPTODISK= Если установлено значение y, такие команды, как grub-mkconfig, update-grub и grub-install, будут искать зашифрованные диски и добавлять команды, необходимые для доступа к ним во время загрузки. Это отключает автоматическую загрузку (GRUB_TIMEOUT= с любым значением, кроме -1), поскольку для доступа к дискам требуется ввести парольную фразу.
Управление пунктами меню
При запуске update-grub GRUB 2 выполнит поиск ядер и операционных систем на компьютере и создаст соответствующие пункты меню в файле /boot/grub/grub.cfg
Новые пункты можно вручную добавить в файлы сценариев в каталоге /etc/grub.d .
Эти файлы должны быть исполняемыми и обрабатываться в порядке следования по числовому индексу с помощью update-grub. Таким образом, 05_debian_theme обрабатывается до 10_linux и так далее. Пользовательские пункты меню обычно добавляются в файл 40_custom
Ниже приведен базовый синтаксис для элемента меню:
menuentry "Default OS" {
set root=(hd0,1)
linux /vmlinuz root=/dev/sda1 ro quiet splash
initrd /initrd.img
}
Первая строка всегда начинается с menuentry и заканчивается {. Текст в кавычках будет отображаться в качестве метки в загрузочном меню GRUB 2.
Параметр set root определяет диск и раздел, на которых расположена корневая файловая система операционной системы. Обратите внимание, что в GRUB 2 диски нумеруются с нуля, поэтому hd0 — это первый диск (sda в Linux), hd1 — второй и так далее. Разделы же нумеруются начиная с единицы. В приведенном выше примере корневая файловая система расположена на первом диске (hd0), в первом разделе (,1), или sda1.
Вместо того чтобы напрямую указывать устройство и раздел, можно настроить GRUB 2 на поиск файловой системы с определенной меткой или UUID (универсальным уникальным идентификатором). Для этого используйте параметр search --set=root, за которым следует параметр --label и метка файловой системы для поиска, или --fs-uuid и UUID файловой системы.
UUID файловой системы можно узнать с помощью следующей команды:
ls -l /dev/disk/by-uuid/
В приведенном выше примере UUID для /dev/sda1 — ae71b214-0aec-48e8-80b2-090b6986b625. Если вы хотите установить его в качестве корневого устройства для GRUB 2, используйте команду search --set=root --fs-uuid ae71b214-0aec-48e8-80b2-090b6986b625.
При использовании команды search обычно добавляется параметр --no-floppy, чтобы GRUB не тратил время на поиск на дискетах.
Строка linux указывает на расположение ядра операционной системы (в данном случае это файл vmlinuz в корне файловой системы). После этого вы можете передать ядру параметры командной строки.
В приведенном выше примере мы указали корневой раздел (root=/dev/sda1) и передали три параметра ядра: корневой раздел должен быть смонтирован в режиме «только чтение» (ro), большинство сообщений в журнале должно быть отключено (quiet) и должен отображаться заставочный экран (splash).
initrd Строка указывает, где расположен исходный диск RAM. В приведенном выше примере файл initrd.img расположен в корне файловой системы.
В большинстве дистрибутивов Linux ядро и initrd не находятся в корневом каталоге корневой файловой системы. Вместо этого они являются ссылками на реальные файлы в каталоге /boot или разделе.
При загрузке системы с помощью GRUB 2 вы увидите меню с вариантами.
Чтобы изменить параметр, выделите его с помощью клавиш со стрелками и нажмите E. Откроется окно редактора с содержимым menuentry, связанного с этим параметром, как указано в /boot/grub/grub.cfg.
После редактирования параметра введите Ctrl+X или F10 для загрузки или Esc для возврата в меню.
Чтобы войти в оболочку GRUB 2, нажмите C на экране меню (или Ctrl+C) в окне редактирования). Вы увидите командную строку, подобную этой: grub >
Введите help для просмотра списка всех доступных команд или нажмите Esc для выхода из командной строки и возврата на экран меню.
Меню не появится, если GRUB_TIMEOUT установлено на 0 в /etc/default/grub.
Загрузка с помощью оболочки grub2
Можно использовать оболочку GRUB 2 для загрузки системы, если из-за неправильной настройки в пункте меню загрузка не выполняется.
#выяснить, где находится загрузочный раздел
#ls покажет список разделов и дисков, обнаруженных GRUB 2.
ls
(proc) (hd0) (hd0,msdos1)
#первый раздел hd0 называется msdos1, потому что диск был разбит на разделы с использованием схемы MBR
#Для загрузки Linux нам нужны раздел с ядром и начальный RAM-диск (initrd).
ls -l (hd0,msdos1)/
#настройте загрузочный раздел:
set root=(hd0,msdos1)
#Загрузите ядро Linux с помощью команды linux, указав путь к ядру и параметр root=
linux /vmlinuz root=/dev/sda1
#Загрузите начальный RAM-диск с помощью initrd, указав полный путь к файлу initrd.img:
initrd /initrd.img
#загрузите систему
boot
Загрузка с помощью Rescue Shell
В случае сбоя загрузки GRUB 2 может загрузить спасательную оболочку — упрощенную версию оболочки
Узнать ее можно по командной строке, которая отображается как grub rescue
Определив, какой раздел является загрузочным (с помощью ls, как показано выше), используйте команду set prefix=, за которой следует полный путь к каталогу, содержащему файлы GRUB 2. Обычно /boot/grub
set prefix=(hd0,msdos1)/boot/grub
#загрузите модули normal и linux с помощью команды insmod:
insmod normal
insmod linux
Затем, как и в предыдущем случае, установите загрузочный раздел с помощью set root=, загрузите ядро Linux (с помощью linux), начальный RAM-диск (initrd) и попробуйте загрузиться с помощью boot.
Установка GRUB Legacy из работающей системы
Чтобы установить GRUB Legacy на диск из работающей системы, мы воспользуемся утилитой grub-install . Основная команда — grub-install DEVICE , где DEVICE — это диск, на который вы хотите установить GRUB Legacy. Например, /dev/sda
По умолчанию GRUB копирует необходимые файлы в каталог /boot на указанном устройстве. Если вы хотите скопировать их в другой каталог, используйте параметр --boot-directory=, а затем укажите полный путь к месту, куда нужно скопировать файлы.
#Установка загрузчика на диск (не раздел)
grub-install /dev/sda
Установка GRUB Legacy из GRUB Shell
Если по какой-то причине вы не можете загрузить систему и вам нужно переустановить GRUB Legacy, это можно сделать из оболочки GRUB на загрузочном диске GRUB Legacy
В оболочке GRUB (введите c в меню загрузки, чтобы перейти к приглашению grub> ) первым делом нужно указать загрузочное устройство, на котором находится каталог /boot
Если вы не знаете, на каком устройстве находится каталог /boot, вы можете попросить GRUB найти его с помощью команды find
root (hd0,0)
#Поиск boot
find /boot/grub/stage1
#с помощью команды setup установите GRUB Legacy в MBR и скопируйте необходимые файлы на диск
setup (hd0)
Настройка устаревших пунктов меню и параметров GRUB
Записи и настройки меню GRUB Legacy хранятся в файле /boot/grub/menu.lst
В пункте меню есть как минимум три команды. Первая, title, задает заголовок операционной системы на экране
Вторая, root, сообщает GRUB Legacy, с какого устройства или раздела нужно загрузиться.
Третья запись, kernel, указывает полный путь к образу ядра, который должен быть загружен
Путь указан относительно устройства, указанного в параметре root
Возможно, вам потребуется указать расположение исходного образа RAM-диска для операционной системы с помощью параметра initrd
# Эта строка является комментарием
title Мой дистрибутив Linux
root (hd0,0)
kernel /vmlinuz root=/dev/hda1
initrd /initrd.img
Оператор root можно опустить, если указать загрузочное устройство перед путем в kernel команде
kernel (hd0,0)/vmlinuz root=dev/hda1
Параметр root=/dev/hda1 после команды kernel указывает ядру Linux, какой раздел следует использовать в качестве корневой файловой системы
Подробнее о параметрах ядра можно узнать на странице https://www.kernel.org/doc/html/v4.14/admin-guide/kernel-parameters.html.
GRUB Legacy имеет модульную структуру, в которой модули (обычно хранящиеся в виде .mod файлов в /boot/grub/i386-pc) можно загружать для добавления дополнительных функций, таких как поддержка необычного оборудования, файловых систем или новых алгоритмов сжатия
Модули загружаются с помощью команды module, за которой следует полный путь к соответствующему .mod файлу. Помните, что, как и в случае с ядрами и образами initrd, этот путь указывается относительно устройства, указанного в команде root
агрузка других Операционных систем
GRUB Legacy можно использовать для загрузки неподдерживаемых операционных систем, таких как Windows, с помощью процесса, называемого цепочкой загрузки. Сначала загружается GRUB Legacy, а при выборе соответствующей опции загружается загрузчик нужной системы.
# Загрузка Windows
title Windows XP
root (hd0,1)
makeactive
chainload +1
boot
makeactive - установит флаг, указывающий на то, что это активный раздел. Это работает только с основными разделами DOS.
chainload +1 - Указывает GRUB на необходимость загрузки первого сектора загрузочного раздела. Обычно там располагаются загрузчики.
boot - запустит загрузчик и загрузит соответствующую операционную систему
Где по умолчанию находится файл конфигурации GRUB 2?
/boot/grub/grub.cfg
Как изменить настройки GRUB 2?
Внесите изменения в файл /etc/default/grub, затем обновите конфигурацию с помощью update-grub.
В какой файл нужно добавлять пользовательские пункты меню GRUB 2?
/etc/grub.d/40_custom
Где хранятся пункты меню для GRUB Legacy?
/boot/grub/menu.lst
Как войти в GRUB Shell из меню GRUB 2 или GRUB Legacy?
Нажмите c на экране меню.






