NanoBSD: создаем собственные устройства


Пример конфигурации NanoBSD

Все эти параметры выглядят достаточно внушительно, но как их использовать на практике? Давайте создадим конфигурационный файл и рассмотрим его повнимательнее. Не забывайте, я собираюсь создать сервер DNS на базе устройства компании Soekris. Любые параметры, которые я не использую, получают значения по умолчанию.

Конфигурация начинается с определения уникального имени образа диска с помощью параметра NANO_NAME (1). Для этого устройства я выбрал нестандартную конфигурацию ядра (2). Где я взял эту конфигурацию? Я выполнил бездисковую загрузку устройства Soekris, получил файл /var/run/dmesg.boot для ядра GENERIC, затем поискал в Интернете другие конфигурации ядер для net4801, чтобы выяснить потенциально полезные параметры настройки, используемые другими людьми. Единственное неудобство, которое пришлось преодолеть при бездисковой загрузке, это отключение ACPI в загрузчике.

Благодаря бездисковой загрузке я узнал, что устройство net4801 видит flash-карту как привод /dev/ad1 (3). Если бы я не установил значение этого параметра в моем конфигурационном файле, во время загрузки NanoBSD сообщила бы, что ядро не может отыскать корневой раздел на /dev/ad0.

Далее перечислены различные сценарии customize_ для настройки этого образа. О настройке мы поговорим ниже в этой главе. Все эти сценарии входят в набор инструментов NanoBSD по умолчанию, и я рекомендую использовать их при создании своего первого образа.

Далее следуют специальные параметры утилиты make(1), которые будут использованы в процессе установки. Мы рассмотрим эти параметры немного ниже, а пока вам достаточно знать, что параметр WITHOUT_TOOLCHAIN предписывает утилите make(1) не устанавливать компилятор, библиотеки и другие инструменты, необходимые для сборки программного обеспечения. Мы не предполагаем собирать программное обеспечение на встраиваемой системе!

Заметьте, как установлено значение параметра СОNF_INSTALL (4). Я поместил апостроф (') после знака равенства, значение параметра указано в отдельной строке и затем следует закрывающий апостроф ('). Это позволяет наглядно отделять множественные значения параметра друг от друга и делает содержимое файла более удобочитаемым. Похожим образом определяется значение параметра CONF_WORLD. NanoBSD предполагает, что каждая переменная будет указана в отдельной строке, так как из них будет создан скрытый файл make.conf.

Каждый из параметров в параметре CONF_WORLD предписывает NanoBSD не собирать соответствующий ему раздел FreeBSD. Назначение большинства из них очевидно, например, WITHOUT_ACPI предписывает не собирать ACPI. NO_MODULES — не собирать модули ядра. Я не включаю в системы то, чего не хотел бы видеть в окончательном образе диска, например Sendmail, игры и фильтры пакетов.

Все эти параметры похоронены в недрах механизма сборки FreeBSD. Некоторым из них уже довольно много лет, другие совершенно новые. Некоторым из них суждено исчезнуть, и нет никакой гарантии, что какие-то из них останутся допустимы в будущих версиях. Список всех допустимых параметров сборки содержится в странице руководства src.conf установленной версии FreeBSD. Я включил в свой пример полный список параметров, чтобы вы видели, насколько агрессивно можно урезать возможности системы. Размеры FreeBSD существенно меньше размеров многих версий Linux, но это не означает, что ее нельзя сделать еще меньше! Однако некоторые параметры сборки, перечисленные в src.conf(5), не должны использоваться для NanoBSD. Например, WITHOUT_SETUID_LOGIN окажет отрицательное влияние на возможность входа в систему. Использование параметра WITHOUT_SYMVER приведет к удалению символов контроля версий, что сделает невозможным использование в вашем образе NanoBSD двоичных файлов, скомпилированных на других машинах FreeBSD. Прежде чем использовать тот или иной параметр, обязательно внимательно изучите его влияние.

Следует также заметить, что вам, возможно, придется отключать некоторые из этих параметров сборки для каких-то образов NanoBSD. Я собираю сервер DNS, поэтому мне нужен сервер BIND, и я закомментировал элемент WITHOUT_BIND (5) в своем конфигурационном файле для данной конкретной сборки.

В параметре СОNF_INSTALL я перечислил только те параметры, которые используются не в процессе сборки, а в процессе установки FreeBSD 7.0. Параметр WITHOUT_TOOLCHAIN предписывает команде make installworld не устанавливать компилятор, заголовочные файлы и сопутствующие инструменты в образ диска. Нам потребуется новый компилятор для сборки новой версии FreeBSD, но он не нужен в окончательном образе. В процессе установки будет пропущено все, что мы исключили из сборки, но для запуска make buildworld необходима свежая версия компилятора.

Это полный конфигурационный файл NanoBSD. Теперь попробуем с его помощью собрать свой образ диска.

Сборка NanoBSD

Запустите файл nanobsd.sh как сценарий командного интерпретатора, передав ему имя конфигурационного файла с помощью ключа -c:

# /bin/sh nanobsd.sh -с mynanoconfig.txt

В ходе сборки NanoBSD на экран выводятся вполне типичные сообщения:

## Clean and create object directory (/usr/obj/nanobsd.SoekrisDNS/)
## Construct build make.conf (/usr/obj/nanobsd.SoekrisDNS//make.conf)
## run buildworld
### log: /usr/obj/nanobsd.SoekrisDNS//_.bw
## build kernel (SOEKRIS)
...
## build diskimage
### log: /usr/obj/nanobsd.SoekrisDNS//_.di
# NanoBSD image completed

Если вы в конце получили сообщение NanoBSD image completed, следовательно, сборка прошла успешно. В противном случае причину ошибки на последнем этапе вы найдете в файле протокола. Вполне обычное дело, если набор параметров в конфигурационном файле, приводящий к нормальной сборке образа, будет получен не с первой попытки, особенно при агрессивном использовании параметров WITHOUT_ с целью уменьшить размер FreeBSD.

Каталог сборки NanoBSD

Для сборки NanoBSD используется подкаталог каталога /usr/obj, имя которого задано параметром NANO_NAME. В нашем конфигурационном файле указано, что выполняется сборка NanoBSD с именем SoekrisDNS, откуда следует, что каталогом сборки будет /usr/obj/nanobsd.SoekrisDNS. Перейдите в этот каталог и посмотрите на файлы. Вы найдете несколько файлов со странными именами, несколько каталогов и образов дисков.

NanoBSD использует файлы, имена которых начинаются с _., как маркеры, протоколы и временные каталоги. Несмотря на лаконизм сообщений, наблюдаемых в процессе сборки, в действительности NanoBSD не скрывает вывод используемых команд, просто он перенаправляется в другие файлы (таблица 20.1).

Таблица 20.1. Файлы, создаваемые в ходе сборки NanoBSD

Файл Назначение
_.bk Протокол команды make buildkernel
_.bw Протокол команды make buildworld
_.cust.<X> Установка настройки X
_.di Создание образа диска командой fdisk
_.dl Создание метки диска командой disklabel
_.env Окружение, использованное при сборке NanoBSD
_.etc Протокол команды make distribution
_.fdisk Конфигурация fdisk(8)
_.ik Протокол команды make installkernel
_.iw Протокол команды make installworld
_.w Вновь созданный «мир»
disk.image Образ диска для единственного дискового участка
disk.full Образ полного диска

При выяснении причин ошибок во время сборки используйте файлы протоколов.

Поиск причин ошибок во время сборки NanoBSD

Сообщения об ошибках, которые выводятся в процессе сборки, не отличаются особой информативностью. Например, вот полный вывод неудачной сборки NanoBSD:

Здесь видно, что попытка сборки потерпела неудачу, но не видно, почему.

Чтобы выяснить действительную причину, загляните в файл, имя которого указано в сообщении. В данном случае это файл протокола /usr/obj/nanobsd.SoekrisDNS/_.bw (1). В конце этого файла находятся последние сообщения, выведенные в ходе неудавшейся сборки. Здесь вы увидите сообщения об ошибках, типичные для процесса обновления.

Одно из обстоятельств, которые следует запомнить, это использование команды make -j 3 по умолчанию. Эта команда может порождать малопонятные сообщения об ошибках в файле протокола, а сама ошибка, вызвавшая отказ, может располагаться несколькими строками выше.

Почему установка NanoBSD терпит неудачу, в то время как обычное обновление из того же исходного кода проходит благополучно? Основной причиной является несовместимость параметров сборки из дерева исходного кода. Мой файл конфигурации NanoBSD включает множество разнообразных параметров WITHOUT_. Вы могли заметить, что некоторые из них закомментированы. Эти параметры отрицательно повлияли на возможность сборки. Хотя для моего сервера DNS в действительности не требуется программное обеспечение, представляемое закомментированными мной параметрами, но отсутствие этих параметров сделало успешную сборку NanoBSD невозможной. (Параметр WITHOUT_BIND закомментирован потому, что мне действительно необходим сервер BIND в данном образе.)

Еще одна возможная проблема при сборке образа NanoBSD — это когда сама сборка прошла успешно, но конструирование образа диска завершилось ошибкой:

/usr/obj/nanobsd.SoekrisDNS/_.mnt: write failed, filesystem is full
(Перевод: ошибка записи, файловая система заполнена)

Для размещения ваших файлов требуется больше места, чем доступно на диске. По умолчанию участок /conf занимает 1 Мбайт. NanoBSD разбивает оставшееся пространство пополам. Если flash-карта имеет емкость 128 Мбайт, ни один из двух образов NanoBSD не должен занимать больше 63,5 Мбайт дискового пространства. Если в состав сборки FreeBSD включены какие-то дополнительные файлы и были установлены пакеты, что привело к увеличению размера образа, то его конструирование потерпит неудачу. Не забывайте, что производители flash-карт измеряют емкость своих устройств так же, как и производители жестких дисков, по основанию 10, а не по основанию 2. В действительности емкость карты на 128 Мбайт немного меньше этого числа. Попробуйте поместить на диск только один образ NanoBSD, уменьшить объем включаемого программного обеспечения или приобрести flash-карту большей емкости.

Законченная сборка

Итак, сборка закончена! Давайте заглянем в образ диска и посмотрим, что в нем находится:

# mdconfig -af _.disk.full
md0

Если запустить утилиту fdisk(8) и передать ей образ диска, можно увидеть три участка — два больших и один совсем маленький. Два больших участка — это образы NanoBSD. Смонтируйте один из них и посмотрите, что в нем находится.

# mount /dev/md0s1a /mnt

Изучив содержимое, нетрудно заметить, что система NanoBSD собрана полностью, но пока еще ничего стоящего не делает. Это ненастроенная инсталляция FreeBSD. Тем не менее, я рекомендую скопировать образ на flash-диск и выполнить пробную загрузку на устройстве, чтобы убедиться, что система работоспособна. Установку NanoBSD на flash-диск /dev/da0 выполняет команда:

# dd if=disk.full of=/dev/da0

Теперь извлеките flash-диск из компьютера, подключите его к вашему устройству Soekris, запустите последовательную консоль и нажмите кнопку включения питания.

Скорость обмена с последовательной консолью

Если попробовать загрузить устройство Soekris с типичной инсталляцией FreeBSD, у вас возникнут трудности. Дело в том, что в устройствах Soekris скорость обмена с последовательной консолью по умолчанию составляет 19 200 бит/с, тогда как FreeBSD по умолчанию использует более привычную скорость 9 600 бит/с. Это означает, что настроив терминал на скорость обмена 19 200, вы сможете увидеть все сообщения времени загрузки устройства Soekris, но при запуске FreeBSD на экране будет сплошной мусор. Если в терминале настроить скорость обмена 9 600, вы сможете наблюдать сообщения FreeBSD, но на начальном этапе вместо сообщений Soekris будет выводиться всякий мусор.

Изменение скорости обмена с консолью в системе FreeBSD будет одной из первых настроек, которые мы выполним. Однако при первой пробной загрузке образа FreeBSD оставьте в консоли скорость обмена 9 600.

Комментарии запрещены.