В этой статье рассмотрим подробнее самый популярный загрузчик для операционных систем Linux, а именно GRUB 2.
GRUB 2
GRUB 2 (GRand Unified Bootloader / большой единый загрузчик) — это кроссплатформенный загрузчик операционных систем.
При старте системы, когда запускается GRUB 2 вы видите следующее меню:
Хотя, по умолчанию в Ubuntu 22.04 вы не увидите это меню, так как система загружается сразу, не показывая его в отличие от Debian 11. А в Debian 11 по умолчанию это меню появляется на 5 секунд.
В обоих системах управление осуществляется следующими клавишами:
- Стрелки «вверх/вниз» — переход по пунктам меню;
- «Enter» — загрузка выбранного пункта;
- «e» — редактирование выбранного пункта;
- «c» — запуск командной строки.
Настройка GRUB 2
При загрузки GRUB 2 читает конфигурационный файл /boot/grub/grub.cfg, но редактировать вручную его не нужно, об этом даже предупреждают в начале этого файла (на английском):
alex@deb-11:~$ 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.
Для Ubuntu 22.04 и Debian 11 настройки по умолчанию немного отличаются. Ниже я вывожу содержимое файлов без комментариев.
Для Debian 11:
alex@deb:~$ 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 22.04:
alex@ubu:~$ 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=""
Параметры конфигурации
Давайте рассмотрим какими параметрами можно настроить наш загрузчик:
- GRUB_DEFAULT — отвечает за номер строки, которая будет загружена по умолчанию. Отсчет начинается с нуля, то-есть 0 — это первая строчка меню, 1 — это вторая строчка меню и так далее.
- 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 для применения настроек. Но выполнять её нужно с правами администратора, поэтому в Debian переключаемся на root пользователя:
alex@deb:~$ su - Пароль: root@deb:~# update-grub2 Generating grub configuration file ... Found linux image: /boot/vmlinuz-5.10.0-13-amd64 Found initrd image: /boot/initrd.img-5.10.0-13-amd64 Found linux image: /boot/vmlinuz-5.10.0-10-amd64 Found initrd image: /boot/initrd.img-5.10.0-10-amd64 done
А в Ubuntu можем это выполнить с помощью команды sudo:
alex@ubu:~$ sudo update-grub2
Своя картинка в меню
На задний фон меню загрузки можно поместить какую-нибудь картинку. Для этого нужно положить файл картинки в /boot/grub и выполнить команду update-grub2. Файл должен быть обязательно в формате .png.
Вот пример для Ubuntu с использованием sudo, а в Debian вам нужно будет переключиться на пользователя root:
alex@ubu:~$ sudo cp ./пингвин.png /boot/grub/ alex@ubu:~$ 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
И после перезагрузки системы увидим нашу картинку (для перезагрузки используйте команду sudo reboot):
Добавление параметров ядра в меню 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«.
Скрипты для Debian 11:
alex@deb:~$ ls /etc/grub.d/ 00_header 05_debian_theme 10_linux 20_linux_xen 30_os-prober 30_uefi-firmware 40_custom 41_custom README
Скрипты для Ubuntu 22.04:
alex@ubu:~$ ls /etc/grub.d/ 00_header 05_debian_theme 10_linux 10_linux_zfs 20_linux_xen 30_os-prober 30_uefi-firmware 35_fwupd 40_custom 41_custom README
Рассмотрим предназначения некоторых из них:
- «10_linux» — отвечает за поиск ядер linux;
- «30_os-prober» — отвечает за поиск других ос;
- «40_custom» — позволяет добавлять свои пункты загрузки.