Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Процесс начальной загрузки системы

Самодостаточный GRUB.


Лучший менеджер загрузки ОС.


Как-то сложилось по жизни, что для работы на PC мне всегда требовалось более одной операционной системы. Архитектура компьютера такую мультизагрузку вполне допускает, я программист, так что особых проблем у меня никогда не было. В тех же случаях, когда подобная мультизагрузка требовалась кому-то еще, я рекомендовал xboot Ильи Евсеева. С приходом Peniium II инсталлятор xboot пришлось слегка подправить по поводу run-time error 202 (ну, не предполагали разработчики TurboPascal, что так быстро все случится).

Познакомившись года четыре назад с Linux, я узнал, что, кроме загрузки первичных разделов (реальных или виртуальных), загружать можно и ядра операционных систем. Причем этих уже может быть сколько угодно: существующее ограничение на количество первичных разделов значения в данном случае не имеет. Дальше - больше. Оказывается, существует спецификация множественной загрузки (multi-boot specification), и если бы производители ОС ее придерживались, то мультизагрузка могла бы стать функцией BIOS, например. Но это из области фантазий. Пока, во всяком случае.

Постепенно примкнув к лагерю сторонников ПО с открытым исходным кодом (и в соответствии с принципами этого лагеря), я несколько раз делился опытом на виртуальных страницах Сети. И вот что интересно: больше всего вопросов задали мне в связи с моим вариантом описания мультизагрузчика GRUB (GRand Unified Boolloader). Причем спрашивали не собратья линуксоиды. а именно пользователи ОС от Microsoft. К сожалению, мои советы по поводу использования GRUB помогали им не так уж часто. И не потому, что этот мультизагрузчик плох, отнюдь, а потому, что, кроме возможности загружать уже существующие на винчестере ОС уважаемым корреспондентам требовалась еще и возможность создавать сосуществующие ОС от Microsoft на одном и том же винчестере. А вот это в прямые функции GRUB никак не входит. Сам же производитель такую возможность пользователям не предоставляет: ну, не могли разработчики предположить такого чтобы для одного компьютера несколько ОС покупалось. Апгрейд со скидкой предположили, а две версии одной ОС, но разной скажем, локализации - нет. Или просто две одинаковых: одну - сынишке-геймеру. другую -себе для работы.

Сожаление мое (а может, раздражение из-за необходимости повторять одну и ту же информацию, с каждым разом кажущуюся все более банальной) постепенно достигло определенного уровня, когда я решил предпринять еще одну попытку разъяснения всем желающим возможности использования на одном PC нескольких операционных систем производства Microsoft. "Еще одну" потому, что документация к любому мультизагрузчику предпринимает такую попытку в обязательном порядке, жаль только мало кто эту документацию читает, если судить по отзывам на эти самые мультизагрузчики. А Microsoft - потому, что ОС unix-клона и так предоставляют все необходимые для мультизагрузки средства, да и пользователи их в большинстве своем, лучше представляют себе организацию данных на винчестере. И не обязательно из-за повышенной грамотности - по необходимости, быть может

Итак, оставим в стороне multiboot specification и даже vmlinuz (традиционное название ядра Linux), просто добьемся существования на одном винчестере двух-трех непритязательных ОС: DOS и Windows 9х. Для решения этой задачи потребуются некоторые знания и инструментарий. И то и другое - в минимальном количестве. В стиле Microsoft, так сказать. Дабы пользователь не утомился.

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

Загрузка PC всегда начинается с переноса в память содержимого нулевого блока загрузочного устройства (HDD, FDD, CDROM -как уж в BIOS Setup задано) и передачи на него управления. Размер блока - всего 512 байт, и для всех устройств, кроме HDD, ничего кроме инструкций загрузки следующей порции кода, в нем не содержится

HDD же, по замыслу создателей PC, может иметь несколько загружаемых разделов, поэтому часть главной загрузочной записи (master boot record - MBR), как уважительно назвали нулевой блок винчестера, отведена под таблицу разделов (Partition Table).

Таблица эта содержит описание не более, чем четырех первичных (primary) разделов, причем только один из них может быть расширенным (extended), в котором, в свою очередь, могут содержаться свои разделы. Эти последние, в отличие от первичных, называются логическими Число логических разделов не ограничено.

Описание каждого первичного раздела, кроме данных о его физическом размещении, содержит пару весьма существенных байт: байт активности (загружаемости) раздела и байт типа файловой системы. Первый принимает всего два значения: 0х80 или 0х00 (для загружаемого и не загружаемого разделов соответственно). Типов же файловых систем существует значительно больше. Современному приверженцу Microsoft достаточно знания следующих:



0х04 - FAT16, объемом менее 504 Мб:

0х05 - расширенный раздел, заканчивающийся ниже 8 Гб;

0х06 - FAT16, объемом менее 2 Гб. заканчивающийся ниже 8 Гб;

0х07 - Windows NT NTFS;

0х0B - FAT32, заканчивающийся ниже 8 Гб;

0х0С - FAT32, заканчивающийся выше 8 Гб (как 0х0B, но только для LBA):

0х0Е - FAT16. объемом менее 2 Гб, заканчивающийся выше 8 Гб (как 0х06, но для LBA)

0х0F - расширенный раздел, объемом, более 8 Гб или заканчивающийся выше 8 Гб (как 0х05, но для LBA);

0хFF - таблица дефектных блоков Xenix.


Типы 0х0В ... 0х0F в настоящее время преобладающие, как преобладающий способ адресации блоков диска - LBA. Тип "таблица дефектных блоков Xenix" используется дня маскировки разделов, а зачем такая маскировка нужна, станет ясно чуть позднее. Прибавление 0x10 к идентификатору типа раздела делает его скрытым (hidden). Правда, на эту скрытость Microsoft перестала обращать внимание, начиная с системы Windows 2000.

Исполняемый код MBR, в отличие от таблицы разделов, не стандартизирован, и разные ОС относятся к нему по-разному: некоторые при инсталляции переспрашивают, можно ли перезаписать MBR а некоторые - нет. Младшие Windows - нет. Спасибо хоть таблицу разделов не затирают. Отсюда вывод: MBR нужно уметь сохранять, восстанавливать, а лучше - формировать заново.

И, наконец, схема загрузки, исповедуемая Microsoft. Порядок изложения - обратный. То есть, от загрузки собственно ОС до операций BIOS, выполняемых по включению компьютера:


- ОС загружается начальным загрузчиком, записанным в нулевой блок первичного раздела, в который инсталлировалась ОС (в отличие от MBR, он уже не "master", а просто "boot record");

- начальный загрузчик записывается ОС при инсталляции;

- начальный загрузчик, в свою очередь, загружается главным загрузчиком (тем, что записан в MBR);

- код главного загрузчика записываемый в MBR ОС Microsoft бесхитростен: найти в таблице разделов первый из загружаемых первичных, считать в память его начальный загрузчик и передать на него управление;

- ну, а главный загрузчик, если помните, считывается в память самим BIOS.


В случае с NT в результате описанных выше действии запускается не ОС, a NTLoader - собственный мультизагрузчик NТ.

Действия над MBR, выполняемый ОС при инсталляции (в том случае, если MBR все-таки переписывается, разумеется), таковы:


- переписать исполняемый код MBR;

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


В принципе, из вышеизложенного уже можно догадаться что нужно сделать для достижения поставленной задачи:


- инсталлировать первую систему, не занимая ею все дисковое пространство, разумеется,

- "маскировать" вышеупомянутую систему;

- инсталлировать вторую систему (при желании, таким же образом - третью):

- "демаскировать" все установленные системы;

- инсталлировать мультизагрузчик GRUB.


С помощью чего?


Теперь осталось выяснить, как конкретно это сделать. Переходим к инструментарию. Существует довольно много программ с помощью которых можно редактировать MBR и. в частности, таблицу разделов. Болыиинству пользователей MS Windows наверняка известен Norton Disk Doctor, доживший уже до девятой, если память не изменяет, версии. Список известных мультизатрузчиков тоже не так уж мал. А вот продукт, достаточный сам по себе для решения поставленной задачи, известен мне только один. Это GRUB - GRand Unified Boolloader.

Изначально автор - Ench Boleyn, а в настоящее время проект развивается как часть GNU - известного бастиона Open Source. Именно на сайте этой уважаемой организации находится страничка GRUB: www gnu.org/software/grub, а на ее FTP-сервере всегда можно скачать последнюю версию пакета.

GRUB, безусловно, достоин oтдельного разговора, но для наших минималистских целей достаточно будет рассказать о пяти-шести из почти шести десятков его команд, да простят меня авторы. Приверженцам Microsoft я даже скачивать дистрибутив GRUB не рекомендую: проще воспользоваться его загрузочной дискетой, подготовленной мной специально для них в формате FAT (подобная дискета входит и в состав дистрибутива, только файлов на ней, не имеющих отношения к ОС от Microsoft, много больше и прочить ее под DOS/Windows затруднительно). Архивированный образ дискеты лежит здесь: www.ldc.net/~popov/GrubOnFAT.zip, - а получить из образа дискету можно с помощью замечательной программы rawrite. которую, пользуясь случаем, я настоятельно всем рекомендую. Размер архива очень скромный - чуть более пятидесяти килобайт. Приступим!



Вот мы и "во всеоружии".


Описание инсталляции ОС пропустим: разные они, да и не об этом речь. Замечу только, что первичный раздел для устанавливаемой ОС лучше готовить ее же средствами, практически никаких шансов ошибиться Поскольку, по мнению fdisk от Microsoft (а именно он разбивает диск на разделы), первичный (primary) раздел может быть только один то придется с этим для начала согласиться. Размер раздела выберите минимально достаточным. Расширенный раздел можно пока не создавать

Убедившись в работоспособности первой инсталлированной системы, загрузимся с дискеты GRUB. Если дискета оригинальная, то вы сразу попадете в командный режим (на зто укажет подсказка "grub>"), а если воспользовались моим предложением, то на экране появится меню загрузки. С меню разберемся позднее, а для перехода в командный режим нужно нажать "с", о чем, кстати, напоминает и присутствующая на экране подсказка. Набираем:


grub> root <Tab>

где <Tab> подразумевает нажатие клавиши табуляции.

В ответ на это вы получаете варианты продолжения команды. Если у вас только один винчестер, то вариантов будет всего два: fd0 и hd0. Отмечаем: так называются и нумеруются (с нуля!) в GRUB дисковые устройства. Продолжим набор в соответствии с нашим планом:


grub> root (hd0 <Tab>

Теперь вы получаете перечень разделов диска, выбор из которых возможен. Поскольку раздел у нас пока один, то и в перечне только одна позиция Нажимаем

Esc, поскольку продолжать команду не нужно, все проделанное было нужно лишь для того, чтобы, заставляя GRUB выполнять автозаполнение команды, выудить у неё информацию о разделах. Что и достигнуто. Запоминаем (лучше - записываем), что первая ОС инсталлирована в разделе (hd0.0) и тип ее - 0х0b), например (у вас, разумеется может быть другой).

Переходим к следующему пункту.

"Маскируем" первую систему командой:


grub> partype (hd0,0) 0xff

Зто уже нормальная команда и завершать ее нужно вводом <Enter>.

Если вы еще не догадались, то скажу, что таким образом мы поменяли байт-идентификатор типа файловой системы раздела на 0xff. С этого момента вполне нормальная система будет видеться всеми прочими, как нечто абсолютно чуждое (даже Xenix, которою все прочие будут полагать создателем этого раздела, посчитает ее списком дефектных блоков).

Инсталлируем следующую систему Инсталлятор, конечно, обнаружит на диске некоторый "Nоn-DOS partition", но препятствием к инсталляции это не будет. Хорошо также и то, что инсталлируемая ОС никак не модифицирует чужой раздел, спасибо Microsoft хоть за это. Все рекомендации аналогичны приведенным для первой инсталляции.

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

Теперь разделы можно "демаскировать". Быть может, это и лишнее, но напомню, что делается это командой:


grub> partype (hd0,n) 0xNN

где n - номер демаскируемого раздела, а 0хNN - действительный тип его файловой системы (я надеюсь, вы еще не потеряли бумажку с записями об этом).

Нетрудно догадаться, что после "демаскирования" грузиться будет всегда система, инсталлированная последней. Большего от кода в MBR добиться не удастся, пора переходить к подготовке мультизагрузки.

У GRUB есть одно достоинство - меню допустимых загрузок и их алгоритмы хранятся в обычном текстовом файле. Это безусловно, достоинство поскольку позволяет изменять загрузку, модифицируя всего лишь один очень небольшой текстовый файл, но, как и многие достоинства, это тоже имеет свою оборотную сторону. Состоит эта сторона в том, что этот самый файл должен находиться в разделе, файловую систему которого умеет читать GRUB. Список читаемых файловых систем довольно обширен, да вот только NTFS в него не входит. Отсюда вывод: все нужное для GRUB нужно размещать в разделе FAT. Надеюсь, хоть один такой у вас имеется. Создаем в его корневом каталоге подкаталог boot/grub (не обращайте внимания на "косые": GRUB не обращает внимания на то, прямые они или обратные, - и мы не будем) и переписываем в него файлы из аналогичного подкаталога дискеты. Заметьте, на котором из разделов находится этот подкаталог

Опять загружаемся с дискеты GRUB (хорошо что времени на это требуется заметно меньше, чем для загрузки, скажем, DOS) и выполняем следующие команды:


grub> root (hd0,n)

grub> setup (hd0)


- где n - номер раздела, в котором находится подкаталог boot/grub.


Последние штрихи.


Если у вас современный винчестер, то почти наверняка GRUB сохранил весь необходимый ему для работы код в блоках нулевой дорожки, соседствующих с MBR (нулевая дорожка не используется операционными системами). Если сообщение об этом появилось на экране во время выполнения команды setup то все файлы подкаталога boot/grub можно теперь удалить. В том числе, menu.lst, если при загрузке вы предпочитаете командный режим. Если же вы предпочитаете меню, то упомянутый файл нужно оставить. И перейдем к анализу его содержимого на примере menu.1st с предложенной вам дискеты. Вообще-то, файл этот достаточно прокомментирован. И даже для удобства приверженцев Microsoft - в кодировке СР-1251. Но некоторые пояснения, быть может, и не помешают. Вот команды установочной сессии:


timeout 10 - задается число секунд, после которого стартует загрузка по умолчанию, нажатие на любую клавишу прерывает отсчет. С этого момента само собой ничего не произойдет - GRUB ожидает команды или выбора позиции меню;

color ligt-gray/blue black/ligt-gray -задаются цвета меню: цвет символов / фона для не выбранной и выбранной позиций меню;

default 0 -задается та самая позиция меню по умолчанию. Позиции меню, как можно заметить, тоже нумеруются с нуля. Приведенная строка, кстати, смысла не имеет: в ее отсутствие именно нулевая позиция меню и считается позицией по умолчанию;

title menu item - всегда начинает описание варианта загрузки. Текст после title станет текстом соответствующей позиции меню.


Все ОС Microsoft загружаются следующими командами:


root (hdm,n)

makeactive

chainloader +1

    • где m - номер диска, n - номер раздела. Оба нумеруются с нуля.

Испытываю искушение начать описывать реальный смысл приведенных команд... Но "наступаю на горло собственной песне поскольку отдаю себе отчет в том, что среднестатистическому пользователю MS Windows это ни к чему, а я, в свою очередь, обещал не обременять его излишними знаниями. Опять же - в стиле Microsoft.


Приложение.


Отредактировав menu.1st вы получаете законченную систему с мультизагрузкой. Поздравляю. Приведенные ниже советы можно прочитать "чисто из любопытства" или в том случае, если вы столкнетесь с проблемой, для разрешения которой знаний у вас окажется недостаточно. Можно рассматривать их и как мини-FAQ. Итак.

Не потеряйте дискету GRUB. Ваш menu.1st никуда не денется, если только вы сами его ненароком не уничтожите, а вот исполняемый код MBR (который в настоящий момент представляет собой ни что иное, как stage1GRUB) рано или поздно будет уничтожен очередной реинсталляцией продукта Microsoft. К счастью, установка мультизагрузчика отнимает не более минуты, вот только дискета GRUB при этом - обязательное условие.

Когда разделов на вашем диске станет много, их таблица, выводимая GRUB, как автозаполнение команды root, не должна ввести вас в заблуждение множеством разделов типа 0х0В или 0хОС. Все разделы с номерами старше трех - логические, и хотя типы их такие же, как у разделов первичных, загружаться они не могут. По крайней мере пока вы не начнете использовать не Microsoft Windows.

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

Имея несколько разделов, вам, возможно, захочется один из них использовать в качестве "подопытного" - того, на котором можно опробовать "сомнительное" ПО. Результатом таких проб и ошибок часто становится крах системы. Сохраните заблаговременно образ "свежеинсталлированнной" системы (Ghost от Symantec или DriveImage от PowerQwest - вполне подходящие для этого средства) - пригодится.

Существует "туповатый" аналог команды root - rootnoverify. Разница между ними в том, что rootnoverify не проверяет так называемую "сигнатуру" - последние два байта загрузчика раздела (boot loader), которые всегда должны быть равны 0х55 0хАА. Мне, признаться, не встречались исправные загрузчики с неверной сигнатурой, но, может быть, вам повезет больше.

Разделы можно "скрывать" (hide), устанавливая четвертый бит в байте типа системы (тот самый, который Microsoft игнорирует, начиная от Windows 2000). Вставив, например, в некоторую секцию загрузки команды


hide (hd0,1)

hide (hd1,1)

unhide (hd0,0)

- мы "скроем" при ее загрузке вторые разделы первого и второго дисков и напротив, "откроем" первый раздел первого диска.


Ни одна ОС от Microsoft кроме NT не может быть загружена со второго диска. Нужно выходить в BIOS Setup, менять устройство загрузки и т д. GRUB предоставляет альтернативу. Команды:


map (hd0) (hd1)

map (hd1) (hd0)

root (hd0,0)

makeaktive

chainloader +1

- загрузят ОС из первого раздела второго диска.


Обратите внимание, что команды map "меняют местами" диски даже в представлении GRUB: второй диск становится после их выполнения hd0, a нe hd1. Так же, собственно, поступает и BIOS.

Символьные имена дисковых устройств, доставшиеся современным ОС от Microsoft "по наследству" от MS DOS, приносят подчас немало неудобств. И дело, конечно, не в том, буквами или цифрами обозначать логические устройства, а в том детерминирована ли связь между наименованием логического устройства и его физической сущностью. У Microsoft - нет. Сами то они "буковки" эти не шибко "жалуют" - загляните хотя бы в NT-шный boot.ini: нумерация дисков и разделов вполне очевидна. Но для пользователя... Наблюдали ли вы изменение порядка именования устройств при подключении второго диска или изменении структуры разделов? Вот об этом-то и идет речь. Как будто второй логический раздел расширенного раздела первого диска изменился после подключения второю диска Явно нет, но называется теперь иначе. Для борьбы с этим явлением рекомендуем задавать в BIOS второй, подключаемый диск как "отсутствующий" (not installed) Система все равно обнаружит его, но уже на более позднем этапе, и "буковки" присвоит его разделам следующие за "буковками" , занятыми разделами первого диска

С NT - получше. Имена разделам можно присваивать самому, а в последних версиях уже появилась возможность монтирования а-ля unix. Когда новое устройство становится как бы частью уже существующего дерева каталогов - и никаких "буковок". Но.. Все это не относится к разделу системному - тому, на котором сама NТ инсталлирована. А потребность такая не исключена. Реинсталляция NT после переноса на другой диск или инсталляция "поверх" (с целью спасти нужные файлы не ко времени рухнувшей системы) с высокой долей вероятности дадут вам новое имя системного раздела. А это неудобно, принимал во внимание количество ссылок в реестре на имя старое. Тут уж придется действовать "отмычкой": с помощью regedit.

Подробнее не описываю, знающему достаточно, а не знающему, что такое regedit сначала лучше с ним поближе познакомиться, и лишь потом переходить к редактированию реестра.

Первичные разделы и логические разделы расширенного раздела нумеруются в порядке создания, а не в соответствии с их физическим расположением. Это одно и то же, но только до первого удаления уже существующего раздела (а кто помешает нам это сделать?). Можно бы об этом и не задумываться, но некоторое ПО почему-то настойчиво предлагает ренумеровать разделы в соответствии с их физическим порядком, а некоторое - просто выполняет "ренумерацию", даже не проинформировав об этом пользователя. Полагаю, не нужно объяснять, что номера разделов в menu.1st после этого могут указывать уже не туда, куда следует. Придется вспомнить о командном режиме, определении действительных типов файловых систем, после чего отредактировать menu.1st.

Все описанные операции над таблицей разделов не касались изменения размеров разделов существующих. И это естественно; GRUB не предлагает такой возможности, да и знаний тут требуется побольше. Если же вам когда-нибудь все-таки придется вручную модифицировать эти размеры (восстанавливая MBR после CIH-атаки, например), то помните, что в таблице они задаются двумя способами - старым, с указанием значений номеров цилиндра, головки и сектора для начала и конца раздела (CHS), и новым - с указанием логического номера стартового блока раздела и его длины в блоках Нетрудно догадаться, что второй является одновременно и единственно правильным для LBA (Logical Block Addressing) режима Для разделов, физические параметры которых уже невозможно опиcaть формулой "цилиндр - головка - сектор" (места, отведенного в свое время создателями PC для хранения этих данных, просто недостаточно для описания параметров современных винчестеров), поля CHS все же заполняются, указывая, обычно, на близкий к максимально адресуемому в рамках CHS.


Эпилог.


Разумеется, описанный способ создания системы с мульти-загрузкой - не единственный. Лет пять назад устав от необходимости несколько раз запускать Disk Editor, пока подготавливаемый к продаже компьютер не обретет запрошенную мультисистемность я написал четыре крошечные утилитки для сохранения и восстановления MBR, а также для просмотра и модификации пресловутых четырех пар байт таблицы разделов Используя возможности создания меню средствами confg.sys и autoexec.bat, loadlin (для загрузки Linux из-под DOS) и эти самые утилитки, также вполне можно было создать мультизагрузочную систему. Вывод: важнее все-таки знать, что нужно делать, а средства осуществления найдутся

Вот, собственно и все о моем любимом мультизагрузчике в варианте изложения для приверженцев MS Windows. Побольше любопытства, хладнокровия при операциях на MBR и - успехов!


Владимир Попов.