Сайт | Скачать | Видео | Wiki

Автор Тема: [GRUB: установка и настройка]  (Прочитано 5935 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Zloy_T

  • Почетный участник
  • Старожил
  • *
  • Сообщений: 326
  • Репутация: +74/-2
  • Автор темы
[GRUB: установка и настройка]
« : 14 Май 2009, 22:57:17 »
Алексей Федорчук

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 его следует подмонтировать вручную:

 
Код
mount /dev/sda1 /boot

На этом, однако, дело не кончается, ибо всё, что мы после этого имеем, — это всего лишь несколько исполняемых файлов с префиксом grub* в каталоге /sbin и «проект» будущего конфига — /boot/grub/menu.lst.sample.

Установочного скрипта пакет grub для Slackware не имеет, и дальнейшие процедуры придётся выполнить собственноручно.

Для начала логика подсказывает нам, что к установке нашего загрузчика имеет отношение команда /sbin/grub-install, которую мы и запускаем:
 
Код
/sbin/grub-install /dev/sda1

Аргументом команды выступает имя файла целевого устройства. А об опциях команды можно узнать таким образом:
 
Код
/sbin/grub-install —help


Из доступных опций интерес могут представлять две:
—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'а — запуск его самого на предмет перезаписи загрузочного сектора:
 
Код
/sbin/grub

После этого перед нами появляется приглашение командной строки его bash-подобного шелла:
Код
grub>

где можно вводить нужные команды из числа встроенных (полный их список выдаётся по нажатию табулятора при пустой строке) с необходимыми агрументами — именами дисковых устройств и их разделов, причем в обоих случаях работает автодополнение и предложение альтернатив (посредством того же табулятора).

При задании аргументов команд необходимо помнить об особенностях номенклатуры устройств в 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 и того устройства, в загрузочный сектор которого будет помещен инициирующий код. Первое делается командой
Код
grub> root (hd0,0)

Аргумент в примере дан, исходя из предположения, что под каталог /boot отведен 1-й раздел 1-го диска. А команда
Код
grub> setup (hd0)

запишет инициирующий код в MBR первого винчестера.

Всё, теперь командой
Код
grub> quit

можно выйти из 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, резонно назвал её
Код
### Global settings
« Последнее редактирование: 14 Май 2009, 23:07:43 от Zloy_T »

Оффлайн Zloy_T

  • Почетный участник
  • Старожил
  • *
  • Сообщений: 326
  • Репутация: +74/-2
  • Автор темы
GRUB: установка и настройка Часть 2
« Ответ #1 : 14 Май 2009, 23:00:26 »
В menu.lst других дистрибутивов она может не иметь никакого названия вообще.

Вторая же секция может распадаться на несколько субсекций, каждая из которых описывает свой вариант загрузки (не обязательно разных операционных систем).

«Глобальная» секция в нашем образцовом конфиге начинается с вещей совсем не обязательных — строки, описывающей загрузку фонового изображения
Код
splashimage (hd0,0)/boot/grub/slack_nalug.xpm.gz

и закрытых комментариями строк, определяющих расцветку меню.
Код
# foreground = FFFFFF
# background = AAAAAA

Очевидно, что без всего этого можно обойтись. Или — заменить своей картинкой и цветами. Картинка в формате xpm должна иметь размер, кажется, 640x480 и быть сжатой gzip'ом. Что же до цветов, то они не обязаны задаваться своими шестнадцатеричными кодами, можно использовать и соответствующие английские слова. Например, в конфигах загрузчиков многих дистрибутивов они определяются так:
Код
color cyan/blue white/blue

Столь же не обязательны и строки
Код
## shaded text
#shade 1

Как это выглядит «в натуре», я проверить не удосужился.

А вот строка
Код
timeout 5

в большинстве случаев очень желательна. Если её нет (или в качестве значения тай-аута указан 0), загрузка происходит немедленно, без предоставления пользователю времени для выбора её варианта. Конечно, при единственной загружаемой системе с неизменными параметрами это оправданно, но всё-таки обычно grub используется как мультисистемный загрузчик, и потому время «на подумать» (в секундах) тут будет не лишним.

Наконец, завершающая «глобальную» секцию строка
Код
default 0

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

Между первой и второй секциями Acrux поместил два блока весьма полезных комментариев. Во-первых, это таблица соответствия именования устройств в grub и в Linux:
Код
## Linux         Grub
## ======================
## /dev/hda      (hd0)
## /dev/hda1     (hd0,0)
## /dev/hdb      (hd1)
## /dev/hdb1     (hd1,0)
## /dev/fd0      (fd0)

То есть примерно то, о чем говорилось выше.

Вторая же вставка — таблица кодов, соответствующих различным режимам фреймбуфера:
Код
###  FRAMEBUFFER RESOLUTION SETTINGS
##     +————————————————————————-+
##          | 640x480    800x600    1024x768   1280x1024
##      ——+——————————————————————
##      256 | 0x301=769  0x303=771  0x305=773   0x307=775
##      32K | 0x310=784  0x313=787  0x316=790   0x319=793
##      64K | 0x311=785  0x314=788  0x317=791   0x31A=794
##      16M | 0x312=786  0x315=789  0x318=792   0x31B=795
##     +————————————————————————-+

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

Со строки
Код
## Default menu entries

неявным образом начинается вторая секция. В нашем примере она имеет две субсекции, описывающие варианты типовой загрузки Slackware. Первая (в соответствии с определённым ранее параметром default) выглядит так:
Код
title Slackware GNU/Linux
kernel (hd0,0)/boot/vmlinuz vga=0x315 root=/dev/hda1 ro

Первая строка (title) — это просто имя варианта загрузки, под которым он будет фигурировать в меню grub'а. Желательно, чтобы оно было осмысленным, как в нашем примере.

Вторая строка (kernel) описывает собственно загружаемое ядро и передаваемые ему параметры. Первое значение её — абсолютный путь к файлу образа ядра (vmlinuz — одно из традиционно принятых для него имен в Linux'е), отсчитываемый от имени устройства в нотации grub'а. Очевидно, что в данном примере каталог /boot не лежит на отдельном разделе, а входит в общее дерево корневого каталога.

Далее — параметр vga, определяющий видеорежим при загрузке и, в дальнейшем, в консоли. В примере это режим фреймбуфера с разрешением 800x600 и глубиной цвета 16 млн (т.н. 24-битный цвет). Однако можно выбрать любое подходящее значение из таблицы (так, для LCD-дисплеев можно определить разрешение, соответствующее физическому разрешению матрицы), опустить этот параметр (тогда загрузка будет происходить в текстовом режиме) или задать значение ask (запрос режима перед загрузкой). Для первого раза я рекомендовал бы опустить параметр vga, ибо без него меньше шансов получить ошибку при старте системы.

Параметр root определяет устройство, несущее корневую систему для уже загруженного ядра, и потому даётся в нотации Linux: grub своё дело сделал, и его правила больше не действуют. В примере это первый раздел первого IDE-диска, то есть тот же самый (hd0,0), который выступал в качестве корневого для grub при указании пути к загружаемому ядру.

Наконец, параметр ro означает read only: в процессе загрузки корневая файловая система монтируется обычно в режиме «только для чтения»; доступной для записи она становится в ходе инициализации системы, когда происходит монтирование всех файловых систем, описанных в файле /etc/fstab с теми опциями, которые там приведены. Считается, что монтирование в режиме read only может сберечь корневую файловую систему от повреждений. Так это или нет — науке не известно, но вреда от параметра ro нет, хотя он, разумеется, не обязателен.

Вторая субсекция определена на случай пересборки ядра. Если нет уверенности, что новое ядро загрузится и будет работать нормально (а полной уверенности в этом быть не может до тех пор, пока сам не убедишься на практике), то резонно было бы сохранить возможность загрузки ядра старого, проверенного. Что и достигается нижеследующими строками:
Код
title Slackware GNU/Linux (old)
kernel (hd0,0)/boot/vmlinuz.old root=/dev/hda1

Можно видеть, что они ничем не отличаются от аналогичных строк первой субсекции, кроме имени (дабы не забыть, что именно здесь загружается) и имени файла образа ядра, столь же традиционного, как указанное выше.

Следующие несколько субсекций, озаглавленных все вместе как
Код
### Special cases

именно что и описывают разные специальные случаи. Впрочем, все они закомментированы, являя собой просто образец для подражания или «болванку» для модификации. Для для нас интерес будет представлять только один из этих примеров, который мы рассмотрим под занавес. А пока вернемся к первой, основной субсекции.

Как нетрудно догадаться, основываясь на параметре title, в примере рассмотрен случай с дистрибутивом Slackware. А Zenwalk, хотя и приходится ей близким родственником, отличается рядом особенностей, в частности, именно условиями загрузки.

Оффлайн Zloy_T

  • Почетный участник
  • Старожил
  • *
  • Сообщений: 326
  • Репутация: +74/-2
  • Автор темы
GRUB: установка и настройка часть 3
« Ответ #2 : 14 Май 2009, 23:01:40 »
Главное отличие заключается в том, что Zenwalk при загрузке использует так называемый initrd — виртуальный диск в оперативной памяти (Initial RAM-диск, подобнее об этом говорится в Интермедии 2.2), содержащий ядро, в котором поддерживается минимальное количество оборудования, но обеспечивается загрузка всех остальных компонентов системы. И это, разумеется, должно быть отражено в конфиге grub'а.

Кроме того, форма описания параметров загрузки, принятая Acrux'ом, далеко не самая распространённая. Практически это не важно, ибо результат достигается точно тот же, но выглядит достаточно непривычно.

Наконец, номенклатура файлов дисковых устройств во многих современных дистрибутивах (и Zenwalk тут не исключение), отличается от использованной в примере нашего конфигурационного файла: жесткие диски, вне зависимости от принадлежности к PATA- или SATA-семейству, именуются одинаково — /dev/sd?.

В соответствие с этим мы и отредактируем прототип. Точнее, я приведу просто фрагмент своего конфига для дистрибутива Zenwalk и прокомментирую его.

Итак, секция, первая,

Код
### Global settings

Это название удачно, и я его сохранил. Хотя и сводится она у меня к двум строкам. Первая:
Код
timeout 10

этого времени мне как раз хватает на размышления, если в планах стоит загрузить систему, отличную от умолчальной:
Код
default 0

Если не догадались, какая же умолчальная — можно посмотреть на название книжки, или перейти ко второй секции, каковая с неё и начинается:
Код
title	Zenwalk

Значение title, думаю, в комментариях не нуждается.
Код
root	(hd0,0)

Этой строкой определяется устройство, несущее корневой каталог для grub — загрузочный раздел у меня выделен в самом начале диска как первичный (/dev/sda1). Как мы увидим позднее, такое самостоятельное определение корневого устройства, отдельно от пути к образу ядра в строке kernel, в ряде случаев удобнее. Хотя в иных ситуациях может оказаться предпочтительным задание полного пути, как в примере из «образцового» конфига.

Итак, в следующей строке
Код
kernel	/vmlinuz vga=791 noapic nolapic root=/dev/sda6 ro quiet splash

определяются образ загружаемого ядра и передаваемые ему параметры. Поскольку раздел под каталог /boot мы только что определили как корневой для grub'а, абсолютный путь к файлу образа от корня же и указывается.

Обратим внимание, что vmlinuz — это символическая ссылка на реальное имя файла образа ядра:
 
Код
ls -l /boot/vmlinuz
lrwxrwxrwx 1 root root      14 2008-08-07 00:07 /boot/vmlinuz -> vmlinuz-2.6.26

То есть при апгрейде версии ядра никаких изменений в menu.lst вносить не нужно.

Значение параметра vga задаёт разрешение 1024x768 при 16-битном цвете при загрузке. В дальнейшем этот же режим будет использоваться в консоли. Впрочем, на современных широкоформатных мониторах любые стандартные VESA-режимы передаются с сильными искажениями, а задание режимов нестандартных — это совсем отдельная история, которой здесь мы касаться не будем.

Параметры noapic и nolapic запрещают использование улучшенного контроллера прерываний (APIC) — как ввода/вывода (первый), так и локального. Без этих параметров большинство дистрибутивов на моей машине (и многих других современных) просто не грузится. Нужны ли эти параметры в общем случае — обычно определяется методом ползучего эмпиризма.

Параметр root определяет устройство корневой файловой системой для уже загруженного ядра — в нашем случае она отличается от корневого устройства загрузчика и предписывает монтирование корня в режиме read only, о чём уже говорилось ранее. Параметр quiet подавляет вывод сообщений о ходе загрузки, подменяемых, благодаря параметру splash, заготовленной splash-картинкой. Разумеется, оба эти параметра не обязательны, у меня они унаследованы от какого-то старого конфига, развлечения же со сплэшами — также тема специально для любителей.

В строке
Код
initrd	/initrd.splash

определяется имя того самого инициирующего диска, о котором говорилось ранее. Он находится в каталоге /boot, вместе с ядром, и в Zemwalk'е по умолчанию носит имя, указанное в вышеприведенной строке. Файлам initrd, собранным для специальных целей (например, для поддержки какого-либо экзотического оборудования), можно давать иные имена.

Отступление: вообще, имена файлов для образа ядра и инициирующего диска в Linux'е не есть что-то предопределенное свыше; они могут быть любыми — нужно только не забывать в соответствующих местах указывать их явным образом. Не обязаны они также находиться в каталоге /boot: довольно часто и ядро, и initrd выносят непосредственно в корневой каталог, хотя обычно в виде символических ссылок. Только опять-таки пути к этим файлам должны быть указаны в абсолютной форме (то есть от корня загрузчика или, если нужно, файловой системы).

Последняя строка нашей субсекции
Код
quiet

предписывает «молчаливый» режим по завершении загрузки и также досталась мне по наследству — острой необходимости в ней нет.

Итак, мы описали основной вариант загрузки нашей системы. По образу и подобию его можно создать сколько угодно субсекций для дополнительных вариантов — с различными сборками образов ядра и (или) initrd. Нужно только заботиться об уникальности имен файлов и тех, и других, а также их соответствии в реальности и в описании конфига. Уникальными желательно быть и значениям строки title.

А вот строка root в дополнительных субсекциях в этом случае не нужна — корневое устройство для загрузчика мы определили в первой субсекции, и определение это будет сквозным, до его переопределения явным образом. Так что каждая из дополнительных субсекций сведется к обязательным строкам примерно такого вида:
Код
title	Zenwalk Old
kernel /vmlinuz.old noapic nolapic root=/dev/sda6
initrd /initrd.old

Однако grub позволяет загружать не только разные варианты одного дистрибутива, но и разные дистрибутивы, каждый из которых лежит, разумеется, на собственном разделе (разделах), что требует переопределения корневого устройства для загрузчика.

Как это делается — проще всего рассмотреть на примере. Одной из систем, установленных у меня на машине, является Xubuntu, которая занимает третий логический раздел (/dev/sda7). Вот как выглядит субсекция, обеспечивающая её загрузку:
Код
title	Xubuntu
root (hd0,6)
kernel /boot/vmlinuz-2.6.24-19-generic vga=791 noapic nolapic root=/dev/sda7 ro quiet
initrd /boot/initrd.img-2.6.24-19-generic
quiet

То есть:
для начала мы идентифицируем систему, дабы знать, что загружает соответствующий пункт меню grub'а,
затем переопределяем корневой раздел для загрузчика — (hd0,6) == /dev/sda7,
потом, исходя из этого, указываем путь к соответствующему образу ядра — каталог /boot теперь является составной частью будущей корневой файловой системы Xubuntu,
задаём ядру необходимые параметры, в том числе, и новый корень файловой системы, совпадающий в этом случае с корнеым устройством загрузчика — /dev/sda7,
и, наконец, прописываем имя файла инициирующего диска initrd.

Оффлайн Zloy_T

  • Почетный участник
  • Старожил
  • *
  • Сообщений: 326
  • Репутация: +74/-2
  • Автор темы
GRUB: установка и настройка Часть 4
« Ответ #3 : 14 Май 2009, 23:04:44 »
Ничего неожиданного, не так ли? Разве что имена файлов образа ядра и инициирующего диска заданы полностью, с указанием версии и субверсии: в дистрибутивах семейства Ubuntu в пределах жизненного цикла одного релиза смена версии ядра, как правило, не происходит. Однако, поскольку корневое устройство загрузчика в этой субсекции уже иное, ничто не мешает нам создать символические ссылки вроде
Код
/boot/vmlinuz -> /boot/vmlinuz-2.6.24-19-generic
/boot/initrd -> /boot/initrd.img-2.6.24-19

дабы избавиться от лишней писанины.

И, наконец, вспомним, что grub яыляется истинно мультисистемным загрузчиком и способен грузить не только Linux, но и иные системы. Делать он это может двояким образом.

Для операционок, файловую систему которых он понимает (к их числу принадлежат, в частности, BSD их FFS и UFS2), grub обеспечивает старт примерно тем же методом, что и для любого Linux'а — то есть непосредственной загрузкой образа ядра или некоей программы, способной эту загрузку выполнить. Например, для FreeBSD (и DragonFlyBSD) это делается примерно так:
Код
title  FreeBSD
root   (hd0,2)
kernel (hd0,2)/boot/loader

С титулом здесь всё понятно. Корневое устройство для загрузчика — это BSD-слайс (первичный раздел в терминологии DOS/Windows и Linux, в данном случае третий), разбитый на логические разделы в соответствии c правилами BSD-разметки, а /boot/loader — один из комопнентов загрузчика BSD Loader, который и выполнит всю остальную работу (подробности обо всех этих материях можно прочитать здесь).

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

На такой случай разработчики grub'а припасли второй метода — загрузку «по цепочке», то есть просто передачу управления на загрузочный сектор раздела, несущего соответствующую операционную систему. Каковую можно и назвать — мы ведь не боимся поминать чёрта к ночи, а Windows — поутру.

Чтобы понять, как это делается, вернёмся к рассмотрению нашего «образцово-показательного» примера — файлу /boot/grub/menu.lst.sample. Ближе к его концу можно обнаружить такую субсекцию:
Код
#title Windows
#root (hd0,5)
#makeactive
#chainloader +1

Снимаем знаки комментария со всех этих строк, вместо устройства (hd0,5), при необходимости, указываем то, которое в вашей системе несёт Windows (простите — на этот раз именно вашей, у меня таковой не имеется), и — вуаля! — загрузка Windows вам обеспечена.

Правда, задать корневое устройство для загрузчика более корректно следует так:

Код
rootnoverify (hd?,#)

где ? и # — номера диска и раздела соответственно. А параметр rootnoverify не просто назначает загрузочное устройство, но и запрещает проверку его файловой системы, резонно полагая, что проверять заведомо непонимаемое смысла не имеет.

Далее строка

Код
makeactive

делает загрузочное устройство активным, а

Код
chainloader +1

«по цепочке» передаёт на него (точнее, на его загрузочный сектор) управление. Дальнейшее — забота Партии, то есть штатного загрузчика Windows, о котором вы наверняка знаете больше меня.

Остаётся только добавить, что загрузка по «цепочке» применима не только к чуждым, но и к вполне соплеменным системам, в отношении которых к ней подчас приходится прибегать. В частности, такая ситуация сложилась, когда во FreeBSD как умолчальная была принята файловая система UFS2, а grub еще не научился её понимать. Как это делалось — ныне представляет только исторический интерес, однако общий принцип «цепочечной» загрузки, думаю, ясен — запомним его на предмет возможного повторения аналогичных ситуаций в будущем:
определение корневого устройства загрузчика без проверки его файловой системы,
активизация оного, и
передача управления на его загрузочный сектор.

Таким образом, grub не мытьём, так катаньем способен загрузить практически любую операционную систему — существующую, былую и грядущую. Правда, при одном необходимом и достаточном условии — что его конфигурационный файл составлен безошибочно.

Однако, во-первых, все мы люди, все мы человеки — и никто из нас не застрахован, скажем, от банальных «ачипяток» (а уж автор этих строк — меньше всех). А во-вторых, как в случае с файловой системой UFS2, ошибки могут быть вызваны и (почти) объективными причинами. И в том, и в другом случае результатом будет не загрузка выбранной системы, а сообщение об ошибке. Что делать?

И тут на помощь придёт режим редактирования — после неудачной загрузки и возврата в главное меню выбранный его пункт можно на лету видоизменить. Для этого нажимаем на клавишу с символом e (от edit) и видим содержимое субсекции, соответствующей данному пункту, а также подсказку по доступным командам, которым соответствуют односимвольные горячие клавиши:

e — редактирование текущей линии,
o — добавление строки после текущей,
O — добавление строки перед текущей,
d — удаление текущей строки,
D — удаление предыдущей строки,
c — переход в режим командной строки, о котором речь пойдёт позже.

Перемещаясь стрелками управления курсором, повторным нажатием e вызываем для редактирования подозрительную строку, вносим те изменения, которые кажутся нам правильными, нажатием клавиши Enter фиксируем эти изменения, после чего нажатием клаивши b (от boot) пытаемся загрузить систему.

Если загрузка проходит успешно — всё хорошо: немедленно, пока не забыли, вносим соответствующие коррективы в /boot/grub/menu.lst и спокойно живём дальше. Если же опять следует сообщение об ошибке, возвращаемся в режим редактирования — и так до победного конца.

В процессе редактирования можно пользоваться автодополнением и выводом альтернатив, для чего служит клавиша табулятора, действующая точно так же, как и в большинстве командных оболочек. То есть, находясь в пустрой строке
Код
grub> root (

по нажатию табулятора мы получим
Код
grub> root (hd
 Possible disks are:  hd0 hd1

Дополнив строку номером раздела, получим
Код
grub> root (hd0,
 Possible partitions are:
   Partition num: 0,  Filesystem type is ext2fs, partition type 0x83
   Partition num: 3,  Filesystem type is ext2fs, partition type 0x83
   Partition num: 4,  Filesystem type unknown, partition type 0x82
   Partition num: 5,  Filesystem type is ext2fs, partition type 0x83
   Partition num: 6,  Filesystem type is ext2fs, partition type 0x83

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

Посредством grub'а можно загрузить систему, которой не соответствует никакая подсекция в menu.lst, и даже если этот файл пуст или вообще не существует. Для этого нажатием клавиши c надо перейти в режим командной строки и последовательно ввести все необходимые для загрузки команды и их аргументы:
root с указанием корневого раздела,
kernel с именем файла образа и необходимыми аргументами,
initrd, если он используется в данной системе.

Или же, если с определением аргументов указанных команд существуют неясности, можно попробовать интерактивно воспроизвести «цепочечную» загрузку, то есть набрать руками содержимое соответствующей субсекции (например, по образу и подобию субсекции, загружающей Windows).

Подводя итог, можно со всей ответственностью заявить: с помощью grub'а любую операционную систему можно загрузить всегда. Для этого потребуется лишь терпение и толика знаний. Если таковых недостанет после прочтения настоящей интермедии, обратитесь к документации. Правда, на этот раз я пошлю заинтересованного читателя не к man-странице. Ибо всё, на что способен man grub — это, после перечисления опций вызова команды, послать ещё дальше. К счастью, не на страничку Лео Каганова, а всего только к документации в формате info:

The  full documentation for grub is maintained as a Texinfo manual.]

Правда, с чтением info-страниц могут возникнуть затруднения. Некоторые особо аскетические дистрибутивы, такие как CRUX, просто не имеют их в своём составе.  Если же читателю этих строк, подобно их автору, слабо пробираться сквозь дебри info-страниц, то Google в помощь: документации по grub в Сети вдоволь, в том числе, и на русском языке.