Одним из самых частых вопросов по Frenzy было "как добавить мою любимую программу NNN в Frenzy". До версии 1.1 сделать это можно было только одним способом - пересборкой образа.
Инструкция по пересборке Frenzy выглядит довольно устрашающе, да и сам процесс довольно нетривиален, поэтому желающих добавлять программы таким способом было, полагаю, весьма невелико.
Естественно, мне предложили сделать дистрибутив модульным и привели в качестве примера линуксовые LiveCD -
Damn Small Linux и
SLAX, где дополнительные программы подключались относительно просто. Реализовать этот механизм я смог только к версии 1.1 по причине отсутствия до того времени в FreeBSD нормальной unionfs (зачем она нужна - я писал в
предыдущей заметке).
Итак, в Frenzy 1.1 появились подключаемые модули, которые были названы FEM (Frenzy Extension Modules). Каждый модуль представляет собой один или несколько FreeBSD-шных пакаджей, которые при загрузке системы с LiveCD или USB Flash будут автоматически подключены. Для этого файлы с FEM-модулями нужно поместить в каталог frenzy/fem на компакт-диске, флешке или любом разделе жесткого диска - в поисках модулей система по очереди пройдет все эти каталоги.
Создание и устройство модулей FEM
Для того чтобы рассказать о внутренностях системы модулей FEM, для начала стоит рассказать как вообще происходит установка пакаджа в обычной FreeBSD:
- Проверка, установлен ли уже пакадж и не будет ли он конфликтовать с другими уже имеющимися.
- Поиск зависимостей. Если их нет, будет произведена попытка их автоматического поиска и установки.
- Запускаются предустановочные скрипты.
- Создается дерево каталогов с помощью mtree.
- Файлы из пакаджа устанавливаются (копируются) в файловую систему.
- Запускаются послеустановочные скрипты
- Информация об установленном пакадже записывается в /var/db/pkg
На LiveCD в принципе можно произвести этот процесс от начала и до конца без всяких там модулей, минуса только два - все файлы установленного пакаджа будут находиться на диске в оперативной памяти (т.е. опенофис таким способом добавить смогут далеко не все), и после каждой загрузки добавлять пакаджи придется вручную.
Теперь пошагово разберем, как из пакаджей получаются FEM-модули. Предположим, мы хотим добавить в Frenzy... ну, например, xmms :)
1. Зависимости. Процесс их "разрешения" полностью переложен на нас. Т.е. кроме пакаджа с xmms, мы должны собрать пакаджи для тех библиотек и приложений, которые отсутствуют в Frenzy 1.1.
2. Итак, у нас есть все пакаджи которые нужны для того чтобы работал xmms, и пакадж самого xmms. Складываем всех в один каталог, назовем его, например, xmms.
3. Теперь берем утилиту pkg2fem (она есть в составе Frenzy 1.1 + ее можно скачать по ссылке в конце статьи) и запускаем
./pkg2fem xmms (предполагается, что каталог xmms находится в том же каталоге что и утилита. Для работы pkg2fem нужен установленный пакет cdrtools)
4. Утилита распаковывает каждый пакадж и все файлы из него складывает в отдельный каталог, имитируя таким образом установку пакаджа. Т.е. в итоге мы получаем каталог /usr с подкаталогами, который потом будет "наложен" с помощью unionfs поверх основного /usr из Frenzy.На этом этапе я наткнулся на проблему с install-скриптами. К примеру, при установке апача будет создан пользователь www-data, что в нашу схему пока никак не вписывается. Был вариант запускать postinstall-скрипты самостоятельно, но после нескольких попыток я эту затею бросил - кроме sh-скриптов, еще есть запуск команд из файла +CONTENTS (строчки @exec), а их интерпретировать у меня сходу не вышло. В итоге было найдено не слишком изящное решение - для каждого пакаджа из модуля создается специальный пакадж, в котором нет ничего кроме install-скриптов, а в файле +CONTENTS оставлены только вызовы @exec, и кладется в отдельный каталог внутри модуля. Чем это нам поможет - увидим позже.
5. Утилита pkg2fem предлагает нам ввести описание и категорию модуля. Планировалось, что эти параметры будут как-то использоваться в дальнейшем при написании других утилит для работы с готовыми модулями.
6. И наконец, с помощью mkisofs и mkuzip создается файл модуля (точно так же, как и сжатый образ frenzy.uzip).
После всего этого мы получаем файл xmms.fem, который осталось подключить к Frenzy.
Подключение модулей FEM
Со стороны пользователя все выглядит достаточно просто - кладем файл xmms.fem в каталог frenzy/fem на флешку или раздел жесткого диска. Чуть сложнее добавить модуль в ISO-образ, но с этим проблем тоже не возникнет.
А вот со стороны системы все куда интереснее. Процесс подключения файловой системы из сжатого образа модуля я
уже описывал, а вот про postinstall-операции не упоминал. После того, как все модули будут подключены, поверх /usr будет подключен RAM-диск и вся файловая система станет доступной для записи, мы запускаем postinstall-скрипты. В коде загрузочных скриптов это выглядит вот так:
pkg_add -R -f -F ${femfs}/scripts/* > /dev/null 2>&1Да-да, всю работу по разборке формата пакаджей я переложил на стандартную утилиту pkg_add, которая добавляет в систему "пустой" пакадж - в /var/db/pkg информация об установке не записывается, проверки на наличие зависимостей не делаются, а вот все операции которые были бы выполнены при обычной установке пакаджа будут сделаны.
Недостатки
Увы, система модулей FEM имеет целый ряд недостатков, одна часть которых связана с самим механизмом реализации, а вторая часть является следствием недостатка времени на их исправление.
1. Зависимости между пакаджами и модулями - самое слабое место системы. Кроме того что при создании модулей нужно знать что в Frenzy уже есть а что нет, возникает проблема когда модули начнут создавать разные люди. К примеру, два разных человека создают модули для qutim и psi. Оба приложения требуют QT4. Автор модуля qutim, недолго думая, берет и запихивает QT4 внутрь модуля с qutim - получаем один модуль. Автор модуля psi делает то же самое. А теперь представим человека который хочет подключить оба модуля... Ошибок при нынешней реализации модулей это не вызовет, но "неприятный осадок" от таскания с собой дублирующихся пакаджей, наверное, останется :) Все это можно было бы решить путем создания какого-то репозитория с модулями и пакетного менеджера для них, чтобы вышеописанные создатели модулей могли бы указать зависимость от готового модуля с qt4. Увы, все это так и осталось в планах.
2. Подключенные модули нигде не регистрируются - в /var/db/pkg записей не делается, в меню fluxbox новые пункты не появляются... Если не знаешь какие приложения включены в состав модуля, придется повозиться чтобы узнать о них :)
3. Не реализовано подключение модулей "на ходу" в уже работающей системе - модули можно подключить только при загрузке. Кроме того, при загрузке нельзя выбрать, какие модули загружать - будут загружены все модули которые были найдены. Ключ "nofem" позволяет отключить загрузку сразу всех модулей (хотя даже при указании этого ключа модули с компакт-диска все равно будут загружены)
4. Пакаджи, которые устанавливают файлы не в каталог /usr/local (например, comms/ltmdm, который устанавливает модуль ядра в /boot/modules), не могут быть преобразованы в FEM-модули. Вернее, могут, скрипт ничего не скажет :) но работать как положено они не будут.
Итоги
Система подключаемых модулей FEM должна была стать "ключевой фичей" Frenzy, поскольку на момент ее создания в BSD-шных LiveCD аналогов ей не было (ближайшим аналогом можно считать PBI-пакеты в PC-BSD, однако у них совершенно иное предназначение и механизм работы). И несмотря на "корявость" реализации и многочисленные недостатки, пользоваться FEM-модулями вполне можно, на FTP выложено несколько готовых модулей, да и утилита для их создания имеется.
Ссылки
P.S. Недавно узнал, что существует еще и музыкальная группа
Frenzy FEM :)