... И всё начинается с рестарта.
Загрузка и инициализация системы

Глава из книги Сага о FreeBSD

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

2008-10-29

назад | к началу

Альтернативные методы загрузки

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

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

  • перезагрузиться в Linux и получить права администратора;
  • открыть в текстовом редакторе файл /etc/lilo.conf;
  • внести в последний строки вида:
    # FreeBSD-7.1 bootable partition config begin
    other=/dev/sdb1
    table=/dev/sdb
    loader=/boot/chain.b
    label=FreeBSD-7.1
    
    где обозначения дисков следует заменить собственными реалиями (как и номер версии FreeBSD -- последний, впрочем, указывать совсем не обязательно);
  • перезапустить (!) lilo командой
    $ /sbin/lilo
    
  • при следующей перезагрузке выбрать в меню Lilo пункт FreeBSD-7.1.

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

Хочу только развеять одно распространённое заблуждение: что GRUB является загрузчиком Linux. Так вот: GRUB к Linux'у не имеет никакого отношения — это по-настоящему мультисистемный загрузчик. То, что он может устанавливаться при установке какого-либо дистрибутива Linux — не более чем предпочтение его майнтайнеров.

Именно поэтому разработчики рекомендуют ставить GRUB на самостоятельный первичный раздел. Который никакой деинсталляцией Linux'а не затрагивается и затрагиваться не может. Единственное требование к этому разделу — одна из файловых систем, понимаемых GRUB'ом на стадии передачи ему управления от кода, записанного в MBR (чаще всего для этих целей используется ext2fs). После этого, как будет сказано ниже, GRUB может работать практически со всеми файловыми системами открытых Unix'ов.

К слову сказать, GRUB можно установить и без всякого Linux'а — непосредственно из портов FreeBSD (/usr/ports/sysutils/grub). Правда, я этого никогда не делал за ненадобностью (при совместном использовании FreeBSD и Linux логично использовать уже имеющийся загрузчик последнего, на чисто Free'шной машине её штатного загрузчика более чем достаточно). Так что этот вопрос оставляю на рассмотрение заинтересованного читателя.

Загрузка 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 — на нем создан единственный слайс этой системы (hd1,0 с точки зрения 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)

Здесь можно обойтись и просто командой root, однако приведённая форма, запрещающая проверку и "опознание" файловой системы (каковая может быть GRUB'у незнакома — ведь именно потому мы всю эту тягомотину и затеяли).

Затем — делаем корневой раздел активным:

makeactive

и "по цепочке" передаём на него управление загрузкой:

chainloader +1

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

назад | к началу