Как пересобрать пакет debian

Обновлено: 07.07.2024

Правильный выход в данной ситуации - подключить deb-src репозитарии, и пересобрать программу именно из тех исходников, которые использовали авторы дистрибутива.

Шаг первый - подготовка

Вначале надо убедиться, что в файле /etc/sources.list есть строки, в которых прописаны репозитарии исходников. Например, в Debian Squeeze должны присутсвовать строки:

Строка, начинающаяся с deb-src - это и есть репозитарий исходников.

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

Во-первых , нужно запомнить, что для каждого пакета из deb обязательно существует его исходник в deb-src . Исключение составляют только мета-пакеты, но они нам неинтересны. То есть, если вы в synaptic видите пакет с именем, например, iptables, то в командах получения исходников нужно использовать это же имя iptables.

Во-вторых нужно знать, что после прописывания строк, начинающихся с deb-src в /etc/sources.list , и после последующей команды " apt-get update ", вы в synaptic или aptitude не увидите пакетов с исходниками. Они будут подключены, система будет знать об пакетах-исходниках, но вы не увидите их наличие.

Шаг второй - получение и распаковка исходников

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

От обычного пользователя (не от рута) даём команду:

$ apt-get source konsole

В результате будут скачаны файлы исходников и размещены в текущем каталоге. Вывод будет примерно вот такой:

Необходимо получить 4 082 kб архивов исходного кода.

Получено 4 082 kБ за 44с (91,3 kБ/c)

dpkg-source: инфо: извлечение kdebase в kdebase-4.4.5

dpkg-source: инфо: распаковывается kdebase_4.4.5.orig.tar.bz2

dpkg-source: инфо: распаковывается kdebase_4.4.5-2.debian.tar.gz

dpkg-source: инфо: накладывается debian-T-addition.diff

Шаг третий - установка зависимых пакетов

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

В результате чего будут закачаны и установлены все пакеты, без которых не заработает сборка нашей программы.

Шаг четвёртый - компиляция

Для компиляции нажно сделать не совсем обычную вещь. В нашем текущем каталоге, в результате наших действий, образовались всякие новые файлы и подкаталоги. Нам нужно нужно найти файл с именем "rules". Это исполнимый файл. У меня он оказался расположен так:

После того, как его нашли, нужно относительно него подняться на каталог выше, и дать от обычного пользователя команду:

$ fakeroot ./debian/rules binary

В результате работы этой команды вначале запустится компиляция, а затем в текущем рабочем каталоге должен появиться *.deb-файл, внутри которого будет лежать только что скомпилированная программа. Может оказаться так, что будет сгенерирован не один *.deb, а несколько, соответсвущих другим программам, находящихся в том же пакете с исходниками.

Например, у меня были сгенерированы следующие пакеты:

Среди этих пакетов есть и интересующий нас konsole_4.4.5-2_i386.deb .

Шаг пятый - установка

Чтобы установить новый пакет поверх имеющегося, нужно от рута дать команду:

Хехе, скорее всего команду эту вы будете выполнять в Konsole? Это делать ненадо, а то установка вылетит на середине, когда будут заменять файлы Konsole. Нужно запустить xterm, перейти в наш рабочий каталог, и там выполнить от рута данную команду.

На шагах 1. 5 мы убедились, что исходники у нас имеются, и они собираются без ошибок. Теперь можно внести изменения в исходники, и получить исправленную нами программу.

Как было написано вначале, нам не нравится форма курсора в Konsole. Многие олдфаги привыкли к мигающем курсору в виде подчеркивания. Такая форма курсора есть в терминале Konsole среды KDE4, но форма представлена в виде тоненькой чёрточки высотой в 1 пиксель. Такой курсор трудно находить на экране.

В то же время, если внимательно рассмотреть курсор в Text Mode, можно убедиться, что он имеет высоту как минимум 2 пикселя, и за счет такой жирности хорошо детектируется на пространстве экрана. При этом курсор не является вырвиглазным блоком, занимающим целое знакоместо.

Небольшой экскурс в историю. Знакосимвольные терминалы обычно имели два вида курсора, которые можно было переключать, записывая в определённый порт нужное значение. Был курсор-подчеркивание, и курсор-блок. Кроме того, можно было настраивать, мигает курсор или нет. Эти настройки были реализованы как в советских микрокомпьютерах, имеющих видеоадаптер на микросхеме КР580ВГ75, так и на более старших моделях - всяких ЕС и IBM PC/XT.

Обратите внимание, что на всех этих фотографиях высота курсора 2 пикселя, а не 1. Отцы-основатели знали что делали, в отличие от нынешних кодеров-обезьянок.

Значит, нам нужно изменить толщину курсора. Рендеринг курсора был найден в файле:

В этом файле находим метод drawCursor, и находим место, в котором отрисовывается курсор в виде подчеркивания. Вот это место:

else if ( _cursorShape == UnderlineCursor )

Нам нужно нарисовать две линии, поэтому заменяем данный код вот таким:

else if ( _cursorShape == UnderlineCursor )

Далее выполняем шаги 4 и 5, запускем Konsole, и видим прекрасный курсор, такой, какой нам надо. Теперь моя консоль выглядит просто прелестно.

Дистрибутивы, основанные на Debian – это не только отличная система управления пакетами APT, которая сама разрешает зависимости, но и удобные инструменты для создания пакетов и своих репозиториев. Если уж вы решились собрать программу из исходников, то советую ещё изучить, как дебианизировать исходники. Это отнимет чуть больше времени, чем стандартное

но зато позволит сохранить систему в чистоте. Удалить программы, установленные командой make install, можно только командой

но не все исходники это поддерживают, а что ещё чаще - исходники удаляют после установки, тогда удалить программу можно только вручную. Но чтобы это сделать, нужно точно знать что и куда установилось. А это уж точно никто не знает, кроме самих разработчиков программы (ну или тех, кто более-менее разбирался в исходниках программы).

APT не знает ничего о программах, установленных вручную. Соответственно, могут быть конфликты, или просто непонятные ошибки. Очень часто исходники по умолчанию «рассчитаны» на определённый дистрибутив, или, наоборот, рассчитаны только на установку из исходников, при этом выполняются разного рода «удобные» настройки в конфигурационных файлах. Так, например, очень любят прописывать mime-типы. Но проблема в том, что переводы разные бывают и в Nautilus может выскочить ошибка

и документ не будет открываться. Таких «недочётов» может быть очень много. А теперь, если представить что это удалить нельзя, поскольку пользователь не запоминал что и куда поставилось, наступает паника и как результат - переустановка.

Но как быть, если программу хочется поставить, а версия в deb-пакете устарела, или такой вообще нет? Использовать программу checkinstall . Она собирает всё в один пакет. К сожалению, она позволяет решить только вопрос с удалением программы. И даже если APT будет знать, что программа установлена, он в лучшем случае сообщит, что есть конфликт файлов,

Чаще всего такие случаи очень корректно разрешаются путём удаления конфликтного пакета. Но на разбор ситуации уйдёт некоторое время.

Cобрать нормальный пакет, как это делают мантейнеры. В котором будет корректная версия, зависимости и расположение файлов будет соответствовать политике дистрибутива. Вижу вам всё ещё интересно . Это радует.

Возможны следующие случаи сборки пакетов:

исходники или бинарные файлы берутся:

из репозитория другого выпуска Ubuntu, из PPA или из Debian; берётся из репозитория Ubuntu, из PPA или из Debian: ни в репозитории Ubuntu текущего выпуска, ни в PPA нет нужной версии программы; доступная версия программы по каким-либо причинам не устраивает (не устраивает код или данные программы, параметры конфигурации или управляющая информация пакета); Дано: некий исходник gcoolprog-0.5.3.tar.bz2. Нужно из него собрать пакет. Решение: ниже идёт вариант, как я обычно поступаю в таком случае. Первым делом смотрю, нет ли deb-пакета той же версии, но допустим под Debian. Если есть делаю так: есть нужная версия пакета в репозитории debian или в будущем релизе Ununtu Если нет той же версии, но есть предыдущей. Тут можно сказать как повезёт, если изменения в исходниках не коснулись положения файлов, то скорее всего дебианизация от старого пакета подойдёт, нужно лишь сменить версию. Теперь вариант в репозитории есть пакет предыдущей версии. Ну и самый страшный случай - нигде никаких deb-пакетов нет, только tar.gz и rpm. Ни в коем случае не использовать rpm! Делаем по первому варианту.

Что необходимо

Полное Руководство начинающего разработчика Debian доступно тут.

К сожалению, на русском, информация немного устарела, свежая инструкция доступна на английском. Но принципы не изменились, поэтому если интересны детали лучше прочитать руководство от и до.

Нам понадобятся как минимум программы, устанавливаемые командой

Можно так же autobook - это документация по утилитам GNU Autoconf , Automake , и Libtool . Ну и конечно то, что требуют сами исходные коды для корректной сборки.

Создание ключа шифрования

Этот шаг не обязателен, его можно пропустить.

Чтобы создать ключ, зайдите в Приложения → Стандартные → Пароли и ключи шифрования. В открывшемся окне, в меню Ключ → Новый ключ, выбираем ключ pgp. Заполняем поля Полное имя и Электронный адрес.

В мире свободного программного обеспечения, для предотвращения «краж» или «подделок», принято подписывать свои «ценные» вещи электронным ключом, открытая часть которого хранится на общедоступных серверах и позволяет другим пользователям легко выяснить подлинность и целостность той или иной вещи.
Поэтому отнеситесь к созданию ключа очень ответственно.
Никто вас не заставляет вписывать сюда реальные имя и фамилию, или ещё какие-нибудь личные данные, но если вас не разыскивает интерпол - думаю указать фамилию и имя будет верным решением, хотя можно и просто свой ник В общем, решайте сами. А вот почтовый адрес укажите реальный, и который вы не поменяете.

Хотя последняя версия программы seahorse имеет демон, который автоматически запускается в сеансе GNOME, и умеет «запоминать пароль» на время сеанса, но пока не все программы умеют с ней работать.

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

/.bashrc, или в другой стартовый скрипт, вашего любимого шелла (для zsh

/.zshrc), нужно вписать переменные

На основании e-mail будет искаться ключ в pgp, при подписи пакета.
Нужно завершить сеанс и зайти заново, чтобы изменения вступили в силу.
Помните, что если вы бэкпортируете пакет, дебианизированный не вами, обязательно нужно изменить версию командой

для того, чтобы в изменения вписался ваш e-mail. А для того, чтобы ваш открытый ключ попал на сервер, необходимо в настройках «seahorse → Пароли и ключи шифрования», настроить соединение с сервером публичных ключей.
Для этого, в меню Правка→Параметры на закладке Публикация ключей необходимо поставить галку Публиковать ключи….
Теперь можно выбрать ключ и в меню по правой кнопке выбрать Синхронизировать и опубликовать ключи.

Дебианизация недоступна

Итак, у нас есть только gcoolprog-0.5.3.tar.gz.

Обычно я выполняю следующие действия:

Предварительно подготавливаю рабочую директорию

Получаем файл gcoolprog-0.5.3.tar.gz. Распакуем его перейдем в полученный каталог:

Для корректной сборки нужно, чтобы корневая директория содержала не только название, но и версию!

Ниже будем считать директорию

/src/gcoolprog/0.5.3/gcoolprog-0.5.3 корневой директорией исходников.
Далее выполняем «черновую» сборку. Т.е. сконфигурируем и соберем приложение, без его установки:

Если команда выполнилась успешно, то осталось только дебианизировать.

Дебианизация

Ничего страшного в этом нет, как я уже говорил есть скрипты, которые сильно упрощают этот процесс.
Вообще смысл всей этой процедуры - создать директорию debian в корне исходников, с нужными файлами конфигурации и скриптом(ами).
Для этого, в корне исходных текстов, выполним

На что мы должны получить следующий диалог

Тут мы указываем сформировать пакет, для одиночного бинарного файла.

Но мы с вами молодцы и всё у нас прошло без ошибок - появился каталог debian в корне исходников, посмотрев его содержимое, Вы увидите кучу файлов (расширение .ex) с примерами на все случаи жизни.

Будем считать, что программа у нас простая – обычно ни один из этих файлов не нужен.
Первым делом, нужно добавить описание программы в файле debian/control

без этого мы получим пустой пакет.
Иногда debian/rules содержит лишь:

Что приемлемо с использованием debhelper.
Этих настроек будет достаточно для сборки пакета с одной программой, которая не содержит разделяемых библиотек, т.е. только бинарник в /usr/bin и данные в /usr/share.

Сборка пакета

Теперь, соберём пакет:

В директории выше, т.е. в

/src/gcoolprog/0.5.3, мы получим файлы

Вот теперь мы можем установить пакет

Дебианизация берётся из репозитория Ubuntu, из PPA или из Debian

Дебианизация берётся из другой версии программы

Как я уже сказал, возможно нам повезёт и достаточно будет только сменить версию. Но не будем гадать.

Ниже я не буду комментировать то, что описано в предыдущем решении.

Предварительно подготовим рабочую директорию

получаем файл gcoolprog-0.5.3.tar.bz2

теперь распаковываем его

копируем каталог gcoolprog-0.5.1/debian в директорию

дальше нам нужно изменить версию командой

этой командой изменяется файл debian/changelog например увидим

но поскольку у нас версия 0.5.3, то нужно изменить значения на

сохраните изменения. Теперь можно выполнить команду сборки в пакет.

Дебианизация берётся из текущей версии программы

Дебианизация берётся не из репозитория текущего выпуска Ubuntu

Предварительно подготовим рабочую директорию

теперь скачиваем три файла

или тоже самое, но одной командой

из пакета devscripts
затем распакуем командой

получим каталог gcoolprog-0.5.3.Перейдём в него и сменим версию:

теперь можно собирать пакет

Дебианизация берётся из репозитория текущего выпуска Ubuntu

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

Для сборки понадобятся следующие пакеты: build-essential devscripts fakeroot. Потребуются также пакеты для разработки, мы их установим в дальнейшем.

apt-get source скачивает исходники из репозитория Ubuntu в текущую директорию. Многие пакеты в репозитории имеют общие друг с другом исходники, поэтому кроме исходников выбранного пакета могут скачаться и исходники других пакетов (общие для нескольких пакетов исходники).

Далее вносим изменения в исходники и собираем из них обратно пакеты.

Устанавливаем необходимые для сборки пакеты для разработки:

Ниже идёт пример как можно поступить в случае, если доступен только deb-пакет и нет его дебианизированных исходников.

Для начала советую прочитать это. И это. Тут полная документация на русском.

Предположим, что работаем в каталоге

/tmp. Создадим подкаталог

/tmp/someprog, чтобы распаковать файлы какого-нибудь пакета, нужно выполнить

Для того, чтобы извлечь контрольную информацию, выполним

ну а теперь, чтобы всё это собрать обратно в пакет, нужно выполнить

/tmp/someprog/DEBIAN содержатся файлы, описывающие, что это за пакет, от чего он зависит, и контрольные суммы файлов, находящихся в нём. Для того, чтобы собрать свой пакет, нужно поместить файлы в каталоге

/tmp/someprog так, как будто это корневой каталог.То есть, если нужно, чтобы файл установился в /usr/bin,нужно его поместить в каталог

/tmp/someprog/usr/bin, ну и, соответственно, если что-то должно лежать в /etc, то в

/tmp/someprog/etc и т.д.

/tmp/someprog создать каталог DEBIAN, обязательно большими буквами, и в нём файл

/tmp/someprog/DEBIAN/control, в этом файле описывается название пакета, его зависимости и описание, формат очень простой. Например:

Ну а теперь собрать:

7.1 Какие программы для управления пакетами имеются в Debian?

7.1.1 dpkg

Это основная программа управления пакетами. dpkg может использоваться с многими параметрами. Некоторые из них:

Вывести список всех параметров: dpkg --help .

Вывести информацию для заданного пакета: dpkg --info foo_VVV-RRR.deb

Установить пакет (т.е. распаковать и настроить) на жесткий диск: dpkg --install foo_VVV-RRR.deb .

Распаковать (но не настраивать) файлы из архива Debian на жесткий диск: dpkg --unpack foo_VVV-RRR.deb . Заметим, что данная операция не обязательно приводит пакет в рабочее состояние; некоторые файлы могут требовать внесения изменений для правильной работы. Данная команда удаляет любую ранее установленную версию программы и запускает сценарий preinst (см. Что это за сценарии preinst, postinst, prerm и postrm?, раздел 6.6), связаный с пакетом.

Настроить пакет который ранее был распакован: dpkg --configure foo . Кроме всего прочего, эта команда запускает сценарий postinst (см. Что это за сценарии preinst, postinst, prerm и postrm?, раздел 6.6) связанный с пакетом. Она также обновляет файлы перечисленные в conffiles для этого пакета. Заметим, что данной команде передается в качестве аргумента имя пакета (т.е., foo), а не имя файла архива Debian (т.е., foo_VVV-RRR.deb).

Извлечь единственный файл с именем "blurf" (или группу файлов с именами "blurf*") из архива Debian: dpkg --fsys-tarfile foo_VVV-RRR.deb | tar -xf - blurf*

Удалить пакет (но не его файлы конфигурации): dpkg --remove foo .

Удалить пакет (в том числе и файлы конфигурации): dpkg --purge foo .

Перечислить статус (установлен или нет) пакетов содержащих в имени строку (или регулярное выражение) "foo*": dpkg --list 'foo*' .

7.1.2 dselect

Данная программа является меню-ориентированным интерфейсом к системе управления пакетами Debian. Она, в частности, используется при первоначальной инсталляции и широкомасштабных обновлениях.

Основные возможности dselect :

позволяет пользователю выбирать пакеты для установки и удаления, гарантирует, что устанавливаемые пакеты не конфликтуют друг с другом, и что все пакеты требуемые для правильной работы каждого пакета установлены;

предупреждает пользователя о противоречиях и несовместимостях, возникающих в процессе выбора;

определяет порядок в котором должны быть установлены пакеты;

автоматически выполняет установку и удаление; и

проводит пользователя через процесс конфигурации каждого пакета.

При запуске dselect предоставляет пользователю меню из семи пунктов, каждый из которых выполняет определенное действие. Пользователь может выбрать один из пунктов наведя на него подсвеченный прямоугольник при помощи клавиш со стрелками, и нажав затем клавишу <enter>.

То, что пользователь увидит дальше, зависит от выбранного действия. Если выбран любой пункт кроме Access (Метод) и Select (Выбрать) , то dselect просто выполнит указанное действие: например, если пользователь выбрал пункт Remove (Удалить) , то dselect произведет удаление всех файлов помеченных для удаления когда пользователь выбирал пункт Select (Выбрать) .

Пункты Access (Метод) и Select (Выбрать) , оба предлагают дополнительные меню. В обоих случаях, эти меню делят экран по вертикали; в верхней части представлен прокручиваемый список возможностей для выбора, в то время, как в нижней части экрана дается краткое описание каждого варианта.

Доступна краткая справка о работе с программой, для ее вызова используйте клавишу '?'.

Порядок, в котором действия представлены в первом меню dselect , отражает порядок в котором эти действия обычно выбираются пользователем при установке пакетов. Однако, пользователь может пользоваться каждым пунктом меню так часто, как это ему нужно.

Начните с выбора метода доступа (Access Method). Это способ которым пользователь получает доступ к пакетам Debian; напр. некоторые имеют компакт-диски с пакетами Debian, другие же скачивают эти пакеты по ftp. Выбранный метод доступа сохраняется после выхода из dselect , поэтому, если он не изменился, то нет необходимости вызывать этот пункт меню каждый раз.

Затем обновите (Update) список доступных пакетов. Для этого dselect читает файл "Packages.gz", который находится в верхнем уровне дерева каталогов содержащего пакеты Debian. (Если его там нет, dselect попытается сделать его для Вас.)

Выберите (Select) нужные пакеты для установки на Вашей системе. После выбора данного пункта меню, пользователю показывается экран помощи (если не указан параметр `--expert' в командной строке). После выхода из экрана помощи, Вы увидите меню для выбора устанавливаемых или удаляемых пакетов.

Верхняя часть экрана содержит список всех 18200 пакетов Debian; нижняя часть экрана содержит описание пакета или группы пакетов, которые выделены выше.

Для указания пакета, над которым будет совершаться операция, следует навести подсветку на его название. После этого можно выбрать требуемую операцию:

Это достигается нажатием клавиши `+'.

Пакеты могут удаляться двумя путями:

remove: эта команда удаляет большинство файлов принадлежащих пакету, но оставляет файлы помеченные как конфигурационные (см. Что такое Debian conffile?, раздел 6.5) и информацию о конфигурации пакета. Выполняется нажатием клавиши `-'.

purge: команда удаляет каждый файл, являющийся частью пакета. Выполняется нажатием клавиши `_'.

Заметим, что не возможно удалить "All Packages". Если Вы попытаетесь это сделать, то Ваша система будет сокращена до первоначально установленных базовых пакетов.

Выполняется нажатием `=', и указывает dselect не выполнять обновление пакета, даже если установленная версия устарела по сравнению с той, что имеется в используемом Вами хранилище пакетов Debian (оно указывается когда Вы определяете метод доступа (Access Method), и инициализируется при выполнении обновления (Update)).

Если пакет заблокирован, то разблокировать его можно нажатием `:'. Этим сообщается dselect , что пакет(ы) может быть обновлен если доступна более новая версия. Это установлено по-умолчанию.

Вы можете выбирать различный порядок представления пакетов используя клавишу `o' для переключения между режимами сортировки. Изначально пакеты отсортированы по приоритету; а в пределах одного приоритета по разделу, к которому они относятся.

Вы можете получить расширенное описание пакетов в верхней части экрана нажав клавишу `v'. Данное действие увеличивает объем выводимого текста, и он выходит за правую границу экрана. Для прокрутки текста можно пользоваться клавишами со стрелками вправо и влево.

Если Вы выбрали пакет для установки или удаления, напр., foo.deb , и этот пакет зависит от (или рекомендует) других пакетов, напр. blurf.deb , то dselect выведет дополнительный экран, подобный основному экрану выбора. Там Вы сможете выбрать среди пакетов относящихся к данному те, которые следует установить. Вы можете принять предлагаемый вариант или отказаться от него. В последнем случае следует нажать Shift-D; для возврата к предлагаемому варианту, нажмите Shift-U. В любом случае Вы можете сохранить свой выбор нажатием Shift-Q. Для того, чтобы отказаться от установки пакета нажмите Shift-X.

После выбора пакетов Вы возвращаетесь в главное меню. Там Вы можете выбрать "Установить" (Install) для установки и конфигурирования выбраных пакетов. Если Вы отметили пакеты для удаления, то можете выбрать пункт "Удалить" (Remove). В любой момент времени можно выбрать пункт "Выход" (Quit) для выхода из программы; при этом пакеты отмеченные для установки и удаления сохраняются dselect .

7.1.3 dpkg-deb

Данная программа позволяет манипулировать файлами архивов Debian ( .deb файлами). Общие случаи применения:

Вывести список допустимых параметров: dpkg-deb --help .

Определить файлы содержащиеся в архиве Debian: dpkg-deb --contents foo_VVV-RRR.deb )

Извлечь файлы, содержащиеся в архиве Debian в указанный пользователем каталог: dpkg-deb --extract foo_VVV-RRR.deb tmp извлечет все файлы из foo_VVV-RRR.deb в каталог tmp/ . Это удобно для просмотра содержимого пакета в изолированном каталоге без его установки в основное дерево каталогов.

Заметим, что любые пакеты просто распакованные командой dpkg-deb --extract будут установлены некорректно, для установки следует использоват dpkg --install .

Больше информации дано в странице руководства dpkg-deb(1) .

7.1.4 apt-get

apt-get обеспечивает простой метод для установки пакетов из командной строки. В отличие от dpkg , apt-get не работает с .deb файлами, она работает с правильными именами пакетов и может устанавливать пакеты только из источников указанных в файле /etc/apt/sources.list .

Для получения более подробной информации, установите пакет apt и ознакомьтесь с apt-get(8) , sources.list(5) и /usr/share/doc/apt/guide.html/index.html .

7.1.5 dpkg-split

Эта программа делит большие пакеты на файлы меньшего размера (напр., для записи на дискеты), и, также, может использоваться для объединения набора разделенных файлов обратно в один файл. Она может использоваться только в системах Debian (т.е. в системах содержащих пакет dpkg ), т.к. вызывает программу dpkg-deb для разделения файла пакета на отдельные компоненты.

Например, для того, чтобы разделить большой .deb файл на части,

Выполните команду dpkg-split --split foo.deb . В результате получится несколько файлов, приблизительно по 460 Кбайт каждый, в текущем каталоге.

Скопируйте эти файлы на дискеты.

Скопируйте содержимое дисет на жесткий диск другой машины.

Объедините эти файлы вместе командой dpkg-split --join "foo*" .

7.2 Debian утверждает, что способен обновить работающую программу; каким образом это достигается?

Ядро в системах Debian GNU/Linux позволяет замену файлов даже если они используются.

Мы, также, предоставляем программу start-stop-daemon , которая используется для запуска демонов при загрузке или их останова при смене уровня выполнения (напр., из многопользовательского в однопользовательский или на завершение работы). Эта же программа используется сценариями установки при инсталяции нового пакета содержащего демон, для остановки работающего демона и его перезапуска по мере необходимости.

7.3 Как я могу узнать какие пакеты установлены в системе?

Чтобы получить список всех установленных пакетов, выполните команду

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

Чтобы узнать статус пакетов, имена которых начинаются с "foo", выполните команду:

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

7.4 Как найти пакет содержащий конкретный файл?

Чтобы определить в каком пакете содержится файл с именем foo вполните одну из следующих команд:

dpkg --search filename

Команда ищет filename в установленых пакетах. (Это (в настоящий момент) эквивалентно поиску всех файлов с расширением .list в каталоге /var/lib/dpkg/info/ , и выводу имен тех из них, которые содержат заданный filename, вместе со строкой, содержащей этот параметр).

zgrep foo Contents-ARCH.gz

Команда выполняет поиск файлов содержащих подстроку foo в своем полном имени. Файлы Contents-ARCH.gz (где ARCH определяет архитектуру) расположены в основных каталогах пакетов (main, non-free, contrib) на FTP сайте Debian. Файлы Contents содержат ссылки на пакеты находящиеся только в подкаталогах соответствующего каталога. Следовательно, может потребоваться поиск более чем в одном файле Contents для нахождения пакета содержащего файл foo .

Данный метод имеет преимущество над dpkg --search в том, что он находит файлы в пакетах не установленных в системе.

От переводчика: мне не хотелось переводить «source package» как «исходный пакет», т.к. такой перевод может наталкивать на мысль о распаковке deb–пакета с бинарниками. Поэтому в статье использован другой перевод — «пакет исходных кодов». Звучит, конечно, убого, но всяко лучше, чем первое.

Умение пересобирать пакеты Debian является очень полезным навыком. Он является необходимым для многих задач, с которыми может столкнуться администратор: включить фичу, выключенную в официальном пакете; пересобрать пакет для использования в другом дистрибутиве (например, пересобрать пакет из Debian Testing для Debian Stable — мы называем это обратным портированием (backporting)); добавить исправление бага, подготовленное разработчиками из апстрима, и так далее. Узнайте о четырёх шагах, позволяющих пересобирать пакеты Debian.

Скачивание пакета с исходным кодом

Предпочитаемым путём получения пакетов с исходным кодом является APT. Он может скачивать их из репозиториев с исходниками, прописанных у вас в /etc/apt/sources.list , например:

Заметьте, что строки начинаются с «deb-src» вместо обычного «deb». Это говорит APT’у о том, что мы заинтересованы в пакетах с исходным кодом, а не бинарниками.

После apt-get update можно использовать apt-get source publican , чтобы получить последнюю версию пакета с исходными кодами «publican». Можно также указать дистрибутив, из которого следует получать пакет, используя следующий синтаксис: «package/distribution». apt-get source publican/testing получит пакет с исходниками publican и распакует их в текущую директорию (используя dpkg-source -x , так что вам понадобится пакет dpkg-dev).

Если APT использовать не хочется, или если пакет с исходными кодами лежит не в APT’овском репозитории, можно скачать его с помощью команды dget -u dsc-url , где dsc-url — это URL .dsc–файла, представляющего пакет с сорцами. dget предоставляется пакетом devscripts. Заметим, что опция -u отключает проверку источника пакета перед его распаковкой.

Установка сборочных зависимостей

И снова APT сделает за вас всю грязную работу: достаточно лишь запустить apt-get build-dep foo , и сборочные зависимости для пакета foo будут установлены. Он поддерживает тот же синтаксический сахар, что и apt-get source , так что для установки зависимостей, требуемых для сборки тестируемой версии publican, можно использовать команду apt-get build-dep publican/testing .

Если пользоваться APT’ом нельзя, перейдите в директорию с распакованным исходным кодом и запустите dpkg-checkbuilddeps . Он покажет список неудовлетворённых сборочных зависимостей (если такие есть; в противном случае ничего выведено не будет и можно будет спокойно продолжать). Немного копирования–вставки и вызовов apt-get install — и вы за пару секунд установите все необходимые пакеты.

Осуществление изменений

Впрочем, вне зависимости от того, сделали вы изменения или просто пересобрали пакет в другом окружении, вам следует поменять версию пакета. Это можно сделать с помощью « dch –local foo » (снова из пакета devscripts), где «foo» следует заменить на короткое имя, идентифицирующее вас как поставщика обновлённой версии. Эта команда обновит debian/changelog и пригласит вас написать короткую заметку о внесённых изменениях.

Сборка пакета

Последний шаг — самый простой, так как всё уже на своих местах. Вы должны находиться в директории с распакованными исходниками.

Сборка завершена, обновлённые пакеты с исходным кодом и бинарниками были сгенерированы в родительской директории.

Comments (migrated from Blogger)

On 2010-12-23T20:09:15.543+02:00, Анонимный wrote:

“Пакет исходников” не? Или принципиально используется строгий оффициальный стиль?

On 2010-12-23T20:33:07.888+02:00, Minoru wrote:

Хех. Анонимус знает всё :) Действительно, можно было бы и так, тем более что для избежания постоянных повторов я скатывался даже до сленга («сорцы»). Впрочем, получилось неплохо, так что лично я смысла что–то менять не вижу. Или сто́ит–таки?

On 2010-12-24T01:50:13.249+02:00, virens wrote:

@Анонимный
Кстати да, “пакет исходников” звучит краше. Я бы в посте поменял. Но пост и так хорош.

@Minoru
Слушай, а в чём сакральный смысл apt-get source?
Я обычно тягаю исходники с домашней страницы авторов, потом dh_make –createorig и далее debuild. Чем не?

И ещё. Можно многоуважаемого граммарфюрера попросить пройтись калёным железом по этому посту? Там комментарий можно оставить даже, будешь, пардон, первонахом :-)

Да, кстати, есть предложение собрать твои гармошки по ZSH в один большой баян + какие-нибудь неопубликованные заметки по ZSH и запостить у меня. Я сейчас в отпуске, так что время есть. Черкни чего-нибудь на mydebianblog жымайл ком, а то я твою почту что-то не найду.

On 2010-12-24T07:47:36.905+02:00, Minoru wrote:

> Слушай, а в чём сакральный смысл apt-get source?
> Я обычно тягаю исходники с домашней страницы авторов, потом dh_make –createorig и далее debuild. Чем не?

Смысл в том, что после apt-get source ты получаешь исходники пакета. То есть если ты после этого сразу скажешь debuild, у тебя (теоретически) должен получиться точно такой же пакетик, что лежит в официальных репозиториях. Основное же преимущество такого подхода в том, что у тебя появляется уже работающий оформленный пакет, и всё, что тебе нужно — внести свои мелкие коррективы. Если же ты начинаешь с апстримового кода и dh_make, ты фактически самостоятельно создаёшь новый пакет. Это, по идее, круче и сложнее, но и проблем огрести можно.

> И ещё. Можно многоуважаемого граммарфюрера попросить пройтись калёным железом по этому посту? Там комментарий можно оставить даже, будешь, пардон, первонахом :-)
Ой, Doxygen в Matlab'е… Всё никак не доберусь до него. Вообще у меня тут как бы зачёты всё время, это вчера вот просто прорвало — услышал про патчик, живенько адаптировал под ту версию coreutils, что водится в наших сквизовских палестинах, собрал пакетик по руководству, ссылка на которое недавно по RSS прилетала — а потом взял да и написал обо всём этом. Ещё вот никак не доперевожу пост про dpatch — оно тоже с перепаковкой (да и сборкой с нуля тоже) связано.

На мыло вечерком черкну, ок.

On 2010-12-25T05:53:43.371+02:00, virens wrote:

Вообще у меня тут как бы зачёты всё время, это вчера вот просто прорвало
Упс, извини, я совсем забыл. У меня сейчас обратная ситуация - я в отпуске :-) Университет закрыт на новогодние праздники до 5 января, сижу посты строчу (потом будет некогда), в комментах троллю :-)

Ты там от зачётов не отвлекайся. Блог блогом, а зачёты - это серьёзно.

Ещё вот никак не доперевожу пост про dpatch — оно тоже с перепаковкой (да и сборкой с нуля тоже) связано.
Слушай, а ты попользуй scheduled posts. Удобственно: ставишь дату, скажем, в январе в настройках поста, и жмёшь “Опубликовать пост”. И всё - идёшь заниматься делами, а пост опубликуется без тебя. И провалов в датах не будет (в Октябре - ни одного поста, а в Декабре целых три подряд), и самому удобно.

Я так уже давно пробавляюсь. Два поста в месяц - и обсудить успеваем, и мне не наряжно.

И да, за комменты в Doxygen огромное спасибо - уже поправил.

On 2010-12-26T01:47:47.412+02:00, Minoru wrote:

Отпуск — это классно! Приятного отдыха! ;)

Scheduled posts я только для всяких поздравлений юзаю — всё остальное публикую сразу же. Просто не вижу смысла придерживать посты, если они уже готовы. Комментаторов у меня не так уж много, читателей всего полторы сотни (ну, плюс ещё runix — там поболее, конечно), так что я не боюсь быть заваленным почтой :) Да и в «провалах» ничего страшного не вижу — ну, не случилось ничего интересного, вот и не пишу.

On 2010-12-26T23:55:35.848+02:00, Paul Rufous wrote:

debuild - надстройка dpkg-buildpackage? Ключи те же.

On 2010-12-27T12:51:14.940+02:00, Minoru wrote:

> debuild - надстройка dpkg-buildpackage? Ключи те же.
И да, и нет. Да, debuild использует dpkg-buildpackage, но не только его. После сборки пакета запускаются lintian (проверка пакета на ошибки) и debsign.

On 2010-12-28T03:08:28.542+02:00, virens wrote:

@Minoru комментирует…
Просто не вижу смысла придерживать посты, если они уже готовы.
Смысл в том, чтобы поддерживать регулярную жизнь блога. Вот у меня, например, два поста в месяц, по понедельникам. Народ привык, мне удобно, и жизнь блога не обрывается - в каждом месяце есть посты.

Это приводит к тому, что намного меньшее количество читателей отписываются, думая, что блог помер.

“Но ты был не прав,
ты всё спалил за час,
и через час
большой огонь угас…”

Комментаторов у меня не так уж много, читателей всего полторы сотни (ну, плюс ещё runix — там поболее, конечно), так что я не боюсь быть заваленным почтой
А ты подумай, почему их немного. Вот тебе пища для размышлений:

  1. в постинге большие периоды затишья
  2. названия постов плохо ищутся поисковыми машинами
  3. часть постов слишком короткие, чтобы быть самостоятельными постами

Да и в «провалах» ничего страшного не вижу - ну, не случилось ничего интересного, вот и не пишу.
Это точка зрения писателя. Теперь посмотри со стороны читателя. Вот ты зашёл на блог, а там четыре месяца ничего не пишут. В предыдущие месяцы по одному посту. Что ты подумаешь об этом? Блог помер. И не станешь подписываться на заведомо дохлый фид.

Попробуй выкладывать посты регулярно - скажем, по средам. Два-три поста в месяц, с хорошим интервалом между ними. И посмотри на статистику подписчиков. Я готов поспорить, что их будет больше.

Тут ещё такое дело — однажды взявшись за написание постов раз в неделю, будет сложно от этой техники отказаться.
Это слишком часто, как мне кажется. Я тут написал пост о десктопе. Это заняло ДВОЕ СУТОК. Но у меня есть время сейчас, потом его не будет. Именно поэтому, как ты уже видел у меня в dashboard, у меня посты расписаны на следующий год.

Любой читатель твоего блога знает, что каждые две недели в понедельник он получит новую интересненькую статью.
Справедливости ради, далеко не все они интересные.
А вот чего читатель блога не знает, так это то, что написаны они ЗАДОЛГО до появления. И появляются они дважды в неделю тогда, когда я занят другими вещами. Инода я забываю об этом и узнаЮ, что на моём блоге что-то опубликовано, по комментариям на почту :-)

Мне почему-то не приходит в голову так много тем для постов, как тебе
Как говорили классики, “достигается упражнением”. Написать можно о чём угодно. Последний мой пост о Файрфоксе целиком стибрен со слешдота - с дополнениями и скриншотами, естественно. Или вот помнишь мой пост про монтирование разделов? Там есть что-нибудь, чего нет в man mount? Нет. А что там есть? Сбор и обобщение того, “куды лошадь запрягать”, с чётким описанием и хорошим оформлением.

Посту не обязательно быть оригинальным в плане новизны. Хороший повар приготовит банальную яичницу так, что пальчики оближешь :-) Главное - как подать.

© 2008–2021 Alexander Batischev. Site’s source.
Content licensed under CC-BY-NC-SA 4.0; code samples under CC0 1.0 Universal.

Читайте также: