ajout infos sur debian packages
This commit is contained in:
parent
8d1414890a
commit
e4e417675b
|
@ -1,176 +1,178 @@
|
|||
---
|
||||
categories: debian system
|
||||
title: Howto Debian packages
|
||||
...
|
||||
|
||||
# Howto Debian packages
|
||||
* dpkg(1) : <https://manpages.debian.org/stable/dpkg/dpkg.1.en.html>
|
||||
* apt-get(1) : <https://manpages.debian.org/stable/apt/apt-get.8.en.html>
|
||||
* apt-cache(1) : <https://manpages.debian.org/stable/apt/apt-cache.8.en.html>
|
||||
|
||||
## Gestion des packages
|
||||
Debian possède le meilleur format de packages : le `.deb` qui se manipule avec l'outil `dpkg`.
|
||||
Debian possède le programme de gestion de packages le plus avancé du monde : APT (Advanced Packaging Tool).
|
||||
|
||||
Voir les évolutions de version proposées :
|
||||
## Format .deb
|
||||
|
||||
Un package `.deb` est une archive au format **ar** qui contient un fichier `debian-binary` et 2 tarballs : `data.tar` (arborescence de fichiers à installer) et `control.tar` (scripts et meta-informations sur le package).
|
||||
|
||||
~~~
|
||||
# aptitude upgrade -sV
|
||||
$ ar x apt_1.6.4_amd64.deb
|
||||
$ ls -l
|
||||
-rw-r--r-- 1 gcolpart evolix 6896 août 24 23:19 control.tar.xz
|
||||
-rw-r--r-- 1 gcolpart evolix 1305248 août 24 23:19 data.tar.xz
|
||||
-rw-r--r-- 1 gcolpart evolix 4 août 24 23:19 debian-binary
|
||||
|
||||
$ tar xvf control.tar.xz
|
||||
./conffiles
|
||||
./control
|
||||
./md5sums
|
||||
./postinst
|
||||
./postrm
|
||||
./preinst
|
||||
./prerm
|
||||
./shlibs
|
||||
./triggers
|
||||
|
||||
$ tar xvf control.tar.xz
|
||||
./etc/
|
||||
./etc/apt/
|
||||
./etc/apt/apt.conf.d/
|
||||
./etc/apt/apt.conf.d/01autoremove
|
||||
[…]
|
||||
./usr/
|
||||
./usr/bin/
|
||||
./usr/bin/apt
|
||||
./usr/bin/apt-cache
|
||||
./usr/bin/apt-cdrom
|
||||
./usr/bin/apt-config
|
||||
./usr/bin/apt-get
|
||||
./usr/bin/apt-key
|
||||
./usr/bin/apt-mark
|
||||
[…]
|
||||
~~~
|
||||
|
||||
### Packages held
|
||||
|
||||
Pour avoir des informations sur un paquet `.deb` :
|
||||
|
||||
~~~
|
||||
# aptitude search ~ahold
|
||||
$ dpkg-deb -I apt_1.6.4_amd64.deb
|
||||
nouveau paquet Debian, version 2.0.
|
||||
taille 1312336 octets : archive de contrôle=6896 octets.
|
||||
121 octets, 4 lignes conffiles
|
||||
1412 octets, 27 lignes control
|
||||
11573 octets, 166 lignes md5sums
|
||||
5042 octets, 137 lignes * postinst #!/bin/sh
|
||||
1370 octets, 45 lignes * postrm #!/bin/sh
|
||||
254 octets, 6 lignes * preinst #!/bin/sh
|
||||
485 octets, 11 lignes * prerm #!/bin/sh
|
||||
23 octets, 1 lignes shlibs
|
||||
67 octets, 2 lignes triggers
|
||||
Package: apt
|
||||
Version: 1.6.4
|
||||
Architecture: amd64
|
||||
[…]
|
||||
|
||||
$ dpkg-deb -c apt_1.6.4_amd64.deb
|
||||
drwxr-xr-x root/root 0 2018-08-20 17:38 ./
|
||||
drwxr-xr-x root/root 0 2018-08-20 17:38 ./etc/
|
||||
drwxr-xr-x root/root 0 2018-08-20 17:38 ./etc/apt/
|
||||
drwxr-xr-x root/root 0 2018-08-20 17:38 ./etc/apt/apt.conf.d/
|
||||
-rw-r--r-- root/root 861 2018-08-20 17:38 ./etc/apt/apt.conf.d/01autoremove
|
||||
[…]
|
||||
|
||||
## dpkg
|
||||
|
||||
`dpkg` est un outil bas niveau pour manipuler des packages Debian :
|
||||
|
||||
~~~
|
||||
Installer un package
|
||||
# dpkg -i foo.deb
|
||||
|
||||
Dépaqueter un package sans le configurer
|
||||
# dpkg --unpack foo.deb
|
||||
|
||||
Configurer un package non configuré
|
||||
# dpkg --configure foo
|
||||
|
||||
Re-configurer un package déjà configuré
|
||||
# dpkg-reconfigure foo
|
||||
|
||||
Re-configurer un package déjà configuré avec un maximum de questions
|
||||
# dpkg-reconfigure -plow foo
|
||||
|
||||
Supprimer un package
|
||||
# dpkg -r foo
|
||||
|
||||
Purger un package supprimé
|
||||
# dpkg -P foo
|
||||
~~~
|
||||
|
||||
## Unattended upgrades / Auto upgrades
|
||||
`dpkg` permet aussi d'avoir quelques informations de base :
|
||||
|
||||
Sur un serveur non critique (backup, dev, …) on peut vouloir faire les mises à jour automatiquement.
|
||||
~~~
|
||||
Lister les packages installés de façon « conviviale »
|
||||
$ dpkg -l
|
||||
|
||||
Pour cela il faut installer le paquet unattended-upgrades et faire « dpkg-reconfigure -plow unattended-upgrades ».
|
||||
Lister les packages installés de façon exhaustive
|
||||
$ dpkg --get-selections
|
||||
|
||||
La configuration se trouve dans /etc/apt/apt.conf.d/50unattended-upgrades.
|
||||
Installer une liste de packages générée par "dpkg --get-selections"
|
||||
# dpkg --merge-avail < apt-cache-dumpavail.txt
|
||||
# dpkg --set-selections < dpkg-get-selections.txt
|
||||
# apt dselect-upgrade
|
||||
|
||||
Lister les fichiers d'un package installé
|
||||
$ dpkg -L foo
|
||||
|
||||
Lister les packages installé qui contiennent un fichier
|
||||
$ dpkg -S bin/bar
|
||||
~~~
|
||||
|
||||
## apt
|
||||
|
||||
Liste des packages pouvant être mis au jour (inclus les package en hold) :
|
||||
|
||||
~~~
|
||||
$ apt list --upgradable
|
||||
~~~
|
||||
|
||||
> *Note* : avec *aptitude* on a un résultat plus précis avec `aptitude upgrade -sV`
|
||||
|
||||
|
||||
### hold / unhold
|
||||
|
||||
~~~
|
||||
# apt-mark hold foo
|
||||
foo passé en figé (« hold »).
|
||||
|
||||
# apt-mark showhold
|
||||
foo
|
||||
|
||||
# dpkg -l foo
|
||||
hi foo […]
|
||||
|
||||
# apt-mark unhold foo
|
||||
Annulation de l'état figé pour foo.
|
||||
~~~
|
||||
|
||||
|
||||
## Astuces
|
||||
|
||||
Lister les packages installés, notamment leur pool pour différencier main/contrib/non-free :
|
||||
|
||||
~~~
|
||||
$ dpkg --get-selections | tr '\t' ' ' | cut -d" " -f1 | cut -d: -f1 | xargs apt-cache show | grep ^Filename
|
||||
~~~
|
||||
|
||||
### Unattended upgrades / Auto upgrades
|
||||
|
||||
Sur un serveur non critique (backup, dev, …) on peut vouloir faire les mises à jour automatiquement :
|
||||
|
||||
~~~
|
||||
# apt install unattended-upgrades
|
||||
# dpkg-reconfigure -plow unattended-upgrades
|
||||
~~~
|
||||
|
||||
La configuration se trouve dans le fichier `/etc/apt/apt.conf.d/50unattended-upgrades`.
|
||||
On peut choisir où envoyer le mail de rapport ou encore si on doit redémarrer la machine automatiquement si nécessaire, etc.
|
||||
|
||||
|
||||
## Créer un paquet Debian
|
||||
|
||||
* Debian Policy : <http://www.debian.org/doc/debian-policy/>
|
||||
* Debian Dev refs : <http://debian.org/doc/developers-reference/>
|
||||
* Debian New Maint guide : <http://debian.org/doc/maint-guide/>
|
||||
* Howto sur le wiki Debian : <http://wiki.debian.org/HowToPackageForDebian>
|
||||
* Howto de L. Nussbaum : <http://www.debian.org/doc/manuals/packaging-tutorial/packaging-tutorial.en.pdf>
|
||||
|
||||
### Génération de l'arborescence _debian/_
|
||||
|
||||
Cette étape consiste à créer une arborescence qui constituera le paquet Debian. On peut l'automatiser simplement avec la commande _dh_make_ :
|
||||
|
||||
~~~
|
||||
cd futur-paquet-0.1
|
||||
dh_make
|
||||
~~~
|
||||
|
||||
_NOTE : le nom du répertoire doit obligatoirement être de la forme _nom_-_version_ (_nom_ peut contenir des minuscules, chiffres et tirets)._
|
||||
|
||||
En utilisant dh_make sans options, il essayera de deviner les informations dont il a besoin. On peut forcer celles ci en les spécifiant sur la ligne de commande. Pour les plus utiles :
|
||||
|
||||
* `-c` : la licence du programme ;
|
||||
* `-e` : l'adresse email du responsable du paquet (vous) ;
|
||||
* `-p` : nom du paquet, si le nom du répertoire courant n'est pas sous la forme standard ;
|
||||
* `-f` : chemin vers l'archive contenant les sources. Si elle n'existe pas, utilisez l'option --createorig.
|
||||
|
||||
Le type de paquet vous sera demandé lors de l'exécution.
|
||||
|
||||
### Édition de certains fichiers importants
|
||||
|
||||
_dh_make_ a créé de nombreux fichiers dans le répertoire _debian/_. Certains sont indispensables, d'autres moins.
|
||||
Par exemple (si vous ne vous en servez pas) vous pouvez supprimer tous les *.ex, des templates servant d'exemple.
|
||||
|
||||
~~~
|
||||
rm *.ex
|
||||
rm *.EX
|
||||
~~~
|
||||
|
||||
Voici une rapide explication à propos des fichiers importants :
|
||||
|
||||
* le fichier _control_ : il décrit de manière générale le paquet. Plusieurs champs sont à compléter, notamment :
|
||||
* _Section_ : voir la liste [ici](http://www.debian.org/doc/debian-policy/ch-archive.html#s-subsections) ;
|
||||
* _Homepage_ : le site du programme ;
|
||||
* _Architecture_ : _any_ par défaut, ce qui va générer un paquet par architecture. Dans le cas d'un script shell par exemple, on préférera _all_ (un seul paquet est généré car compatible avec toutes les architectures) ;
|
||||
* _Depends_ : indiquez ici le nom et la version des paquets dont dépends éventuellement le programme (en général des bibliothèques) ;
|
||||
* _Description_ : le champ doit contenir une description courte, suivi d'une description longue (sur la ligne suivante, indentée d'un espace).
|
||||
* le fichier _changelog_ : il décrit les changements qui ont été fait sur le programme. À priori, il est déjà complété avec un « Initial release ». Supprimez juste le « (Closes: #nnnn) » puisque c'est la première version.
|
||||
* le fichier _copyright_ : il contient la licence sous laquelle est distribué le programme. `dh_make` l'a partiellement remplit, il vous reste à indiquer le(s) développeur(s) du programme ainsi que le texte de la licence.
|
||||
* le fichier _rules_ : c'est en fait un fichier Makefile, qui décrit les règles de construction et d'installation du paquet. Dans le cas d'un script unique, et qui ne nécessite pas de configuration/compilation :
|
||||
|
||||
C'est le célèbre _./debian/rules_ qui gère donc la compilation et la copie des fichiers dans la future arborescence.
|
||||
Si l'on simplement copier un script, on peut par exemple rajouter ceci à la fin de la cible _install_ :
|
||||
|
||||
~~~
|
||||
install -d -m 0755 -o root -g root $(CURDIR)/debian/futur-paquet
|
||||
install -m 0755 -o root -g root nom-du-script $(CURDIR)/debian/futur-paquet
|
||||
~~~
|
||||
|
||||
### Construction du paquet
|
||||
|
||||
Maintenant nous pouvons construire le paquet à l'aide de la commande :
|
||||
|
||||
~~~
|
||||
$ debuild -us -uc
|
||||
~~~
|
||||
|
||||
Si aucune erreur n'est apparue, votre paquet est prêt à être installé et/ou poussé sur un dépôt non officiel.
|
||||
|
||||
|
||||
## Créer un paquet pour un module PHP Pear ou Pecl
|
||||
|
||||
La commande `dh-make-pecl` (ou `dh-make-pear`) permet de télécharger l'archive depuis les dépôts PHP puis de créer l'arborescence du paquet Debian en pré remplissant certains fichiers (notamment le _debian/rules_) :
|
||||
|
||||
~~~
|
||||
dh-make-pecl --maintainer "John Doe <jdoe@example.com>" --only 5 pecl-package
|
||||
~~~
|
||||
|
||||
### Construire un paquet pour un module PHP Pecl avec PHP7.X
|
||||
|
||||
Depuis Debian Stretch avec php7.0, la commande `dh-make-pecl` n'est pas adapté a php7.0, il faut donc adapté le fichier debian/rules et inclure le fichier /usr/share/dh-php/pkg-pecl.mk pour construire le paquet correctement :
|
||||
|
||||
~~~
|
||||
#!/usr/bin/make -f
|
||||
include /usr/share/dh-php/pkg-pecl.mk
|
||||
~~~
|
||||
|
||||
## Manipulation d'un paquet (binaire)
|
||||
|
||||
Pour certaines (mauvaises) raisons, on peut être amené à vouloir modifier un paquet binaire... notamment un maintainer script par exemple.
|
||||
|
||||
~~~
|
||||
$ ar x foo.deb
|
||||
$ ls
|
||||
control.tar.gz data.tar.gz debian-binary
|
||||
$ tar xf control.tar.gz
|
||||
$ vim preinst
|
||||
<hack...hack...hack>
|
||||
$ tar cvf control.tar.gz md5sums postrm control prerm preinst postinst
|
||||
$ ar r foo.deb control.tar.gz
|
||||
~~~
|
||||
|
||||
Et voilà, on a modifié le _preinst_ du paquet _foo.deb_.
|
||||
|
||||
## FAQ
|
||||
|
||||
### Erreur lintian : mkdir -p failed at /usr/share/perl5/Lintian/Unpacker.pm line 224
|
||||
|
||||
~~~
|
||||
mkdir -p /tmp/temp-lintian-lab-6xngeaELBD/pool/d/devscripts/devscripts_2.13.8_amd64_binary failed at /usr/share/perl5/Lintian/Unpacker.pm line 224.
|
||||
~~~
|
||||
|
||||
C'est probablement que votre système n'a pas assez de mémoire.
|
||||
Avec un _strace lintian_ vous obtiendrez peut-être :
|
||||
|
||||
~~~
|
||||
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f09117029d0) = -1 ENOMEM (Cannot allocate memory)
|
||||
~~~
|
||||
|
||||
## Savoir si un package est installé
|
||||
|
||||
~~~
|
||||
# apt-cache search php | grep apc
|
||||
php-apc - APC User Cache for PHP 5 (transitional package)
|
||||
php5-apcu - APC User Cache for PHP 5
|
||||
# dpkg -l php-apc | grep ^ii
|
||||
~~~
|
||||
|
||||
## Savoir la hiérarchie des fichiers créés suite installation d'un package
|
||||
|
||||
~~~
|
||||
# dpkg -L php-apc
|
||||
/.
|
||||
/usr
|
||||
/usr/lib
|
||||
/usr/lib/php5
|
||||
/usr/lib/php5/20090626
|
||||
...
|
||||
~~~
|
||||
|
||||
## hold / unhold
|
||||
|
||||
~~~
|
||||
# apt-mark hold youtube-dl
|
||||
youtube-dl passé en figé (« hold »).
|
||||
|
||||
# apt-mark unhold youtube-dl
|
||||
Annulation de l'état figé pour youtube-dl.
|
||||
~~~
|
Loading…
Reference in a new issue