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

Алексей Федорчук
2003 г.

Эта заметка размещается в связи с опробованием последней (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, который и выполнит остальную работу.

Загрузка FreeBSD через GRUB: 2 комментария

  1. > makeactive
    если память не изменяет,то годик назад у меня и без этого по цепочке нормально загружалась и FreeBSD, и Windows

  2. >Итак, загружаемся в Linux, монтируем /dev/discs/disc0/part1 как /boot (для раздела, несущего GRUB, не рекомендуется автоматическое монтирование при старте системы)

    Вот это я не очень понял… :(
    Помню когда прописывал OpenBSD в груб, то просто открыл /boot/grub/menu.lst и добавил:

    title Open BSD 4.5
    rootnoverify (hd1,1)
    makeactive
    chainloader +1

    Правда grub у меня не в отдельном раздеде, а в / , а BSD и ее загрузчик на другом диске.

Обсуждение закрыто.