Можайский Сергей (frenzytechnix) wrote,
Можайский Сергей
frenzytechnix

Categories:

Frenzy в деталях: подключаемые модули FEM

Одним из самых частых вопросов по 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:
  1. Проверка, установлен ли уже пакадж и не будет ли он конфликтовать с другими уже имеющимися.
  2. Поиск зависимостей. Если их нет, будет произведена попытка их автоматического поиска и установки.
  3. Запускаются предустановочные скрипты.
  4. Создается дерево каталогов с помощью mtree.
  5. Файлы из пакаджа устанавливаются (копируются) в файловую систему.
  6. Запускаются послеустановочные скрипты
  7. Информация об установленном пакадже записывается в /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 :)
Tags: freebsd, frenzy
Subscribe

  • Frenzy 1.4

    Тихо, незаметно и совершенно неожиданно для меня вышла Frenzy 1.4. Спасибо Егору за то, что нашел время и собрал-таки исошники. Конечно, многие…

  • Вроде бы о FreeBSD, но не совсем

    Я так думаю, все уже успели обсудить довольно провокационный пост о миграции Рамблера с FreeBSD на Linux, и другой, менее провокационный, но не…

  • Обзор PC-BSD 8.2

    Когда-то я писал обзор PC-BSD 8. Не так давно вышла PC-BSD 8.2, и мне, конечно же, захотелось посмотреть как развивается этот проект и что…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 4 comments