Загрузчик GRUB 2

В этой статье рассмотрим подробнее самый популярный загрузчик для операционных систем Linux, а именно GRUB 2.

GRUB 2

GRUB 2 (GRand Unified Bootloader / большой единый загрузчик) — это кроссплатформенный загрузчик операционных систем.

При старте системы, когда запускается GRUB 2 вы видите следующее меню:

Управление осуществляется следующими клавишами:

  • Стрелки «вверх/вниз» — переход по пунктам меню;
  • «Enter» — загрузка выбранного пункта;
  • «e» — редактирование выбранного пункта;
  • «c» — запуск командной строки.

Настройка GRUB 2

При загрузки GRUB 2 читает конфигурационный файл /boot/grub/grub.cfg, но редактировать вручную его не нужно, об этом даже предупреждают в начале этого файла (на английском):

$ head /boot/grub/grub.cfg

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  • Я использовал команду head, чтобы посмотреть первые строки из файла /boot/grub/grub.cfg.

Основной конфигурационный файл, который нужно редактировать для настройки этого загрузчика - /etc/default/grub.

Для Debian:

$ cat /etc/default/grub | grep -v '^#'

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

Для Ubuntu:

$ cat /etc/default/grub | grep -v '^#'

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="maybe-ubiquity"
GRUB_CMDLINE_LINUX=""
  • Я вывожу содержимое файлов без комментариев с помощью grep -v '^#'.

Параметры конфигурации

Давайте рассмотрим какими параметрами можно настроить наш загрузчик:

  • GRUB_DEFAULT — отвечает за номер строки, которая будет загружена по умолчанию. Отсчет начинается с нуля, то-есть 0.
  • GRUB_TIMEOUT — отвечает за время (в секундах), после истечения которого, если ничего не нажать, загрузится строка под номером указанным в GRUB_DEFAULT. Чтобы меню не появлялось следует указать 0, а чтобы выключить таймер то -1.
  • GRUB_TIMEOUT_STYLE — с помощью этого параметра можно скрыть или отобразить меню:
    • hidden — меню будет скрыто в течении GRUB_TIMEOUT, а затем начнется загрузка системы;
    • menu — меню будет отображаться, тоже самое будет если полностью удалить этот параметр.
  • GRUB_DISTRIBUTOR — описательное имя для строки меню. Здесь можно указать строку, но по умолчанию вместо строки используется команда lsb_release -i -s 2> /dev/null || echo Debian которая найдет имя операционной системы (Ubuntu или Debian GNU/Linux), а если не найдет то напишет Debian;
  • GRUB_CMDLINE_LINUX_DEFAULT — этот параметр позволяет передать опции загрузки ядра, добавляемые только к обычному режиму загрузки системы:
    • quiet — означает, не выводить сообщения во время загрузки;
    • splash — вывести заставку загрузки;
    • selinux=0 — выключить selinux;
    • rootfstype=ext4 — можем указать тип файловой системы, чтобы он не вычислялся.
  • GRUB_CMDLINE_LINUX — тоже самое что и GRUB_CMDLINE_LINUX_DEFAULT, только применяется и к обычному режиму загрузки, и к режиму восстановления системы;
  • GRUB_TERMINAL — задает устройство для вывода терминала:
    • console — отключает графический терминал, при этом меню будет показано в текстовом виде;
    • gfxterm — включает графический терминал;
  • GRUB_GFXMODE — позволяет задать разрешение и глубину цвета для графического терминала, например 640x480x32;
  • GRUB_HIDDEN_TIMEOUT — можно указать сколько секунд меню будет скрыто. При этом GRUB_TIMEOUT должен быть равным нулю. При такой настройке меню не будет показываться, а чтобы его увидеть нужно нажать клавишу «Esc».
  • GRUB_DISABLE_LINUX_UUID — выключает UUID (идентификатор диска), вместо него будет использоваться например /dev/sda;
  • GRUB_DISABLE_RECOVERY — выключает пункты меню режима восстановления;
  • GRUB_INIT_TUNE — звуковой сигнал при загрузке меню. Можете попробовать такой звук:
GRUB_INIT_TUNE="1750 523 1 392 1 523 1 659 1 784 1 1047 1 784 1 415 1 523 1 622 1 831 1 622 1 831 1 1046 1 1244 1 1661 1 1244 1 466 1 587 1 698 1 932 1 1195 1 1397 1 1865 1 1397 1"

После изменения настроек GRUB 2 нужно всегда выполнять команду update-grub2 для применения настроек. Но выполнять её нужно с правами администратора.

$ sudo update-grub2

Своя картинка в меню

На задний фон меню загрузки можно поместить какую-нибудь картинку. Для этого нужно положить файл картинки в /boot/grub и выполнить команду update-grub2. Файл должен быть обязательно в формате .png.

$ sudo cp ./пингвин.png /boot/grub/

$ sudo update-grub2
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found background image: пингвин.png
Found linux image: /boot/vmlinuz-5.15.0-30-generic
Found initrd image: /boot/initrd.img-5.15.0-30-generic
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
done

После перезагрузки системы увидим нашу картинку:

Добавление параметров ядра в меню GRUB 2

Добавлять параметры ядра можно не только редактируя файл /etc/default/grub, но и в самом меню. Для этого нужно отредактировать выбранный пункт меню нажав клавишу e, после чего у вас откроется вот такой редактор:

  • Опции загрузки добавляются в строке начинающейся с linux, это строка выделена на рисунке выше.

Редактируя здесь параметры ядра можно, например сбросить пароль root пользователя в системе. Для этого нужно ro изменить на rw, и дописать init=/bin/bash:

Дальше нажимаем Ctrl+x или F10 для загрузки и попадаем в систему под пользователем root, без ввода пароля.

Осталось только поменять пароль и перезагрузить сервер.

Командная строка GRUB 2

Чтобы попасть в командную строку нажимаем клавишу c. Рассмотрим пока только две команды:

  • ls — позволяет просматривать файлы на файловой системе, а также блочные устройства;

  • search — позволяет производить поиск.

  • Команда ls без параметров покажет нам список разделов;

  • С помощью команды search -f /путь_к_файлу можем найти раздел, на котором лежит определённый файл;

  • Если к команде ls добавить раздел ls (hd0,gpt2) -> получим информацию о нём;

  • А если после раздела поставить слеш ls (hd0,gpt2)/ -> увидим содержимое этого раздела;

  • Можем посмотреть содержимое определённого каталога ls (hd0,gpt2)/boot/grub/;

  • Если вы хотите перезагрузить систему, выполните reboot.

Меню GRUB 2 с несколькими системами

Если на компьютере установлено несколько систем, то меню GRUB 2 выглядит следующим образом:

Как установить 2-е системы на один компьютер и при этом использовать загрузчик GRUB 2 мы разберём в следующей статье.

Каталог со скриптами (/etc/grub.d/)

В каталоге /etc/grub.d/ находятся специальные скрипты написанные на языке сценариев sh. Они выполняются при обновлении GRUB 2, то есть когда мы выполняем команду update-grub2.

Рассмотрим предназначения некоторых из скриптов:

  • 10_linux — отвечает за поиск ядер linux;
  • 30_os-prober — отвечает за поиск других ос;
  • 40_custom — позволяет добавлять свои пункты загрузки.

Если понравилась статья, подпишись на мой канал в  VK  или  Telegram .