GNU GRUB (сокращение от GNU GRand Unified Bootloader , обычно называемый GRUB ) — пакет загрузчика из проекта GNU . GRUB — это эталонная реализация спецификации Multiboot от Free Software Foundation , которая предоставляет пользователю возможность выбора между загрузкой одной из нескольких операционных систем, установленных на компьютере, или выбором определенной конфигурации ядра , доступной на разделах конкретной операционной системы.
GNU GRUB был разработан на основе пакета Grand Unified Bootloader (игра слов Grand Unified Theory [6] ). Он в основном используется для Unix-подобных систем.
Когда компьютер включается, его BIOS находит первичное загрузочное устройство (обычно жесткий диск компьютера) и запускает начальную программу начальной загрузки из главной загрузочной записи (MBR). MBR — это первый сектор жесткого диска. Эта программа начальной загрузки должна быть небольшой, поскольку она должна умещаться в одном секторе. Долгое время размер сектора составлял 512 байт. С 2009 года доступны жесткие диски с размером сектора 4096 байт, называемые дисками Advanced Format , но по состоянию на октябрь 2013 года [обновлять]такие жесткие диски по-прежнему доступны в секторах по 512 байт, используя эмуляцию 512e . [7] Устаревшая таблица разделов MBR поддерживает максимум четыре раздела и занимает 64 байта в совокупности. Вместе с дополнительной сигнатурой диска (четыре байта) и временной меткой диска (шесть байт) это оставляет от 434 до 446 байт, доступных для машинного кода загрузчика. Хотя такого небольшого пространства может быть достаточно для очень простых загрузчиков, [8] оно недостаточно велико для загрузчика, поддерживающего сложные и множественные файловые системы , выбор вариантов загрузки с помощью меню и т. д. Загрузчики с большим объемом памяти поэтому разбиваются на части, где наименьшая часть помещается в MBR, в то время как одна или несколько более крупных частей хранятся в других местах, таких как пустые сектора между MBR и первым разделом. Код в MBR затем делает немного больше, чем запускает вторую часть.
Целью оставшейся части(ей) загрузчика является фактическая загрузка операционной системы путем ее настройки и запуска ядра . Ядра в большинстве случаев хранятся в виде файлов, находящихся в соответствующих файловых системах, но концепция файловой системы неизвестна BIOS. Таким образом, в системах на основе BIOS обязанность загрузчика заключается в доступе к содержимому этих файлов, чтобы его можно было загрузить в оперативную память и выполнить.
Один из возможных подходов для загрузчиков — загрузка образов ядра путем прямого доступа к секторам жесткого диска без понимания базовой файловой системы. Обычно требуется дополнительный уровень косвенности в виде карт или файлов карт — вспомогательных файлов, содержащих список физических секторов, занятых образами ядра. Такие карты необходимо обновлять каждый раз, когда образ ядра меняет свое физическое местоположение на диске из-за установки новых образов ядра, дефрагментации файловой системы и т. д. Кроме того, в случае изменения картами своего физического местоположения их местоположения необходимо обновить в коде MBR загрузчика, чтобы механизм косвенности секторов продолжал работать. Это не только обременительно, но и оставляет систему нуждающейся в ручном ремонте в случае, если что-то пойдет не так во время обновления системы. [9]
Другой подход заключается в том, чтобы сделать загрузчик осведомленным о базовых файловых системах, поэтому образы ядра настраиваются и доступны с использованием их фактических путей к файлам . Для этого требуется, чтобы загрузчик содержал драйвер для каждой из поддерживаемых файловых систем, чтобы они могли быть поняты и доступны самому загрузчику. Такой подход устраняет необходимость в жестко закодированных расположениях секторов жесткого диска и наличии файлов карт, а также не требует обновлений MBR после добавления или перемещения образов ядра. Конфигурация загрузчика хранится в обычном файле, к которому также осуществляется доступ с учетом файловой системы для получения конфигураций загрузки до фактической загрузки любых образов ядра. Таким образом, меньше вещей может пойти не так во время обновлений системы. Недостатком таких загрузчиков является то, что они больше и сложнее. [9]
GNU GRUB использует второй подход, понимая базовые файловые системы. Сам загрузчик разделен на несколько этапов , чтобы он соответствовал схеме загрузки MBR.
Широко используются две основные версии GRUB: GRUB версии 0, называемая GRUB legacy, распространена только в старых выпусках дистрибутивов Linux. GRUB 2 был написан с нуля и предназначался для замены своего предшественника, и в настоящее время используется большинством дистрибутивов Linux.
GRUB 0.x следует двухэтапному подходу. Основная загрузочная запись (MBR) обычно содержит этап GRUB 1 или может содержать стандартную реализацию MBR, которая загружает этап GRUB 1 из загрузочного сектора активного раздела . Учитывая небольшой размер загрузочного сектора (512 байт), этап 1 может сделать немного больше, чем загрузить следующий этап GRUB, загрузив несколько секторов диска из фиксированного местоположения около начала диска (в пределах его первых 1024 цилиндров).
Этап 1 может напрямую загружать этап 2 , но обычно он настроен на загрузку этапа 1.5. , расположенного в первых 30 КБ жесткого диска сразу после MBR и перед первым разделом. В случае, если это пространство недоступно (необычная таблица разделов, специальные драйверы диска, диск GPT или LVM ), установка этапа 1.5 не будет выполнена. Образ этапа 1.5 содержит драйверы файловой системы, что позволяет ему напрямую загружать этап 2 из любого известного места в файловой системе, например из /boot/grub
. Затем этап 2 загрузит файл конфигурации по умолчанию и любые другие необходимые модули.
boot.img
( этап 1 ) записывается в первые 440 байтов основной загрузочной записи (загрузочный код MBR в секторе 0) или, опционально, в загрузочный сектор раздела (PBR). Он адресуется diskboot.img
по 64-битному адресу LBA . Фактический номер сектора записывается с помощью grub-install
. diskboot.img
является первым сектором core.img
с единственной целью загрузить остальные core.img
идентифицированные с помощью номеров секторов LBA, также записанных с помощью grub-install
.core.img
( этап 1.5 ) хранится в пустых секторах (если они доступны) между MBR и первым разделом. Последние операционные системы предлагают здесь зазор в 1 МБ для выравнивания (2047 секторов по 512 байт или 255 секторов по 4 КБ). Этот зазор раньше составлял 62 сектора (31 КБ) как напоминание об ограничении числа секторов адресации Cylinder-Head-Sector (C/H/S), используемой BIOS до 1996 года, поэтому core.img
он разработан так, чтобы быть меньше 32 КБ.core.img
записывается в свой собственный раздел. Он должен быть помечен как "BIOS_grub", не должен быть отформатирован и может быть размером всего 1 МБ.core.img
загрузка /boot/grub/i386-pc/normal.mod
из раздела, настроенного с помощью grub-install
. Если индекс раздела изменился, GRUB не сможет найти normal.mod
, и предоставит пользователю приглашение GRUB Rescue./boot/grub/
находится либо в корневом разделе дистрибутива Linux, либо в отдельном разделе /boot .normal.mod
анализирует /boot/grub/grub.cfg
, опционально загружает модули (например, для графического интерфейса и поддержки файловой системы) и отображает меню./efi/<distro>/grubx64.efi
(для систем x64 UEFI) устанавливается как файл в системный раздел EFI и загружается прошивкой напрямую, без boot.img
сектора MBR 0. Этот файл похож на stage1 и stage1.5./boot/grub/
может быть установлен, среди прочего, на системный раздел EFI или на отдельный раздел /boot ./boot/grub/x86_64-efi/normal.mod
и другие /boot/grub/
файлы.GRUB представляет меню, в котором пользователь может выбрать одну из операционных систем (ОС), найденных grub-install. GRUB можно настроить на автоматическую загрузку указанной ОС после определенного пользователем тайм-аута. Если тайм-аут установлен на ноль секунд, нажатие и удерживание ⇧ Shiftво время загрузки компьютера позволяет получить доступ к меню загрузки. [11]
В меню выбора операционной системы GRUB принимает несколько команд:
nvidia-current
modprobe.blacklist=nvidia-current
После выбора параметров загрузки GRUB загружает выбранное ядро в память и передает управление ядру. В качестве альтернативы GRUB может передать управление процессом загрузки другому загрузчику, используя цепную загрузку . Этот метод используется для загрузки операционных систем, которые не поддерживают спецификацию Multiboot или не поддерживаются напрямую GRUB.
К компьютеру может быть подключено несколько жестких дисков. Они могут быть идентифицированы через их порт SATA. Каждый раз, когда компьютер проходит процедуру POST , жесткому диску, подключенному к определенному порту материнской платы, может быть назначен один и тот же идентификатор, например hd0, hd1, …
. Но что, если такая согласованность не может быть гарантирована? Что, если созвездие подключенных жестких дисков изменится от одного запуска к другому? Что, если жесткий диск будет подключен к другому компьютеру?
Введя ls
либо консоль восстановления GRUB (доступна после загрузки core.img
), либо консоль GRUB (доступна после загрузки normal.mod
), можно получить список всех доступных жестких дисков и разделов. Например, ls (hd0,5)/
) покажет номера, которые могут быть назначены фактическим жестким дискам и разделам.
Поскольку невозможно гарантировать hd0"
единообразие нумерации жестких дисков с помощью номеров устройств, GNU GRUB может использовать универсальный уникальный идентификатор (UUID) для идентификации разделов (фактически экземпляров файловой системы).
Файловые системы ext2, ext3, ext4 и xfs используют UUID для уникальной идентификации экземпляра. UUID создается при форматировании раздела. UUID является частью файловой системы и записывается в суперблок . Все операции, кроме форматирования, должны оставлять UUID неизменным. Можно изменить UUID или дублировать его, используя dd для клонирования всего раздела.
Файл grub.cfg
используется для настройки GRUB. Он содержит команды, которые должны быть выполнены при каждом запуске. Без существующего и действительного grub.cfg
GRUB выдаст приглашение.
Абсолютный минимум grub.cfg
может содержать только следующие две команды (ср. начальный электронный диск ):
linux (hd0,1)/kernel/vmlinuz-3.20.1-4 ro # использовать имя файла "vmlinuz-…", расположенного в каталоге /kernel на первом разделе первого жесткого диска, как образ ядра Linuxinitrd (hd0,1)/boot/initrd.img-3.20.1-4 # использовать файл с именем "initrd.img–…", расположенный в каталоге /boot на первом разделе первого жесткого диска, как начальный ramdisk
Любитель grub.cfg
опишет меню, которое будет представлено, использует несколько цветов и может указать фоновое изображение.
GRUB изначально был разработан Эрихом Болейном как часть работы по загрузке операционной системы GNU / Hurd , разработанной Free Software Foundation . [13] В 1999 году Гордон Мацигкейт и Ёсинори К. Окудзи сделали GRUB официальным программным пакетом проекта GNU и открыли процесс разработки для публики. [13] По состоянию на 2014 год большинство дистрибутивов Linux приняли GNU GRUB 2, а также другие системы, такие как PlayStation 4[обновлять] от Sony . [14]
GRUB версии 0 (также известный как «GRUB Legacy») больше не находится в разработке и постепенно прекращает свое существование. [15] Разработчики GNU GRUB переключили свое внимание на GRUB 2, [16] полностью переписанный с целями сделать GNU GRUB чище, надежнее, портативнее и мощнее. GRUB 2 начинался под названием PUPA . PUPA поддерживался Агентством по содействию информационным технологиям (IPA) в Японии. PUPA был интегрирован в разработку GRUB 2 около 2002 года, когда версия GRUB 0.9x была переименована в GRUB Legacy.
Некоторые из целей проекта GRUB 2 включают поддержку не-x86 платформ , интернационализацию и локализацию , не-ASCII символы, динамические модули, управление памятью , скриптовый мини-язык , миграцию платформенно-специфичного (x86) кода в платформенно-специфичные модули и объектно-ориентированный фреймворк. GNU GRUB версии 2.00 был официально выпущен 26 июня 2012 года. [17] [18]
Три наиболее широко используемых дистрибутивов Linux используют GRUB 2 в качестве основного загрузчика. [19] [20] [21] Ubuntu приняла его в качестве загрузчика по умолчанию в своей версии 9.10 в октябре 2009 года. [22] Fedora последовала этому примеру, выпустив Fedora 16 в ноябре 2011 года. [23] OpenSUSE приняла GRUB 2 в качестве загрузчика по умолчанию в своем выпуске 12.2 в сентябре 2012 года. [24] Solaris также приняла GRUB 2 на платформе x86 в выпуске Solaris 11.1. [25] Buildroot также использует GNU GRUB для целей x86 и x86_64 .
В конце 2015 года была обнаружена и быстро устранена уязвимость, позволяющая нажимать клавишу Backspace 28 раз для обхода пароля входа в систему. [26] [27]
GNU GRUB — это свободное программное обеспечение , поэтому было создано несколько вариантов. Некоторые из них, которые не были объединены в основную ветку GRUB:
Инструменты настройки, используемые различными дистрибутивами, часто включают модули для настройки GRUB. Например, YaST2 в дистрибутивах SUSE Linux и openSUSE и Anaconda в дистрибутивах Fedora / RHEL . StartUp-Manager и GRUB Customizer — графические редакторы конфигурации для дистрибутивов на базе Debian. Разработка StartUp-Manager была остановлена 6 мая 2011 года после того, как ведущий разработчик сослался на личные причины неактивной разработки программы. [37] GRUB Customizer также доступен для дистрибутивов на базе Arch.
Для GRUB 2 существуют модули управления KDE. [38] [39]
GRLDR ICE — это небольшой инструмент для изменения конфигурации файла grldr по умолчанию для GRUB4DOS. [40]
Boot-Repair — это простой графический инструмент для восстановления после частых проблем с загрузкой GRUB и загрузчика Microsoft Windows . Это приложение доступно по лицензии GNU GPL . Boot-Repair может восстанавливать GRUB на нескольких дистрибутивах Linux, включая, помимо прочего, Debian, Ubuntu, Mint , Fedora, openSUSE и Arch Linux .
Grub2Win — это пакет программного обеспечения с открытым исходным кодом для Windows. Он позволяет GNU GRUB загружаться из каталога Windows. Программа установки устанавливает GNU GRUB версии 2.12 в раздел NTFS. Затем приложение Windows GUI используется для настройки меню загрузки GRUB, тем, порядка загрузки UEFI, скриптов и т. д. Все скрипты и команды GNU GRUB поддерживаются как для UEFI, так и для устаревших систем. Grub2Win может настраивать GRUB для мультизагрузки Windows, Ubuntu, openSuse, Fedora и многих других дистрибутивов Linux. Он свободно доступен по лицензии GNU GPL на SourceForge.
Преимущество GRUB заключается в широком спектре поддерживаемых платформ, файловых систем и операционных систем, что делает его выбором по умолчанию для дистрибутивов и встраиваемых систем.
Однако существуют менеджеры загрузки, ориентированные на конечного пользователя, которые обеспечивают более удобный пользовательский интерфейс, графический выбор ОС и более простую настройку:
Неграфические альтернативы:
Вики-ресурсы по дистрибутивам содержат множество решений распространенных проблем и пользовательских настроек, которые могут вам помочь:
{{cite web}}
: CS1 maint: бот: исходный статус URL неизвестен ( ссылка ).