Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Последняя версия Следующая версия справа и слева | ||
wiki:grub [2013/11/28 11:41] [А что если отключить?] |
wiki:grub [2017/03/27 02:01] [Скрытое меню] |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
====== GRUB - загрузчик системы ====== | ====== GRUB - загрузчик системы ====== | ||
- | {{http://resq.ntaxa.com/img/oil-0.11/128x128/apps/grub.png }} {{ wiki:grub:grub.png?300|GRUB}}**GRUB** (**GR**and **U**nified **B**ootloader((Основной Единый Загрузчик))) — программа-загрузчик операционных систем.\\ | + | {{ wiki:grub:grub.png?300|GRUB}}**GRUB** (**GR**and **U**nified **B**ootloader((Основной Единый Загрузчик))) — программа-загрузчик операционных систем.\\ |
**GRUB** является эталонной реализацией загрузчика, соответствующего [[wpru>Multiboot_Specification|спецификации Multiboot]] и может загрузить любую совместимую с ней операционную систему. Среди них: [[Linux]], FreeBSD, Solaris и многие другие. Кроме того, **GRUB** умеет по цепочке передавать управление другому загрузчику, что позволяет ему загружать **Windows** (через загрузчик [[NTLDR]]), MS-DOS, OS/2 и другие системы.\\ | **GRUB** является эталонной реализацией загрузчика, соответствующего [[wpru>Multiboot_Specification|спецификации Multiboot]] и может загрузить любую совместимую с ней операционную систему. Среди них: [[Linux]], FreeBSD, Solaris и многие другие. Кроме того, **GRUB** умеет по цепочке передавать управление другому загрузчику, что позволяет ему загружать **Windows** (через загрузчик [[NTLDR]]), MS-DOS, OS/2 и другие системы.\\ | ||
После настройки **GRUB** пользователь при включении компьютера видит список операционных систем, которые установлены на его компьютер и которые можно загрузить, выбрав подходящую и нажав <key>Enter</key>.\\ | После настройки **GRUB** пользователь при включении компьютера видит список операционных систем, которые установлены на его компьютер и которые можно загрузить, выбрав подходящую и нажав <key>Enter</key>.\\ | ||
Строка 64: | Строка 64: | ||
Пятому сверху пункту будет соответствовать значение 4, второму - 1, первому - 0. В вышеприведенном примере установлено значение 6, то есть стандартным задан седьмой пункт меню. | Пятому сверху пункту будет соответствовать значение 4, второму - 1, первому - 0. В вышеприведенном примере установлено значение 6, то есть стандартным задан седьмой пункт меню. | ||
- | <note tip>В качестве значения можно указать "saved" - тогда при загрузке будет выбран тот пункт, который был загружен в прошлый раз.</note> | + | <note tip>В качестве значения можно указать **saved**. Это позволит использовать команды grub-reboot и grub-set-default для выбора пункта меню по-умолчанию при последующих перезагрузках. Например: |
+ | * Команда ''sudo grub-reboot 1'' однократно выбирает второй пункт меню по-умолчанию (только для следующей загрузки), | ||
+ | * Команда ''sudo grub-set-default 2'' выбирает на постоянной основе третий пункт меню по-умолчанию. | ||
+ | </note> | ||
- | Или же можно указать точное название пункта в данном случае оно должно быть именно таким, каким мы его видим в «/boot/grub/grub.cfg". При этом значение должно указываться в кавычках. Данный способ удобен тем, что после обновления ядра не придется изменять настройки из-за сбившейся нумерации. | + | Или же можно указать значение идентификатора (id), оно должно быть именно таким, каким мы его видим в «/boot/grub/grub.cfg". Данный способ удобен тем, что после обновления ядра не придется изменять настройки из-за сбившейся нумерации. |
=== Пример === | === Пример === | ||
Если в "grub.cfg" пункт меню выглядит так: | Если в "grub.cfg" пункт меню выглядит так: | ||
<file> | <file> | ||
- | menuentry "Ubuntu, Linux 2.6.32-020632rc6-generic" { | + | menuentry 'Example GNU/Linux distribution' --class gnu-linux --id example-gnu-linux { |
- | recordfail=1 | + | ... |
- | .... | + | } |
- | } | + | |
</file> | </file> | ||
То значение параметра "GRUB_DEFAULT" должно указываться именно в виде: | То значение параметра "GRUB_DEFAULT" должно указываться именно в виде: | ||
- | <code>GRUB_DEFAULT="Ubuntu, Linux 2.6.32-020632rc6-generic"</code> | + | <code>GRUB_DEFAULT=example-gnu-linux</code> |
+ | |||
+ | <note important>Ранее документацией предлагалось указывать название пункта меню загрузки (так, как он отображается в самом меню). Хотя этот способ по-прежнему работает, использовать его не рекомендуется, поскольку эти названия могут меняться, например, при обновлении ядра/версии ОС</note> | ||
==== Изменение времени отображения меню ==== | ==== Изменение времени отображения меню ==== | ||
Строка 102: | Строка 106: | ||
* Применяем изменения командой: | * Применяем изменения командой: | ||
<code>sudo update-grub</code> | <code>sudo update-grub</code> | ||
+ | ==== Убираем подменю ==== | ||
+ | Чтобы раскрыть все меню используем такой параметр: | ||
+ | <code>GRUB_DISABLE_SUBMENU="y"</code> Это бывает нужно если хотим загружаться не с первой строчки. | ||
+ | ==== Особые случаи ==== | ||
+ | Поведение меню отличается от заданного переменными GRUB_TIMEOUT и GRUB_HIDDEN_TIMEOUT когда предыдущая загрузка не завершилась успехом или предыдущаяя загрузка происходила в режиме восстановления. Подробно это описано далее, в разделе "Защита от зацикливания на перезагрузке". | ||
==== Изменение стандартных параметров загрузки ядра ==== | ==== Изменение стандартных параметров загрузки ядра ==== | ||
Иногда бывает необходимо загружать ядро системы с какими-либо особыми параметрами (например, для корректной работы специфического оборудования). В этом случае весьма полезен будет параметр "GRUB_CMDLINE_LINUX_DEFAULT" он отвечает за те параметры, с которыми запускаются ядра при загрузке. | Иногда бывает необходимо загружать ядро системы с какими-либо особыми параметрами (например, для корректной работы специфического оборудования). В этом случае весьма полезен будет параметр "GRUB_CMDLINE_LINUX_DEFAULT" он отвечает за те параметры, с которыми запускаются ядра при загрузке. | ||
Строка 280: | Строка 288: | ||
Настроив свой файл, сохраните его <key>Ctrl+S</key> и закройте. | Настроив свой файл, сохраните его <key>Ctrl+S</key> и закройте. | ||
- | Теперь необходимо добавить дополнительное меню. Для этого в файле "/etc/default/40_custom" добавим запись такого вида: | + | Теперь необходимо добавить дополнительное меню. Для этого в файле "/etc/grub.d/40_custom" добавим запись такого вида: |
<code> | <code> | ||
menuentry "Название меню"{ | menuentry "Название меню"{ | ||
Строка 338: | Строка 346: | ||
===== Защита от зацикливания на перезагрузке ===== | ===== Защита от зацикливания на перезагрузке ===== | ||
- | В Grub2 реализована защита от бесконечных перезагрузок. \\ | + | Если загрузка ОС не закончилась успешно, или осуществлялась загрузка в режим восстановления, то при следующей загрузке - меню выбора GRUB будет выводится и ждать явного вмешательства оператора (так же, как если бы вы выставили GRUB_TIMEOUT=-1). При этом последующие аппаратные сбросы системы - не помогут проскочить меню.\\ |
- | Если загрузка ОС не закончилась успешно, то при следующей - меню выбора GRUB будет выводится и ждать явного вмешательства (так же, как если бы вы выставили GRUB_TIMEOUT=-1). При этом последующие сбросы системы - не помогут проскочить меню.\\ | + | |
==== Зачем это сделано ==== | ==== Зачем это сделано ==== | ||
При загрузке в лог файлы пишется информация и размеры логов растут. В нормально загруженной систем работают сервисы, которые архивируют и подчищают логи. В нормально работающей системе постоянно пополнение лог-файлов не требует внимания со стороны пользователя.\\ | При загрузке в лог файлы пишется информация и размеры логов растут. В нормально загруженной систем работают сервисы, которые архивируют и подчищают логи. В нормально работающей системе постоянно пополнение лог-файлов не требует внимания со стороны пользователя.\\ | ||
Строка 347: | Строка 354: | ||
Функция (как видно) - безусловно полезная, однако она может быть неудобной для без-клавиатурных станций - на них "зависшее" меню GRUB-а - это не преимущество, а некоторые сложности (без подключения клавиатуры такая станция, попавшая в меню GRUB, никогда не загрузится вообще). | Функция (как видно) - безусловно полезная, однако она может быть неудобной для без-клавиатурных станций - на них "зависшее" меню GRUB-а - это не преимущество, а некоторые сложности (без подключения клавиатуры такая станция, попавшая в меню GRUB, никогда не загрузится вообще). | ||
==== А что если отключить? ==== | ==== А что если отключить? ==== | ||
- | Собственно сами случаи, когда циклится загрузка - не так и часты, если машина работает без графики то там вообще мало чему так падать на этапе загрузки, да еще так, что бы система вышла на перезагрузку. Разве что совсем кривой прикладной софт встроенный в процесс загрузки...\\ | + | Собственно сами случаи, когда циклится загрузка - не так и часты, если машина работает без графики то там вообще мало чему падать на этапе загрузки, да еще так, что бы система вышла на перезагрузку. Разве что совсем кривой прикладной софт встроенный в процесс загрузки...\\ |
- | Гораздо чаще загрузка прерывается из за внешних условий - например пропадает питание, или кто-то сбрасывает систему. | + | Гораздо чаще загрузка прерывается из за внешних условий - например пропадает питание, или кто-то сбрасывает грубо систему. |
==== Отключаем... ==== | ==== Отключаем... ==== | ||
== Как это работает == | == Как это работает == | ||
- | Реализовано все достаточно просто - в скрипте /boot/grub/grub.cfg переменная окружения GRUB recordfail устанавливается в 1. | + | Реализовано все достаточно просто - в скрипте /boot/grub/grub.cfg переменная окружения GRUB recordfail устанавливается в ходе каждой загрузки в 1. |
Скрипт /etc/init.d/grub-common запускается на финальных этапах загрузки (линки с именем S99grub-common есть в /etc/rc2.d, /etc/rc3.d, ... /etc/rc5.d). grub-common сбрасывает переменную recordfail в 0. | Скрипт /etc/init.d/grub-common запускается на финальных этапах загрузки (линки с именем S99grub-common есть в /etc/rc2.d, /etc/rc3.d, ... /etc/rc5.d). grub-common сбрасывает переменную recordfail в 0. | ||
- | Если скрипт /etc/init.d/grub-common не отработает, то не сброшенное значение recordfail предотвращает автоматическую загрузку (без ожидани или с ожиданием) и меню GRUB появляется и требует явного интерактивного вмешательства со стороны оператора. | + | Если скрипт /etc/init.d/grub-common не отработает, то не сброшенное значение recordfail предотвращает автоматическую загрузку, меню GRUB появляется и потребуется явное интерактивное вмешательство со стороны оператора. |
==== ==== | ==== ==== | ||
- | Отключить эту логику можно разными путями, но в любом случае надо исправить скрипты лежащие в /etc/grub.d. Можно изменить логику работы выбора таймаута (что бы она не реагировала на установленную в 1 переменную recordfail), а можно изменить функцию, которая устанавливает recordfail в 1. Втрой вариант - проще. Его и рассмотрим.\\ | + | Для того, что бы убрать необходимость интерактивного вмешательства в процесс загрузки нужно установить переменную GRUB_RECORDFAIL_TIMEOUT в /etc/defaul/grub в то количество секунд, которые меню GRUB-а будет ждать ввода в случае когда recordfail=1. |
- | Открыв в любом редакторе (с правами рута) скрипт /etc/grub.d/00_header надо найти функцию recordfail, выглядит она примерно так: | + | Сохранить изменения и обновить GRUB (sudo update-grub). |
- | <code>function recordfail { | + | <note important>Вы должны понимать, что проделанные изменения могут привести к довольно печальным последствиям, если все-таки у вас случится ситуация, при которой зациклится перезагрузка системы.</note> |
- | set recordfail=1 | + | |
- | if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi | + | Финт с GRUB_RECORDFAIL_TIMEOUT может не сработать в некоторых (старых) версиях GRUB. Тогда нужно редактировать /etc/grub.d/00_header. Нужно найти функцию make_timeout (), которая выглядит примерно так: |
- | } </code> | + | <code> |
- | Во второй строчке нужно поменять единицу на ноль. Сохранить изменения и обновить GRUB (sudo update-grub) | + | make_timeout () |
- | <note important>Вы должны понимать, что проделанные изменения могут привести к довольно печальным последствиям, если все-таки у вас случится ситуация при которой зациклится перезагрузка системы.</note> | + | { |
- | <note important>Изменения в скрипте /etc/grub.d/00_header могут быть утеряны в ходе очередного обновления пакета grub-common. Нужно следить за тем, что бы после обновления grub-common изменения в /etc/grub.d/00_header сохранялись.</note> | + | cat << EOF |
+ | if [ "\${recordfail}" = 1 ]; then | ||
+ | set timeout=-1 | ||
+ | else | ||
+ | set timeout=${2} | ||
+ | fi | ||
+ | EOF | ||
+ | } | ||
+ | </code> | ||
+ | и заменить в ней строчку | ||
+ | <code>set timeout=-1</code> | ||
+ | на | ||
+ | <code>set timeout=${GRUB_RECORDFAIL_TIMEOUT:--1} | ||
+ | </code> | ||
+ | После этого финт с GRUB_RECORDFAIL_TIMEOUT заработает. Нужно сохранить изменения и обновить GRUB (sudo update-grub). | ||
+ | <note important>Изменения в скрипте /etc/grub.d/00_header могут быть утеряны при обновлении пакета grub-common. Но в новых версиях GRUB переменная GRUB_RECORDFAIL_TIMEOUT уже внедрена (т.е. эти изменения уже сделаны в 00_header).</note> | ||
===== Ссылки ===== | ===== Ссылки ===== | ||
* [[http://forum.ubuntu.ru/index.php?topic=192735.0|Обсуждение статьи на форуме]] | * [[http://forum.ubuntu.ru/index.php?topic=192735.0|Обсуждение статьи на форуме]] | ||
Строка 373: | Строка 395: | ||
{{topic> GRUB}} | {{topic> GRUB}} | ||
- | <style float-right> тэг: GRUB </style> | + | {{tag>GRUB Система Администрирование HOWTO Индексная_статья}} |
- | {{tag>Система Администрирование HOWTO Индексная_статья}} | + |