Как стать автором
Обновить

FreeBSD на Mac

Время на прочтение 8 мин
Количество просмотров 10K
Публикуется от имени и по просьбе товарища mrTuborg

Год назад поднял я сервер на Mac mini под управлением Leopard'a (Mac OS X 10.5), как и все порядочные люди, обнаружив внутри — зачатки/огрызки от FreeBSD, скачал и поставил порты fink (finkproject.org). Год поигрался… выставил WiFi адаптер в режим Infrastructure… теперь он и Internet стал на ноутбук отдавать… Качает торренты в режиме 24/7, переправляет поток VNC из локалки во внешний инет (для доступа с того же ноутбука при нахождении далеко от своего дома)… предоставляет опять же для меня любимого дискетку по SFTP размером в 500Г, держит транспорт для джаббера…

И стало скучно…
А что вот если взять и поставить на него настоящий FreeBSD? Пацан сказал — пацан сделал?.. ан нет… вот тут и начинается самое интересное.

Прожёг образ FreeBSD 7.0 PowerPC. Мак стартанул с диска нормально. Начинаем установку… упс… а где fdisk?? Нету fdisk'a. Есть Label Editor. Но как начинает выясняться он ничего не может сделать с таблицей разделов… И понеслось. В результате 2х недельного копания родилcя небольшой ToDo «Как поставить FreeBSD на Mac»… Который я и собираюсь представить вашему вниманию.

Итак, проблемы с которыми я столкнулся:

1) FreeBSD Installation DVD не имеет fdisk. Только LabelEditor который впринципе ничем помочь с разделами не может.
И нигде не найдёте портированную версию fdisk под Mac (по крайней мере работающую версию). Проблема кроется в «особом» железе и особом
Open-Firmware(об этом чуть ниже) фирмы Apple.

2) «Особенный» Open-Firmware
Всё прогрессивное человечество уже отказалось от системы BIOS заменив их постепенно (я так понимаю пока в теории, а на маках уже и в практике) на Open Firmware. Аппаратный предзагрузчик с функциями самотестирования. В маках хоть и указано что это Open Firmware, но исходя из набора команд это всё таки свой Open Firmware. И этот Open Firmware понимает загрузку лишь с Маковских разделов HFS+. Собственно все дальнейшие танцы с бубном и происходят вокруг этого Open Firmware.
Что это такое написано здесь — en.wikipedia.org/wiki/Open_Firmware. Новомодная технология пришедшая на смену морально умершему BIOS. Набор команд для управления можно почитать здесь — www.firmworks.com/QuickRef.html. Но особенность Apple'вского OpenFirmware и заключается в том, что оно практически ни как не пересекается с описанными вещами. Здесь немного изменённый набор команд (большинство команд из указанного Reference — не работают) и поведение этих команд немного не предсказуемое. Очень часто одни и те же команды перестают работать или работать как то по другому. Выход один — перезагрузка.
Итак, вход в Mac'овский OpenFirmware — Alt + Cmd + O + F. После недолгой тренировки эта комбинация легко нажимается одной правой (левой не получится — пробовал =)).
Самые полезные, из обнаруженных команд:

mac-boot — продолжить загрузку
shut-down — выключить мак
reset-all — перезагрузить систему
eject cd — «выплюнуть» диск
boot <загрузчик> <ядро> — загрузить систему

devalias — вывод списка всех назначенных символьных сокращений для устройств
(запишите алиас для hd и сd)

Вывод всего дерева устройств:
1) dev / — подмонтировать дерево устройств в корень
2) ls

printenv — вывод переменных окружения.
(самая для нас интересная переменная — boot-device)
setenv <переменная> <значение> — Назначить переменную окружения

Чтобы сбросить все настройки в заводские — необходимо в выключенном состоянии подержать кнопку включения до появления характерного звука и реакции домашних а-ля «у тебя всё в порядке? 0_o» Вобщем сигнал узнаваемый.

Вроде всё кристально чисто понятно. Но! OpenFirmware не может загружаться ни с чего иного, кроме как HFS+, и при этом…

3) FreeBSD не видит маковские HFS+ разделы.
Впринципе этого и нетребуется. Всё что требуется — создать при помощи инструментов Mac OS подготовить раздел HFS+ и не трогать его уже из
FreeBSD, чтобы не испортить.

4) Mac OS при первой возможности «бросается улучшать» разделы на жёстком диске.
Проблема обратная описанной в п.3 Когда уже установим FreeBSD ни в коем случае не допустите загрузки Mac OS X (с установочного диска). Всю процедуру установки BSD придётся начинать заново.

Итак. Это была теоретическая часть. Теперь собственно приступим к практике — к препарированию пациента.

Инструменты:
1) Установочный диск FreeBSD.
2) Установочный диск Mac OS X (Тигр или Леопард).
3) Флэшка.

0. Определение оборудования.

Далее мы будем везде указывать символические имена устройств, но на всякий случай если они не сработают, надо выпытать полное название необходимых нам устройств на данном этапе.
Входим в Open Firmware(путём зажима клавиш Cmd+Alt+O+F)…

пишем следующие команды:

0> dev /
0> ls

начнётся постраничный вывод дерева устройств построенного на начальном этапе загрузки Open Firmware. Здесь требуется внимательность.
Для имени нужна вся ветка… которая собственно там не указывается… а лишь обозначается отступами.

мой контроллер ATA (куда подключены жёсткий диск и cd-rom) выглядит так:

/pci@f4000000/ata-6@d/disk

(через слэш разделены ветви дерева).

как узнать правильно ли определили ветку дерева?

Загружаемся дальше — в boot2/EFI (при условии что вставлен диск установки Free BSD). Там имеем более расширенный (но такой же глючный) набор команд от FreeBSD где можно проверить все наши догадки:

Как загрузить boot2/EFI. Находясь в OpenFirmware вводим команду (второй параметр опущен — ядро загружаться не будет)
boot cd:,\boot\loader

Итак мы в boot2/EFI.

все догадки вбиваем в переменную окружения «currdev»:
после имени контроллера ata-дисков(pci@f4000000/ata-6@d/disk) надо указать номер диска и номер раздела
set currdev=/pci@f4000000/ata-6@d/disk@1:0

в моём случае это cdrom. поскольку там всего один раздел, то номер раздела можно опустить, оставив так:
set currdev=/pci@f4000000/ata-6@d/disk@1

дальше проверяем нашу догадку коммандой ls.
Если получили листинг файлов и директорий диска — догадка оказалась верна.

Жёсткий диск в моём случае вышлядит как: /pci@f4000000/ata-6@d/disk@0

Если мы ошиблись то нахождение требуемых разделов решается путём простого перебора =).

1. Подготовка загрузчика (на соседнем компьютере)

Берём флэшку и копируем на неё loader и boot.tbxi (в любую папку, флэшка — как инструмент для переноски, не более)
Что за файлы… и где их взять? loader — находится на установочном диске FreeBSD (\boot\loader), boot.tbxi там же, но его надо поправить или создать заново если его не найдёте.
Это загрузочный скрипт на языке Forth для Open Firmware, выглядит следующим образом:

<boot-script>
" screen" output
boot hd:???,\boot\loader hd:???
</boot-script>

Нас интересует команда boot. Разберёмся с её синтаксисом:
1й параметр — место расположения загрузчика (в данном случае boot2/EFI-загрузчик от FreeBSD). В данном примере укзана символическая подстановка, hd — hard disk (cd — compact disk), через двоеточие номер раздела (о номере раздела чуть ниже) и через забятую путь на этом разделе к файлу загрузчика. Файловая система HFS+.

2й параметр — место расположения ядра загружаемой системы. Здесь проще — просто номер раздела. Параметр передаётся на вход файла-загрузчика, поэтому требования к формату файловой системы не предъявляются.

Как выяснить нужные номера разделов мы выясним соответственно в момент когда эти разделы создадим. Поэтому редактирование скрипта на соседнем компьютере этим не заканчивается…

2. Подготовка жёсткого диска.

Установочный диск MAC OS X потрбуется один раз (см. проблему №4) поэтому с него и начнём.

После загрузки установочного диска MAC OS X вам доступны следующие необходимые нам инструменты: Disk Utilities и Terminal

2.1 Разбиваем диск при помощи Disk Utilities.

Почему бы не сделать один раздел и не поделить его на слайсы при помощи Label Editor'a? Не получится. Label Editor может только использовать созданные для него разделы, но никак не вмешиваться в таблицу разделов — не получится. Вот поэтому под каждый слайс лучше всё-таки сделать свой раздел…
Перед разбиением диска на разделы нужно выбрать тип таблицы разделов. GUID, Apple Partition Map или MBR. Выбрать нужно для PowerPC mac — APM, для Intel mac — GUID.

Я сделал следующие разделы:
под root — 4 Gb
под swap — 2 Gb
под var — 2 Gb
под usr — 8 Gb
под home — всё что осталось, а именно 22 Gb.

чтобы их было проще на следующем шаге идентифицировать в терминале зададим этим разделам метки типа root, swap… и пр.

Вообще на всяческих буржуйских форумах не советуют долго играться с Disk Utilities так как подозревается он в глючности. Не отрицаю сей факт, было такое, но я это списывал на свои кривые руки.
Пару слов о совместимости файловых систем Mac OS и BSD. В Disk Utilities есть 4 типа файловых систем для выбора — они все называются длинно и заумно Extended File System (Расширенная файловая система) с поддержкой (или без) журналирования и с поддержкой (или нет) различия заглавных и строчных букв в названиях файлов. На самом деле это ничто иное как Journaled или Non-Journaled Ext3 с опциями. Так что проблем с прочтением как в теории так и в практике этих разделов из под BSD не возникает (он их переконвертирует в UFS). Но закавыка всё таки есть. Надо загрузчик загрузить c HFS+, а ядро уже с партиции понимаемой в BSD.
Для дальнейшей успешной загрузки устанавливаемой BSD надо разделить загрузчик и собственно само ядро. Для этого на диске к уже описанным выше разделать создать раздел для bootloader'a. Я указал размер как 0.2Гб, Леопард тут же поправил до 1 Гб, но после процесса разбиения раздел оказался размером 0.86Гб. Ну не будем с ним спорить =). Далее BSD при установке сделает нечитаемыми для мака свои разделы, поэтому диск установки Leopard'a используем лишь один раз и только до установки BSD на жёсткий диск. Иначе, при следующей загрузке установочного диска Leopard'a, Mac OS все подготовленный разделы «улучшит» до степени непригодности так что процесс установки придётся начинать сначала.

Итак имеем следуюшую таблицу разделов:
bootloader (1G)
root (4G)
swap (2G)
var (2G)
usr (8G)
home (22G)

Закончив подготовку разделов, закрывем Disk Utilities и запускаем terminal (Всё с того же установочного диска Leopard или Tiger).
находяcь в терминале, необходимо разместить в разделе bootloader 2 файла c ранее подготовленной флешки- loader и boot.tbxi. Требований по размещению нет. Я, к примеру создал там директорию boot, и скопировал всё туда… а да нам надо закончить приготовление загрузочного скрипта.

2.2 Идентификация номера раздела

Способ 1: Находясь в терминале установочного диска leopard, выведите список подмонтированных разделов (всё подмонтировалось уже до нас)

пример работы команды mount, у меня:
/dev/disk0s3 on /bootloader
/dev/disk0s5 on /root
……

цифра стоящая после s и есть требуемые нам циферьки (см выше пример моего загрузочного скрипта)

Способ 2: Находясь в LabelEditor'е установочного диска FreeBSD.
пример моего случая:

ad0s3
ad0s5



Здесь уже приходится ориентироваться по порядку расположения и размерам разделов для выяснения — кто есть кто, так как заданных меток не видно. Немного неудобно.

Теперь добиваем загрузочный скрипт:
<boot-script>
" screen" output
boot hd:3,\boot\loader hd:5
</boot-script>

2.3 Подготовка bootloader

Находясь в Terminal копируем с флэшки на мак в раздел bootloader файлы loader и boot.tbxi

3. Установка FreeBSD.

Итак. Что имеем к этому моменту — разбитый (пока что только на разделы) диск, скопированные в bootloader-раздел файлы loader и boot.tbxi.
Перезапускаем Мак и загружаемся с установочного диска FreeBSD. Проводим установку. Перезапускаемся. Получаем мигающую папочку ;-)

4. Загрузка установленного FreeBSD.

Пока всё хорошо. Заходим снова в OpenFirmware. Тестим установку ручной загрузкой:

0> eject cd — вытаскиваем загрузочный диск инсталлятора FreeBSD
ok
0> boot hd:3,\boot\loader hd:5 — загружаем подготовленный нами loader на 3ьей партиции и передаём ему на вход ядро с 5й партиции.
ok


Успешно? Если да переходим к пункту 4.2. Нет — читаем дальше.

4.1 Непосредственные имена устройств.

Если загрузка не пошла, значит не верно определены символические ссылки (devalias)
Значит будем использовать непосредственные имена устройств. Вспоминаем пункт 0. Загружаемся опять в EFI
Проверяем там ли у нас загрузчик и ядро:
set currdev=/pci@f4000000/ata-6@d/disk@0:3
ls — листинг файлов с раздела bootloader. Должны увидеть loader и boot.tbxi


set currdev=/pci@f4000000/ata-6@d/disk@0:5
ls — листинг файлов с раздела root.


Если неудачно, то меняем цифры a и b — disk@a:b путём перебора, пока не найдём.
Допустим нашли нужные цифры, тогда тестируем загрузку (предварительно перегрузившись в OpenFirmware)
0> boot /pci@f4000000/ata-6@d/disk@0:3,\boot\loader /pci@f4000000/ata-6@d/disk@0:5

соответственно придётся поправить загрузочный скрипт boot.tbxi на найденные параметры

4.2 Установленная FreeBSD загрузилась...

Можно работать… Вуаля!

На этом месте информация примерно на всех буржуинских форумах заканчивается… Для них всё ок. Они достигли нирваны…
Но как заметит наш внимательный пролетарский читатель — неужели теперь ручками надо это всё загружать? На многих форумах в этом месте рекоммендуют подготовить загрузочный диск (по типу инсталляционного) с правильным скриптом .tbxi который будет загружать ядро не с диска, а с винчестера.

5. Но это не выход!

Прошла не одна бессонная неделя и я натолкнулся в другом месте и совсем по другому поводу на команду setenv. Вот он выход, финальный аккорд, так сказать…

setenv boot-device hd:3,\boot\boot.tbxi

На моём маке сработал. Сработает ли у вас — гарантии никаких… поскольку всё это недокументированные возможности маковского Open Firmware.
В любом случае, как вернуть всё взад? Сбросить параметры nvram — при выключенном маке зажмите на 20 секунд кнопку питания.

Послесловие.
На моём маке загрузилась FreeBSD. Кулеры работают теперь постоянно… WiFi модуля не видно… Есть что продолжить. Если конечно это всё кому-нибудь надо.
Теги:
Хабы:
+85
Комментарии 61
Комментарии Комментарии 61

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн