Загрузчик GRUB в Linux

GRUB (GNU GRUB, расшифровывается как GRand Unified Bootloader — «унифицированный загрузчик GNU») — это загрузчик операционной системы, который используется в большинстве дистрибутивов 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 на экране меню.


    Источники
    Последнее изменение: 18.08.2026 17:35


    Связанные темы
    Здесь пока нет комментариев
    Добавлять комментарии могут только авторизованные пользователи

    Авторизоваться
    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ