The Debian package is not only an archive of files intended for installation. It is part of a larger whole and describes its relationship with other Debian packages (requisites, dependencies, conflicts, suggestions). It also provides scripts that enable the execution of commands at different stages in the package's lifecycle (installation, upgrade, removal). These data are used by the package management tools but are not part of the packaged software; they are, within the package, what is called its “meta-information” (information about other information).
5.2.1. Omschrijving: het control
Bestand
This file uses a structure similar to email headers (as defined by
RFC 2822) and is fully described in the Debian Policy and the manual pages
deb-control(5) and
deb822(5).
For example, for apt, the control
file looks like the following:
$
apt-cache show apt
Package: apt
Version: 1.8.2
Installed-Size: 4064
Maintainer: APT Development Team <deity@lists.debian.org>
Architecture: amd64
Replaces: apt-transport-https (<< 1.5~alpha4~), apt-utils (<< 1.3~exp2~)
Provides: apt-transport-https (= 1.8.2)
Depends: adduser, gpgv | gpgv2 | gpgv1, debian-archive-keyring, libapt-pkg5.0 (>= 1.7.0~alpha3~), libc6 (>= 2.15), libgcc1 (>= 1:3.0), libgnutls30 (>= 3.6.6), libseccomp2 (>= 1.0.1), libstdc++6 (>= 5.2)
Recommends: ca-certificates
Suggests: apt-doc, aptitude | synaptic | wajig, dpkg-dev (>= 1.17.2), gnupg | gnupg2 | gnupg1, powermgmt-base
Breaks: apt-transport-https (<< 1.5~alpha4~), apt-utils (<< 1.3~exp2~), aptitude (<< 0.8.10)
Description-en: commandline package manager
This package provides commandline tools for searching and
managing as well as querying information about packages
as a low-level access to all features of the libapt-pkg library.
.
These include:
* apt-get for retrieval of packages and information about them
from authenticated sources and for installation, upgrade and
removal of packages together with their dependencies
* apt-cache for querying available information about installed
as well as installable packages
* apt-cdrom to use removable media as a source for packages
* apt-config as an interface to the configuration settings
* apt-key as an interface to manage authentication keys
Description-md5: 9fb97a88cb7383934ef963352b53b4a7
Tag: admin::package-management, devel::lang:ruby, hardware::storage,
hardware::storage:cd, implemented-in::c++, implemented-in::perl,
implemented-in::ruby, interface::commandline, network::client,
protocol::ftp, protocol::http, protocol::ipv6, role::program,
scope::application, scope::utility, suite::debian, use::downloading,
use::organizing, use::playing, use::searching, works-with-format::html,
works-with::audio, works-with::software:package, works-with::text
Section: admin
Priority: required
Filename: pool/main/a/apt/apt_1.8.2_amd64.deb
Size: 1418108
MD5sum: 0e80dedab6ec1e66a8f6c15f1925d2d3
SHA256: 80e9600822c4943106593ca5b0ec75d5aafa74c6130ba1071b013c42c507475e
5.2.1.1. Afhankelijkheden: het Depends
Veld
The dependencies are defined in the Depends
field in the package header. It is a list of conditions to be met for the package to work correctly. This information is used by tools such as apt
in order to install the required libraries, tools, drivers, etc. in appropriate versions fulfilling the dependencies of the package to be installed. For each dependency, it is possible to restrict the range of versions that meet that condition. In other words, it is possible to express the fact that we need the package libc6 in a version equal to or greater than “2.15” (written “libc6 (>= 2.15)
”). Version comparison operators are as follows:
<<
: kleiner dan;
<=
: kleiner dan of gelijk aan;
=
: gelijk aan (merk op dat “2.6.1
” niet gelijk is aan “2.6.1-1
”);
>=
: groter dan of gelijk aan;
>>
: groter dan.
In a list of conditions to be met, the comma serves as a separator. It must be interpreted as a logical “and”. In conditions, the vertical bar (“|”) expresses a logical “or” (it is an inclusive “or”, not an exclusive “either/or”). Carrying greater priority than “and”, it can be used as many times as necessary. Thus, the dependency “(A or B) and C” is written
A | B, C
. In contrast, the expression “A or (B and C)” should be written as “(A or B) and (A or C)”, since the
Depends
field does not tolerate parentheses that change the order of priorities between the logical operators “or” and “and”. It would thus be written
A | B, A | C
.
Het afhankelijkheidssysteem is een goed mechanisme om de werking een programma te garanderen, maar het heeft een ander gebruikt met “meta-pakketten”. Dit zijn lege pakketten die enkel afhankelijkheden beschrijven. Ze vergemakkelijken de installatie van een consistente groep programma's voorgeselecteerd door de meta-pakket onderhouder; zo zal, apt install meta-pakket
al de programma's die gebruik maken van de meta-pakketten afhankelijkheden. De gnome, kde-full en linux-image-amd64 pakketten zijn voorbeelden van meta-pakketten.
5.2.1.2. Conflict: het Conflict
veld
The Conflicts
field indicates when a package cannot be installed simultaneously with another. The most common reasons for this are that both packages include a file of the same name and path, or provide the same service on the same TCP port, or would hinder each other's operation.
dpkg
zal weigeren om een pakket te installeren als het een conflicteert met een reeds geïnstalleerd pakket, behalve als het nieuwe pakket aangeeft het geïnstalleerde pakket te “vervangen”, in welk geval dpkg
ervoor zal kiezen om het oude pakket te vervangen door het nieuwe. apt
volgt altijd jouw instructies: als je ervoor kiest om een nieuw pakket te installeren, zal het automatisch aanbieden het pakket dat voor problemen zorgt te verwijderen.
5.2.1.3. Incompatibiliteiten: het Breaks
Veld
Het Breekt
veld heeft een effect gelijkaardig als het Conficts
veld, maar met een speciale betekenis. Het geeft aan dat de installatie van een pakket een ander pakket “breekt” (of bepaalde versies ervan). In het algemeen is deze incompatibiliteit tussen twee pakketten van voorbijgaande aard, en de Breekt
relatie refereert specifiek naar een incompatibele versie.
dpkg
zal weigeren om een pakket te installeren dat een reeds geïnstaleerd programma breekt en apt
zal proberen om het probleem op te lossen door het pakket dat gebroken zou worden te upgraden naar een nieuwere versie (van welke wordt aangenomen dat het gerepareerd is en dus, opnieuw compatibel).
Dit soort situatie kan voorkomen in het geval van updates zonder achterwaartse compatibiliteit: dit is het geval als de nieuwe versie niet langer werkt met de oudere versie en een fout in een ander programma veroorzaakt zonder speciale voorzorgen te nemen. Het Breekt
veld voorkomt dat de gebruiker deze problemen tegenkomt.
5.2.1.4. Aangeboden Items: het Biedt aan
Veld
Dit veld introduceert de zeer interessante concepten van een “virtueel pakket”. Het heeft vele rollen, maar er zijn er twee van een bepaald belang. De eerste rol bestaat er uit om een virtueel pakket te associëren met een algemene dienst (het pakket “biedt” de dienst aan). De tweede geeft aan dat een pakket een ander volledig vervangt en dat het hiervoor ook de afhankelijkheden kan voldoen die dat ander zou voldoen. Het is dus mogelijk om een vervangings-pakket te maken zonder dezelfde naam voor het pakket te gebruiken.
5.2.1.4.1. Een "Dienst" aanbieden
Laten we het eerste geval wat nader bekijken met een voorbeeld: Alle email servers, zoals postfix of sendmail “bieden” het mail-transport-agent virtueel pakket. Dus ieder pakket dat deze dienst nodig heeft om te kunnen werken (bijv. email lijst beheerder, zoasl smartlist of sympa) geven simpelweg aan in zijn afhankelijkheden aan dat een mail-transport-agent nodig heeft in plaats van een lange, doch onvolledige lijst van mogelijke oplossingen (bijv. postfix | sendmail | exim4 | …
). Verder is het nutteloos om twee email servers op dezelfde machine te installeren, daarom geeft ieder van deze pakketten aan dat ze conflicteren met het mail-transport-agent virtueel pakket. Een conflict tussen een pakket en zichzelf wordt genegeerd door het systeem, maar deze techniek zal de installatie van twee email servers naarst elkaar verhinderen.
5.2.1.4.2. Uitwisselbaarheid met Andere Pakketten
The Provides
field is also interesting when the content of a package is included in a larger package. For example, the libdigest-md5-perl Perl module was an optional module in Perl 5.6, and has been integrated as standard in Perl 5.8 (and later versions, such as 5.28 present in Buster). As such, the package perl has since version 5.8 declared Provides: libdigest-md5-perl
so that the dependencies on this package are met if the user has Perl 5.8 (or newer). The libdigest-md5-perl package itself has eventually been deleted, since it no longer had any purpose when old Perl versions were removed.
Dit kenmerk is zeer handig, omdat het nooit mogelijk is op te anticiperen op de grillen van ontwikkeling en het is noodzakelijk om aan te passen aan overblijvende, en andere automatische vervangingen, van verouderde software.
5.2.1.4.3. Eerdere Beperkingen
Virtuele pakketten hadden last van bepaalde beperkingen, de meest significante was het ontbreken van een versie nummer. Om naar het vorige voorbeeld terug te gaan, een afhankelijkheid zoals Depends: libdigest-md5-perl (>= 1.6)
, zal, ondanks de aanwezigheid van Perl 5.10, door het pakketbeheersysteem nooit beschouwd worden als voldaan — terwijl het in feite hoogst waarschijnlijk voldaan is. Dit niet beseffende, zal het pakketbeheersysteem de minst riskante optie kiezen, er van uit gaan dat de versies niet overeenkomen.
This limitation has been lifted in dpkg 1.17.11, and is no longer relevant. Packages can assign a version to the virtual packages they provide with a dependency such as Provides: libdigest-md5-perl (= 1.8)
.
5.2.1.5. Bestanden Vervangen: Het Vervangt
Veld
Het Vervangt
veld geeft aan dat het pakket bestanden bevat die ook aanwezig zijn in een ander pakket, maar dat het pakket rechtmatig gerecht is om ze te vervangen. Zonder deze specificatie zal dpkg
falen, aangevend dat het de bestanden van een ander pakket niet kan overschrijven (technisch gezien, is hte mogelijk om dit af te dwingen met de --force-overwrite
optie, maar dat wordt niet gezien als de standaard handeling). Dit laat de identificatie van potentiële problemen toe en verijst dat de onderhouders de zaak voor het al-dan-niet gebruiken van zo'n veld.
Het gebruik van dit veld is gerechtvaardigd wanneer pakket namen veranderen of wanneer een pakket is inbegrepen in een ander. Dit gebeurt ook wanneer de onderhouder beslist om bestanden de verdelen over verschillende binaire pakketten gemaakt van het zelfde bron code pakket: een vervangen bestand hoort niet langen bij het oude pakket, maar enkel het nieuwe.
Als alle bestanden in een geïnstalleerd pakket vervangen zijn, zal het pakket als verwijderd beschouwd worden. Tenslotte moedigt dit veld dpkg
aan om het vervangen pakket te verwijderen wanneer er een conflict is.
5.2.2. Configuratie Scripts
In addition to the
control
file, the
control.tar.gz
archive for each Debian package may contain a number of scripts, called by
dpkg
at different stages in the processing of a package. The Debian Policy describes the possible cases
in detail, specifying the scripts called and the arguments that they receive. These sequences may be complicated, since if one of the scripts fails,
dpkg
will try to return to a satisfactory state by canceling the installation or removal in progress (insofar as it is possible).
In general, the preinst
script is executed prior to installation of the package, while postinst
follows it. Likewise, prerm
is invoked before removal of a package and postrm
afterwards. An update of a package is equivalent to removal of the previous version and installation of the new one. It is not possible to describe in detail all the possible scenarios here, but we will discuss the most common two: an installation/update and a removal.
5.2.2.1. Installatie en Upgrade
Dit is wat er gebeurd tijdens een installatie (of een update):
Voor een update roept dpkg
het old-perm upgrade new-version
aan.
Nog steeds voor een update, voert dpkg
dan new-preinst upgrade old-version
aan; voor een eerste installatie, voert het new-preinst install
uit. Het kan het oude versie nummer in de laatste parameter toevoegen, als het pakket in tussentijd geïnstalleerd en verwijderd is (maar niet purged blijven de configuratie bestanden behouden).
De nieuwe pakket bestanden worden dan uitgepakt. Als een bestand al bestaat, wordt het vervangen, maar er wordt een tijdelijke back-up gemaakt.
Voor een update voert dpkg
het old-postrm upgrade new-version
bestand uit.
dpkg
update al de interne gegevens (bestandslijst, configuratie scripts, enz.) en verwijderd de back-up's van de vervangen bestanden. Vanaf nu is er geen weg terug: dpkg
heeft niet langer toegang tot all de elementen noodzakelijk om naar de vorige staat terug te keren.
Tenslotte, configureert dpkg
hte pakket door new-postinst configure last)version-configured
. uit te voeren.
5.2.2.2. Pakket verwijdering
Dit is wat er gebeurd tijdens een verwijdering van een pakket:
dpkg
roept prerm remove
aan.
dpkg
verwijderd all de bestanden van het pakket, met uitzondering van de configuratie bestanden en configuratie scripts.
dpkg
voert postrm remove
uit. All de configuratie scripts, behalve postrm
, worden verwijderd. Als de gebruiker de “purge” optie niet gebruikt stopt het proces hier.
Voor een complete zuivering van het pakket (commando uitgevoerd met dpkg --purge
of dpkg -P
, worden de configuratiebestanden ook gewist, samen met een bepaald aantal kopie's (*.dpkg-tmp
, *.dpkg-old
, *.dpkg-new
) en tijdelijke bestanden; dpkg
voert dan postrm-purge
uit.
De vier scripts hierboven beschreven worden aangevuld door een config
script, voorzien door pakketen die debconf
gebruiken om informatie van de gebruiker voor de configuratie te bekomen. Tijdens de installatie, definieert dit script in detail de vragen van debconf
. De antwoorden worden opgeslagen in de debconf
databank voor toekomstige verwijzingen. Het script wordt in het algemeen uitgevoerd door apt
voor de installatie van de pakketten één-voor-één om al de vragen te groeperen en ze te stellen aan de gebruiker aan het begin van het proces. De pre- en post-installatie scripts kunnen deze informatie dan gebruiken om te werken volgens de wensen van de gebruiker.
5.2.3. Checksums, Lijsten van Configuratie Bestanden
In addition to the maintainer scripts and control data already mentioned in the previous sections, the
control.tar.gz
archive of a Debian package may contain other interesting files. The first,
md5sums
, contains the MD5 checksums for all of the package's files. Its main advantage is that it allows
dpkg --verify
(which we will study in
Paragraaf 14.3.4.1, “Auditing Packages with dpkg --verify
”) and
debsums
(from the package of the same name; see
Paragraaf 14.3.4.2, “Auditing Packages: debsums
and its Limits”) to check if these files have been modified since their installation. Note that when this file doesn't exist,
dpkg
will generate it dynamically at installation time (and store it in the dpkg database just like other control files).
conffiles
lists package files that must be handled as configuration files (see also deb-conffiles(5)). Configuration files can be modified by the administrator, and dpkg
will try to preserve those changes during a package update.
In dit geval probeert dpkg
zich zo intelligent mogelijk te gedragen: als de standaard configuratie bestand niet is veranderd tussen de twee versies, zal het niks doen. Hoewel als het bestand veranderd is, zal het proberen dit bestand up te daten. Twee gevallen zijn mogelijk: ofwel heeft de beheerder dit configuratie bestand niet aangepast, in welk geval zal dpkg
automatisch de nieuwe versie installeren; of het bestand is aangepast, in dat geval zal dpkg
de beheerder vragen welke versie hij wenst te gebruiken (de oude met aanpassingen of het nieuwe bestand bij het pakket). Om bij deze beslissing te assisteren zal dpkg
aanbieden een “diff
”, dat de verschillen tussen de twee versies laat zien, weer te geven. Als de gebruiker kiest om de oude versie te behouden,zal het nieuwe bestand opgeslagen worden op dezelfde locatie in een bestand met de .dpkg-dist
extensie. Als de gebruiker de nieuwe versie kiest, zal het oude behouden blijven in een bestand met de dpkg-old
extensie. Een andere beschikbare actie bestaat uit het tijdelijk onderbreken van dpkg
om het bestand te bewerken en de relevante aanpassingen (eerder weergegeven met diff
) te reconstrueren.