?

Log in

No account? Create an account
Frenzy в деталях: подключаемые модули FEM - technix, the Frenzy developer — ЖЖ [entries|archive|friends|userinfo]
Можайский Сергей

[ Сайт | Визитка ]
[ Frenzy | FreeBSD LiveCD ]

Frenzy в деталях: подключаемые модули FEM [май. 11, 2009|09:34 pm]
Можайский Сергей
[Tags|, ]

Одним из самых частых вопросов по 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 :)
СсылкаОтветить

Comments:
[User Picture]From: rekun
2009-05-11 07:28 pm
Велик тот человек, которому спасибо говорят ;)
Спасибо тебе Сережа.
(Ответить) (Thread)
From: ext_111379
2009-05-11 09:12 pm
ну от зависимостей никуда не уйти
(Ответить) (Thread)
[User Picture]From: frenzytechnix
2009-05-11 09:29 pm
Не уйти. Но я думал этот процесс хоть как-то облегчить...
(Ответить) (Parent) (Thread)
[User Picture]From: bochafreebsd
2009-05-13 01:36 am
Вообще, Frenzy во многом новаторский дистрибутив, во многом он превосходит другие, знакомые мне LiveCD, и тот факт, что в нем используются самостоятельные разработки не смотря на имеющиеся в них какие-либо недостатки - делает Frenzy еще лучше, еще приятней для профессионального пользователя. Frenzy - это очень яркий представитель open-source проекта с точки зрения наглядности и прозрачности его функционирования, да и просто с ним приятно работать даже обычному юзеру, который всего этого не знает. Очень здорово, что этот дистрибутив есть, он помогал и будет помогать в решение многих задач. Спасибо.
(Ответить) (Thread)