GRUB - загрузчик системы Сравнение версий

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
wiki:grub [2013/11/28 11:41]
Sly_tom_catSly_tom_catSly_tom_catXubuntu 18.04 (64bit)Don't worry, be happy! [А что если отключить?]
wiki:grub [2017/03/27 02:04] (текущий)
jura12jura1218.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 Индексная_статья}}+