Часто бывает нужно по-быстрому собрать deb-пакет в Debian, особенно когда уже имеется бинарный файл. Так как мы не слакварщики и не хотим засорять систему make & make install, мы пойдём другим путём и сделаем собственный пакет. А чтобы они не валялись по всему диску, закатаем наши пакеты в собственный же репозиторий.
Распаковка существующих пакетов
Сначала посмотрим,
что внутри пакета deb или rpm.
Распаковка deb-пакета
Распаковать пакет Debian нужно в два этапа - сначала извлекаем из него файлы, а потом добираемся до собственно бинарников. Вскрываем пакетик:
# ar vx mypackage.deb
Файл пакета
mypackage.deb содержит три вложенных файла:
- debian-binary - это текстовый файл, который содержит информацию о версии пакета (например: 2.0)
- control.tar.gz - этот архив содержит всю мета-информацию: имя и версию пакета, зависимости и прочее.
- data.tar.gz - собственно, бинарники программы, необходимые для работы. Именно эти файлы будут разархивированы в каталог /usr для дальнейшего использования.
Теперь, если нам охота поживиться бинарниками пакета (содержимое data.tar.gz), даём команду:
$ tar -xzvf data.tar.gz
В текущем каталоге появится ./usr
текущего каталога. Желанный бинарник лежит в ./usr/bin подкаталоге.
Если же вам нужно просто извлечь файлы из пакета, можно всё сделать одной командой
$ ar p mypackage.deb data.tar.gz | tar zx
это распакует пакет deb в текущий каталог. Другой вариант - использовать dpkg-deb в виде:
$ dpkg-deb -x что.deb куда/
Распаковка rpm-пакета
На всякий случай о том, как распаковать пакеты
вероятного противника RPM-based систем. Для этого нам потребуются программы
rpm2cpio и
cpio. Распаковка содержимого RPM пакета делается в один шаг:
$ rpm2cpio mypackage.rpm | cpio -vid
Если же нужно просмотреть содержимое пакета, не распаковывая его, даём команду:
$ rpm2cpio mypackage.rpm | cpio -vt
Для того, чтобы (попытаться) конвертировать RPM-пакет в Debian, можно воспользоваться командой:
# alien mypack.i386.rpm
Надо сказать, что пакеты RPM и DEB сильно отличаются друг и друга, и такое простое конвертирование не всегда проходит.
Deb-пакет из бинарного файла
Теперь, когда мы знаем, что ничего волшебного внутри deb-пакетов нет, можно попробовать сварганить свой собственный дебиановский пакетик.
Часто хочется сделать побыстрее, чтоб "завелось и поехало" - и вместо пакетов пользователи устанавливают программы в виде ./configure, make & make install (вместо make install можно использовать checkinstall). Как уже говорилось не раз, не стоит поддаваться искушению и ставить программы в Linux в обход менеджера пакетов - пакетный менеджер ничего о них знать не будет, и при обновлении системы вы рискуете получить больше проблем на свою голову, чем представляете.
Иногда бывает так, что исходников к пакету нет - скажем, поступила к нам проприетарщина, а упаковать её в пакет хочется. Или мы наваяли скрипт, и хочется, чтобы он был на многих машинах. Нет проблем: завернём это в deb-пакет и скормим apt-у.
Для этого нам понадобится утилита
# apt-get install dpkg-dev
Подопытным кроликом будет служить бинарный файл системы контроля версий fossil,
о котором уже говорилось ранее.
Идея в том, чтобы в локальном каталоге (назовём его ~./tempprog) отдублировать структуру каталогов для программы так, как она лежала бы в системе в установленном виде. Большинство бинарников находится в системном каталоге /usr/bin, поэтому создаём такую же структуру в локальном:
$ mkdir -p ./tempprog/usr/bin/
Так мы создадим все подкаталоги за один проход. Зайдём внутрь:
$ cd tempprog/
и увидим созданные подкаталоги:
$ tree
Вот они:
.
└── usr
└── bin
2 directories, 0 files
Отлично, теперь в локальном каталоге ./tempprog создаём подкаталог ./DEBIAN:
$ mkdir ./DEBIAN
Внутри подкаталога ./DEBIAN создаём текстовый файл
control с таким содержимым:
Package: имя-пакета
Version: версия пакета, скажем 1.0 или 2.7.9.
Architecture: архитектура(i386, amd64, all...)
Maintainer: сопровождающий_пакета
Installed-Size: размер программы в килобайтах
Depends: зависимости (пакет (>= версия))
Recommends: рекомендации (пакет (>= версия))
Suggests: предложения (пакет)
Section: секция (multimedia, games, system, или другое)
Priority: приоритет (optional)
Homepage: http://www.домашняя_страница
Description: описание программы
Таким образом, в нашем локальном каталоге ./tempprog будет лежать вот что:
.
├── DEBIAN
│.. └── control
└── usr
└── bin
└── fossil
3 directories, 2 files
Теперь из каталога ./tempprog даём команду на сборку этого простенького пакета:
$ dpkg-deb -b ./ ./
В результате появится пакет (в нашем примере с fossil) вида:
fossil_1.21_i386.deb
который можно сразу же установить в систему:
$ sudo dpkg -i fossil_1.21_i386.deb
[sudo] password for starscream:
Selecting previously deselected package fossil.
(Reading database ... 247627 files and directories currently installed.)
Unpacking fossil (from fossil_1.21_i386.deb) ...
Setting up fossil (1.21) ...
И всё, наступает счастье.
Небольшое примечание: если кто хочет установить программу в директорию
/opt/ нужно сделать следующее:
- В локальном каталоге ./tempprog создаём каталог /opt/ и размещаем там
программу так, как она и будет установлена в /opt
- Там же, в ./tempprog создаём подкаталоги /tempprog/usr/bin/
в котором размещаем небольшой скрипт, например zotero
- В нём пишем:
#! /bin/sh
PATH=$PATH:/opt/zotero/
/opt/zotero/zotero
Это говорит системе, что теперь можно запускать файлы и из /opt/zotero
Deb-пакет из исходников на скорую руку
Здесь приводится простой вариант упаковки исходников, если все зависимости уже на месте и нам ничего не нужно делать. В общем случае это не так, и сборка пакетов с прописыванием зависимостей представляет собой довольно нетривиальный процесс.
Если нам повезло и все зависимости уже в системе, можно скомпилировать исходные тексты программы и
по-быстрому завернуть всё в пакет Debian.
Для этого скачанные исходные тексты программы (для примера foobar версии 1.2.3) распаковываем в каталог foobar-1.2.3, и от рута даём команду:
# dh_make --createorig
Далее пишем
# debuild
Опять, если нам повезло, всё должно собраться без вопросов. Полученный пакет устанавливаем
# dpkg -i foobar_1.2.3-1_i386.deb
Охочим до тонкостей дебиановской кулинарии и прочим правильно писающим мальчикам
просьба пройти сюда и насладиться The Debian Administrator's Handbook. Эта
Книга о вкусной и здоровой пище довольно занудная, водянистая и словоохотливая книжеца от двух дебианщиков расскажет вам о Debian Policy, как всё делать ортодоксально и, когда авторы вспоминают, что не мемуары пишут, про то,
что же таки собственно делать.
Создание собственного локального репозитория Debian своими руками
Когда количество собственноручно собранных пакетов перевалит за десяток, захочется удобства и комфорта установки софта. К счастью, создание собственного локального репозитория - дело сравнительно простое.
Создаём каталог, в котором будут лежать все собранные непосильным трудом пакеты - пусть это будет ~/zips/virensdebianrepositor в который копируем deb-пакеты.
Для создания репозитория нам понадобится dpkg-scanpackages который является (во всяком случае на момент написания поста) частью пакета dpkg-dev,
как это неожиданно выяснилось.
Создаём список пакетов:
$ dpkg-scanpackages . /dev/null | gzip -9c > ./Packages.gz
Может быть, нам будет выведено сообщение типа:
dpkg-scanpackages: warning: Packages in archive but missing from override file:
dpkg-scanpackages: warning: fossil linux-headers-3.8.0-avl9-pae linux-image-3.8.0-avl9-pae pdfsam sublimetext virtualbox-4.2 xserver-xorg-input-wacom zotero
dpkg-scanpackages: info: Wrote 8 entries to output Packages file.
Теперь в нашем репозитории 8 пакетов. Отлично, добавляем наш репозиторий в файл:
# vim /etc/apt/sources.list
строчкой типа:
deb file:///home/имя_пользователя/zips/virensdebianrepository ./
Теперь нужно обновить список пакетов, чтобы они стали доступны для установки:
# apt-get update
Всё, теперь можно установить, к примеру, свежесобранный текстовый редактор
Sublime Text 2 (отличная инструкция
там) как всегда: Теперь, для того, чтобы установить SublimeText достаточно сделать:
# apt-get install sublimetext
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
sublimetext
0 upgraded, 1 newly installed, 0 to remove and 245 not upgraded.
Need to get 0 B/11.4 MB of archives.
After this operation, 17.4 MB of additional disk space will be used.
WARNING: The following packages cannot be authenticated!
sublimetext
Install these packages without verification [y/N]? Y
Selecting previously deselected package sublimetext.
(Reading database ... 247813 files and directories currently installed.)
Unpacking sublimetext (from ..././sublimetext_2.0.2_i386.deb) ...
Setting up sublimetext (2.0.2) ...
Всё, пакет будет распакован и установлен, а то, что он из местного репозитория, видно вот тут: (from ..././sublimetext_2.0.2_i386.deb)
Заключение
Описанные в этом посте рецепты - блюда на скорую руку, а не фуагра с трюфелями. Для больших репозиториев или сложных пакетов придётся-таки ознакомиться с
документацией и
руководствами. Ещё можно воспользоваться программой
APTonCD, которая умеет не только создавать репозитории, но и записывать их на CD/DVD диски.