Утилита alien: конвертация пакетов в deb-формат

Алексей Федорчук

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

Все кандидаты на включение в прото-репозиторий (шрифты, русский спеллинг с поддержкой Ё, простенький редактор micro) были очень просты, и возиться со всамделишней сборкой посредством apt-build или чего-то подобного показалось мне нецелесообразным. К тому же все они (кроме micro) имелись в бинарном виде в «домашних» репозиториях openSUSE или в Arch User Repository. И потому я воспользовался утилитой alien.

Утилита эта была написана в незапамятные времена и специально предназначена для конвертации бинарных пакетов, собранных для разных дистрибутивов, из одного формата в другой. Поддерживаемые форматы — deb, rpm, tgzиз Slackware (и абстрактный tar.gz — тоже), slp из Stampede (был некогда такой дистрибутив Linux’а, в своё время — самый фронтирный) и pkg из Solaris.

Утилита alien входит в последнюю сборку Cintu — cintu-maxi-16041-7ts. В сборке cintu-midi-16041-3ts (как и во всех остальных Ubuntu’идах) её легко установить из официального репозитория:

$ sudo apt install alien

Целевым форматом по умолчанию в alien выступает deb, прочие задаются соответствующими опциями, на которых я останавливаться не буду (заинтересованным предлагаю обратиться к тёте Мане — man alien). Конвертация в deb-пакет из любого другого формата требует прав администратора (на причинах этого здесь останавливаться не буду). Однако пользоваться на предмет их обретения командой sudo здесь не желательно (хотя и не запрещается): после этого сгенерённый файл *.deb будет принадлежать root‘у, со всеми вытекающими из этого неудобствами.

Так что проще воспользоваться утилитой fakeroot, которая имеется и в midi-, и в maxi-редакции Cintu. А в произвольной системе Ubuntu based её можно установить из официального репозитория:

$ sudo apt install alien

Утилита fakeroot после запуска (кстати, не требующего ввода пароля) создаёт «псевдоадминистративное окружение». Как и sudo, её можно использовать двояко. Во-первых, дать команду

$ fakeroot

после которой последует две жалобы на «несекьюрность» текущего каталога (в обоих случаях надо отвечать согласием, то есть y), после чего в приглашении командной строки вместо пользователя можно увидеть «администратора». То есть в Cintu по умолчанию это будет выглядеть так:

[alv]=$ fakeroot
zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]? y
zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]? y
[root]=$

Однако реальным пользователем всё равно остаётся тот, кто запустил fakeroot, в чём легко убедиться такой командой:

[root]=$ echo $USER
alv

Теперь можно дать команду конвертации, например, такую:

[root]=$ alien thessalonica-theano-otf-fonts-2.0-19.77.noarch.rpm

Которая завершится сообщением:

thessalonica-theano-otf-fonts-2.0-19.77.noarch.deb generated

При необходимости команду можно повторить для следующего файла, или задать сразу несколько аргументов. А по окончании всей процедуры конвертации — вернуться в нормальную пользовательскую среду командой exit. И убедиться, что владельцем конвертированного файла будет не root, как в случае применения sudo, а пользователь:

[alv]=$ ls -l adobe-sourcecodepro-fonts_2.010-23.5_all.deb
-rw-r--r-- 1 alv alv 1297642 сен 20 22:27 adobe-sourcecodepro-fonts_2.010-23.5_all.deb

Если требуется конвертировать единичный пакет — можно поступить проще:

[alv]=$ fakeroot alien micro-d41f0bb_amd64.tar.gz
micro-d41f0bb-amd64_1-2_all.deb generated

С тем же самым результатом:

[alv]=$ ls -l micro-d41f0bb-amd64_1-2_all.deb
-rw-r--r-- 1 alv alv 2173384 сен 20 22:35 micro-d41f0bb-amd64_1-2_all.deb

Внимательный читатель обратил внимание, что в списке поддерживаемых утилитой alien форматов нет tar.xz (txz), а утилита xz нынче часто используется для компрессии тарбаллов. И действительно, напрямую конвертировать файл с таким суффиксом не удастся:

[alv]=$ fakeroot alien otf-bitter-1-2-any.pkg.tar.xz
Unknown type of package, otf-bitter-1-2-any.pkg.tar.xz.

Однако тут помогает нехитрая уловка — банальное переименование tar.xz в tar.gz, поскольку alien сам непосредственно распаковкой и упаковкой архивов не занимается.

И действительно, если выполнить такую операцию:

[alv]=$ cp otf-bitter-1-2-any.pkg.tar.xz otf-bitter-1-2-any.pkg.tar.gz

А уже затем дать команду конвертации, всё пройдёт без сяких яких:

[alv]=$ fakeroot alien otf-bitter-1-2-any.pkg.tar.gz
otf-bitter-1_2-2_all.deb generated

Команду alien можно применять не только к пакетам какого-либо дистрибутива, но и к абстрактным тарбаллам — выше это было проделано для редактора micro, откомпилированный бинарник которого скачан с официального сайта проекта.

Более того, alien работает даже с самосборными тарбаллами. Например, шрифта Monofur в виде пакета не найти, наверное, ни в одном дистрибутиве. Он доступен в виде zip-архива в одной из шрифтовых коллекций. Его можно распаковать, входящие файлы распихать по нужным подкаталогам (собственно шрифты monof55.ttf и monof56.ttf — в usr/share/fonts/truetype, текст лицензии monof_tt.txt в usr/share/licenses), а из родительского каталога сделать архив monofur-otf_1-1_all.tar.gz и подсунуть его в качестве аргумента команды alien. С генерацией deb-пакета на выходе. Да, это не эстетично идеологично, зато «дёшево, надёжно и практично».

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

Утилита alien: конвертация пакетов в deb-формат: 2 комментария

  1. Спасибо, Алексей, очень интересный материал, в особенности по конвертации из tar.gz и переименованию для этого tar.xz.
    Только вопрос, в результате конвертации все файлы будут иметь в конце all.deb? По приведённому в качестве примера редактора micro на сайте предлагаются архивы для Linux:
    micro-3afb3d0-linux32.tar.gz и micro-3afb3d0-linux64.tar.gz.
    На выходе оба будут иметь расширение all.deb. Или их нужно переименовывать, чтобы учесть архитектуру?

  2. Да, Таня, alien конструирует имя из исходного пакета по своим правилам, поэтому я переименовывал для единообразия — с префиксом fonts для шрифтовых файлов, с указанием архитектуры — как для скомпилированных бинарников. Более-менее стараясь придерживаться стандартной номенклатуры Ubuntu.

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