Содержание
В этой главе вкратце рассматривается внутренняя низкоуровневая организация системы управления пакетами Debian. Если вас главным образом интересует вопрос о том, как использовать соответствующие утилиты, переходите сразу к Глава 8, Инструменты управления пакетами Debian или Глава 9, Поддержание обновлений системы Debian.
Пакет обычно содержит полный комплект файлов, необходимых для реализации определённого набора команд или возможностей. Существует два типа пакетов Debian:
Binary packages, which contain executables,
configuration files, man/info pages, copyright information, and other
documentation. These packages are distributed in a Debian-specific archive
format (see Раздел 7.2, «Какой формат у двоичных пакетов Debian?»); they are usually characterized by
having a '.deb' file extension. Binary packages can be unpacked using the
Debian utility dpkg
(possibly via a frontend like
apt); details are given in its manual page.
Source packages, which consist of a
.dsc
file describing the source package (including the
names of the following files), a .orig.tar.gz
file that
contains the original unmodified source in gzip-compressed tar format and
usually a .debian.tar.xz
file that contains the
Debian-specific changes to the original source. The utility
dpkg-source
packs and unpacks Debian source archives;
details are provided in its manual page. (The program
apt-get can be used as a frontend for
dpkg-source
.)
Installation of software by the package system uses "dependencies" which are
carefully designed by the package maintainers. These dependencies are
documented in the control
file associated with each
package. For example, the package containing the GNU C compiler
(gcc
) "depends" on the package
binutils
which includes the linker
and assembler. If a user attempts to install gcc
without having first installed binutils
, the package management system (dpkg)
will send an error message that it also needs binutils
, and stop installing gcc
. (However, this facility can be overridden
by the insistent user, see
dpkg(8).)
See more in Раздел 7.9, «Что имеется в виду, когда говорят, что пакет
Рекомендует (Recommends),
Предлагает (Suggests), Заменяет
(Replaces), Ломает (Breaks) или
Предоставляет (Provides) другой пакет,
Зависит (Depends) от него или
Конфликтует (Conflicts) с ним?» below.
Инструменты управления пакетами Debian могут использоваться для:
манипулирования и управления пакетами или их частями;
управления локальными заменами файлов пакета;
помощи разработчикам в сборке пакетов;
aid users in the installation of packages which reside on a remote archive site.
A Debian "package", or a Debian archive file, contains the executable files,
libraries, and documentation associated with a particular program or set of
related programs. Normally, a Debian archive file has a filename that ends
in .deb
.
The internals of this Debian binary packages format are described in the
deb(5)
manual page. This internal format is subject to change (between major
releases of Debian GNU/Linux), therefore please always use
dpkg-deb(1)
if you need to do lowlevel manipulations on .deb
files.
The Debian binary package file names conform to the following convention: <DebianPackageName>_<VersionNumber>-<DebianRevisionNumber>_<DebianArchitecture>.deb
Checking the package name associated with a particular Debian archive file (.deb file) can be done in one of these ways:
inspect the "Packages" file in the directory where it was stored at a Debian archive site. This file contains a stanza describing each package; the first field in each stanza is the formal package name.
use the command dpkg --info PPP_VVV-RRR_AAA.deb
(where
PPP, VVV, RRR and AAA are the package name, version, revision and
architecture of the package in question, respectively). This displays,
among other things, the package name corresponding to the archive file being
unpacked.
Компонент VVV
определяет номер версии, установленный
разработчиком программы. Его формат не стандартизован, поэтому номер версии
может быть любым, например «19990513» или «1.3.8pre1».
The RRR
component is the Debian revision number, and is
specified by the Debian developer (or a user who chooses to rebuild the
package locally). This number corresponds to the revision level of the
Debian package, thus, a new revision level usually signifies changes in the
Debian Makefile (debian/rules
), the Debian control file
(debian/control
), the installation or removal scripts
(debian/p*
), or in the configuration files used with the
package.
The AAA
component identifies the processor for which the
package was built. This is commonly amd64
, which refers
to AMD64, Intel 64 or VIA Nano chips. For other possibilities review
Debian's archive directory structure at Раздел 6.7, «What are all those directories at the Debian archives?». For
details, see the description of "Debian architecture" in the manual page
dpkg-architecture(1).
Содержимое файла control подробно рассматривается в разделе 5 «Руководства по политике Debian» (Debian Policy Manual) (см. Раздел 12.1, «Какая ещё документация существует по системе Debian?»).
Краткий пример файла control для пакета Debian hello приведён ниже:
Package: hello Version: 2.9-2+deb8u1 Architecture: amd64 Maintainer: Santiago Vila <[email protected]> Installed-Size: 145 Depends: libc6 (>= 2.14) Conflicts: hello-traditional Breaks: hello-debhelper (<< 2.9) Replaces: hello-debhelper (<< 2.9), hello-traditional Section: devel Priority: optional Homepage: https://www.gnu.org/software/hello/ Description: example package based on GNU hello The GNU hello program produces a familiar, friendly greeting. It allows non-programmers to use a classic computer science tool which would otherwise be unavailable to them. . Seriously, though: this is an example of how to do a Debian package. It is the Debian version of the GNU Project's "hello world" program (which is itself an example for the GNU Project).
Поле Package содержит имя пакета. Это имя, по которому инструменты управления пакетами будут его опознавать. Обычно (но не обязательно) оно совпадает с первым компонентом имени файла архива Debian.
Поле Version содержит номер версии программы, установленный её разработчиками, и (в последнем компоненте) номер ревизии пакета этой программы в Debian, см. Раздел 7.3, «Почему имена файлов пакетов Debian такие длинные?».
Поле Architecture определяет тип процессора, для которого были скомпилированы двоичные файлы в данном пакете.
Поле Depends содержит список пакетов, которые должны быть установлены для успешной установки данного пакета.
Installed-Size отражает размер дискового пространства, который будет занят пакетом после установки. Этот параметр может использоваться программами установки для проверки достаточности дискового пространства перед установкой пакета.
The Section line gives the "section" where this Debian package is stored at the Debian archive sites.
Поле Priority показывает, насколько установка этого пакета важна для системы; некоторые программы, например, apt или aptitude, могут сортировать пакеты по категориям (напр., поместить пакет в список необязательных пакеты), см. Раздел 7.7, «Что такое Пакет первой необходимости (Essential), Необходимый (Required), Важный (Important), Стандартный (Standard), Необязательный (Optional) или Дополнительный (Extra) пакет?».
В поле Maintainer указан адрес электронной почты человека, ответственного за поддержку данного пакета.
В поле Description приводится краткое описание функциональности пакета.
Более подробную информацию о всех возможных полях управляющего файла пакета см. в разделе 5 («Управляющие файлы и их поля») «Руководства по политике Debian» (Debian Policy Manual), см. Раздел 12.1, «Какая ещё документация существует по системе Debian?».
Conffile содержит список файлов настроек (обычно помещаемых в
/etc
), которые при обновлении пакета не будут
перезаписываться системой управления пакетами. Это гарантирует, что
содержимое файлов настроек будет сохранено, и позволяет обновлять пакеты, не
прерывая работу системы.
Чтобы точно определить, какие файлы сохраняются при обновлении, запустите:
dpkg --status пакет
и взгляните на строку «Conffiles:».
Это исполняемые сценарии, автоматически запускаемые до или после установки
или удаления пакета. Вместе с файлом control
эти файлы
являются частью «управляющего» раздела архивного файла Debian.
Более подробно:
This script is executed before the package it belongs to is unpacked from its Debian archive (".deb") file. Many 'preinst' scripts stop services for packages which are being upgraded until their installation or upgrade is completed (following the successful execution of the 'postinst' script).
This script typically completes any required configuration of the package
foo
once foo
has been unpacked from
its Debian archive (".deb") file. Many 'postinst' scripts execute any
commands necessary to start or restart a service once a new package has been
installed or upgraded.
Этот сценарий обычно служит для остановки всех связанных с пакетом служб. Он выполняется перед удалением файлов данного пакета.
Этот сценарий обычно служит для изменения ссылок или других файлов,
связанных с foo
, и/или удаления файлов, созданных
пакетом. (См. также Раздел 7.8, «Что такое виртуальный пакет?».)
Currently all of the control files can be found in the directory
/var/lib/dpkg/info
. The files relevant to package
foo
begin with the name "foo" and have file extensions of
"preinst", "postinst", etc., as appropriate. The file
foo.list
in that directory lists all of the files that
were installed with the package foo
. (Note that the
location of these files is a dpkg internal; you should not rely on it.)
Для поддержки системы управления пакетами каждому пакету в Debian сопровождающими дистрибутива назначается приоритет. Возможные приоритеты:
Необходимые (Required) — пакеты, необходимые для правильного функционирования системы.
Сюда входят все инструменты, необходимые для устранения неполадок в системе. Вам не следует удалять эти пакеты, иначе ваша система может перестать работать, и не исключено, что вы даже не сможете использовать dpkg для того, чтобы вернуть всё назад. Функциональность системы, в которой установлены только Необходимые пакеты, не слишком высока, но достаточна для того, чтобы позволить системному администратору загрузить её и установить больше программного обеспечения.
Важные (Important) — пакеты, которые должны быть в любой Unix-системе.
Other packages which the system will not run well or be usable without will be here. This does NOT include Emacs or X or TeX or any other large application. These packages only constitute the bare infrastructure.
Standard packages are standard on any Linux system, including a reasonably small but not too limited character-mode system. Tools are included to be able to send e-mail (with mutt) and download files from archive servers.
This is what will be installed by default if users do not select anything else. It does not include many large applications, but it does include the Python interpreter and some server software like OpenSSH (for remote administration) and Exim (for mail delivery, although it can be configured for local delivery only). It also includes some common generic documentation that most users will find helpful.
Optional packages include all those that you might reasonably want to install if you do not know what they are, or that do not have specialized requirements.
Сюда входят X, полный дистрибутив TeX и множество других приложений.
Дополнительные (Extra) — пакеты, либо конфликтующие с другими пакетами, имеющими более высокий приоритет, полезные, скорее всего, только в том случае, когда вы уже знаете, что это такое, либо имеющие специфические требования, из-за которых им нельзя дать приоритет «Необязательный».
Если вы выполните установку Debian по умолчанию, то будут установлены все пакеты с приоритетом Стандартный или выше. Если вы выберете какие-то определённые задачи, то также будут установлены и пакеты с более низким приоритетом.
Кроме того, некоторые пакеты классифицированы как Пакеты первой необходимости (Essential), так как они абсолютно необходимы для правильной работы системы. Инструменты управления пакетами не допустят их удаления.
A virtual package is a generic name that applies to any one of a group of
packages, all of which provide similar basic functionality. For example,
both the konqueror
and firefox-esr
programs are web browsers, and should therefore satisfy any dependency of a
program that requires a web browser on a system, in order to work or to be
useful. They are therefore both said to provide the "virtual package"
called www-browser
.
Similarly, exim4
and sendmail
both
provide the functionality of a mail transport agent. They are therefore
said to provide the virtual package "mail-transport-agent". If either one
is installed, then any program depending on the installation of a
mail-transport-agent
will be satisfied by the presence of
this virtual package.
Кроме того, в Debian есть механизм, позволяющий системному администратору в
том случае, когда в системе установлено несколько пакетов, предоставляющих
определённый виртуальный пакет, выбрать предпочтительный. Для этого служит
команда update-alternatives
, см. Раздел 11.11, «Некоторым пользователям нравится mawk, другим gawk; некоторым vim, другим
elvis; некоторым trn, другим tin. Как осуществляется поддержка предпочтений
в Debian?».
В системе пакетов Debian есть несколько типов «зависимостей» пакетов друг от друга, задуманных для определения (в одной переменной) степени независимости одной программы (например, А) от наличия в данной системе другой (Б).
Пакет A зависит от пакета Б, если Б абсолютно необходим для работы A. В некоторых случаях A не просто зависит от Б, но дополнительно требует определённую версию Б. В этом случае обычно накладывается требование, чтобы версия Б была не ниже заданной.
Пакет A рекомендует пакет Б, если сопровождающий пакета считает, что большинство пользователей не захотят пользоваться A, не имея функциональности, предоставляемой пакетом Б.
Пакет A предлагает пакет Б, если Б содержит файлы, имеющие отношение к функциональности пакета A (и обычно её расширяющие).
Пакет A конфликтует с пакетом Б, когда A не может работать, если установлен пакет Б. Наиболее часто конфликты возникают, когда A содержит усовершенствованные версии файлов, содержащихся в Б. «Конфликтует» часто задаётся вместе с «заменяет».
Пакет A заменяет пакет Б, когда файлы, установленные из пакета Б, удаляются и (в некоторых случаях) замещаются файлами из A.
Пакет А ломает пакет Б, когда нельзя одновременно настроить оба пакета в системе. Система управления пакетами предотвратит установку одного, если в системе уже установлен и настроен другой.
Пакет A предоставляет пакет Б, когда все файлы и функциональность Б имеются в A. Этот механизм позволяет пользователям с ограниченным дисковым пространством получить только ту часть пакета А, которая действительно им нужна.
More detailed information on the use of each of these terms can be found in the Debian Policy manual, section 7.2, "Binary Dependencies", see Раздел 12.1, «Какая ещё документация существует по системе Debian?».
"Pre-Depends" is a special dependency. In the case of most packages,
dpkg
will unpack the archive file of a package (i.e., its
.deb
file) independently of whether or not the files on
which it depends exist on the system. Simplistically, unpacking means that
dpkg
will extract the files from the archive file that
were meant to be installed on your file system, and put them in place. If
those packages depend on the existence of some other
packages on your system, dpkg
will refuse to complete the
installation (by executing its "configure" action) until the other packages
are installed.
Однако, некоторые пакеты dpkg
даже не будет
распаковывать, пока не будут разрешены некоторые зависимости. Про такие
пакеты говорят, что они имеют «предварительную зависимость» от наличия
некоторых других пакетов. Этот механизм предоставляется в Debian для
поддержки безопасного перехода систем с формата a.out
на
ELF
, когда критична очерёдность
распаковки пакетов. Существуют и другие варианты больших обновлений, где
этот приём также полезен, например для пакетов с приоритетом «необходимый»,
когда они зависят от LibC.
Опять же, более подробную информацию об этом можно найти в руководстве по политике.
Эти флаги определяют, что пользователь «хочет» сделать с пакетом (что
определяется вызовами
dpkg
/apt
/aptitude
).
Их значения:
неизвестно (unknown) — пользователь никоим образом не отметил, нужен ли ему этот пакет.
установить (install) — пользователь хочет установить или обновить пакет;
remove - the user wants the package removed, but does not want to remove any existing configuration file.
вычистить (purge) — пользователь хочет удалить пакет полностью, включая его файлы настроек;
зафиксировать (hold) — пользователь хочет, чтобы над пакетом не совершалось никаких действий, т. е. он хочет сохранить текущую версию пакета, в каком бы состоянии она ни была.
Есть три способа перевода пакета в зафиксированное состояние: с помощью dpkg, apt или aptitude.
При использовании dpkg вам нужно экспортировать список состояний отметки пакетов:
dpkg --get-selections \* > selections.txt
Затем отредактировать полученный файл selections.txt
,
заменив строку с именем пакета, который нужно зафиксировать, например
libc6
, с:
libc6 install
на:
libc6 hold
Сохранить файл и загрузить его в базу данных dpkg:
dpkg --set-selections < selections.txt
С помощью apt пакет можно зафиксировать командой
apt-mark hold имя_пакета
а снять фиксацию с помощью
apt-mark unhold имя_пакета
При использовании aptitude пакет можно зафиксировать командой
aptitude hold имя_пакета
а снять фиксацию с помощью
aptitude unhold имя_пакета
Пакеты исходного кода Debian на самом деле нельзя «установить», они просто распаковываются в любой указанный вами каталог для сборки двоичного пакета.
Source packages are distributed on most of the same mirrors where you can obtain the binary packages. If you set up your APT's sources.list(5) to include the appropriate "deb-src" lines, you'll be able to easily download any source package by running
apt-get source имя_пакета
To help you in actually building the source package, Debian source packages provide the so-called build-dependencies mechanism. This means that the source package maintainer keeps a list of other packages that are required to build their package. To see how this is useful, run
apt-get build-dep имя_пакета
перед сборкой пакета.
Лучше всего это делать с помощью различных утилит-обёрток. Мы покажем как
использовать инструментарий devscripts
. Установите этот
пакет, если это ещё не сделано.
Сначала добудьте пакет с исходным кодом:
apt-get source имя_пакета
и перейдите в дерево исходников:
cd имя_пакета-*
Затем установите необходимые сборочные зависимости (при их наличии):
sudo apt-get build-dep имя_пакета
После этого создайте отдельную версию своей сборки (для того, чтобы позже не удивляться, когда в Debian тоже выйдет новая версия):
dch -l local 'Blah blah blah'
И, наконец, соберите пакет:
debuild -us -uc
Если всё прошло успешно, то вы сможете установить свой пакет, запустив
sudo dpkg -i ../*.deb
Если вы предпочитаете делать всё вручную и не хотите использовать
devscripts
, то делайте так:
Для компиляции исходного кода вам понадобятся файлы имя_пакета_*.dsc, имя_пакета_*.tar.gz и имя_пакета_*.debian.tar.xz (учтите, что для некоторых родных пакетов Debian файла .debian.tar.xz нет).
Если у вас есть эти файлы (см. Раздел 7.13, «Как установить пакет исходного кода?») и установлен
пакет dpkg-dev
, то следующая
команда:
dpkg-source -x имя_пакета_версия-ревизия.dsc
извлечёт пакет в каталог с именем имя_пакета-версия
.
If you just want to compile the package, you may cd into the
foo-version
directory and issue the command
dpkg-buildpackage -rfakeroot -b
для сборки пакета (обратите внимание, что для этого также понадобится пакет
fakeroot
), а затем
dpkg -i ../имя_пакета_версия-ревизия_архитектура.deb
для установки только что собранного пакета.
For a more detailed description on this, read the New Maintainers' Guide,
available in the maint-guide
package
or at https://www.debian.org/doc/devel-manuals#maint-guide,
or the Guide for Debian Maintainers, available in the debmake-doc
package or at https://www.debian.org/doc/devel-manuals#debmake-doc.