K210.ORG

Краеугольный камень пакетной системы Debian — это deb-пакет (см. deb(5)), представляющий из себя архив формата ar, внутри которого содержится три файла:
1. debian-binary — текстовый файл, содержащий версию формата deb-пакета, в данный момент это 2.0. Программы, работающие с deb-пакетами, должны читать только первую строку этого файла и не падать, если минорная версия вдруг поменяется (например, станет 2.1).
2. control.tar.gz — служебная информация о пакете, скрипты, вспомогательные файлы (см deb-control(5)). Должен содержать только файлы, единственная папка, которая может присутствовать — «.» (текущая директория). В этот архив обязательно должен входить файл control, его минимальное содержимое рассмотрим чуть ниже.
3. data.tar — собственно файлы, устанавливаемые в систему. Чаще всего этот файл сжат каким-нибудь архиватором (поддерживаются расширения .gz, .xz, .bz2, .lzma), чаще всего в архивах встречается data.tar.gz.
Указанный порядок следования файлов в архиве обязателен. Если в этом архиве требуется разместить еще какие-нибудь файлы (не представляю, зачем это может кому-нибудь понадобиться), они должны находиться перед data.tar.gz, т.е. последний файл в архиве всегда data.tar. Но если сообщество когда-нибудь решит добавить в формат deb еще файлы, они будут помещены после data.tar.
Файл control в архиве control.tar.gz описывает назначение, версию и зависимости пакета, его формат более-менее подробно описан в deb-control(5). Пересказывать всю справку сейчас не буду, опишу лишь минимальное содержимое, необходимое для взаимодействия с инфраструктурой dpkg:
Package: имя пакета
Version: строка версии (при выборе политики назначения версий следует придерживаться deb-version(5))
Maintainer: John Doe (человек, поддерживающий пакет, а не автор программы)
Description: короткое описание пакета
Длинное описание, на несколько строк. Каждая строка, входящая в
длинное описание, должна начинаться с пробела
Работа с пакетами средствами ar
Теоретически данной информации должно быть достаточно, чтобы собрать простейший пакет «на коленке» и установить его в систему. Пусть наш пакет (назовем его test) просто добавляет в систему файл /usr/share/example-content/test со строчкой «test». Сделаем архив data.tar.gz со структурой папок и единственным файлом, а также файлик debian-binary:
$ mkdir -p usr/share/example-content/
$ echo test > usr/share/example-content/test
$ tar czf data.tar.gz usr
$ echo 2.0 > debian-binary
Создадим файл control со следующим содержанием:
$ cat control
Package: test
Version: 1.0
Maintainer: Dummy Maint
Description: test package
Test package created on my own knees.
$ tar czf control.tar.gz control
Теперь соберем все воедино:
$ ar -qS test-1.0.deb debian-binary control.tar.gz data.tar.gz
В текущем каталоге должен появиться файл test-1.0.deb . Его «физическое» содержимое можно просмотреть с помощью следующей команды:
$ ar t test-1.0.deb
debian-binary
control.tar.gz
data.tar.gz
Посмотреть файл debian-binary:
$ ar p test-1.0.deb debian-binary
2.0
Посмотреть список файлов в пакете:
$ ar p test-1.0.deb data.tar.gz|tar -tzf -
usr/
usr/share/
usr/share/example-content/
usr/share/example-content/test
Посмотреть содержимое файла control:
$ ar p test-1.0.deb control.tar.gz |tar -O -xzf - control
Package: test
Version: 1.0
Maintainer: Dummy Maint
Description: test package
Test package created on my own knees.
Можно установить этот пакет и убедиться, что файл /usr/share/example-content/test успешно создан, но лучше этого не делать, поскольку из-за недостатка информации в control в пакетной системе может появиться мусор:
$ sudo dpkg -i test-1.0.deb
Selecting previously deselected package test.
(Reading database . 97631 files and directories currently installed.)
Unpacking test (from test-1.0.deb) .
Setting up test (1.0) .
Работа с пакетами средствами dpkg-deb
Все вышеописанное позволяет управляться с deb-пакетами на самом низком уровне, не имея под рукой ничего, кроме стандартных средств Unix (доподлинно известно, что программа ar входила в состав первых Unix 1970х годов). Однако, как несложно догадаться, есть и более высокоуровневые способы создания пакетов и изучения их содержимого. В частности, если уж так необходимо поковыряться с пакетом на низком уровне, все вышеописанные действия настоятельно рекомендуется выполнять с помощью утилиты dpkg-deb(1).
Создание пакета средствами dpkg-deb
Минимальный формат вызова команды dpkg-deb для построения пакета следующий:
dpkg-deb -b исходная_папка
Все, что находится в исходной папке, кроме директории DEBIAN, помещается в data.tar.gz. Содержимое DEBIAN будет использовано для создания control.tar.gz, в частности, будет прочитан и проанализирован файл control и в случае каких-либо ошибок (отсутствует одно из необходимых полей или эти поля имеют неправильные значения) пакет просто не будет создан. Процесс создания нашего тестового пакета с нуля теперь выглядит так (в последней команде предполагается, что в текущей папке остался файл control от сборки пакета средствами ar):
$ mkdir -p test-1.1/usr/share/example-content/ test-1.1/DEBIAN
$ echo test 1.1 > test-1.1/usr/share/example-content/test
$ sed 's/Version: 1.0/Version: 1.1/g' control > test-1.1/DEBIAN/control
Попытаемся собрать пакет:
$ dpkg-deb -b test-1.1
warning, in file 'test-1.1/DEBIAN/control' near line 5 package 'test':
missing architecture
dpkg-deb: building package `test' in `test-1.1.deb'.
dpkg-deb: warning: ignoring 1 warnings about the control file(s)
Несмотря на отсутствие важного, но не необходимого поля Architecture, был создан пакет test-1.1.deb. Добавим поле и пересоздадим пакет:
$ sed -i "1a \
Architecture: all" test-1.1/DEBIAN/control
$ dpkg-deb -b test-1.1
dpkg-deb: building package `test' in `test-1.1.deb'
Еще одна немаловажная деталь. Как правило, в названии файла пакета указывается его архитектура, а команда dpkg-deb -b назвала файл по имени папки, из которой он был создан. Если бы папка называлась ololo, то мы получили бы ololo.deb. Чтобы файл пакета автоматически именовался в формате имя-версия-архитектура, при вызове dpkg -b необходимо указывать папку, куда будет положен итоговый архив, например, текущую. Тогда все компоненты имени файла будут извлечены из control:
$ cp -R test-1.1 ololo
$ dpkg -b ololo
dpkg-deb: building package `test' in `ololo.deb'.
$ dpkg -b ololo .
dpkg-deb: building package `test' in `./test_1.1_all.deb'.
Теперь всё относительно нормально, продолжаем изучение возможностей dpkg-deb на примере нового пакета.
Получение информации о пакете
Узнать версию формата deb, размер пакета и содержимое файла control:
$ dpkg -I test_1.1_all.deb
new debian package, version 2.0.
size 644 bytes: control archive= 259 bytes.
160 bytes, 6 lines control
Package: test
Architecture: all
Version: 1.1
Maintainer: Dummy Maint
Description: test package
Test package created on my own knees.
Список файлов, устанавливаемых в систему (кроме служебных):
$ dpkg -c test_1.1_all.deb
drwxr-xr-x bvk/bvk 0 2010-10-22 13:21 ./
drwxr-xr-x bvk/bvk 0 2010-10-22 13:21 ./usr/
drwxr-xr-x bvk/bvk 0 2010-10-22 13:21 ./usr/share/
drwxr-xr-x bvk/bvk 0 2010-10-22 13:21 ./usr/share/example-content/
-rw-r--r-- bvk/bvk 9 2010-10-22 13:21 ./usr/share/example-content/test
Обратите внимание на владельца устанавливаемых файлов и каталогов: это не root, а некий пользователь. Чтобы исправить эту проблему, можно собирать пакеты из-под root’а, либо воспользоваться специальной утилитой fakeroot из одноименного пакета. Она перехватывает системные вызовы chmod(2) и stat(2) для файлов, и возвращает значения, как если бы файл принадлежал пользователю root. Небольшой пример:
$ id
uid=1000(bvk) gid=1000(bvk) .
$ touch trololo
$ ls -l trololo
-rw-r--r-- 1 bvk bvk 0 2010-10-22 13:23 trololo
$ fakeroot ls -l trololo
-rw-r--r-- 1 root root 0 2010-10-22 13:23 trololo
Думаю, принцип понятен. Пересоберем пакет еще более правильно:
$ fakeroot dpkg -b test-1.1 .
dpkg-deb: building package `test' in `test_1.1_all.deb'.
$ dpkg -c test_1.1_all.deb
drwxr-xr-x root/root 0 2010-10-22 13:25 ./
drwxr-xr-x root/root 0 2010-10-22 13:25 ./usr/
drwxr-xr-x root/root 0 2010-10-22 13:25 ./usr/share/
drwxr-xr-x root/root 0 2010-10-22 13:25 ./usr/share/example-content/
-rw-r--r-- root/root 9 2010-10-22 13:25 ./usr/share/example-content/test
Теперь наконец ок.
Можно получаить информацию о пакете в заданном формате:
$ dpkg-deb -W --showformat='$-$-$ ($)\n' test_1.1_all.deb
test-1.1-all (Dummy Maint )
Список полей, которые можно указать в –showformat, можно узнать из вывода команды dpkg-deb -I
Подать на STDOUT архив data.tar.gz из пакета (уже «разжатый»), может быть полезно для извлечения только некоторых файлов:
$ dpkg-deb --fsys-tarfile test-1.0.deb |tar -Ox usr/share/example-content/test
test
Перепаковка пакета
Пожалуй, теперь наступил момент применить свежеполученные знания на практике 🙂 Часто возникает следующая проблема: из некоего источника поступил пакет с некорректными зависимостями, например, требуется устаревший пакет, отсутствующий в системе и всех репозиториях, но доподлинно известно, что другой, уже установленный пакет предоставляет нужную функциональность. В скачанном пакете требуется изменить файл control, убрав или исправив зависимость. Правильно было бы скачать и распаковать исходник пакета (apt-get source), произвести необходимые изменения в скриптах сборки, установить все необходимые для пересборки библиотеки и окружение и т.д. и т.п., но для частного использования (т.е. без распространения по репозиториям) достаточно просто распаковать пакет, изменить необходимые файлы и запаковать обратно. Проиллюстрирую последовательность действий на примере невинного пакета hello:
$ aptitude download hello
Get:1 http://yum.fireground.ru/ubuntu/mirror/ maverick/main hello i386 2.5-1 [34.4kB]
Fetched 34.4kB in 0s (824kB/s)
# да-да, я сижу под убунтой и описываю debian
# распаковать содержимое пакета в папку hello (если не существует, будет создана):
$ dpkg-deb -x hello_2.5-1_i386.deb hello
# распаковать содержимое control.tar.gz в hello/DEBIAN
$ dpkg-deb -e hello_2.5-1_i386.deb hello/DEBIAN
# что-нибудь поменять в control, например, версию пакета:
$ sed -i 's/Version: .*$/Version: 2.5-1test/' hello/DEBIAN/control
# собрать новый пакет:
$ fakeroot dpkg -b hello/ .
dpkg-deb: warning: 'hello//DEBIAN/control' contains user-defined field 'Original-Maintainer'
dpkg-deb: building package `hello' in `./hello_2.5-1test_i386.deb'.
dpkg-deb: warning: ignoring 1 warnings about the control file(s)
Пакет собран. Убедиться, в том, что в нем нет ошибок из-за немного нетрадиционного способа сборки, можно с помощью программы lintian:
$ sudo aptitude install lintian
.
$ lintian hello_2.5-1test_i386.deb
$ echo $?
0
Об установке пакетов в систему, механизме зависимостей, структуре репозиториев и еще более правильных способах сборки пакетов читайте в следующих статьях 🙂
Сборка пакетов
Дистрибутивы, основанные на Debian – это не только отличная система управления пакетами APT, которая сама разрешает зависимости, но и удобные инструменты для создания пакетов и своих репозиториев. Если уж вы решились собрать программу из исходников, то советую ещё изучить, как дебианизировать исходники. Это отнимет чуть больше времени, чем стандартное
./configure && make && make install
но зато позволит сохранить систему в чистоте. Удалить программы, установленные командой make install, можно только командой
make uninstall
но не все исходники это поддерживают, а что ещё чаще — исходники удаляют после установки, тогда удалить программу можно только вручную. Но чтобы это сделать, нужно точно знать что и куда установилось. А это уж точно никто не знает, кроме самих разработчиков программы (ну или тех, кто более-менее разбирался в исходниках программы).
Ну и что? Главное — работает!
APT не знает ничего о программах, установленных вручную. Соответственно, могут быть конфликты, или просто непонятные ошибки.
Очень часто исходники по умолчанию «рассчитаны» на определённый дистрибутив, или, наоборот, рассчитаны только на установку из исходников, при этом выполняются разного рода «удобные» настройки в конфигурационных файлах. Так, например, очень любят прописывать mime-типы. Но проблема в том, что переводы разные бывают и в Nautilus может выскочить ошибка
"Имя файла показывает, что файл является типом файла . Содержимое файла показывает, что файл является файлом типа "
и документ не будет открываться. Таких «недочётов» может быть очень много. А теперь, если представить что это удалить нельзя, поскольку пользователь не запоминал что и куда поставилось, наступает паника и как результат — переустановка.
Но как быть, если программу хочется поставить, а версия в deb-пакете устарела, или такой вообще нет?
Есть два выхода:
Использовать программу checkinstall . Она собирает всё в один пакет. К сожалению, она позволяет решить только вопрос с удалением программы. И даже если APT будет знать, что программа установлена, он в лучшем случае сообщит, что есть конфликт файлов,
файл /some/path/to/some/file уже есть в пакете "имя пакета собранного с помощью checkinstall"
Чаще всего такие случаи очень корректно разрешаются путём удаления конфликтного пакета. Но на разбор ситуации уйдёт некоторое время.
![]()
Cобрать нормальный пакет, как это делают мантейнеры. В котором будет корректная версия, зависимости и расположение файлов будет соответствовать политике дистрибутива. Вижу вам всё ещё интересно . Это радует.
Классификация случаев сборки
Возможны следующие случаи сборки пакетов:
сборка из исходников;
сборка из бинарных файлов;
исходники или бинарные файлы берутся:
не из репозитория;
из репозитория другого дистрибутива;
из репозитория другого выпуска Ubuntu, из PPA или из Debian;
из репозитория текущего выпуска Ubuntu;
недоступна;
берётся из репозитория Ubuntu, из PPA или из Debian:
из другой версии программы;
из текущей версии программы:
не из репозитория текущего выпуска Ubuntu;
из репозитория текущего выпуска Ubuntu;
ни в репозитории Ubuntu текущего выпуска, ни в PPA нет нужной версии программы;
доступная версия программы по каким-либо причинам не устраивает (не устраивает код или данные программы, параметры конфигурации или управляющая информация пакета);
и то, и другое.
Сборка из исходников
Дано: некий исходник gcoolprog-0.5.3.tar.bz2. Нужно из него собрать пакет.
Решение: ниже идёт вариант, как я обычно поступаю в таком случае.
Первым делом смотрю, нет ли deb-пакета той же версии, но допустим под Debian. Если есть делаю так: есть нужная версия пакета в репозитории debian или в будущем релизе Ununtu
Если нет той же версии, но есть предыдущей. Тут можно сказать как повезёт, если изменения в исходниках не коснулись положения файлов, то скорее всего дебианизация от старого пакета подойдёт, нужно лишь сменить версию. Теперь вариант в репозитории есть пакет предыдущей версии.
Ну и самый страшный случай — нигде никаких deb-пакетов нет, только tar.gz и rpm. Ни в коем случае не использовать rpm! Делаем по первому варианту.
Что необходимо
Полное Руководство начинающего разработчика Debian доступно тут.
К сожалению, на русском, информация немного устарела, свежая инструкция доступна на английском. Но принципы не изменились, поэтому если интересны детали лучше прочитать руководство от и до.
Нам понадобятся как минимум программы, устанавливаемые командой
sudo apt-get install autoconf automake libtool autotools-dev dpkg-dev fakeroot
Можно так же autobook — это документация по утилитам GNU Autoconf , Automake , и Libtool . Ну и конечно то, что требуют сами исходные коды для корректной сборки.
Создание ключа шифрования
Этот шаг не обязателен, его можно пропустить.
Чтобы создать ключ, зайдите в Приложения → Стандартные → Пароли и ключи шифрования. В открывшемся окне, в меню Ключ → Новый ключ, выбираем ключ pgp. Заполняем поля Полное имя и Электронный адрес.
![]()
В мире свободного программного обеспечения, для предотвращения «краж» или «подделок», принято подписывать свои «ценные» вещи электронным ключом, открытая часть которого хранится на общедоступных серверах и позволяет другим пользователям легко выяснить подлинность и целостность той или иной вещи.
Поэтому отнеситесь к созданию ключа очень ответственно.
Никто вас не заставляет вписывать сюда реальные имя и фамилию, или ещё какие-нибудь личные данные, но если вас не разыскивает интерпол — думаю указать фамилию и имя будет верным решением, хотя можно и просто свой ник В общем, решайте сами. А вот почтовый адрес укажите реальный, и который вы не поменяете.
Можно завести ящик, если ещё нет, на каком-нибудь популярном почтовом сервере: например, gmail.com или yandex.ru .
Это позволит в будущем легко связаться с вами человеку, который вас не знает, но по той или иной причине встретил «вещь», подписанную вами.
Далее вас спросят ввести пароль, как дополнительную защиту. Он может быть полезен, если вы будете использовать закрытый ключ на машинах, которым вы не можете на 100% доверять. Обратная сторона — вам придётся вводить пароль каждый раз, как только вы будете что-то подписывать.
Хотя последняя версия программы seahorse имеет демон, который автоматически запускается в сеансе GNOME, и умеет «запоминать пароль» на время сеанса, но пока не все программы умеют с ней работать.
Итак, вы создали ключ — теперь его можно будет использовать при создании пакетов.
Для этого, в файл ~/.bashrc, или в другой стартовый скрипт, вашего любимого шелла (для zsh ~/.zshrc), нужно вписать переменные
export DEBEMAIL=ваш@имейл
На основании e-mail будет искаться ключ в pgp, при подписи пакета.
Нужно завершить сеанс и зайти заново, чтобы изменения вступили в силу.
Помните, что если вы бэкпортируете пакет, дебианизированный не вами, обязательно нужно изменить версию командой
dch -i
для того, чтобы в изменения вписался ваш e-mail. А для того, чтобы ваш открытый ключ попал на сервер, необходимо в настройках «seahorse → Пароли и ключи шифрования», настроить соединение с сервером публичных ключей.
Для этого, в меню Правка→Параметры на закладке Публикация ключей необходимо поставить галку Публиковать ключи….
Теперь можно выбрать ключ и в меню по правой кнопке выбрать Синхронизировать и опубликовать ключи.
Дебианизация недоступна
Итак, у нас есть только gcoolprog-0.5.3.tar.gz.
Обычно я выполняю следующие действия:
Предварительно подготавливаю рабочую директорию
mkdir ~/src/gcoolprog mkdir ~/src/gcoolprog/0.5.3 cd ~/src/gcoolprog/0.5.3 wget "http://" #можно конечно и просто через браузер скачать но обычно так быстрее
Получаем файл gcoolprog-0.5.3.tar.gz. Распакуем его перейдем в полученный каталог:
tar zxvf gcoolprog-0.5.3.tar.gz cd gcoolprog-0.5.3
Для корректной сборки нужно, чтобы корневая директория содержала не только название, но и версию!
Ниже будем считать директорию ~/src/gcoolprog/0.5.3/gcoolprog-0.5.3 корневой директорией исходников.
Далее выполняем «черновую» сборку. Т.е. сконфигурируем и соберем приложение, без его установки:
./configure --prefix=/usr && make
Если команда выполнилась успешно, то осталось только дебианизировать.
Дебианизация
Ничего страшного в этом нет, как я уже говорил есть скрипты, которые сильно упрощают этот процесс.
Вообще смысл всей этой процедуры — создать директорию debian в корне исходников, с нужными файлами конфигурации и скриптом(ами).
Для этого, в корне исходных текстов, выполним
dh_make --createorig
На что мы должны получить следующий диалог
Type of package: single binary, multiple binary, library, kernel module or cdbs? [s/m/l/k/b] s Maintainer name : denis Email-Address : Ubuntu_user@mail.ru Date : Mon, 13 Aug 2007 12:40:33 +0400 Package Name : gcoolprog Version : 0.5.3 License : blank Type of Package : Single Hit to confirm:
Тут мы указываем сформировать пакет, для одиночного бинарного файла.
Но мы с вами молодцы и всё у нас прошло без ошибок — появился каталог debian в корне исходников, посмотрев его содержимое, Вы увидите кучу файлов (расширение .ex) с примерами на все случаи жизни.
Будем считать, что программа у нас простая – обычно ни один из этих файлов не нужен.
Первым делом, нужно добавить описание программы в файле debian/control
Description:
Вместо и (без угловых кавычек) нужно вписать описание, что это за программа.
Именно эти сведения увидит пользователь, когда посмотрит описание пакета.
Второй момент — это поправить файл debian/rules
в секции binary-arch: нужно раскомментировать (т.е. убрать # в начале строки)
dh_install
без этого мы получим пустой пакет.
Иногда debian/rules содержит лишь:
Что приемлемо с использованием debhelper.
Этих настроек будет достаточно для сборки пакета с одной программой, которая не содержит разделяемых библиотек, т.е. только бинарник в /usr/bin и данные в /usr/share.
Сборка пакета
Теперь, соберём пакет:
dpkg-buildpackage -rfakeroot
В директории выше, т.е. в ~/src/gcoolprog/0.5.3, мы получим файлы
gcoolprog_0.5.3-1.diff.gz gcoolprog_0.5.3-1_i386.changes gcoolprog_0.5.3-1_i386.deb gcoolprog_0.5.3.orig.tar.gz
Вот теперь мы можем установить пакет
dpkg -i *.deb
Дебианизация берётся из репозитория Ubuntu, из PPA или из Debian
Дебианизация берётся из другой версии программы
В этом случае, очень удобно взять дебианизацию оттуда и поправить для новой версии.
Как я уже сказал, возможно нам повезёт и достаточно будет только сменить версию. Но не будем гадать.
Ниже я не буду комментировать то, что описано в предыдущем решении.
Предварительно подготовим рабочую директорию
mkdir ~/src/gcoolprog mkdir ~/src/gcoolprog/0.5.3 cd ~/src/gcoolprog/0.5.3 wget "http://"
получаем файл gcoolprog-0.5.3.tar.bz2
bunzip2 gcoolprog-0.5.3.tar.bz2 gzip gcoolprog-0.5.3.tar mv gcoolprog-0.5.3.tar.gz gcoolprog_0.5.3.orig.tar.gz
теперь распаковываем его
tar zxvf ./gcoolprog_0.5.3.orig.tar.gz
скачиваем предыдущую версию с http://packages.ubuntu.com или http://packages.debian.org, файл gcoolprog_0.5.1.diff.gz (в самом низу в секции More Information on gcoolprog)
wget "http://archive.ubuntu.com/ubuntu/pool/universe/g/gcoolprog/gcoolprog_0.5.1.diff.gz" gunzip gcoolprog_0.5.1.diff.gz patch -p0 ./gcoolprog_0.5.1.diff
~/src/gcoolprog/0.5.3/gcoolprog-0.5.1/debian
копируем каталог gcoolprog-0.5.1/debian в директорию ~/src/gcoolprog/0.5.3/gcoolprog-0.5.3
cp -a ~/src/gcoolprog/0.5.3/gcoolprog-0.5.1/debian ~/src/gcoolprog/0.5.3/gcoolprog-0.5.3
дальше нам нужно изменить версию командой
dch -i
этой командой изменяется файл debian/changelog например увидим
gcoolprog (0.5.1-1ubuntu2) feisty; urgency=low * -- denis ubuntu_user@mail.ru> Mon, 13 Aug 2007 14:13:27 +0400
но поскольку у нас версия 0.5.3, то нужно изменить значения на
gcoolprog (0.5.3-1ubuntu1) feisty; urgency=low * New upstream release. -- denis ubuntu_user@mail.ru> Mon, 13 Aug 2007 14:13:27 +0400
сохраните изменения. Теперь можно выполнить команду сборки в пакет.
dpkg-buildpackage -rfakeroot
cd .. ls -1 gcoolprog_0.5.3-1.diff.gz gcoolprog_0.5.3-1_i386.changes gcoolprog_0.5.3-1_i386.deb gcoolprog_0.5.3.orig.tar.gz dpkg -i *.deb
Дебианизация берётся из текущей версии программы
Дебианизация берётся не из репозитория текущего выпуска Ubuntu
Для Debian нужно использовать сайт http://packages.debian.org, для Ubuntu — http://packages.ubuntu.com. Тогда, например, в Ubuntu ищем пакет gcoolprog в репозитории будущего релиза.
Предварительно подготовим рабочую директорию
mkdir ~/src/gcoolprog mkdir ~/src/gcoolprog/0.5.3 cd ~/src/gcoolprog/0.5.3
теперь скачиваем три файла
wget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcoolprog/gcoolprog_0.5.3-1.dsc wget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcoolprog/gcoolprog_0.5.3.orig.tar.gz wget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcoolprog/gcoolprog_0.5.3-1.diff.gz
или тоже самое, но одной командой
dget http://archive.ubuntu.com/ubuntu/pool/universe/g/gcoolprog/gcoolprog_0.5.3-1.dsc
из пакета devscripts
затем распакуем командой
dpkg-source -x ./gcoolprog_0.5.3-1.dsc
получим каталог gcoolprog-0.5.3.Перейдём в него и сменим версию:
cd gcoolprog-0.5.3 dch -i
gcoolprog (0.5.3-1ubuntu1) feisty; urgency=low * backport from gutsy -- denis ubuntu_user@mail.ru> Mon, 13 Aug 2007 14:13:27 +0400
теперь можно собирать пакет
dpkg-buildpackage -rfakeroot
cd .. ls -1. gcoolprog_0.5.3-1.diff.gz gcoolprog_0.5.3-1_i386.changes gcoolprog_0.5.3-1_i386.deb gcoolprog_0.5.3.orig.tar.gz dpkg -i *.deb
Дебианизация берётся из репозитория текущего выпуска Ubuntu
В случае, когда для нужной версии программы имеется пакет в репозитории текущего выпуска Ubuntu, но он по каким-либо причинам не устраивает и в его исходники нужно внести изменения (например, применить какой-нибудь патч) и пересобрать, основываясь на уже имеющейся в пакете дебианизации, можно поступить следующим образом.
Для сборки понадобятся следующие пакеты: build-essential devscripts fakeroot. Потребуются также пакеты для разработки, мы их установим в дальнейшем.
cd ~/src apt-get source gcoolprog
apt-get source скачивает исходники из репозитория Ubuntu в текущую директорию. Многие пакеты в репозитории имеют общие друг с другом исходники, поэтому кроме исходников выбранного пакета могут скачаться и исходники других пакетов (общие для нескольких пакетов исходники).
Далее вносим изменения в исходники и собираем из них обратно пакеты.
Устанавливаем необходимые для сборки пакеты для разработки:
sudo apt-get build-dep gcoolprog
cd gcoolprog-0.5.3 debuild -b -us -uc
debuild следует запускать в директории исходников. Параметры -b -us -uc передаются программе dpkg-buildpackage. Первый требует собирать только бинарные пакеты, второй и третий — не подписывать цифровой подписью, соответственно, пакет исходников и файл .changes. Получившиеся в результате сборки пакеты будут в директории на один уровень выше.
Сборка из бинарных файлов
Ниже идёт пример как можно поступить в случае, если доступен только deb-пакет и нет его дебианизированных исходников.
Для начала советую прочитать это. И это. Тут полная документация на русском.
Предположим, что работаем в каталоге ~/tmp. Создадим подкаталог ~/tmp/someprog, чтобы распаковать файлы какого-нибудь пакета, нужно выполнить
dpkg -x ~./tmp/some-prog-123.deb ./someprog
Для того, чтобы извлечь контрольную информацию, выполним
mkdir ~/tmp/someprog/DEBIAN dpkg -e ~/tmp/some-prog-123.deb ./someprog/DEBIAN
ну а теперь, чтобы всё это собрать обратно в пакет, нужно выполнить
dpkg -b ./someprog ~/tmp/some-prog-123-new.deb
В каталоге ~/tmp/someprog/DEBIAN содержатся файлы, описывающие, что это за пакет, от чего он зависит, и контрольные суммы файлов, находящихся в нём. Для того, чтобы собрать свой пакет, нужно поместить файлы в каталоге ~/tmp/someprog так, как будто это корневой каталог.То есть, если нужно, чтобы файл установился в /usr/bin,нужно его поместить в каталог ~/tmp/someprog/usr/bin, ну и, соответственно, если что-то должно лежать в /etc, то в ~/tmp/someprog/etc и т.д.
Затем в ~/tmp/someprog создать каталог DEBIAN, обязательно большими буквами, и в нём файл ~/tmp/someprog/DEBIAN/control, в этом файле описывается название пакета, его зависимости и описание, формат очень простой. Например:
Package: libcurl3 Version: 7.15.2-2 Section: libs Priority: optional Architecture: i386 Depends: libc6 (>= 2.3.5-1), libcomerr2 (>= 1.33-3), libidn11 (>= 0.5.18), libkrb53 (>= 1.4.2), libssl0.9.8 (>= 0.9.8a-1),zlib1g (>= 1:1.2.1), ca-certificates Suggests: libldap2 Replaces: libcurl2 ( Source: curl Description: Multi-protocol file transfer library libcurl is designed to be a solid, usable, reliable and portable multi-protocol file transfer library. . SSL support is provided by OpenSSL. To enable LDAP support package libldap2-dev is required. . This is the shared version of libcurl. . Homepage: http://curl.haxx.se
Ну а теперь собрать:
dpkg -b ./someprog some-prog-123-new.deb
Этой информации достаточно, чтобы собрать/пересобрать простенький пакет. На самом деле можно ещё запускать скрипты при установке пакета, при его удалении и много чего ещё, что нужно нормальному maintainer’у.
Ссылки
Некоторые команды мне подсказал Александр Герасёв http://gq.net.ru/2007/03/16/building-deb-packages/
Официальное полное руководство на Русском http://www.debian.org/doc/maint-guide/
Уголок разработчика Debian http://www.debian.org/devel/
Хороший цикл статей Цикл статей по сборке RPM и DEB пакетов , правда автор предвзято относится к сборке deb-пакетов, но если на это не обращать внимания, вполне приличный обзор.
Полигон призраков
Кто-нибудь может создать deb пакет из tar.gz ?
Поиск, обмен ссылками, вопросы по устаревшему программному обеспечению.
grey_rat Advanced Member Сообщения: 336 Зарегистрирован: 13.06.2019,21:29 Откуда: Минск
Кто-нибудь может создать deb пакет из tar.gz ?
Сообщение grey_rat » 25.12.2020,22:44
Хочу вернуть поддержку VLC плагина в Firefox 68-84 для Linux так же как для Windows.
Я знаю как отредактировать нужные файлы из npapi-vlc-2.2.0.tar.gz , но я не умею создавать рабочий deb пакет.
grey_rat
v74m Advanced Member Сообщения: 531 Зарегистрирован: 17.02.2016,13:24 Откуда: SPb
Кто-нибудь может создать deb пакет из tar.gz ?
Сообщение v74m » 25.12.2020,23:38
попробуйте конвертер пакетов alien
Всякое бывает.
v74m
grey_rat Advanced Member Сообщения: 336 Зарегистрирован: 13.06.2019,21:29 Откуда: Минск
Кто-нибудь может создать deb пакет из tar.gz ?
Сообщение grey_rat » 26.12.2020,12:23
Вот это пугает
И в заключение — очень важное замечание: применять утилиту alien целесообразно только к простым пакетам, без многочисленных зависимостей и сложных установочных сценариев — именно таковы были все рассмотренные выше случаи. В противном случае не гарантируется не то что превосходный, но даже просто приемлемый результат.
grey_rat
ATauenis Advanced Member Сообщения: 5466 Зарегистрирован: 30.04.2015,21:30 Откуда: Москва Контактная информация:
Вклад в сообщество
Кто-нибудь может создать deb пакет из tar.gz ?
Сообщение ATauenis » 26.12.2020,17:40
grey_rat писал(а): ↑ 25.12.2020,22:44 Я знаю как отредактировать нужные файлы из npapi-vlc-2.2.0.tar.gz , но я не умею создавать рабочий deb пакет.
Можно распаковать его архиватором, исправить файлы, поправить md5sums, потом заархивировать обратно. Получится deb.
ATauenis
geg Advanced Member Сообщения: 11781 Зарегистрирован: 21.11.2010,12:04
Кто-нибудь может создать deb пакет из tar.gz ?
Сообщение geg » 26.12.2020,17:55
ATauenis писал(а): ↑ 26.12.2020,17:40 Можно распаковать его архиватором, исправить файлы, поправить md5sums, потом заархивировать обратно. Получится deb.
grey_rat Advanced Member Сообщения: 336 Зарегистрирован: 13.06.2019,21:29 Откуда: Минск
Кто-нибудь может создать deb пакет из tar.gz ?
Сообщение grey_rat » 26.12.2020,22:54
А зачем править md5 ? Deb получится, как я понимю, после прогонки созданного архива в alien или типа того. Но будет ли оно работать?
Ну хотя бы родной без изменений https://download.videolan.org/pub/video . 0.6.tar.xz сделать рабочим deb пакетом, получится или нет?
grey_rat
geg Advanced Member Сообщения: 11781 Зарегистрирован: 21.11.2010,12:04
Кто-нибудь может создать deb пакет из tar.gz ?
Сообщение geg » 26.12.2020,23:36
grey_rat писал(а): ↑ 26.12.2020,22:54 Но будет ли оно работать?
Вы какие-нибудь текстовые файлы внутри архива читали? Хотя бы INSTALL?
ATauenis Advanced Member Сообщения: 5466 Зарегистрирован: 30.04.2015,21:30 Откуда: Москва Контактная информация:
Вклад в сообщество
Кто-нибудь может создать deb пакет из tar.gz ?
Сообщение ATauenis » 27.12.2020,10:59
aleksvolgin писал(а): ↑ 26.12.2020,17:55 рукалицо.
Точно. Прочёл невнимательно. Там исходного deb нет, который надо было бы подправить, а простой tar.gz.
Тогда вот топикстартеру подборка информации для размышлений: https://yandex.ru/search/?text=dpkg-bui . >Вернуться к началу
ATauenis
grey_rat Advanced Member Сообщения: 336 Зарегистрирован: 13.06.2019,21:29 Откуда: Минск
Кто-нибудь может создать deb пакет из tar.gz ?
Сообщение grey_rat » 27.12.2020,12:33
Я так понял, что где-то надо найти человека, который сможет собрать deb пакет. Ибо сам я тут ничего не сделаю.
grey_rat
STIW Advanced Member Сообщения: 5898 Зарегистрирован: 02.05.2007,16:02 Откуда: Тамбов
Кто-нибудь может создать deb пакет из tar.gz ?
Сообщение STIW » 28.01.2021,08:27
grey_rat , не знаю, как это поможет, и поможет ли как-нибудь (линух — не моя тема), но один маньяк тут советует (мапэд не мой):
1. Распаковать архив из-под обычного пользователя
2. Перейти в директорию с программой, которую распаковал архив выше
3. Выполнить: $ ./configure && make
4. Затем, не выходя из директории, залогиниться из-под root’а: $ su
5. Выполнить команду $ checkinstall -D -y —install=»no»
6. Выполнить: $ chown -R вася_user:вася_group ./
где: вася_user — имя обычного пользователя (пункт 1 выше); вася_group — имя его группы
7. Выйти из root’а обратно к обычному пользователю: $ exit
8. Найти полученный DEB-файл: $ ls -l ./*.deb
9. Сохранить его себе туда, куда нужно
(тупо скопипастил, так что — без претензий, но узнать, помогло ли, интересно)
Получить deb-пакет из исходников, чтобы все было по-взрослому
Исходно проблема такая. Нужно в Ubuntu 22.04 поставить Slurm версии не менее 22.05. Предлагаемая в Ubuntu 22.04 версия Slurm меня не устраивает по причине отсутствия поддержки Cgroups v2, переключаться на v1 мне не хотелось бы. Смешивать пакеты из разных дистрибутивов, как я понимаю, не благословляется из-за конфликта зависимостей.
Возникла идея сделать свою сборку из исходников, но чтобы было все по-взрослому, прям как пакет из дистрибутива. Чтобы пакет учитывал особенности Ubuntu, были разные дополнительные вещи типа поддержки logrotate и другие тонкости о которых я даже не знаю. Для этого, видимо, нужны дополнительные файлы, которые делают Сопровождающие.
В Ubuntu 23.04 есть подходящая версия Slurm — 22.05.8. На сайте Ubuntu можно найти файлы: slurm-wlm_22.05.8-3.dsc, slurm-wlm_22.05.8.orig.tar.gz и slurm-wlm_22.05.8-3.debian.tar.xz. Это, я так понимаю, исходник и необходимые вспомогательные файлы. Теперь это надо как-то легким движение превратить в полноценный deb-пакет, но только для Ubuntu 22.04.
Это вообще реально? Как сделать? Какие могут быть проблемы?
zb2
06.03.23 15:47:46 MSK
- Ответить на это сообщение
- Ссылка