Загрузка FreeBSD через GRUB


Автор: Алексей Федорчук

Эта заметка размещается в связи с опробованием последней (2.4) версии DragonFly BSD — обеспечить её загрузку с помощью GRUB можно точно так же, как и FreeBSD.

Обычно обеспечить совместное проживание Linux и FreeBSD на одной отдельно взятой машине не составляет никакого труда. Для обеспечения загрузки любой из этих систем, установленных на одной машине, можно воспользоваться:
штатным загрузчиком FreeBSD (BSD loader);
LILO;
GRUB.

Конечно, первый способ — не самый удобный, возможности BSD loader’а по загрузке “чуждых” систем несколько ограничены: он умеет грузить системы не более чем с двух физических дисков, только с первичного раздела и только в том случае, если их загрузчик записан в Boot Record последнего. LILO в этом плане гораздо богаче. Однако лучшим загрузчиком при использовании нескольких операционок, ИМХО, является GRUB. Тем более, что большинство современных дистрибутивов Linux именно его и устанавливают по умолчанию. И если он уже есть - менять его на что-либо другое после установки FreeBSD никаких основания я не вижу.

Однако здесь возникает одно небольшое осложнение. С выходом FreeBSD 5-й ветки в этой операционке по умолчанию принята файловая система UFS2. Которая обладает рядом несомненных достоинств по сравнению со своей предшественницей (UFS просто).

Однако вот беда - новая файловая система не понимается текущими версиями GRUB (ни 0.93, ни 0.94. То есть обеспечить загрузку FreeBSD старым способом, вписав в файл /boot/grub/menu.lst строки типа
# FreeBSD
title FreeBSD 5.2
root (hd0,1)
kernel (hd0,1)/boot/loader

уже не удастся. (Насколько мне известно, LILO до недавнего времени также не справлялась с загрузкой FreeBSD при использовании UFS2 - как сейчас, не знаю). Конечно, ситуацию быстро поправили - порт GRUB версии 0.94 включает в себя патч для понимания UFS2. Однако согласитесь, загрузчик - это такая вещь, которую лишний раз переставлять не хочется, абы чего не вышло. Особенно если он давным-давно был установлен вместе с уже затертым дистрибутивом Linux…

Примечание: ныне (конец 2005-го года) GRUB без проблем работает с UFS2, однако описанный ниже способ по прежнему может использоваться для загрузки FreeBSD (или любой другой BSD-системы, буде у нее обнаружится классовые противоречия с GRUB’ом).

Из этой ситуации напрашивается два простых выхода: а) отказаться от GRUB в пользу Free’шного загрузчика, и б) отказаться от UFS2 на корневом разделе FreeBSD. Однако оба решения, помимо отмеченных выше недостатков, просто не спортивны. И потому есть смысл поискать третье решение - и UFS2 сохранить, и с GRUB‘а загрузить.

А для этого вспомним, что GRUB сам по себе не способен загрузить ядро еще некоторых, весьма известных, операционных систем. И, тем не менее, вполне успешно используется для мультисистемной загрузки комбинаций Linux - Windows 9X/ME - Windows NT/2000/XP.

Как же он это делает? А очень просто - передачей управления на загрузочный сектор Windows-раздела “по цепочки”. Если такой номер проходит с системами от MS, почему бы не испробовать его на классово близкой к GRUB (разрабатываемом в рамках проекта GNU) FreeBSD?

А что, и испробуем. На примере конфигурации дисков и дисковых разделов, на которой я, в дополнение к имеющемуся Archlinux, не так давно устанавливал FreeBSD 5.2.

На первом мастере имеем три раздела - hd0,0, hd0,1, hd0,2 в номенклатуре GRUB; в Linux-нотации (при использовании devfs им соответствуют /dev/discs/disc0/part(1-3), во FreeBSD - /dev/ad0s(1-3). Первый раздел (файловая система ext2fs) - под каталог /boot Linux-инсталляции, он-то и содержит GRUB. Второй раздел несет на себе Archlinux, третий зарезервирован под всякого рода эксперименты (оба - с файловой системой ext3fs).

Первый слейв целиком отдан на растерзание FreeBSD - на нем создан единственный слайс этой системы (hd0,1 с точки зрения GRUB, /dev/discs/disc1/part1 по Linux’овому, /dev/ad1s1 по Free’шному) в режиме эксклюзивного использования, разбитый на партиции (какие - в данном случае не существенно, важно только, что все они несут файловую систему UFS2).

Разбиение второго мастера (он сидит в паре с CD-R/RW) в текущем контексте также не существенно - он оформлен как Extended partition с несколькими логическими дисками (все - с файловой системой ext3fs), предназначенными исключительно для хранения данных (в Linux монтируется как /home).

Итак, загружаемся в Linux, монтируем /dev/discs/disc0/part1 как /boot (для раздела, несущего GRUB, не рекомендуется автоматическое монтирование при старте системы) и открываем в текстовом редакторе файл /boot/grub/menu.lst, содержащий вводную секцию:
# Config file for GRUB - The GNU GRand Unified Bootloader
# /boot/grub/menu.lst

# general configuration:
timeout 5
# Время ожидания выбора загружаемой ОС в секундах

default 0
# ОС, загружаемая по умолчанию
# (в данном случае Linux)

color light-blue/black light-cyan/blue
# Цветовая гамма меню (мне такая нравится)

Далее идут строки:
# (0) Arch Linux
title Arch Linux [/boot/vmlinuz]
root (hd0,1)
kernel (hd0,0)/vmlinuz root=/dev/discs/disc0/part2 ro hdd=ide-scsi

обеспечивающие загрузку Linux. Дописываем комментарий и метку для пункта меню, загружающего FreeBSD:
# (1) FreeBSD
title FreeBSD 5.2

Теперь остается только определить раздел, который будет корневым для загружаемой системы в нотации GRUB (а не FreeBSD! - это еще не / ее файловой системы):
rootnoverify (hd1,0)

сделать его активным:
makeactive

и “по цепочке” передать на него управление загрузкой:
chainloader +1

На этом миссия GRUB заканчивается - теперь в ходе загрузки в дело вступит /boot/loader из FreeBSD, который и выполнит остальную работу.

Обновлено: 12.03.2015