Часть 1. Сборка пакетов Debian. Общие понятия

Deb пакеты используются в таких популярных дистрибутивах, как Debian и Ubuntu. В отличии от различных RPM-base дистрибутивов структура этих пакетов нисколько не отличается друг от друга. По этому будет совсем не сложно пересобрать пакет из одного дистрибутива под другой.

Deb-пакет представляет собой gzip-архив, а также скрипты и дополнительные файлы. Вот типичный пример названия пакета:

liferea_1.2.18-0ubuntu1_amd64.deb

Как мы видим имя пакета отделяется от версии символом подчёркивания, также как и архитектура пакета. Через символ ”-” указывается некоторое подобие release, хотя точного понятия, как в RPM для него не существует.

Архитектуры бывают i386 (как в rpm), amd64 (64-х битный пакет, названный в честь первых процессоров AMD), all (тоже что noarch в RPM, независимый от архитектуры), powerpc, а также различные экзотические архитектуры, которые я приводить не буду.

Думаю будет полезно провести некоторое поверхностное сравнение RPM и DEB. Отличий много, однако со стороны конечного пользователя они будут не так заметны. Вообще когда за нас кто-то всё делает (причём качественно), всё хорошо. Как только мы начинаем пытаться делать что-то сами — все плохо.

Итак, самой известной отличительной чертой Deb является наличие мягких зависимостей (Recomends и Suggest). Многие пользователи видят в этом сверхестественную силу и мощь DEB, хотя что с этими зависимостями делать дальше, вероятно, они не знают. Apt-get не умеет обрабатывать их, Aptitude умеет при помощи двух опций в настройках apt:

Aptitude::Recommends-Important "true";

Aptitude::Suggests-Important "true";

В любом случае в мягкие зависимости прописываются пакеты, без которых наш пакет работать будет в любом случае. И на мой взгляд абсолютно все равно жёсткая зависимость или мягкая, так как мы либо ставим все пакеты из Recomends или Suggest, либо не ставим ничего, либо система будет чистенькая с урезанными функциями некоторых пакетов, либо грязненькая с кучей всевозможных пакетов.

Вторым полезным отличием является возможность указания в зависимостях логического или.

Depends: debootstrap | cdebootstrap

В RPM подобная проблема исправлялась добавлением Provides в пакет, от которого зависит собираемый пакет. Однако гораздо проще сделать так, как это делается в DEB.

Ещё в качестве полезности можно выделить вот что. Все скрипты и служебные файлы лежат в каталоге /var/lib/dpkg/info/. Так что мы можем быстро на них взглянуть, а не мучится с различными командами.

Собственно на этом все. По Deb пакету нельзя определить на какой машине он был собран, у пакета нет различных макросов, как в RPM.

В общем как видно, преимущества и недостатки одного и другого довольно сомнительны. Но это только по отношению к конечному пользователю. Как только мы начинаем собирать свой собственный пакет (почти с нуля), недостатки Deb становятся более очевидными.

К ним можно отнести:

1. Множество файлов конфигурации (против 1-го spec у rpm);
2. Множество служебных dh_* команд, которые не совсем понятно что делают;
3. Исходник идёт не одним файлом, а 2-я, 3-я;
4. Сложность в накладывании патчей;
5. Возможность делать одно и тоже несколькими разными способами.

Внутренний язык dh_make тоже не делает сборку особо привлекательной.

Отдельно хочется сказать о цифровой подписи к пакету. Сам Deb пакет, в отличии от RPM, не подписывается, а подписываются различные текстовые файлы, содержащие контрольные суммы. В конечном счёте все доходит до подписи Release.gpg в репозитории. Так что если вы каким-либо образом подсунете в главный репозиторий левый пакет, то идентифицировать его подлинность будет невозможно. Более того, обычно для подписи самого репозитория используется ключ с пустым паролем.

Хотя пакеты для Debian и Ubuntu и лежат все в одном месте, но из-за различных репозиториев и системы pool найти что-либо бывает сложно. Я рекомендую воспользоваться соответственно сайтами http://packages.debian.org и http://packages.ubuntu.com. На них вы сможете легко понять к какому дистрибутиву, какой пакет относится.

Далее - Часть 2. Сборка пакетов

Указатель