Открыть сервис

GRUB

GRUB (Grand Unified Bootloader) — загрузчик операционной системы, используемый в большинстве дистрибутивов Linux и других Unix-подобных системах. Он отвечает за загрузку ядра операционной системы после завершения работы BIOS или UEFI, предоставляя пользователю меню выбора загружаемой ОС. GRUB является свободным программным обеспечением, распространяемым под лицензией GNU General Public License.

История

Происхождение

GRUB был разработан Эриком Бойном (Erik B. Naggum) и другими участниками проекта GNU в 1995 году как замена загрузчику LILO (Linux Loader). Основной целью было создание более гибкого и мощного инструмента, способного работать с различными файловыми системами и поддерживать загрузку нескольких операционных систем.

Версия 1 (GRUB Legacy)

Первая стабильная версия, получившая название GRUB Legacy, вышла в 1999 году. Она поддерживала загрузку с разделов, отформатированных в файловых системах ext2, ext3, FAT16, FAT32, и других. GRUB Legacy обладал текстовым интерфейсом и позволял редактировать параметры загрузки вручную. Однако его архитектура была ограничена: он не поддерживал загрузку с дисков, отформатированных в современных файловых системах, таких как NTFS или Btrfs, и имел проблемы с работой на системах с UEFI.

Версия 2 (GRUB 2)

В 2002 году началась разработка второй версии, известной как GRUB 2. Она была полностью переписана с нуля с целью устранения недостатков предшественника. GRUB 2 получил модульную архитектуру, поддержку загрузки с дисков с файловыми системами Btrfs, XFS, ZFS, а также возможность работы с UEFI. Первая стабильная версия GRUB 2 вышла в 2010 году. Начиная с 2012 года, большинство дистрибутивов Linux перешли на GRUB 2, и GRUB Legacy считается устаревшим.

Архитектура и принцип работы

Этапы загрузки

GRUB 2 работает в несколько этапов:

  1. Загрузка первого этапа (boot.img) — записывается в главную загрузочную запись (MBR) или в EFI-раздел. Этот код минимален (около 512 байт) и предназначен для загрузки следующего этапа.
  2. Загрузка второго этапа (core.img) — загружается с диска и содержит драйверы для работы с файловыми системами и дисками. Этот этап может быть расположен в области между MBR и первым разделом диска или в отдельном разделе.
  3. Загрузка конфигурации и меню — GRUB считывает файл конфигурации /boot/grub/grub.cfg, который содержит список загружаемых ядер и операционных систем. На основе этого файла формируется меню выбора.
  4. Загрузка ядра — после выбора пользователем пункта меню GRUB загружает ядро операционной системы и передаёт ему управление.

Модульная структура

GRUB 2 состоит из множества модулей, которые загружаются по мере необходимости. Модули могут включать поддержку различных файловых систем (ext2, ext4, Btrfs, XFS, NTFS, FAT32), сетевых протоколов (TFTP, HTTP), шифрования (LUKS), а также графических интерфейсов. Это позволяет уменьшить размер загрузчика и адаптировать его под конкретные задачи.

Конфигурация

Файл grub.cfg

Основной файл конфигурации GRUB 2 — /boot/grub/grub.cfg. Он генерируется автоматически с помощью утилиты grub-mkconfig (или update-grub в некоторых дистрибутивах) и не рекомендуется для ручного редактирования. Вместо этого пользователи могут изменять настройки в файле /etc/default/grub, который содержит переменные, такие как GRUB_DEFAULT (пункт меню по умолчанию), GRUB_TIMEOUT (время ожидания выбора), GRUB_CMDLINE_LINUX (параметры ядра).

Ручная настройка

Для опытных пользователей доступна ручная настройка через командную строку GRUB. В режиме загрузки можно нажать клавишу c для входа в командную оболочку, где доступны команды, такие как ls (список дисков и разделов), set (установка переменных), linux (загрузка ядра) и boot (запуск загрузки). Это позволяет загрузить систему даже при повреждении конфигурационного файла.

Поддержка операционных систем

Linux

GRUB является основным загрузчиком для большинства дистрибутивов Linux, включая Ubuntu, Debian, Fedora, Arch Linux и openSUSE. Он поддерживает загрузку ядер Linux, а также initramfs (образы начальной файловой системы).

Windows

GRUB может загружать Windows через механизм цепочной загрузки (chainloading). Для этого в конфигурации указывается раздел, содержащий загрузчик Windows (например, ntldr для Windows XP или bootmgfw.efi для Windows 7 и новее). Однако GRUB не может напрямую загружать ядро Windows, так как оно использует собственный загрузчик.

Другие системы

GRUB поддерживает загрузку FreeBSD, NetBSD, OpenBSD, а также некоторых версий macOS (через загрузчик boot.efi). Для этого требуется соответствующая настройка конфигурации.

Графический интерфейс

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

Безопасность

Парольная защита

GRUB позволяет установить пароль на редактирование параметров загрузки или на выбор определённых пунктов меню. Пароль хранится в виде хеша (например, PBKDF2) в файле конфигурации. Для защиты от несанкционированного доступа рекомендуется использовать пароль на этапе загрузки.

Шифрование

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

Подпись ядра

В системах с UEFI GRUB может загружать только подписанные ядра, если включена функция Secure Boot. Для этого используется модуль shim, который проверяет цифровую подпись загрузчика и ядра.

Критика

GRUB подвергается критике за сложность конфигурации и потенциальные проблемы с производительностью. Некоторые пользователи отмечают, что автоматическая генерация grub.cfg может приводить к ошибкам при обновлении ядра, особенно в системах с нестандартной конфигурацией разделов. Кроме того, GRUB 2 имеет больший размер по сравнению с альтернативами, такими как systemd-boot или rEFInd, что может быть критично для встраиваемых систем.

Альтернативы

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

  • LILO — устаревший загрузчик, не поддерживающий UEFI и современные файловые системы.
  • systemd-boot — простой загрузчик, входящий в состав systemd, используемый в некоторых дистрибутивах (например, в Arch Linux).
  • rEFInd — загрузчик с графическим интерфейсом, поддерживающий загрузку нескольких ОС, включая macOS и Windows.
  • Syslinux — набор загрузчиков, используемый в основном для загрузки с USB-накопителей и в Live-системах.

Интересные факты

  • GRUB был первым загрузчиком, который поддерживал загрузку с дисков, отформатированных в файловой системе ext2, без необходимости использования отдельного раздела для загрузчика.
  • В 2015 году была обнаружена уязвимость в GRUB (CVE-2015-8370), позволяющая обойти парольную защиту путём ввода определённой последовательности символов. Уязвимость была исправлена в версии 2.02.
  • GRUB используется в проекте GNU Hurd — микроядерной операционной системе, разрабатываемой в рамках проекта GNU.

Источники

  • Официальная документация GNU GRUB Manual
  • Статья «GRUB» в энциклопедии ArchWiki
  • Документация проекта GNU GRUB
  • Материалы конференции Linux Foundation по загрузчикам

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →