Как сделать “backport” пакета

1. Введение.

Поскольку я обновляю дистрибутив на домашнем компе редко, в основном по LTS релизам, то зачастую, версии софта в репозитории моего дистра достаточно устаревшие.

Понятное дело, что ставить пакет например из Ubuntu 14.04 в 12.04 бесполезная трата времени, во первых, т.к. будет куча неудовлетворенных зависимостей, во вторых, даже если забить на формальности, то бинарники из нового дистрибутива, как правило собраны под более новые библиотеки (libc, glib и т.д.), и скорее всего не будут работать.

Вариант переустановить систему на более новую я не рассматриваю. Поэтому основных решений обычно два:

1. Поискать готовый пакет под свою систему в ppa (https://launchpad.net/ubuntu/+ppas)

2. Портировать пакет из свежего дистра в свой.

Ставить пакеты из ppa, не очень безопасно, хорошо, если данный ppa принадлежит разработчику программы, и он там распростаняет свои сборки. Но чаще всего, архив принадлежит совершенно посторонним людям, и никаких гарантий, что в программу не засунули бэкдор нет.

Благо бэкпортить не сложно. Один из способов это селать, я покажу на примере программы snort. Что для этого нужно:

1. Установить ubuntu-dev-tools
2. Сгенерировать  пару gpg ключей.
3. Установить все необходимые для компиляции snort пакеты.
4. С помощью backportpackage получить необходимые для компиляции файлы.
5. Скомпилировать прогрумму.

2. Подготовка.

Пару дистрибутивов назад, для бекпорта требовалось масса телодвижений, все приходилось делать в ручную. Если для простых программ (не требующих перекомпиляции библиотек от которых они зависят) процесс был проще (быстрее можно было собрать пакет), то в общем случае, все было муторно и долго.

Во первых, теперь достаточно установить всего один пакет ubuntu-dev-tools, который притащит все необходимое в зависимостях, и попутно поставит написанные энтузиастами скрипты для создания бэкпортов. Скрипты эти хороши тем, что не нужно задумываться над такими вещами как устройство пакетов debian.
aptitude install ubuntu-dev-tools
Для работы некоторых скриптов, требуется что бы у вас был сгенерирован gpg ключ, которым будут подписываться созданные пакеты. Будем считать, что у вас ключей нет.

Для их генерации делаем:
gpg --gen-key --no-use-agent
После введения команды последует примерно такой диалог:
serp@testhost:~/snort$ gpg --gen-key --no-use-agent
gpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 1024
Requested keysize is 1024 bits
Please specify how long the key should be valid.
0 = key does not expire
<n>  = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Tue 07 Apr 2015 04:30:25 PM MAGT
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: Sergei (SerP) Pustovoi
Email address: serp2002@inbox.ru
Comment: for backporting
You selected this USER-ID:
"Sergei (SerP) Pustovoi (for backporting) <serp2002@inbox.ru>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 290 more bytes)

.+++++
+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
..+++++
+++++
gpg: /home/serp/.gnupg/trustdb.gpg: trustdb created
gpg: key 65F82D5E marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2015-04-07
pub   1024R/65F82D5E 2014-04-07 [expires: 2015-04-07]
Key fingerprint = B6DE E143 478D 8975 3085  A29A 2137 77F6 65F8 2D5E
uid                  Sergei (SerP) Pustovoi (for backporting) <serp2002@inbox.ru>
sub   1024R/2AC70EC5 2014-04-07 [expires: 2015-04-07]

 

На этапе генерации процесс может тормознуться на стадии:
Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 290 more bytes)

Что бы это ускорить, проще всего, чего-нибудь поделать на компьютере, файлы покопировать, покомпилять что-то. Это позволит собрать системе необходимое количество энтропии, для создания криптоключей. Ну или оставить его в покое на длительное время.

Далее нужно прописать идентификатор ключа в файл ~/.devscripts. Для этого в этот файл нужно вписать строку вида:
DEBSIGN_KEYID=2AC70EC5
Где 2AC70EC5 – идентификатор сгенерированного вами ключа, который можно узнать после генерации (см. выше) в строке 1024R/2AC70EC5. Здесь 1024 означает длину ключа, а буква R означает что ключ RSA. Или можно посмотреть позже командой gpg –list-keys:
serp@testhost:~$ gpg --list-keys
/home/serp/.gnupg/pubring.gpg
-----------------------------
pub   1024R/65F82D5E 2014-04-07 [expires: 2015-04-07]
uid                  Sergei (SerP) Pustovoi (for backporting) <serp2002@inbox.ru>
sub   1024R/2AC70EC5 2014-04-07 [expires: 2015-04-07]

3. Создание пакета.

Что бы не запутаться создадим директорию:
Mkdir tmp
Далее можно приступать к получению архивов с исходниками:
backportpackage -d precise -s trusty -w ./tmp snort
Где «-d precise» дистрибутив в который мы портируем, а «-s trusty» из которого, а «-w ./tmp» обозначает только что созданную нами директорию, как «рабочую» в данном процессе.

Если на этом этапе выскочит ошибка со словами «clearsign failed: secret key not available». Значит скрипт не может найти ключ, проверьте все ли верно в файле “.devscripts”.

Теперь в директории tmp должны лежать файлы необходимые для сборки пакета. В моем случае, пришлось еще ставить зависимости для сборки:
aptitude build-dep snort
Команда ставит кучу пакетов. Если команда выдала ошибку, нужно проверить прописаны ли в /etc/apt/sources.list deb-src строки. Естественно, они должны быть раскомментированы.

Далее с помощью
dpkg-source -x ./tmp/snort_2.9.6.0-0ubuntu1~precise1.dsc
Можно распаковать полученные файлы. Вместо «snort_2.9.6.0-0ubuntu1~precise1.dsc» должен быть сгенерированный ранее вами файл. Хочу обратить внимание, что в папке tmp, к этому моменту будет 2 файла «.dsc» – оригинальный, и бэкпорт, в имени файла бэкпорта (который нам и нужен), будет присутствовать «дистрибутив назначения» указанный нами ранее.

После этого в текущей директории появится новая папка, в которую нужно перейти
cd ./snort-2.9.6.0
И в ней выполнить команду на компиляцию:
dpkg-buildpackage –rfakeroot
В моем случае это вызвало несколько ошибок типа:
dpkg-buildpackage: warning: Build dependencies/conflicts unsatisfied; aborting.
dpkg-buildpackage: warning: (Use -d flag to override.)

У меня это случилось изза того, что библиотека libdaq-dev, для компиляции требуется версии >= 2.0, а установлена была 0.6. Т.о. мне пришлось сперва забекпортить ее, а потом уже мою прогу компилять. Описывать я это не буду, все делается так же.

Затем скрипт отчего то запросил у меня dh-autoreconf, странно, что оно не поставилось само ранее. Сделал так:
aptitude install dh-autoreconf
Если же ошибок после «dpkg-buildpackage –rfakeroot» у вас не было, то каталогом выше, должны появиться файлы deb. В моем случае их 2:
snort_2.9.6.0-0ubuntu1~precise1_amd64.deb
snort-common-libraries_2.9.6.0-0ubuntu1~precise1_amd64.deb

Теперь можно их установить:
Dpkg –I ./snort-common-libraries_2.9.6.0-0ubuntu1~precise1_amd64.deb
Dpkg –I ./snort_2.9.6.0-0ubuntu1~precise1_amd64.deb

Далее полученный пакет можно без проблем загрузить в свой собственный ppa, откуда его смогут получить все желающие. Но это уже другая история.

Добавить комментарий

Войти с помощью: