Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #86, ФЕВРАЛЬ 2006 г.

Лиловая грубость

Евгений Зобнин aka j1m

Хакер, номер #086, стр. 086-104-3


Сложный путь заключается в самостоятельном вводе команды, выполняемой GRUB после окончания установки (install /grub/stage1 (hd0) ...). Немного модифицировав эту команду, можно избавиться от второго компонента загрузки (e2fs_stage1_5), чтобы избежать проблем с файловыми системами и... обрести новые из-за невозможности перемещать stage2 внутри каталога /boot/grub, так как второго компонента, понимающего ФС, теперь не будет, и начальному загрузчику, укрывшемуся в MBR, придется самостоятельно калькулировать расположение stage2 по смещению от начала раздела, которое после перемещения файла тоже изменится.

[курсы углубленного изучения]

У нас уже есть совсем крохотный, но рабочий конфиг. Сейчас мы его расширим, добавив возможность загрузки нескольких ОС. Представим такую ситуацию: на диске hda созданы разделы в следующей последовательности: /boot (hda1), корневой раздел Linux (hda2), раздел FreeBSD (hda3) и раздел для Windows (hda4). На все разделы, за исключением первого, установлена соответствующая ОС. Чтобы иметь возможность загрузки каждой из них, нам понадобится примерно такой конфиг:

# vi /boot/menu.lst

# ждать три секунды и грузить ОС, назначенную по умолчанию

timeout 3

# по дефолту загружаем первый пункт меню (Linux)

default 0

# если первый пункт загрузить не удалось, то загружаем второй (FreeBSD ;)

fallback 1

# красивое зеленое меню

color green/black

# далее идут элементы меню

title Linux

root (hd0,0)

# загружаем ядро Linux

kernel /vmlinuz root=/dev/hda2

title FreeBSD

root (hd0,1,a)

# загружаем стандартный загрузчик BSD

kernel /boot/loader

title Windows

root (hd0,2)

# делаем активным выбранный раздел (метка BOOT)

makeactive

# передаем управление следующему загрузчику

chainloader +1

# перезагрузка

title Reboot

reboot

# выключение

title Halt

halt

После каждого поля title идут стандартные команды встроенного в GRUB шелла, их можно использовать прямо в самом загрузчике. Как нам уже известно, команда root совершает переход на выбранный раздел. А команда kernel принимает в качестве аргумента путь до образа ядра, при этом ядро должно поддерживать спецификацию Multiboot (Linux и все BSD следуют ей). Как можно видеть, мы не загружаем ядро FreeBSD напрямую, это было бы идеологически и практически не верно, вместо этого передаем управление стандартному загрузчику /boot/loader. Имя раздела для FreeBSD тоже выглядит по-другому, оно включает в себя и подраздел в виде буквы, как принято в BSD-системах. А вот с Windows уже начинаются костыли, Multiboot эта ОС не поддерживает и требует, чтобы раздел, на котором она установлена, был активным. Поэтому мы идем напрямую: сначала с помощью команды makeactive делаем текущий раздел активным, а затем по цепочке передаем управление стандартному загрузчику Windows, расположенному в BR, то есть в первом секторе раздела.

Вообще говоря, специально для таких операционок, как творение Билла Гейтса, в GRUB предусмотрено множество обходных путей. Например, две версии Windows 9X не могут быть загружены из смежных разделов, управление получит только первая. Для устранения проблемы можно использовать такую конструкцию:

Назад на стр. 086-104-2  Содержание  Вперед на стр. 086-104-4