Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
wiki:grub [2013/11/28 11:40] [Зачем это сделано] |
wiki:grub [2017/03/27 02:04] [Особые случаи] |
||
---|---|---|---|
Строка 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 когда предыдущая загрузка не завершилась успехом или предыдущаяя загрузка происходила в режиме восстановления. Подробно это описано далее, в разделе "Защита от зацикливания на перезагрузке". Полную справку по параметрам файла настроек можно дав команду: <code>info -f grub -n 'Simple configuration'</code> | ||
==== Изменение стандартных параметров загрузки ядра ==== | ==== Изменение стандартных параметров загрузки ядра ==== | ||
Иногда бывает необходимо загружать ядро системы с какими-либо особыми параметрами (например, для корректной работы специфического оборудования). В этом случае весьма полезен будет параметр "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 Индексная_статья}} | + |