Журнал LinuxFormat - перейти на главную

LXF90:Grub

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(Новая: == Grub: Настройте свой загрузчике == ''Один дистрибутив загрузить легко – но что если вам надо жонглирова...)

Версия 15:08, 16 марта 2008

Grub: Настройте свой загрузчике

Один дистрибутив загрузить легко – но что если вам надо жонглировать дюжиной систем? Ник Вейч грубо прикидывает...

Содержание

Добро пожаловать на очередной урок по Linux. Сегодня я проведу несколько упражнений с загрузкой системы: покажу вам, как настроить её и улучшить с помощью Grub. Но сначала проведем разминку. Как вы уже знаете, при загрузке в вашу любимую операционную систему компьютер проходит несколько этапов. Все их понимать не обязательно, но в определенный момент времени прошитое ПО компьютера (BIOS) пытается загрузить ОС с диска (или другого устройства), используя для этого MBR (главную загрузочную запись) диска. Это небольшая область на диске, содержащая код, который найдет и загрузит ядро вашей ОС.

Долгое время Linux обходился системой Lilo (Linux Loader), устанавливавший код начальной загрузки в MBR и создающий map-файл с указаниями на код, который надо загрузить. У Lilo много ограничений, и не самое мелкое из них состоит в том, что этот файл нужно заново создавать всякий раз, когда вы хотите поменять инструкции загрузки.

Чтобы сделать загрузку более гибкой и внести новые возможности в этот процесс, был создан Grub, Grand Unified Boot manager (Большой Унифицированный менеджер Загрузки); он также поддерживает загрузку нескольких систем. Позор, что почти никто не использует его возможности! Среднестатистический дистрибутив Linux при установке создает загрузочную запись для себя, а если у вас есть Windows, то везучим он создаст запись и для него. Но может-то он гораздо больше! А тем, кто хочет загружать более одной системы, просто следует этим воспользоваться! Встрепенулись? Значит, можно начать урок.

Grub управляется файлом настройки, обычно находящимся в /boot/Grub/menu.lst. Когда Grub инициируется кодом начальной загрузки, он ищет этот файл, считывает его и выполняет указанные в нем команды. Преимущество такой системы в том, что после изменения конфигурации вам не нужно пересоздавать никакие файлы – с Grub вы даже можете менять процесс загрузки на лету!

Файл настройки

По умолчанию файл настройки Grub выглядит примерно так:

# grub.conf созданный anaconda
default=0
timeout=5
splashimage=(hd0,10)/boot/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.18-1.2849.fc6)
           root (hd0,10)
           kernel /boot/vmlinuz-2.6.18-1.2849.fc6 ro root=LABEL=/1 rhgb quiet
           initrd /boot/initrd-2.6.18-1.2849.fc6.img
title Fedora Core (2.6.18-1.2798.fc6)
           root (hd0,10)
           kernel /boot/vmlinuz-2.6.18-1.2798.fc6 ro root=LABEL=/1 rhgb quiet
           initrd /boot/initrd-2.6.18-1.2798.fc6.img
title Wintest
           rootnoverify (hd0,5)
           chainloader +1

В начале файла идет набор глобальных настроек, описывающих загрузку по умолчанию, время до начала загрузки по умолчанию, экранную заставку, и опция, позволяющая спрятать меню, если не будет нажата какая-либо клавиша. Остальные настройки – индивидуальные записи меню, каждая из которых начинается с заголовка.

Начинаем

OK, теперь взглянем на стандартные шаги, необходимые для загрузки с помощью Grub. Первым делом познакомьтесь с командой root. Она устанавливает корневое устройство, а также подключает его, чтобы добыть информацию о размере раздела и т.п. Вот как выглядит типичная запись:

root (hd0,0)

Команда устанавливает корневым разделом первый раздел первого диска. Если как корневой вы хотите использовать не-Linux раздел, то используйте команду rootnoverify, которая не пытается сначала подключить устройство. Вам необходимо это сделать, чтобы прицепить загрузчик Windows, например, который наверняка располагается на разделе NTFS.

То, как Grub определяет диски, нередко вызывает путаницу (да такую, что в грядущем Grub2 это решено переделать). Во-первых, он, не в стиле Linux, использует номера дисков вместо букв, так что согласно Grub hdb становится hd1. Вторая особенность состоит в том, что вся нумерация начинается с нуля!

Для вящего замешательства, если в Linux, пытаясь указать файл на втором разделе второго диска на системе, вы использовали hdb2, то в Grub это будет (hd1,1). Ветеран вы или салага, но когда-нибудь здесь непременно споткнетесь!

Определив корневое устройство, мы должны указать расположение образа, который хотим запустить. Это делается с помощью команды kernel. Она принимает имя файла (который представляет образ загружаемого ядра). Grub автоматически может распознавать тип файла для ядер Linux, а также большинства других Unix-систем.

Обычно вы видите примерно следующее:

kernel /boot/vmlinuz-2.6.18

Заметим, что здесь используется устройство, которое вы определили как корневое. Так что, увидев эту строчку, Grub попытается загрузить файл (hd0,0)/boot/vmlinuz-2.6.18.

Если образ ядра почему-либо находится на другом устройстве, то вам необходимо только приставить спереди нужный дескриптор устройства. Все остальные аргументы команды kernel передаются ядру, так что если ваши действия как-то связаны с конкретным драйвером, необходимые опции можно указать в конце этой строки.

Если ваше ядро использует образ RAM-диска для начальной загрузки, то вам необходимо указать его здесь, вот так, например:

initrd /boot/initrd-2.6.18

Вот и все, что нужно для стандартной записи в меню. Если бы вы набирали эти строки из командной строки Grub, то затем понадобилось набрать команду boot, однако ее наличие в меню подразумевается.

Чтобы запустить систему Windows, необходимо вызвать загрузчик Windows. Команда chainloader просто загружает другой загрузчик с указанного корневого раздела. Значение +1 означает, что дополнительный загрузчик сидит в первом блоке раздела (именно туда его помещает Windows).

Двойной пакет Окон

Grub также позволяет установить несколько версий Windows. Стандартный загрузчик Windows 9x/DOS срабатывает, только если он находится на первом диске, что, очевидно, затрудняет установку более чем одной копии системы. Хуже того: если у вас на одном диске два загрузочных раздела Windows, могут возникнуть проблемы.

Пора уже сообразить, что Grub может помочь и в этой ситуации. Команда map позволяет переупорядочить разделы диска, и вы сможете установить две версии Windows, обманув загрузчик: он поверит, что грузится с первого диска. Вот как можно это сделать:

title Windows A
           hide (hd0,1)
           rootnoverify (hd0,0)
           chainloader+1
title Windows B
           hide (hd0,0)
           rootnoverify (hd0,1)
           chainloader+1
title Windows C
           map (hd0) (hd1)
           map (hd1) (hd0)
           rootnoverify (hd1,0)
           chainloader+1

Команда hide полностью прячет раздел от операционной системы и тем самым предотвращает возможные инциденты.

Аварийное восстановление

Самое тяжкое преступление для рабочей системы – невозможность перезагрузиться после сбоя. Меньше всего вам хотелось бы, чтобы ядро системы впадало в панику из-за выхода из строя какого-то оборудования – особенно если вы администрируете удаленный сервер за тысячи километров от вас. Grub здесь может прийти вам на помощь: у него есть система восстановления после сбоев, позволяющая определить альтернативный порядок загрузки, если отказала основная последовательность инструкций.

Заметим, что отказ может быть как проблемой Grub, так и проблемой системы – например, с настройкой Grub все в порядке, но ядро не может загрузиться, не находит файловую систему или что там еще надо. Понятно, что защиты от дурака нигде не бывает, случаются такие обстоятельства, что процесс загрузки просто зависает, а не отказывает, однако данный метод позволит предотвратить множество типичных проблем.

Вот пример простой настройки аварийной загрузки:

default saved
timeout 10
fallback 1 2

title Default system
root (hd0,0)
kernel /boot/vmlinuz-2.6.18
initrd /boot/initrd-2.6.18
savedefault fallback

title Failsafe mode
root (hd0,0)
kernel /boot/vmlinuz-2.6.18 failsafe
initrd /boot/initrd-2.6.18
savedefault fallback

title Alternative
root (hd0,3)
kernel /boot/vmlinuz-2.4.34
initrd /boot/initrd-2.6.18
savedefault

Строка default велит Grub искать сохраненное значение. Строка fallback определяет порядок альтернативной загрузки (умолчание по умолчанию 0), поэтому в данном примере сначала пробуется запись Failsafe, затем запись Alternative.

Grub ищет в своем каталоге файл default, содержащий значение загрузки записи по умолчанию. Это значение можно изменить командой Grub-set-default, входящей в состав Grub, но так как многие дистрибутивы ее не включают, то можете сделать, например, так:

echo ‘1’ > /boot/grub/default
chmod 600 /boot/grub/default

Учтите, что после того, как диск произвел аварийную загрузку, значение по умолчанию изменится на первую успешную загрузочную запись, поэтому вам необходимо обновить значение в файле ‘default’ и вернуть все на свои места.

Ставим замок

Навидавшись чудес, совершаемых с помощью Grub, вы можете обеспокоиться, нельзя ли все это использовать в нехороших целях. Что ж, ваш компьютер никогда не находится в полной безопасности, если он, конечно, не защищен физически, однако существуют меры по усилению сохранности системы.

Grub поддерживает защиту паролем как в виде обычного текста, так и в виде md5-шифрованных паролей.

Я покажу, как это работает. Создайте зашифрованный пароль прямо в Grub как в терминале (от имени root).

grub
grub> md5crypt
Password: ********
Encrypted:$1$IsFjn1$VROhkBS.BaraJ6brXjnc8.

Теперь добавьте следующий код в первый раздел вашего файла настройки menu.lst':

# заголовок
# обычно создается
# вашим дистрибутивом
default =0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
password -md5 :$1$IsFjn1$VROhkBS.BaraJ6brXjnc8.
hiddenmenu
title Linux-one
       root(hd0,0)
       ...

и т.д. Далее, существует несколько способов использования паролей. В показанном выше файле, пользователь сможет выбирать пункты меню, но не запускать команды Grub через командную строку и не редактировать существующие настройки. Если попытаетесь, то вас попросят пароль – тех, кто его не знает, Grub пнет обратно в меню.

Это довольно простая мера защиты; а если вы хотите вообще скрыть присутствие альтернативных записей загрузки? Что ж, команда password может принимать еще один аргумент, указывающий на другое меню Grub.

password -md5 :$1$IsF... /grub/menu2.lst

Вы можете, конечно, назвать файл как угодно и даже хранить его где угодно, лишь бы Grub мог до него добраться.

При загрузке Grub отобразит обычное меню, с теми же ограничениями. А вот если на экране выбора в меню вы нажмете ‘p’ и введете правильный пароль, то он загрузит совершенно новый файл меню со всеми спрятанными опциями.

И наконец, полезный способ использовать пароль – это применить его к отдельному образу. Строка с паролем вставляется сразу после заголовка title. Когда данная запись выбирается в меню, Grub потребует пароль – а нет то откажется продолжить работу. Это полезно, если к вашей системе имеет доступ несколько групп пользователей.

Создание загрузочного Grub CD

Grub на загрузочном диске может очень пригодиться – например, чтобы оживить систему, которая перестала работать, или для загрузки с устройства, не распознаваемого BIOS (это непросто, так как придется установить ядро, поддерживающее устройство в образе RAM-диска, и использовать его для загрузки настоящего ядра).

Кроме загрузки с неподдерживаемого устройства, вы также можете использовать спасательный диск, чтобы переустановить первый этап Grub в главной загрузочной записи на диске.

Чтобы загрузиться с CD, Grub пользуется образом El Torito. El Torito – это имя стандартного протокола загрузки с CD (странное? См. врезку Знаете ли вы?), которому требуется особый код.

Создайте каталог, где будет хранится образ, и реплицируйте структуру каталога boot следующим образом:

mkdir -p grubcd/boot/grub

Теперь необходимо скопировать нужный образ Grub. Ваш дистрибутив обычно хранит их в /usr/share/Grub/i386-pc/, хотя имя последнего каталога может варьироваться. Для Fedora, например, мы использовали

cp /usr/share/grub/i386-redhat/stage2_eltorito grubcd/boot/grub/

Без конфигурационного файла, Grub просто загрузит командную строку, позволив вам вводить команды загрузки напрямую. Однако вы можете при желании включить такой файл (например, списать его с вашей основной системы Linux, чтобы использовать его как резервную копию). И хотя вы создаете Grub CD, это не значит, что на него нельзя поместить другие полезные вещи.

Для создания образа можно использовать команду makeiso. Нужно будет сообщить ей, где находится загрузочный образ. Затем, так как данный образ Grub не использует систему эмуляции диска (где образ диска эмулирует загрузочную дискету), на это также придется указать, да еще добавить несколько дополнительных параметров для максимальной совместимости с системами со старым BIOS. Сведя все вместе, получаем, что ввести надо

mkisofs r -b grubcd/grub/stage2eltorito -no-emul-boot -boot-loadsize 4 -boot-info-table -o Grubcd.iso

Данная команда создаст файл ISO, который будет грузиться (проверьте, что BIOS настроен на загрузку с CD!). Осталось использовать CDRecord или инструмент вроде K3b для прожига образа на диск, и все готово.

Завершение

Наш урок окончен, и настало время остыть. Если ваши Linux мускулы еще не болят, то можете попытаться двигаться дальше. Grub хорош, но разве вы не думаете, что он может больше? Разве вас не достает, как он обзывает диски и разделы? Многие уже на это натыкались. На самом деле их так много, что Grub2, который уже довольно долгое время находится в разработке, исправит эти недочеты. Grub2 вырос из старого исследовательского проекта Pupa (Preliminary Universal Programming Architecture), который был создан для исследования процесса обновления. Некоторые новые возможности Grub2 включают расширяемую, модульную среду, поддержку скриптов и ориентированность на многие платформы. Хотя система следующего поколения еще в разработке, пользоваться ею уже можно. Вы можете ознакомиться с ходом разработки Grub2 в wiki по адресу http://grub.enbug.org. LXF

Персональные инструменты
купить
подписаться
Яндекс.Метрика