Deviljin » 21 фев 2010, 13:30
GRUB2
при первом сравнении grub2 со старым grub самым весомым различием оказывается измененная структура файлов конфигурации. настройка grub2 производится теперь по принципиально иному принципу.
первое же, что бросается в глаза - отсутствие привычного многим "
/boot/grub/menu.lst", в котором были прописаны пункты загрузки, таймаут меню и прочие настройки. где это теперь?
в grub2 основным файлом конфигурации является "
/boot/grub/grub.cfg". однако же, не торопитесь править его так, как привыкли это делать с "menu.lst". при внимательном прочтении мы видим в начале файла "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" генерируется автоматически с использованием нескольких скриптов. поэтому после следующего обновления grub2 ваш "grub.cfg" будет создан заново, и все ваши правки будут утрачены. но это мы подробнее рассмотрим чуть ниже.
перейдем к основным файлам конфигурации grub2. как и упомянуто выше, главным файлом, собственно, отвечающим за загрузочное меню, является "
/boot/grub/grub.cfg". кроме него имеются файл "
/etc/default/grub" и папка "
/etc/grub.d". рассмотрим их подробнее.
/etc/default/grubданный файл содержит в себе основные настройки для grub2. через него, собственно, они и изменяются. для наглядности ниже приводится примерное содержимое этого файла:
- Код: Выделить всё • Развернуть
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, поэтому и выбирается первый пункт. для того. чтобы выбрать другой пункт, нам нужно узнать, каким по счету он будет в списке. тут есть два варианта: просмотреть содержимое "
/boot/grub/grub.cfg" и сосчитать, какой по счету окажется нужная запись, или же перезагрузиться и более наглядно посмотреть то же самое в меню загрузки (перед этим побегайте стрелочками по меню, чтобы остановить таймер). вторый вариант отличается более наглядным представлением, что проще для неопытного пользователя. в обоих случаях не забывайте о порядке нумерации - 0, 1, 2, 3 и так далее. то есть, пятому сверху пункту будет соответствовать знаение 4, второму - 1, первому - 0. в вышеприведенном примере установлено значение 6, то есть стандартным задан седьмой пункт меню.
кроме задания конкретного пункта есть еще другие интересный варианты. например, в качестве значения можно указать "saved" - тогда при загрузке будет выбран тот пункт, который был загружен в прошлый раз.
или же можно указать точное название пункта. в данном случае оно должно быть именно таким, каким мы его видим в "
/boot/grub/grub.cfg". при этом значение должно указываться в кавычках! данный способ удобен тем, что после обновления ядра не придется изменять настройки из-за съехавшей нумерации
например, если в "grub.cfg" пункт меню выглядит так:
- Код: Выделить всё • Развернуть
menuentry "Ubuntu, Linux 2.6.32-020632rc6-generic" {
recordfail=1
....
}
то и значение параметра "GRUB_DEFAULT" должно указываться именно в виде
- Код: Выделить всё • Развернуть
GRUB_DEFAULT="Ubuntu, Linux 2.6.32-020632rc6-generic"
по умолчанию меню загрузки отображается 10 секунд, после чего загружается стандартный пункт (если раньше не нажат enter и не выбран другой пункт, что останавливает таймер). с изменением задержки все совсем просто.
за эту задержку отвечает параметр "GRUB_TIMEOUT" (не путайте с "GRUB_HIDDEN_TIMEOUT"!). значение задается в секундах. обратите внимание, что цифра указывается в кавычках. в нашем примере это значение - 2, то есть меню отображается две секунды.
кроме того, есть одна хитрость. если поставить значение "-1", то меню будет отображаться до тех пор, пока пользователь не выберет какой-либо пункт. то есть без всяких таймеров и утекающих секунд.
"скрытое" меню.
в случае, если на компьютере установлена только Ubuntu, меню загрузки по умолчанию не будет отображаться, а grub2 будет загружать вас напрямую в систему. однако же, иногда может возникнуть необходимость загрузиться с другим ядром или же запустить проверку памяти. для этого предусмотрено "скрытое меню".
за него отвечает параметр "GRUB_HIDDEN_TIMEOUT". в случае, когда установлены другие ОС, этот параметр закомментирован (# в начале строки). в случае с единственной ОС он будет активен. значение его задает задержку в секундах. grub2 приостановит загрузку на заданное количество секунд, давая пользователю возможность вызвать меню загрузки, нажав Escape.
если значение установлено в 0, то задержки не будет. однако, пользователь все равно сможет вызвать отображение меню, удерживая при загрузке shift.
параметр "GRUB_HIDDEN_TIMEOUT_QUIET" отвечает за отображение таймера во время паузы. при значении "true" таймер показан не будет. "false" - будет отображаться.
изменение стандартных параметров загрузки ядра
иногда бывает необходимо загружать ядро системы с какими-либо особыми параметрами. например, для корректной работы специфического оборудования. в этом случае весьма полезен будет параметр "GRUB_CMDLINE_LINUX_DEFAULT". он отвечает за те параметры, с которыми запускаются linux-ядра при загрузке. значение его по умолчанию - "quiet splash", что приводит показу графической заставки при запуске системы без показа какой-либо текстовой информации. вы можете добавить необходимые вам параметра запуска ядра, приведя это значение к виду "quiet splash your_param1 your_param2", то есть дописав через пробел нужные параметры.
пример: вместо того, чтобы добавлять новые параметры, мы уберем стандартные. отключим графическую заставку и "молчаливый режим". заменим
- Код: Выделить всё • Развернуть
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
на
- Код: Выделить всё • Развернуть
GRUB_CMDLINE_LINUX_DEFAULT=""
теперь все наши пункты загрузки linux-ядер будут преобразованы в verbose mode, то есть режим загрузки без графической заставки и с выводом на экран текстовой информации о загрузке компонентов системы, что позволяет следить за процессом загрузки и выявлять неполадки
пример: вместо того, чтобы добавлять новые параметры, мы уберем стандартные. отключим графическую заставку и "молчаливый режим". заменим
- Код: Выделить всё • Развернуть
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
на
- Код: Выделить всё • Развернуть
GRUB_CMDLINE_LINUX_DEFAULT=""
теперь все наши пункты загрузки linux-ядер будут преобразованы в verbose mode, то есть режим загрузки без графической заставки и с выводом на экран текстовой информации о загрузке компонентов системы, что позволяет следить за процессом загрузки и выявлять неполадки
/etc/grub.d
эта папка содержит в себе скрипты, которые используются при создании "grub.cfg". при обновлении grub2 они находят все установленные на компьютере системы и ядра и формируют в "grub.cfg" меню загрузки, которое мы и видим. два основных из них - "10_linux" и "30_os-prober" отвечают за поиск linux-ядер и остальных ОС на других разделах соотвественно.
файл "40_custom" позволяет добавлять свои пункты загрузки. это может быть полезно, если вы, например, хотите добавить какие-то особые варианты загрузки системы.
(Кликните, чтобы показать/скрыть)
пример: добавляем verbose-mode (режим загрузки без графической заставки, с текстовым отображением процесса загрузки), позволяющий контролировать процесс загрузки системы. для этого мы немного отредактируем обычный пункт загрузки. допустим, он выглядит так (в "/boot/grub/grub.cfg"):
- Код: Выделить всё • Развернуть
menuentry "Ubuntu, Linux 2.6.32-020632rc6-generic" {
recordfail=1
if [ -n ${have_grubenv} ]; then save_env recordfail; fi
set quiet=1
insmod ext2
set root=(hd0,5)
search --no-floppy --fs-uuid --set 0e717c2a-24bd-4abe-acfe-ecf98fc814f8
linux /boot/vmlinuz-2.6.32-020632rc6-generic root=UUID=0e717c2a-24bd-4abe-acfe-ecf98fc814f8 ro quiet splash
initrd /boot/initrd.img-2.6.32-020632rc6-generic
}
для того, чтобы сделать из этого verbose-mode, нам нужно убрать опции quiet и splash из строки "linux". ну, и для понятности изменим название самого пункта. в итоге получаем:
- Код: Выделить всё • Развернуть
echo "adding verbose mode" >&2
menuentry "Ubuntu, Linux 2.6.32.rc6 verbose-mode" {
recordfail=1
if [ -n ${have_grubenv} ]; then save_env recordfail; fi
set quiet=1
insmod ext2
set root=(hd0,5)
search --no-floppy --fs-uuid --set 0e717c2a-24bd-4abe-acfe-ecf98fc814f8
linux /boot/vmlinuz-2.6.32-020632rc6-generic root=UUID=0e717c2a-24bd-4abe-acfe-ecf98fc814f8 ro
initrd /boot/initrd.img-2.6.32-020632rc6-generic
}
все это и добавляем в "40_custom" в конец файла. строка с echo не является обязательной. она лишь будет сигнализировать нам о том, что наш пункт найден и добавлен при обновлении grub2
примечание: файл "40_custom" должен заканчиваться пустой строкой, иначе последний пункт не будет отображаться в меню!
применение изменений.
после того, как мы отредактировали и сохранили наши файлы, радоваться еще рано. теперь нужно закончить дело, обновив наш "/boot/grub/grub.cfg". это довольно просто - нужно всего лишь выполнить команду
Код:
sudo update-grub
она выполнит скрипты в папке "/etc/grub.d" и применит заданные в "/etc/default/grub" параметры. после этого смело перезагружаемся и видим, что все работает как надо. ну или не работает...
если все прошло успешно, то в выоде консоли вы увидите спсиок найденных grub2 ОС и linux-ядер. выглядит все это примерно так:
тот же самый "update-grub" происходит и при обновлении ядра.
нюанс с нумерацией дисков и разделов.
в grub2 имеется еще одно важное отличие от старого grub. связано оно с нумерацией жестких дисков и их разделов.
в grub нумерация физических дисков и нумерация разделов начинались одинаково - с нуля. первый физический диск (sda в системе) обозначался "hd0", второй (sdb) - "hd1", и так далее. это же осталось и в grub2.
нумерация же разделов диска изменилась. если в grub первый раздел первого диска (sda1) именовался "hd0,0", четвертый (sda4) - "hd0,3", то теперь, в grub2, цифра раздела в grub2 соотвествует цифре раздела в системе. то есть, sda1 теперь будет "hd0,1" (а не "hd0,0"), sdb4 - "hd1,4".
проще говоря, нумерация дисков идет с нуля, а нумерация разделов - с единицы!
резервная копия.
перед каким-либо редактированием обязательно сделайте бэкап файлов конфигурации. например, выполнив последовательно эти строки:
- Код: Выделить всё • Развернуть
datev=$(date +%Y_%m_%d)
mkdir -p ~/.grub.bak/$datev
cd ~/.grub.bak/$datev
mkdir -p boot/grub etc/default
cp /boot/grub/grub.cfg boot/grub
cp -Rp /etc/grub.d etc
cp /etc/default/grub etc/default
(можно сохранить данный скрипт в /usr/bin, назвать, к примеру, "grub-backup" и дать права 755. теперь для резервного копирования grub2 достаточно будет выполнить команду "grub-backup")