Алексей Федорчук
Задавшись целью создать репозиторий 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
целесообразно только к простым пакетам, без многочисленных зависимостей и сложных установочных сценариев — именно таковы были все рассмотренные выше случаи. В противном случае не гарантируется не то что превосходный, но даже просто приемлемый результат.
Спасибо, Алексей, очень интересный материал, в особенности по конвертации из tar.gz и переименованию для этого tar.xz.
Только вопрос, в результате конвертации все файлы будут иметь в конце all.deb? По приведённому в качестве примера редактора micro на сайте предлагаются архивы для Linux:
micro-3afb3d0-linux32.tar.gz и micro-3afb3d0-linux64.tar.gz.
На выходе оба будут иметь расширение all.deb. Или их нужно переименовывать, чтобы учесть архитектуру?
Да, Таня, alien конструирует имя из исходного пакета по своим правилам, поэтому я переименовывал для единообразия — с префиксом fonts для шрифтовых файлов, с указанием архитектуры — как для скомпилированных бинарников. Более-менее стараясь придерживаться стандартной номенклатуры Ubuntu.