Jump to content

GRUB 2 в Ubuntu 10.04


Recommended Posts

I. GRUB2 - первые шаги. (на примере Ubuntu 9.10)

При первом сравнении 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, то есть режим загрузки без графической заставки и с выводом на экран текстовой информации о загрузке компонентов системы, что позволяет следить за процессом загрузки и выявлять неполадки.

/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-ядер. Выглядит все это примерно так:

user@book:~$ sudo update-grub

[sudo] password for user:

Generating grub.cfg.....

Found Debian background: image.tga

Found linux image: /boot/vmlinuz-2.6.32-020632rc6-generic

Found initrd image: /boot/initrd.img-2.6.31-020632rc6-generic

Found linux image: /boot/vmlinuz-2.6.31-14-generic

Found initrd image: /boot/initrd.img-2.6.31-14-generic

Found memtest86+ image: /boot/memtest86+.bin

Found Microsoft Windows XP Professional RU on /dev/sda1

done

user@book:~$

Тот же самый "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")

II. Украшательства.

Установка фонового изображения.

Вы можете выбрать и установить полноцветное изображение в качестве фона в меню загрузки grub2. Размер изображения должен соответствовать разрешению grub2 (по умолчанию - 640x480, задается в "/etc/default/grub"), формат файла - png или tga. Вы можете установить готовый набор из нескольких подходящих для grub2 изображений, выполнив команду:

$ sudo apt-get install grub2-splashimages

Не путайте пакет grub2-splashimages с пакетом grub-splashimages, который не совместим с grub2!. Эти изображения будут помещены в папку "/usr/share/images/grub", которую нужно будет добавить в файл конфигурации (см. ниже). Фоновое изображение задается в файле "/etc/grub.d/05_debian_theme". Найдите в нем строку такого вида:

for i in {/boot/grub,/usr/share/images/desktop-base}/moreblue-orbit-g rub.{png,tga} ; do

Те, кто более-менее знаком с bash, узнают прием с перечислением в фигурных скобках. Для остальных: все на так сложно, как может показаться. В первых фигурных скобках (в нашем примере - "{/boot/grub,/usr/share/images/desktop-base}") перечислены папки, в которых grub2 будет искать подходящие для установки изображения. Далее (после слэша) указано имя файла изображения (без расширения!), которое мы хотим установить в качестве фона (здесь - "moreblue-orbit-grub"). Вторые фигурные скобки ("{png,tga}") определяют расширения файлов, которые grub2 будет пытаться использовать в качестве фона. Заметьте, что пункты в фигурных скобках перечисляются через запятую и не разделяются пробелами! По умолчанию изображения ищутся в папках "/boot/grub" и "/usr/share/images/desktop-base". Изображения из пакета grub2-splashimages у нас распаковались в "/usr/share/images/grub". Поэтому мы должны добавить эту папку в список мест, где grub2 будет искать изображения. Добавим еще один пункт в первые фигурные скобки. Сразу же определимся с выбором картинки. Я выбрал последнюю, переименовав файл для удобства в "winter.tga". Заменим имя ("moreblue-orbit-grub") на имя выбранной картинки (в моем случае - "winter"), в итоге получим такую строку:

for i in {/boot/grub,/usr/share/images/desktop-base,/usr/share/images /grub}/winter.{png,tga} ; do

Заметьте, что между именем файла и вторыми фигурными скобками должна стоять точка! Как это работает: grub2 последовательно просматривает заданные папки и ищет в них файл с заданным именем и одним из перечисленных расширений. Цикл прекращается как только найдено первое подходящее изображение. Таким образом, файл с подходящим именем присутствует в нескольких папках, будет взят файл из той папки, которая раньше указана в списке. Аналогично, если изображение представлено в разных форматах (например, "image.png" и "image.tga") - выбран будет файл с тем расширение, которое первым указано во вторых фигурных скобках.

Интересности:

Вы можете добавить любую папку с изображениями, владельцем которой вы являетесь. Это упростит добавление/изменение изображений, однако, заметьте: при этом root должен иметь как минимум права r-x на эту папку. Также не стоит добавлять папки с шифрованного home-раздела, так как на момент загрузки он еще не примонтирован. Лучше просто сделайте себя владельцем папки "/usr/share/images/gub" и храните все картинки там. Помимо PNG и TGA поддерживается также формат JPEG, но на текущий момент реализована только поддержка jpeg с 8-битным цветом, поэтому используйте jpeg-файлы только если вы понимаете, что такое глубина цвета и как сохранить изображение в 8-битном цвете. Для того, чтобы добавить поддержку jpeg-файлов, приведите вторые фигурные скобки к такому виду: "{png,tga,jpg,jpeg}".

Настройка цвета пунктов меню.

Цвета пунктов меню также задаются в файле "/etc/grub.d/05_debian_theme". Найдите ближе к концу файла следующую секцию:

if background_image `make_system_path_relative_to_its_root ${bg}` ; then

set color_normal=black/black

set color_highlight=black/light-gray

else

EOF

fi

Здесь и настраиваются цвета для пунктов меню загрузки. Строка "set color_normal" отвечает за цвета обычного (невыделенного) пункта меню. "set color_highlight" - за цвета выделенного пункта. Вот эти две строки мы и будем изменять. Значение каждой из этих строк представляет собой два цвета, разделенные слэшем. Первый цвет - это цвет текста, второй цвет - цвет фона строки. Вот список доступных цветов:

black - черный

blue - синий

brown - коричневый

cyan - голубой

dark-gray - темно-серый

green - зеленый

light-cyan - светло-голубой

light-blue - светло-синий

light-green - ярко-зеленый

light-gray - серый

light-magenta - розовый

light-red - светло-красный

magenta - пурпурный

red - красный

white - белый

yellow - желтый

Заметьте, что black (черный) при использовании в качестве второго параметра (т.е. цвета фона) в результате даст прозрачный фон, без какой-либо заливки, текст прямо поверх картинки. Использование black в качестве цвета текста дает черный текст. Пример:

set color_normal=black/black

set color_highlight=black/light-gray

В моем случае заданы следующие параметры: обычный пункт - черный текст, прозрачный фон; выделенный пункт - черный текст, серая подсветка строки. Примечание: не перепутайте вышеописанную секцию с секцией "set_mono_theme", что в начале файла! Последняя отвечает за цвета меню в том случае, если фоновое изображение отсутствует.

III. Восстановление GRUB2.

После, например, установки Windows, вы можете столкнуться с тем, что при загрузке будет отображаться только меню загрузки Windows, а меню grub2 вы не увидите вовсе, что приведет к невозможности загрузить что-либо кроме Windows. Такое происходит из-за того, что Windows при установке затирает загрузочную область жесткого диска (так назывемый MBR-раздел), удаляя оттуда запись загрузчика grub2. Для восстановления grub2 вам понадобится liveCD любой современной системы, включающей grub2 в свой дистрибутив. Архитектура LiveCD должна соответствовать архитектуре вашей системы! Узнать текущую архитектуру можно с помощью команды "arch" или "uname -m". "i686" соответствует 32-битной архитектуре, "amd64" - 64-битной.

Востановление GRUB2 с LiveCD.

Загрузитесь с вашего LiveCD (предварительно выберите меню устройств загрузки при наличии такового или же установите cd-привод первым boot device в BIOS). Запустите консоль. Для начала нам нужно будет узнать, на каком диске и на каком разделе установлена Ubuntu. Если вы не помните этого - воспользуйтесь командой:

$ sudo fdisk -l

для работы нам понадобится /-раздел (root). Примонтируйте его командой:

$ sudo mount /dev/sda5 /mnt

В моем случае корневой раздел системы - /dev/sda5, вы же используйте свое значение. Если у вас /boot сделан отдельным разделом, его также надо будет примонтировать:

$ sudo mount /dev/sda3 /mnt/boot

Также монтируем папку /dev нашей live-системы как /dev нашего root-раздела:

$ sudo mount --bind /dev /mnt/dev

И папку /proc как /proc root-раздела:

$ sudo mount --bind /proc /mnt/proc

Теперь выполняем следующую команду:

$ sudo chroot /mnt /bin/bash

Теперь вы - root-пользователь в системе, корневым разделом которой считается /mnt, то есть корневой раздел вашей настоящей системы. и вот мы готовы обновить MBR-раздел жесткого диска, переустановив grub2. Но для начала нам нужно определиться, с какого физического диска загружается наш компьютер. если у вас один жесткий диск, разбитый на разделы - он будет именоваться sda. Если несколько - первый из них - sda, второй - sdb, и так далее. Если вы не знаете, какой жесткий диск установлен в качестве загрузочного, посмотрите соответствующую опцию в BIOS. Обычно жесткий диск указан по модели (например, так: ST9160310AS). Чтобы узнать, какому диску в системе соответствует данная модель, выполните такую команду:

$ for d in /dev/sd[a-z] ; do echo "$d: $(sudo hdparm -I $d | grep -i 'model')" ; done

Кроме того, в Ubuntu 9.10 можно воспользоваться утилитой palimpsest ("система - администрирование - дисковая утилита"). Определившись с загрузочным диском (в нашем примере - sda), ставим на него grub2:

$ grub-install /dev/sda

Если вы столкнетесь с какими-либо ошибками - попробуйте перезапустить команду с ключом --recheck:

$ grub-install --recheck /dev/sda

Обратите внимание: мы устанавливаем grub2 на физический диск (sda, sdb...), а не на раздел (sda3, sdb1...)! если все прошло успешно, выходим из chroot командой:

$ exit

Отмонтируем наши диски и

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...