Gentoo Update & package management

Published: 22-12-2014

Updated: 10-01-2016

By: Maxime de Roucy

tags: emerge gentoo

Mes notes concernant les mise à jours de Gentoo et la gestion de paquet en général.

Update

Les commandes que j’utilise pour mettre à jour ma gentoo :

root@server # eix-sync
root@server # emerge -av --update --changed-use --deep @world
root@server # emerge -av @preserved-rebuild
root@server # emerge --depclean
root@server # emaint all
root@server # eclean-dist --deep
root@server # eclean-pkg --deep
root@server # eix-test-obsolete
root@server # rkhunter --propupd
root@server # lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u

emerge

sets

Un « set » est un groupe de paquet de fichier. Les « sets » sont précédé d’un « @ ». Par exemple « @world » est un set contenant tous les paquets explicitement installés par l’utilisateur.

Les « sets » présent par défaut dans portage peuvent être listée via la commande suivante.

max@laptop % emerge --list-sets

Leurs configuration se trouve dans le fichier /usr/share/portage/config/sets/portage.conf.

Pour afficher le contenu d’un set, e.g. « @system » :

max@laptop % emerge -p --emptytree --nodeps @system

Pour afficher sont contenu et toutes ses dépendences :

max@laptop % emerge -p --emptytree @system

@world

« @world » contient tous les paquets explicitement installé par l’utilisateur.

La liste des paquets contenus dans « @world » est récupéré du fichier /var/lib/portage/world.

Options de emerge relative à « @world » :

@preserved-rebuild

Lorsque la fonctionnalité portage « preserve-libs » n’existait pas encore, on lançait emerge --depclean directement après emerge --update …. L’option --depclean supprime les paquets qui ne sont pas dans l’arbre de dépendance de « @world ». On supprime donc les anciennes versions des paquets qui ont été mis à jour, certains de ces paquets pouvant être des bibliothèques.

Durant la mise a jour, d’autre paquets ont pu être compilé avant la mise à jour de ces bibliothèques. Il peuvent donc être linké aux anciennes versions de ces bibliothèques. emerge --depclean supprimant ces versions, on pouvait se retrouver avec de paquets linké sur des bibliothèques supprimées.

Il fallait lancer revdep-rebuild. Pour chaque binaire, il vérifie que le linkage est bon et recompile le paquet correspondant (au binaire, pas à la bibliothèque) si ce n’est pas le cas.

Aujourd’hui portage (si la fonctionnalité « preserve-libs » est activée : FEATURES=“… preserve-libs …”) conserve une liste des bibliothèques (avec leur version) utilisées pour compiler chaque paquet. Le « set » « @preserved-rebuild » utilise cette liste. emerge @preserved-rebuild recompile tous les paquets qui sont linké à des bibliothèques dont une version plus récente est présente sur le système. Il faut donc lancer cette commande avant emerge --depclean.

supprimer un élément

Source : man portage

Pour supprimer un élément du set « @world » il suffit de le désinstaller. Pour supprimer un élément du set « @profile » ou « @system » il faut modifier le fichier /etc/portage/profile/packages.

Par exemple pour avoir un système purement systemd j’ai supprimé les paquets « openrc » et « net-tools » de « @system ». Le « - » indique une suppression et le « * » indique que la modification impacte « @system » et non « @profile ».

-*sys-apps/openrc
-*sys-apps/net-tools

options

changed-use

Déclanche la re-compilation d’un paquet lorsque la liste de ses useflags activé est modifiée. À la différence de --newuse, si un nouveau useflags est ajouté au paquet mais que ce useflags est désactivé, le paquet ne sera pas recompilé.

newuse

Déclanche la re-compilation d’un paquet lorsque la liste de ses useflags, activé ou non, est modifiée.

with-bdeps

L’option --depclean supprime les paquets qui ne sont pas dans l’arbre de dépendance des paquets présents dans @world. Par défaut les dépendance de compilation sont aussi prisent en compte dans l’arbre de dépendance (--with-bdeps=y). Les paquets qui sont nécessaire uniquement lors de la compilation des autres paquets ne sont donc pas supprimé.

On peut utiliser l’option --with-bdeps=n pour forcer ces paquets à être supprimé lors d’un --depclean. Cependant ce n’est pas forcément un bonne idée car la plupart de ces paquets devrons de nouveau être installé lors de la prochaine mise à jours.

Lors de la mise à jour du système et plus généralement lors de n’importe quelle opération d’installation, les dépendance de compilation ne sont pas prise en compte dans l’arbre des dépendances (--with-bdeps=n). Une mise à jour standard d’un paquet ne met donc pas à jour ses dépendances de compilations à moins que les versions de ces dépendances ne soit explicitement requise (dans la variable RDEPEND de l’ebuild du paquet) et que celle-ci ne soit pas disponible sur le système.

Il est possible de forcer la mise à jour de ces dépendances de compilation avec l’option --with-bdeps=y. Ce n’est pas forcément une bonne idée car si les ebuild/paquets sont parfaits, les versions minimal des dépendances de compilations doivent être indiquées et emerge les mets donc à jour. Cependant on fait ici une grosse supposition « les ebuild/paquets sont parfaits ». Non pas qu’il soit mal fait ; je trouve le travail des mainteneur et dévelopeur Gentoo remarquable. Mais déterminer les versions minimals des dépendances de compilation d’un paquet est juste un travail titanesque, et je ne leur en voudrais pas si certain paquets ne compile pas à cause de ça.

De temps en temps, je conseille donc de lancer une mise à jour avec l’option --with-bdeps=y.

config

Après installation certain paquets (ici postgresql) nécéssite d’être configuré (un message l’indique à la fin de l’installation).

root@server # emerge --config '=dev-db/postgresql-9.4.1'

Les paramètres de cette configuration sont placés dans /etc/conf.d. Les commandes exécutées par emerge --config se trouve dans la fonction « pkg_config » de l’ebuild.

Bloquage

Lors de l’utilisation de l’option --pretend, emerge peut remonter des erreurs de « blocks ». Toutes ces erreurs ne sont pas équivalente et avant de chercher à les corriger il faut savoir que les erreur marquée d’un « b » minuscule ne sont pas bloquante et sont résolue automatiquement. Il ne faut pas confondre « B » et « b ».

B   blocked by another package (unresolved conflict)
b   blocked by another package (automatically resolved conflict)

Sources :

emaint

Cet outil effectue plusieurs vérifications relative à portage permettant de garder un système « propre ». Par defaut il ne modifie rien. Si certains modules vous informe d’anomalies vous pouvez les corriger avec l’option -f, --fix.

À partir de la version 2.2.16 de portage, emaint permettra aussi de synchroniser les dépots.

Sources : page man de emaint

eclean

Cet outil permet de nettoyer les dossier :

Par défaut, il en supprime que les sources et les binaires des paquets qui ne sont plus disponible dans l’arbre portage. Avec l’option -d, --deep on supprime les sources des paquets qui ne sont pas intallé sur le système.

unavailable installed packages

root@server # eclean-dist
   The following unavailable installed packages were found
             virtual/perl-CPAN-Meta-YAML-0.12.0 ...distfile name(s) not known/saved
             www-apps/davical-1.1.1-r1

Cela veut simplement dire que des paquets installé ne sont plus disponible dans l’arbre portage. Ça n’est pas inquiétant et ces paquets seront généralement supprimé au prochain update.

Source : eclean-dist unavailable installed packages were found

eix-test-obsolete

La commande eix-test-obsolete effectue plusieurs tests dans /etc/portage sur les paquets installés pour vérifier la cohérence global du système.

lsof

La commande suivante permet de déterminer quel sont les processus actif utilisant des bibliothèque qui ont été supprimé. Il convient de redémarrer ces services.

root@server # lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u

+c 0 permet d’afficher le nom complet des processus. Les lignes marqué de type « DEL » indique que le processus utilise un fichier qui a été supprimé. Il est important de noté que, bien que ces fichiers sont supprimés, leur contenu est conservé sur le disque jusqu’a ce que le processus l’utilisant le libère. Le reste de la commande permet de n’afficher que les informations intéressante pour nous, c’est à dire le nom du processus et le fichier supprimé.

configuration de portage

Les fichiers de configuration de portage, notamment make.conf, se trouve dans le dossier /etc/portage. La configuration par défaut de portage se trouve dans le dossier /usr/share/portage/config. Ce dossier contient aussi le fichier make.conf.example qui contient toutes les options de configuration et leurs descriptions, pouvant être renseignées dans /etc/portage/make.conf.

etc-update

Par défaut lorsqu’un nouveau fichier configuration est installé avec un paquet il n’écrase pas l’ancien si celui-ci existe (encore heureux). Il est renommé avec le préfix « . » et le suffix « .dist_x » ou x est un compteur à 4 chiffre (0001, 0002…). Et l’utilisateur est avertie de la présence d’un nouveau fichier de configuration par un message en fin d’installation.

 * IMPORTANT: config file '/etc/smartd.conf' needs updating.
 * See the CONFIGURATION FILES section of the emerge
 * man page to learn how to update config files.

Pour mettre à jours ces fichiers on peut utiliser la commande etc-update.

Il est possible de configurer cet outils via le fichier /etc/etc-update. Mais il n’est pas possible de le configurer pour utiliser vimdiff comme commande de fusion de fichier car il permet à l’utilisateur de choisir un fichier d’enregistrement autre que celui attendu.

NOTE_1: Editors such as vim/vimdiff are not usable for the merge_command because it is not known what filenames the produced files have (the user can choose while using those programs)

log

Tous les messages affiché en fin d’installation/update/remove… via emerge peuvent être retrouvé dans le fichier /var/log/portage/elog/summary.log. Ce fichier est versionné par logrotate via /etc/logrotate.d/elog-save-summary.

news

Lors de changement ou d’annonce importante, les développeurs gentoo utilise un système de notification spécifique appelé « news ». Lorsque vous avez une « news » emerge vous notifi avec le message suivant :

 * IMPORTANT: 1 news items need reading for repository 'gentoo'.
 * Use eselect news read to view new items.

Vous pouvez manipuler les news avec la commande eselect.

max@laptop % eselect news
count   -- Display number of news items
list    -- List news items
purge   -- Purge read news
read    -- Read news items
unread  -- Mark read news items as unread again

max@laptop % eselect news list
News items:
  …
  [20]     2015-04-16  FFmpeg default
  [21]  N  2015-06-08  udev-init-scripts-29 important changes
  [22]     2015-07-25  Python 3.4 enabled by default

max@server % eselect news read
2015-06-08-udev-init-scripts-changes
  Title                     udev-init-scripts-29 important changes
  Author                    William Hubbs <williamh@gentoo.org>
  Posted                    2015-06-08
  Revision                  2

In udev-init-scripts-29 and newer, the udev service script has been
…

max@laptop % eselect news unread 21

TODO : voire si les news aparaisse à l’installation de paquet ou à la synchronisation des dépôts.

webapp-config

Gentoo inclue des application web dans sont gestionnaire de paquet, webapp-config permet de déployer et manager ces application après leurs installation sur le système. En effet, emerge installe ces applications dans le dossier /usr/share/webapps/ il faut donc ensuite les déployer sur le serveur web.

Un article est dédié à cet outil : Gentoo webapp-config.

savedconfig

« savedconfig » est un USE flag qui permet d’enregistrer et d’appliquer une configuration spécifique concernant un paquet. Un exemple sera plus parlant. « sys-kernel/linux-firmware » et un paquet qui installe certains firmware non inclue dans le sources du noyau. Généralement, sur votre installation vous avez besoin d’un ou deux des firmware installé par ce paquet. Beaucoup de fichier installé par défaut par ce paquet sont donc inutile sur un système donné. « sys-kernel/linux-firmware » utilise le USE flag « savedconfig » pour permettre à l’utilisateur de n’installé que les firmware voulu.

méthode simple

Lorsque j’installe « sys-kernel/linux-firmware-20150812 », celui-ci va installer tous les firmware et sauvegarder cette « configuration » (installer tout) dans le fichier /etc/portage/savedconfig/sys-kernel/linux-firmware-20150812. Vous pouvez aller modifier ce fichier pour configurer l’installation des seuls firmwares désiré. Lorsque vous réinstaller le paquet cette nouvelle configuration est appliquée.

Si vous voulez que cette configuration soit appliquée au autre version du paquet, renomez le fichier …/linux-firmware.

méthode complexe

Cette méthode est plus complexe mais je la trouve plus propre car elle n’implique pas d’installer le paquet une première fois pour pouvoir faire la modification de la configuration. Certaines explications se trouve uniquement dans la section « méthode simple » !

Tout d’abord j’ai été voir dans le fichier /usr/portage/sys-kernel/linux-firmware/linux-firmware-20150812.ebuild dans quelle section se trouvé la création de la configuration de base. Il s’agit de la section src_prepare. J’ai ensuite lancer la commande suivante pour éxécuter ladite section (et toutes les sections dépendantes).

root@server # ebuild …/linux-firmware-20150812.ebuild prepare

Le fichier de configuration est généré dans le dossier de build et il suffit de le copier dans /etc/portage/savedconfig/…

root@server # cp /var/tmp/portage/sys-kernel/linux-firmware-20150812/work/linux-firmware-20150812/linux-firmware.conf \
     /etc/portage/savedconfig/sys-kernel/linux-firmware