Алексей Федорчук 25 июня 2008 гLilo — хорош, пока речь идет о загрузке одной-двух систем, причём не перегруженной экспериментальными ядрами собственной сборки. Если же начинаются опыты с многочисленными ядрами или, паче того, дистрибутивами, да ещё раскиданными по разным физическим дискам, ограниченность возможностей традиционного загрузчика операционной системы Linux становится очевидной.
Проявляется эта ограниченность, во-первых, в неудобстве конфигурирования как вручную, так и специальным средством — /sbin/liloconfig. А неудобство конфигурирования повышает вероятность ошибки в его процессе, которую исправить в ходе загрузки не получится: интерактивные функции Lilo если и не равны нулю, то асимптотически к нему приближаются. Да и необходимость перезапуска /sbin/lilo после любого изменения конфигурационного файла весьма раздражает. И, кстати, тоже служит источником пользовательских ошибок.
Благо, клином не сошёлся свет на Lilo — как всегда, пользователю свободных систем предоставляется немало возможностей выбора. Наиболее известные альтернативы — это BSD Loader из соплеменного берклианского мира, и собственно герой нашего повествования — grub.
О BSD Loader'е можно сказать только две вещи. Первая — при внимательном рассмотрении (и изучении) он оказывается отнюдь не таким убогим, каким выглядит на первый взгляд. А по интерактивным возможностям оставляет Lilo далеко позади. Однако, и это второе, использовать BSD Loader имеет смысл только при наличии какой-либо BSD-системы в уже установленном виде. Ну, и наконец, третье: всё, что умеет делать BSD Loader, умеет и grub — только лучше.
Об удобстве настройки и интерактивных возможностях grub много хороших слов написал Владимир Попов, и повторяться я не буду — заинтересованные могут для начала прочесть это. А я попробую рассказать о том, как обрести эти удобства и возможности в нашем дистре. И тут, как всегда, открываются два пути.
Первый — взять какой-либо LiveCD, в котором в качестве загрузчика используется grub (например, PuppyRus), и, следуя вышеуказанному документу, установить grub с него. Процедура несложная , но требует скачивания дополнительного iso'шника и его записи. Хотя сам по себе RIP в жизни и пригодится, это может оказаться обременительным.
Второй же путь — более прост: воспользоваться готовым пакетом. Но тут самое время вспомнить о старшей родственнице, Slackware, и отправиться в хранилище её неофициальных пакетов, где искомый grub легко отыскивается поиском по всем версиям — последняя его версия там на данный момент
grub-0.97-i486-2.tgz для Slackware аж 10.2, но в данном случае это значения не имеет.
Вероятно, если тщательно порыться по сети, то можно обнаружить пакет и посвежее, например, что-нибудь из пре-релизов 2-й версии, или собрать таковой самому. Однако не уверен, что это стоит делать: «пред-первые» grub'ы годами служили верой и правдой. А вот как себя поведут «пред-вторые» — пока не ясно. А загрузчик — не та штука, с которой хотелось бы экспериментировать.
Так что скачиваем ранее найденный пакет, несмотря на его преклонный возраст, с подходящего зеркала и устанавливаем его традиционным способом, по-патриковски:
installpkg grub-0.97-i486-2.tgz
Примечание. Нам с вами Груб устанавливать не нужно, он имеется в дистро PuppyRusРазумеется, это и последующие действия выполняются от лица суперпользователя. И вот еще о чем следует помнить: если, следуя рекомендациям разработчиков grub, мы вынесли каталог /boot на самостоятельный раздел (что подразумевается и в дальнейшем), не монтируемый автоматически при старте системы, то перед отдачей команды installpkg его следует подмонтировать вручную:
На этом, однако, дело не кончается, ибо всё, что мы после этого имеем, — это всего лишь несколько исполняемых файлов с префиксом grub* в каталоге /sbin и «проект» будущего конфига — /boot/grub/menu.lst.sample.
Установочного скрипта пакет grub для Slackware не имеет, и дальнейшие процедуры придётся выполнить собственноручно.
Для начала логика подсказывает нам, что к установке нашего загрузчика имеет отношение команда /sbin/grub-install, которую мы и запускаем:
/sbin/grub-install /dev/sda1
Аргументом команды выступает имя файла целевого устройства. А об опциях команды можно узнать таким образом:
Из доступных опций интерес могут представлять две:
—root-directory=DIR
с помощью которой можно сохранить копию grub'а в произвольном каталоге, указанном в качестве значения опции, и
—grub-shell=FILE
задающая шелл, который будет использоваться grub'ом в качестве оболочки при интерактивной работе. Впрочем, по умолчанию в качестве таковой применяется нечто похожее на bash, чего вполне достаточно.
Однако вернёмся к установке. В результате наших действий каталог /boot/grub заполняется серией файлов «полуторной» стадии, *_stage1_5, обеспечивающих «понимание» grub'ом соответствующих файловых систем, как нативных для Linux (e2fs_stage1_5, reiserfs_stage1_5, xfs_stage1_5, jfs_stage1_5), так и иных (ufs2_stage1_5, ffs_stage1_5, minix_stage1_5, iso9660_stage1_5). И с тех, и с других, однако, grub может напрямую загружать ядра соответствующих ОС, не прибегая к «загрузке по цепочке», вынужденно используемой им при загрузке Windows.
Завершающий штрих установки grub'а — запуск его самого на предмет перезаписи загрузочного сектора:
После этого перед нами появляется приглашение командной строки его bash-подобного шелла:
где можно вводить нужные команды из числа встроенных (полный их список выдаётся по нажатию табулятора при пустой строке) с необходимыми агрументами — именами дисковых устройств и их разделов, причем в обоих случаях работает автодополнение и предложение альтернатив (посредством того же табулятора).
При задании аргументов команд необходимо помнить об особенностях номенклатуры устройств в grub'е и синтаксисе его шелла:
все диски, вне зависимости от типа интерфейса, именуются hd (дискеты — fd, компакты — cd);
нумерация дисков начинается с нуля — hd0 соответствует /dev/sda в номенклатуре Linux'а и так далее;
с нуля же начинается и нумерация первичных разделов — то есть (hd0,0), (hd0,1), (hd0,1) и (hd0,3) соответствуют Linux'овым /dev/sda[1-4];
как и в Linux'е, за логическими разделами в разделе расширенном закреплены номера, начиная за таковым последнего возможного первичного раздела, вне зависимости от того, все ли они размечены на самом деле, то есть (hd0,4) — это первый логический раздел (соответствует /dev/sda5) и так далее;
номера дисков и разделов, как можно видеть из приведённых выше примеров, разделяются запятой (без пробела), а полное имя устройства заключается в круглые скобки, например: (hd0) — первый диск целиком, (hd0,0) — первый первичный раздел на нём и так далее.
Вся эта премудрость понадобится нам потом, при составлении конфигурационного файла grub'а и, в особенности, при интерактивной работе с ним, неизбежной при всякого рода экспериментах. Пока же нам достаточно указать имена корневого устройсва для grub и того устройства, в загрузочный сектор которого будет помещен инициирующий код. Первое делается командой
Аргумент в примере дан, исходя из предположения, что под каталог /boot отведен 1-й раздел 1-го диска. А команда
запишет инициирующий код в MBR первого винчестера.
Всё, теперь командой
можно выйти из grub-окружения. И перезагрузиться? Нет, торопиться не надо, как говорил товарищ Саахов. Потому что установить-то grub мы установили, но еще не настроили его должным образом.
Это делается редактированием конфига — простого текстового файла /boot/grub/menu.lst. Ранее я уже упоминал, что прототип его в виде /boot/grub/menu.lst.sample у нас имеется. Так что берём его за основу
cp /boot/grub/menu.lst.sample /boot/grub/menu.lst
и результат копирования, то есть собственно конфиг menu.lst, загружаем в любимый текстовый редактор, например:
nano -w /boot/grub/menu.lst
Отступление: в некоторых дистрибутивах (например, в Gentoo) конфигурационный файл grub'а так и называется — grub.conf. Могут различаться также детали внутреннего устройства, большая или меньшая полнота комментариев и приводимых примеров и тому подобные мелочи. Мы будем придерживаться того, как это подаётся в Slackware и модифицируется в Zenwalk'е, но большинство сказанного ниже имеет силу для любых систем, использующих grub.
Прототип нашего будущего конфига, в полном соответствие с заветами Великого Патрика, хорошо прокомментирован (комментарии предваряются привычным символом #), так что разобраться в нём будет нетрудно. Для тех, кто совсем не разумеет вражьей мовы, остановлюсь на самых существенных моментах.
Конфиг нашего загрузчика неявным образом разделяется на две секции. Первая из них описывает общие настройки grub'а, и потому мантайнер пакета, некто Acrux, резонно назвал её