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


Экстренное сообщение: «Компьютеры слишком дороги!»

Многие приобретают компьютер с единственной целью, например создать брандмауэр с функцией трансляции сетевых адресов. Это правда, что высокопроизводительный компьютер на процессоре i486, работающий под управлением FreeBSD, прекрасно справляется с обслуживанием сети небольшого офиса, но стоимость компьютеров превышает стоимость минимально необходимых аппаратных средств. Такие системы громоздки, требуют для работы много электроэнергии, а их жесткие диски еле дышат. Если вы работаете в коммерческой организации, ваш менеджер вряд ли захочет услышать: «Помните старый компьютер, который так тормозил, что даже секретарша от него отказалась? Я сделал из него веб-сервер». Операционная система FreeBSD легко устанавливается на устаревшие компьютеры, но по определенным причинам RAIC (Redundant Array of Inexpensive Crap — избыточный массив недорогого барахла)* никогда не упоминается в публикациях. Конечно, вы всегда можете, выцарапав бюджет, приобрести новую машину с полной гарантией, но каждый из нас предпочел бы купить что-то другое, а не компьютер, который будет простаивать 99 процентов времени. Все это составляет понятие «дороговизны». Этого достаточно, чтобы побудить самого ярого сторонника движения за программное обеспечение с открытым исходным кодом рассмотреть возможность приобретения недорогого аппаратного брандмауэра, обменяв гибкость и уверенность на низкое энергопотребление и недорогую тишину.

Вы можете взять все самое лучшее из двух миров, собрав собственное устройство на недорогой аппаратуре с низким энергопотреблением. Операционная система FreeBSD широко используется на рынке встраиваемых устройств. Компании, такие как NetApp и Juniper, собирают высокопроизводительные устройства, работающие под управлением FreeBSD. Инструменты сборки образов FreeBSD для встраиваемых устройств интегрированы непосредственно в дерево исходных текстов FreeBSD. Вам встретится множество способов, но наиболее широко используется метод, получивший название NanoBSD (/usr/src/tools/tools/nanobsd).

Небольшие, недорогие и компактные компьютеры производят множество компаний, но я отдаю предпочтение компании Soekris (http://www.soekris.com). Компьютеры Soekris размерами напоминают книгу в мягкой обложке. У них нет вентиляторов, видеокарт, очень низкое энергопотребление, кроме того, они проектировались специально для работы под управлением открытого программного обеспечения. Процессор, память, последовательные порты и порты USB, а также сетевые интерфейсы впаяны непосредственно в материнскую плату. Вы можете купить одну материнскую плату или вместе с корпусом. С этими компьютерами можно использовать жесткий диск или карту mini-PCI, в качестве диска можно использовать flash-карты. Но самое замечательное, что они стоят всего пару сотен долларов — достаточно дешево, чтобы благополучно преодолеть сопротивление бухгалтерии без заполнения множества документов. При покупке вы не получите гарантию, но за стоимость одного маленького сервера в стойке вы сможете купить десять компьютеров Soekris. Если один выйдет из строя, его можно просто выкинуть, а на его место поставить другой. Замечу, что эти системы настолько просты, что мне пока не приходилось сталкиваться со случаями выхода из строя.*

В примерах далее мы будем использовать одну из таких систем, с flash-картой вместо жесткого диска. Все примеры в этом разделе были проверены на Soekris net4801 с микропроцессором на 266 МГц, ОЗУ 128 Мбайт и блоком питания AC/DC. Для среднего использования я рекомендую flash-карту объемом 128 или 256 Мбайт. Больший объем будет пустой тратой, если конечно, вы не собираетесь использовать во встраиваемой системе действительно большие программные продукты. Впрочем, и сейчас, когда я пишу эти строки, карты емкостью 128 Мбайт уже практически исчезли из продажи, поэтому вам, скорее всего, придется использовать самую маленькую flash-карту, какую только удастся отыскать. Есть аналогичные аппаратные средства других производителей, но для них вам придется немного изменить приведенные ниже инструкции. (Мы на переднем крае FreeBSD, помните?)

Для следующего примера я построил минимально возможный сервер DNS, включив в систему только программное обеспечение, необходимое для поддержки DNS.

Что такое NanoBSD?

NanoBSD — это сценарий командной оболочки, который собирает усеченную версию FreeBSD, пригодную для запуска на простейших устройствах. Термин простейшее устройство означает, что система собрана для решения одной или нескольких узкоспециализированных задач. Система NanoBSD превосходно справится с ролью сервера имен, брандмауэра или маршрутизатора. Однако из нее не получится хороший настольный компьютер, так как настольные системы предполагают возможность решения сложных задач, круг которых все шире. Точно так же большинство многоцелевых серверов плохо подходят для работы под управлением NanoBSD. Если вы хотите превратить свой брандмауэр NanoBSD в DNS-сервер NanoBSD, придется создать новый образ NanoBSD и переустановить его с самого начала. Это не сложно, но непривычно для сервера.

Создать образ NanoBSD непросто, и вам, вероятно, понадобится несколько попыток, прежде чем вы соберете свой первый диск с NanoBSD. Более того, процесс настройки тоже достаточно непрост, чтобы его можно было разбить на пошаговые инструкции. Вполне возможно, вам придется прочитать этот раздел дважды.

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

Аппаратное окружение и flash-диск

NanoBSD — это версия FreeBSD, настроенная под ваши требования и установленная в образ диска, который можно скопировать прямо на flash-диск. Прежде чем приступать к созданию образа диска, нужно внимательно изучить геометрию flash-карты. На flash-дисках нет ни цилиндров, ни головок, хотя они сообщают компьютеру об их наличии. Хуже того, различные компьютеры могут видеть разные геометрии одной и той же flash-карты. Многие инструменты, такие как diskinfo(8), нормально работают с flash-картой, но в зависимости от конкретной модели карты они могут давать неверную информацию о ней. Единственный способ надежно идентифицировать геометрию карты состоит в том, чтобы смонтировать ее в целевой системе и посмотреть, что сообщит о себе flash-карта.

В устройствах компании Soekris в качестве консоли по умолчанию используется последовательный порт. Однако в отличие от многих других встраиваемых систем в устройствах Soekris скорость обмена по последовательному порту установлена равной 19 200 бит/с, а не 9 600 бит/с. Подсоедините нуль-модемный кабель к последовательному порту устройства, другой конец кабеля подключите к последовательному порту компьютера и откройте сеанс программы tip(1), выбрав скорость обмена 19 200 бит/с.

# tip -19200 sio0

Теперь включите устройство Soekris. После вывода начальных сообщений вы увидите на экране примерно вот что:

На экране много интересной информации об аппаратном обеспечении, но сейчас нас больше всего интересуют сведения о диске. Данный flash-диск виден как подчиненное устройство, подключенное к первичному контроллеру (primary slave) (1). Кроме того, машина видит эту flash-карту емкостью 63 Мбайт как диск, имеющий 984 цилиндра, 4 головки и 32 сектора (2). Теперь мы сможем подготовить образ диска NanoBSD с учетом этой геометрии. Выключите устройство Soekris и извлеките flash-карту. В следующий раз, когда вы включите это устройство, оно загрузит FreeBSD с flash-карты.

NanoBSD и бездисковые системы

Если у вас есть бездисковая платформа, загрузите разок бездисковую систему NanoBSD. Это позволит вам заглянуть в файл dmesg.boot и поможет создать отличную конфигурацию ядра. Кроме того, вы сможете узнать, какое имя устройства ваша система использует для обозначения flash-карты, что позднее позволит вам сэкономить время на настройке.

Инструменты NanoBSD

Вы найдете NanoBSD в /usr/src/tools/tools/nanobsd. Базовый набор инструментов включает каталог с именем Files, сценарий командного интерпретатора nanobsd.sh и файл FlashDevice.sub.

Каталог Files содержит файлы, которые следует скопировать в образ NanoBSD. NanoBSD поставляется с несколькими сценариями, упрощающими сопровождение систем NanoBSD, позднее вы сможете добавить их в свой арсенал.

Файл FlashDevice.sub содержит описания геометрии различных flash-дисков. Этот файл далеко не полон из-за неисчислимого множества производителей flash-дисков, но его легко расширить.

Основные функции NanoBSD находятся в сценарии командного интерпретатора nanobsd.sh. Фактически это программа, реализующая процедуру сборки из исходного кода, описанную в главе 13.

В дополнение к этим файлам вам потребуется конфигурационный файл NanoBSD и, возможно, каталог packages.

Дополнение файла FlashDevice.sub

Есть вероятность, что ваша flash-карта отсутствует в файле FlashDevice.sub. Добавить его описание в файл очень просто, дело всего нескольких секунд. Все, что нужно сделать, это скопировать одну из имеющихся записей и исправить ее в соответствии с параметрами вашей flash-карты. Вам необходимо знать название диска и размер, а также его геометрию. Название и размер можно прочитать на наклейке. Геометрия устройства отображается на экране BIOS устройства Soekris, равно как и в устройствах других производителей. Запись для новой карты выглядит примерно так:

Сначала нужно указать производителя карты (1), при этом запись должна стоять на своем месте в алфавитном порядке внутри файла.

Нам известен один объем flash-карты, что находится в наших руках. Это 128 Мбайт (2). Однако нам требуется, чтобы сценарий мог принимать в качестве аргумента любое из двух обозначений емкости — 128 и 128mb, поэтому указываем оба.

Значение NANO_MEDIASIZE (3) вычисляется умножением числа цилиндров на число головок, на число секторов в дорожке и на 512. Вычислите это произведение и подставьте его в инструкцию expr(1). (Да, NanoBSD сразу же делит это значение на 512.)

Значения NANO_HEADS (4) и NANO_SECTS (5) — это число головок и число секторов, которые мы видели на экране BIOS.

У нас также имеется вариант выбора по умолчанию (6), чтобы в случае использования, например, отсутствующей в списке карты Samsung емкостью 256 Мбайт сценарий создания образа NanoBSD прекратил работу, вместо того чтобы создать дефектный образ.

Добавьте в файл FlashDevice.sub запись вроде этой, и можно продолжить создание вашего образа NanoBSD.

Параметры настройки NanoBSD

Настройка сборки NanoBSD производится с помощью конфигурационного файла. Система FreeBSD по умолчанию не содержит конфигурационный файл для NanoBSD, на что есть веские причины: каждая инсталляция NanoBSD уникальна. В Интернете можно найти множество примеров конфигурации, а я представлю здесь свой собственный файл. Однако из-за возможных изменений в последующих версиях FreeBSD вам может потребоваться внести изменения в свою конфигурацию. Конфигурация NanoBSD, пригодная для FreeBSD 7.0, вероятно будет не совсем корректна в версии FreeBSD 7.5 и наверняка некорректна в версии FreeBSD 8.0. Вы можете создать несколько файлов конфигурации для разных типов сборок NanoBSD.

Ниже приведены некоторые полезные параметры конфигурации и описание их применения.

NANO_NAME=full
Имя, которое вы присваиваете сборке NanoBSD. Это имя NanoBSD использует для присвоения имен рабочим каталогам и файлу образа диска.

NANO_SRC=/usr/src
Местоположение дерева исходного кода, который NanoBSD использует для создания образов дисков. Если вам требуется указать другое местоположение, измените этот параметр. Вы можете собрать NanoBSD в любой версии FreeBSD, достаточно близкой к той, что вы используете.

NANO_TOOLS=tools/tools/nanobsd
Сценарии и файлы NanoBSD считаются частью исходного кода FreeBSD. Это означает, что при запуске csup файлы NanoBSD могут обновиться. Если вы внесете какие-либо изменения в файлы NanoBSD, csup(1) затрет эти изменения. При изменении базовых компонентов NanoBSD желательно скопировать каталог NanoBSD куда-нибудь за пределы дерева исходного кода (например, в /usr/src/tools/tools/local-nanobsd). Отслеживание различий между вашими нестандартными инструментами NanoBSD и базовыми системными инструментами NanoBSD, полностью ложится на вас.

NANO_PACKAGE_DIR=${NANO_SRC}/${NANO_TOOLS}/Pkg
В этом каталоге NanoBSD ищет все пакеты, которые должны быть установлены в образ диска. По умолчанию это каталог /usr/src/tools/tools/nanobsd/Pkg.

NANO_PMAKE="make -j 3"
Данный параметр определяет ключ -j, передаваемый утилите make(1) во время обработки целей buildworld и buildkernel. Если вам придется столкнуться с ошибками во время сборки NanoBSD в ходе обработки целей buildworld или buildkernel, попробуйте установить значение make -j 1.

CONF_BUILD=' '
Любые параметры, определенные здесь, будут использованы на этапе make buildworld. Полный список параметров, допустимых в вашей версии FreeBSD, вы найдете на странице руководства src.conf(5).

CONF_INSTALL=' '
Любые параметры, определенные здесь, будут использованы на этапе make installworld. Полный список допустимых параметров вы также найдете на странице руководства src.conf(5).

CONF_WORLD=' '
Значение этого параметра используется как ключи в ходе всего процесса сборки.

NANO_KERNEL=GENERIC
Вы наверняка захотите собрать нестандартное ядро для своего образа NanoBSD. Укажите его здесь. Это должно быть имя файла в каталоге /usr/src/sys/i386/conf.

NANO_CUSTOMIZE=""
По умолчанию, в ходе сборки образа NanoBSD не использует какие-либо сценарии настройки. О доводке образа диска мы поговорим ниже в этой главе. Укажите здесь любые сценарии настройки образа, если хотите их использовать.

NANO_NEWFS="-b 4096 -f 512 -i 8192 -01 -U"
Создание файловой системы в образе диска производится с помощью newfs(8). Укажите здесь все нужные вам параметры этой команды. Не забывайте, что NanoBSD будет использовать этот диск в режиме доступа «только для чтения», поэтому здесь не следует использовать какие-либо нестандартные параметры.

NANO_DRIVE=ad0
Нужно указать имя файла устройства, соответствующего flash-диску. Чтобы узнать это, можно загрузить целевое устройство и посмотреть, под каким именем оно видит эту карту.

NANO_MEDIASIZE=1000000
Емкость вашего flash-диска в 512-байтовых секторах.

NANO_IMAGES=2
NanoBSD позволяет создать несколько образов операционной системы на одном flash-диске. Это может упростить обновление, но требует в два раза больше пространства. Поскольку в наши дни flash-диски достаточно емки и способны вместить практически любой образ FreeBSD, который вы можете собрать, я не вижу веских причин изменять это значение.

NANO_CODESIZE=0
Здесь можно задать объем дискового пространства, выделяемого для дисковых участков операционной системы. Если установить значение 0, сценарий, выполняющий сборку, выделит максимальное возможное пространство.

NANO_CONFSIZE=2048
Дополнительно NanoBSD создает дисковый участок для хранения конфигурационных файлов, как показано ниже. Данный параметр определяет размер этого участка в 512-байтовых секторах. 2048 секторов эквивалентно одному мегабайту.

NANO_DATASIZE=0
При желании NanoBSD может создать четвертый дисковый участок для хранения данных. Это немного необычно, но вполне допустимо для сборки устройства NanoBSD, способного долго хранить данные. Если указать значение 0, сценарий nanobsd.ch не будет создавать раздел для данных. Если указать отрицательное число, NanoBSD сделает раздел с данными настолько большим, насколько это возможно.

NANO_RAM_ETCSIZE=10240
Объем дискового пространства в 512-байтовых секторах, выделяемого для каталога /etc. Значение 10240 соответствует пяти мегабайтам.

NANO_RAM_TMPVARSIZE=10240
Объем дискового пространства, выделяемого для каталогов /var и /tmp. 5 Мбайт — это достаточно много при условии, что система не предполагает ведение файлов протоколов.

NANO_SECTS=63 и NANO_HEADS=16
Здесь определяется геометрия используемого flash-диска. Не устанавливайте этот параметр в конфигурационном файле! Настраивайте flash-карту в файле FlashDevice.sub.

FlashDevice Samsung 128
Этот параметр предписывает NanoBSD взять описание геометрии диска из файла FlashDevice.sub и не использовать значения NANO_SECTS и NANO_HEADS. Данный пример записи означает, что будет использован flash-диск емкостью 128 Мбайт, произведенный компанией Samsung.

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