GRUB — загрузчик системы
GRUB (GRand Unified Bootloader 1) ) — программа-загрузчик операционных систем.
GRUB является эталонной реализацией загрузчика, соответствующего спецификации Multiboot и может загрузить любую совместимую с ней операционную систему. Среди них: Linux, FreeBSD, Solaris и многие другие. Кроме того, GRUB умеет по цепочке передавать управление другому загрузчику, что позволяет ему загружать Windows (через загрузчик NTLDR), MS -DOS, OS /2 и другие системы.
После настройки GRUB пользователь при включении компьютера видит список операционных систем, которые установлены на его компьютер и которые можно загрузить, выбрав подходящую и нажав Enter .
GRUB позволяет пользователю при загрузке задавать произвольные параметры и передавать их в ядро Multiboot-совместимой ОС для дальнейшей обработки.
GRUB — самый популярный загрузчик в мире Linux и является загрузчиком по умолчанию в большинстве известных дистрибутивов.
Здесь и далее в иных статьях под названием программы GRUB подразумевается GRUB 2, который используется в операционных системах семейства Ubuntu начиная с версии 9.10, до него использовался GRUB первой версии, сейчас известный как GRUB Legacy. GRUB 2 полностью переписан с нуля и не имеет ничего общего с GRUB Legacy, разработка которого была остановлена в пользу более совершенного и мощного GRUB.
Первые шаги
При первом сравнении GRUB со старым GRUB Legacy самым весомым различием оказывается измененная структура файлов конфигурации.
Настройка GRUB производится теперь принципиально иным способом — основным файлом конфигурации является «/boot/grub/grub.cfg«. Однако же, не торопитесь править его так, как привыкли это делать с «menu.lst» в GRUB Legacy. При внимательном прочтении мы видим в начале файла «grub.cfg» такие строки:
# # DO NOT EDIT THIS FILE # # It is automatically generated by /usr/sbin/grub-mkconfig using templates # from /etc/grub.d and settings from /etc/default/grub #
И об этом нас предупреждают не просто так. Ведь «grub.cfg» генерируется автоматически с использованием нескольких скриптов. Поэтому после следующего обновления GRUB ваш «grub.cfg» будет создан заново, и все ваши правки будут утрачены.
Кроме файла «grub.cfg», отвечающего за загрузочное меню, имеются файл «/etc/default/grub» и папка «/etc/grub.d«. Рассмотрим их подробнее.
/etc/default/grub
Данный файл содержит в себе основные настройки для GRUB. Через него, собственно, они и изменяются. Для наглядности ниже приводится примерное содержимое этого файла:
GRUB_DEFAULT=6 #GRUB_HIDDEN_TIMEOUT=0 GRUB_HIDDEN_TIMEOUT_QUIET=true GRUB_TIMEOUT="2" GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" GRUB_CMDLINE_LINUX="" # Uncomment to disable graphical terminal (grub-pc only) #GRUB_TERMINAL=console # The resolution used on graphical terminal # note that you can use only modes which your graphic card supports via VBE # you can see them in real GRUB with the command `vbeinfo' #GRUB_GFXMODE=640x480 # Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux #GRUB_DISABLE_LINUX_UUID=true # Uncomment to disable generation of recovery mode menu entrys #GRUB_DISABLE_LINUX_RECOVERY="true"
Файл представляет из себя набор опций в понятном формате ОПЦИЯ=ЗНАЧЕНИЕ.
Наиболее часто встречающаяся потребность при настройке GRUB — изменение стандартного пункта загрузки и/или времени показа меню. Рассмотрим же, как это делается.
Изменение стандартного пункта загрузки
По умолчанию стандартный пункт (выделенный при показе меню) — верхний в списке. После установки Ubuntu она окажется наверху, а Windows, например, будет последним пунктом.
Значением «GRUB_DEFAULT» является номер пункта меню, который должен быть выбран стандартным. Чтобы выбрать другой пункт, нам нужно узнать, каким по счету он будет в списке. Есть два варианта:
Нумерация пунктов меню начинается с нуля. Значение по умолчанию — 0, поэтому и выбирается первый пункт.
Пятому сверху пункту будет соответствовать значение 4, второму — 1, первому — 0. В вышеприведенном примере установлено значение 6, то есть стандартным задан седьмой пункт меню.
Команда sudo grub-reboot 1 однократно выбирает второй пункт меню по-умолчанию (только для следующей загрузки),
Или же можно указать значение идентификатора (id), оно должно быть именно таким, каким мы его видим в «/boot/grub/grub.cfg«. Данный способ удобен тем, что после обновления ядра не придется изменять настройки из-за сбившейся нумерации.
Пример
Если в «grub.cfg» пункт меню выглядит так:
menuentry ‘Example GNU/Linux distribution’ —class gnu-linux —id example-gnu-linux
То значение параметра «GRUB_DEFAULT» должно указываться именно в виде:
GRUB_DEFAULT=example-gnu-linux
Ранее документацией предлагалось указывать название пункта меню загрузки (так, как он отображается в самом меню). Хотя этот способ по-прежнему работает, использовать его не рекомендуется, поскольку эти названия могут меняться, например, при обновлении ядра/версии ОС
Изменение времени отображения меню
По умолчанию меню загрузки отображается 10 секунд (при наличии других установленных ОС, если система одна — GRUB по умолчанию не отображается и сразу начинает загрузку), после чего загружается стандартный пункт, если раньше не нажат Enter или не выбран другой пункт, что останавливает таймер. За эту задержку отвечает параметр «GRUB_TIMEOUT», значение задается в секундах.
Если поставить значение «-1», то меню будет отображаться до тех пор, пока пользователь не выберет какой-либо пункт
Обратите внимание, что цифра указывается в кавычках. В нашем примере это значение — 2, то есть меню отображается две секунды.
«Скрытое» меню
В случае, если на компьютере установлена только Ubuntu, меню загрузки по умолчанию не будет отображаться, а GRUB будет загружать вас напрямую в систему. Однако же, иногда может возникнуть необходимость загрузиться с другим ядром или же запустить проверку памяти. Для этого предусмотрено «скрытое меню» за него отвечает параметр «GRUB_HIDDEN_TIMEOUT».
В случае, когда установлены другие ОС, этот параметр закомментирован (# в начале строки). Данное значение позволит приостановит загрузку на заданное количество секунд, давая пользователю возможность вызвать меню загрузки, нажав Esc .
Если значение установлено в 0, то задержки не будет, однако вызвать меню можно, удерживая при загрузке Shift
Параметр «GRUB_HIDDEN_TIMEOUT_QUIET» отвечает за отображение таймера во время паузы. Если его значение «true» таймер отображаться не будет, а со значением «false» будет.
Чтобы GRUB отображал меню со списком установленных операционных систем, без нажатия клавиш вызова меню (например Shift или Esc ) необходимо:
sudo gedit /etc/default/grub
Why do I need GRUB_DISABLE_LINUX_UUID=true
What do you mean by «still has UUIDs»? I thought the UUID identifies the device and has little to do with the filesystem which lives there. The filesystem is BTW an ext4.
You write that the auto-generated grub.conf contained some UUIDs and some /dev entries, I assumed that was after changing GRUB_DISABLE_LINUX_UUID and running update-grub, if that is not the case please update your Q with the word ‘original’ before auto-generated.
What type of filesystem does the root filesystem use? What type of container is it on (e.g. PC partition, GPT partition, fakeraid, dmraid, LVM, dmcrypt, …)?
2 Answers 2
The value of GRUB_DISABLE_LINUX_UUID is used by update-grub and the scripts in the directory /etc/grub.d/ . If you still get UUIDs in your grub.conf it looks like one of the scripts is not checking against the GRUB_DISABLE_LINUX_UUID setting.
Best thing to do there is trying to figure out what the filesystem type is and check that against the names of the scripts in /etc/grub.d to see if there is a pattern.
As to why UUIDs are not working, I have no definitive answer, I would suspect this depends on the filesystem type, but that is a wild guess.
You don’t need UUIDs in your fstab even when grub uses them, but it is of course a possible way to see if you are using the right UUIDs in the first place (but I rather look in /dev/disk/by-uuid for that).
GRUB_DISABLE_LINUX_UUID does work and I no longer see UUIDs in my grub.cfg. My question was, why I need to set this in the first place. The documentation suggests that not using UUIDs is a cosmetic issue (/dev looks nicer), but it my case UUIDs don’t work at all. The filsystem is an ext4. Just checked dmesg and I see «EXT3-fs (sda1): error: couldn’t mount because of unsupported optional features (240)». Could that be the reason why /dev works but UUIDs don’t?
The nice things about UUIDs is that they don’t change if you move your discs around, and they do change if you put new filesystems on your partition. The error is IIRC a result of your system first trying those ext4 filesystems as ext3 (or ext2)
In case anyone stumbles across this post and is using Centos 7 / GRUB2 (like I am), the variable name appears to have changed to GRUB_DISABLE_UUID (not GRUB_DISABLE**_LINUX**_UUID).
You can check yours at /usr/share/grub/grub-mkconfig_lib. Mine has this:
if [ «x$GRUB_DISABLE_UUID» != «xtrue» ]
After a grub2-mkconfig, the UUIDs were replaced with /dev/sda1, etc. (which we needed because we clone these systems).
Update March 2023 Prompted by @MelroyvandenBerg followup comment, I took a quick look to see if my 2016 answer was still relevant.
We’ve switched away from Centos in 2019 (see Centos Stream discussion elsewhere) but I spun up an old machine that is still running CentOS Linux release 7.2.1511. I reconfirmed the results above:
$ grep GRUB_DISABLE /usr/share/grub/grub-mkconfig_lib if [ "x$GRUB_DISABLE_UUID" != "xtrue" ] && fs_uuid="`"$" --device $@ --target=fs_uuid 2> /dev/null`" ; then if [ "x$GRUB_DISABLE_UUID" != "xtrue" ] && fs_uuid="`"$" --device $ --target=fs_uuid 2> /dev/null`" ; then
Looking into this a bit more (still on the Centos 7 system), /usr/share/doc/grub2-tools-2.02/grub.html contains the following (emphasis added to show differences)
GRUB_DISABLE_LINUX_UUID
Normally, grub2-mkconfig will generate menu entries that use universally-unique identifiers (UUIDs) to identify the root filesystem to the Linux kernel, using a ‘root=UUID=. ’ kernel parameter. This is usually more reliable, but in some cases it may not be appropriate. To disable the use of UUIDs, set this option to ‘true’.
GRUB_DISABLE_UUID
Normally, grub2-mkconfig will generate menu entries that use universally-unique identifiers (UUIDs) to identify various filesystems to search for files. This is usually more reliable, but in some cases it may not be appropriate. To disable this use of UUIDs, set this option to ‘true’.
So it does look like there is a specific difference between GRUB_DISABLE_LINUX_UUID and GRUB_DISABLE_UUID
Skipping forward 7 years and looking at Ubuntu 22.04.1 LTS (more current, albeit Debian based), I did observe this snippet in /usr/sbin/grub-mkconfig
if [ "x$" = "xtrue" ]; then if [ -z "$" ]; then GRUB_DISABLE_LINUX_UUID="true" fi if [ -z "$" ]; then GRUB_DISABLE_LINUX_PARTUUID="true" fi fi
Which will cause an (unset) GRUB_DISABLE_LINUX_UUID to be set to true if GRUB_DISABLE_UUID is true. I can only guess that somewhere in the last 7 years someone has been working to clarify and/or eliminate the distinction between these two variables.
I encourage you to check with your specific distribution’s code and documentation rather than my original 2016 comment.