О блоге

Все новые материалы размещаются на Блогосайте alv.me. Старые - в процессе переноса.

26.07.2008

FreeBSD: загрузка с помощью GRUB

2003 г

До недавнего времени обеспечить совместное проживание Linux и FreeBSD на одной отдельно взятой машине не составляло никакого труда. Для обеспечения загрузки любой из этих систем можно было воспользоваться:

  • штатным загрузчиком FreeBSD (BSD loader);
  • LILO - загрузчиком, разработанным для Linux, но быстро ставшим мультисистемным;
  • GRUB - изначально мультисистемным загрузчиком, разработанным для того, чтобы грузить всё, что способно загружаться (и немножечко - то, что загружаться не способно в принципе) .

Первый способ не так уж плох: BSD loader обладает не столь уж малыми возможностями, а в интерактивном режиме далеко превосходит Lilo (хотя и уступает GRUB'у). Однако он имеет ряд ограничений, в частности, в отношении загрузки со второго винчестера и вообще загрузки не-BSD-систем. Они обходимы, но доставляют некоторые неудобства.

LILO в плане загрузки "чужых" систем имеет больше возможностей, зато практически лишен интерактивных способов загрузки.

Так что есть мнение (и не только моё) что, лучшим загрузчиком при использовании нескольких операционок является GRUB. Тем более, что большинство современных дистрибутивов Linux именно его и устанавливают по умолчанию. И если он уже есть - менять его на что-либо другое после установки FreeBSD никаких основания я не вижу.

Загрузка FreeBSD через GRUB осуществляется очень просто. Для этого достаточно в файл его конфигурации (/boot/grub/menu.lst) внести строки примерно такого вида:

# FreeBSD
title FreeBSD
root (hd0,1)
kernel (hd0,1)/boot/loader

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

GRUB в сущности представляет собой мини-ОС, способную, в том числе, и работать с файловыми системами без загрузки какого-либо ядра операционки "всамделишней". Но лишь с теми файловыми системами, которые он знает. Их список достаточно обширен - это все файловые системы, нативные для Linux, файловые системы BSD, Minix в её старом варианте. Поговаривают, что недалёк день, когда GRUB будет понимать и ZFS.

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

Однако вот беда - новая файловая система некоторое время не воспринималась текущими тогда версиями GRUB (ни 0.93, ни 0.94). То есть обеспечить загрузку FreeBSD старым способом оказалось невозможным. Насколько мне известно, LILO в то время также не справлялась с загрузкой FreeBSD при использовании UFS2.

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

Ныне (по крайней мере с конца 2005-го года) GRUB без проблем работает с UFS2. Однако описанный ниже способ по прежнему может использоваться для загрузки FreeBSD (или любой другой операционки, буде у ее файловой системы обнаружатся классовые противоречия с 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. Первый раздел (файловая система ext2fs) - был задействован под каталог /boot Linux-инсталляции, он-то и содержал GRUB и его конфигурационный файл. Второй раздел нес на себе Archlinux, третий был зарезервирован под всякого рода эксперименты (оба - с файловой системой ext3fs).

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

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

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