Het Debian pakket is niet enkel een archief van bestanden bedoelt voor installatie. Het is een onderdeel van een groter geheel en het beschrijft haar relatie met andere Debian pakketten (afhankelijkheden, conflicten, suggesties). Het biedt ook scripts die het uitvoeren van commando's in verschillende stadia van de levenscyclus van het pakket mogelijk maken (installatie, verwijdering, upgrades). Deze gegevens worden gebruikt door het pakketbeheerders-programma maar zijn geen onderdeel van de ingepakte software; ze zijn, binnen het pakket, wat zijn “meta-informatie” (informatie over andere informatie) heet.
5.2.1. Omschrijving: het control
Bestand
Dit bestand gebruikt een structuur gelijkaardig aan email headers (zoals gedefinieerd door RFC 2822). Bij voorbeeld, voor apt, ziet het control
bestand er zo uit:
$
apt-cache show apt
Package: apt
Version: 1.0.9.6
Installed-Size: 3788
Maintainer: APT Development Team <deity@lists.debian.org>
Architecture: amd64
Replaces: manpages-it (<< 2.80-4~), manpages-pl (<< 20060617-3~), openjdk-6-jdk (<< 6b24-1.11-0ubuntu1~), sun-java5-jdk (>> 0), sun-java6-jdk (>> 0)
Depends: libapt-pkg4.12 (>= 1.0.9.6), libc6 (>= 2.15), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.9), debian-archive-keyring, gnupg
Suggests: aptitude | synaptic | wajig, dpkg-dev (>= 1.17.2), apt-doc, python-apt
Conflicts: python-apt (<< 0.7.93.2~)
Breaks: manpages-it (<< 2.80-4~), manpages-pl (<< 20060617-3~), openjdk-6-jdk (<< 6b24-1.11-0ubuntu1~), sun-java5-jdk (>> 0), sun-java6-jdk (>> 0)
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,
role::shared-lib, scope::application, scope::utility, sound::player,
suite::debian, use::downloading, use::organizing, use::searching,
works-with::audio, works-with::software:package, works-with::text
Section: admin
Priority: important
Filename: pool/main/a/apt/apt_1.0.9.6_amd64.deb
Size: 1107560
MD5sum: a325ccb14e69fef2c50da54e035a4df4
SHA1: 635d09fcb600ec12810e3136d51e696bcfa636a6
SHA256: 371a559ce741394b59dbc6460470a9399be5245356a9183bbeea0f89ecaabb03
5.2.1.1. Afhankelijkheden: het Depends
Veld
De afhankelijkheden worden gedefinieerd in het Depends
veld in de header van het pakket. Dit is een lijst van voorwaarden waaraan voldaan moet worden om het programma correct te laten werken — deze informatie wordt gebruikt door gereedschappen zoals apt
om de nodige bibliotheken te installeren, in de geschikte versies van de afhankelijkheden van het te installeren pakket. Voor iedere afhankelijkheid is het mogelijk het bereik van versies die aan deze eisen voldoen te beperken. In andere woorden, het is mogelijk om uit te drukken dat we een pakket libc6 in een versie gelijk aan of groter dan “2.15” (geschreven als “libc6 (>= 2.15)
”). vergelijking operaties zijn als volgt:
<<
: 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 een lijst met voorwaarden waaraan te voldoen, gescheiden door een komma. Het moet geïnterpreteerd worden als een logische “en”. in voorwaarden, betekend een verticale lijn (“|”) een logische “of” (het is een inclusieve “of”, geen exclusieve “één van beide/of”). Meer meer prioriteit dan “en”, het kan zo veel als nodig gebruikt worden. Dus, de afankeleikheid (“A of B) en C” is geschreven als
A | B, C
. In contrast, de uitdrukking “A of (B en C)” zou geschreven moeten worden als “(A of B) en (A of C)” omdat het
Hangt af van
veld laat geen haakjes toe de de volgorde van de prioriteiten tussen logische opperatoren “of” en “en” toe. Het zou dus geschreven moeten worden als
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
Het Conflict
veld geeft aan wanneer een pakket niet geïnstalleerd kan worden gelijktijdig met een ander. De meest voorkomende reden voor dit is dat beide pakketten een bestand bevatten met dezelfde naam of dezelfde dienst of dezelfde TCP poort, of elkaars werking zouden verhinderen.
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
Het Biedt aan
veld is ook interessant wanneer de inhoudt van een pakket wordt geleverd in een groter pakket. Bij voorbeeld, de libdigest-md5-perl Perl module was een optionele module in Perl 5.6 en is as standaard geïntegreerd in Perl 5.8 (en nieuwere versies zoals 5.20 momenteel in Jessie). Als zodanig heeft het perl pakket sinds versie 5.8 aangegeven Biedt aan: libdigest-md5-perl
zodat de afhankelijkheden van dit pakket voldaan zijn als de gebruiker Perl versie 5.8 (of nieuwer) heeft. Het libdigest-md5-perl pakket zelf is uiteindelijk verwijderd, omdat het geen belang meer had sinds oude versies van Perl verwijderd werden.
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.
Deze beperking is opgelost in dpkg 1.17.11, en is niet meer relevant in Jessie. Pakketten kunnen een versie nummer toewijzen aan een virtueel pakket dat zij aanbieden met een afhankelijkheid zoals Biedt aan: 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
Naast het control
bestand en het control.tar.gz
archief voor ieder Debian pakket, kunnen Debian pakketten ook een aantal scripts bevatten, ingeroepen door dpkg
tijdens verschillende stadia van het verwerken van een pakket. Het Debian Beleid beschrijft de mogelijke gevallen in detail, het specificeert de scripts die worden aangeroepen en de argumenten die ze kunnen ontvangen. Deze volgorde kan complex zijn, omdat indien één script faalt, dpkg
zal proberen om naar een voldane staat terug te keren door de installatie of verwijdering die aan de gang is te annuleren (voor zover dit mogelijk is).
In het algemeen, wordt het preinst
script uitgevoerd voor de installatie van het pakket, terwijl het postinst
erna komt. Hetzelfde voor prerm
wat aangeroepen wordt voor de verwijdering van een pakket en postrm
erna. Een update van een pakket is hetzelfde als de vorige versie verwijderen en de installatie van het nieuwe. Het is niet mogelijk om alle mogelijke scenario's hier in detail te beschrijven, maar we zullen de meest voorkomende twee bespreken: een installatie/update en een verwijdering.
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
Naast de onderhouder scripts en controle data al genoemd in het vorige deel, kan het
control.tar.gz
archief van een Debian pakket ook nog andere interessante bestanden bevatten. De eerste
md5sum
, bevat de MD5 checksum voor al de bestanden in het pakket. Het grote voordeel is dat het
dpkg --verify
toestaat (wat ze in
Paragraaf 14.3.3.1, “Auditing Packages with dpkg --verify
” zullen bespreken) om de controleren of de bestanden zijn aangepast sinds hun installatie. Merk op dat indien dit bestand niet bestaat
dpkg
het dynamisch tijdens de installatie zal genereren (en het opslaan in de dpkg databank net zoals andere control bestanden).
conffiles
een lijst van pakketten die moeten behandeld worden als configuratie bestanden. Configuratiebestanden kunnen aangepast worden door de beheerder en dpkg
wal proberen deze veranderingen te behouden bij een pakket 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.