Améliorer Pacman

De ArchwikiFR

Pacman est un outil simple, mais il peut arriver qu'on ait envie de faire des trucs divers et variés pour améliorer les performances de notre gestionnaire de paquets préféré.

Améliorer les accès à la base

pacman-optimize

Pacman sauvegarde les informations correspondantes au paquets dans un ensemble de fichiers de petites tailles, afin d'améliorer les temps d'accès à ces fichiers, vous pouvez lancer:

pacman-optimize

Cette commande compresse puis décompresse la base de données de pacman, ça permet de rassembler les fichiers dans un même endroit physique, ce qui en théorie accélère l'accès.

Vous pouvez effectuer un ménage dans les paquets en cache (cf. la section appropriée de ce même article) avant de lancer la commande.

pacman-cage

pacman-cage est un script qui crée un fichier loop contenant la base de données pacman.

Ce script fait une sauvegarde au premier lancement seulement.

Attention: Il est vivement conseillé de bien vérifier que le fichier loop a bien été crée et monté avant d'utiliser pacman sinon, vous pouvez vite vous retrouver avec une base incohérente.
Note: Depuis la version 3.5, pacman ne décompresse plus la bases des dépôts distant.

Partager son cache

Problème : j'ai un paquet, mais mon voisin ne l'a pas, comment peut-on faire pour ne pas avoir à le re-télécharger depuis un miroir ?

Machines fixes

Dans cette situation, nous avons plusieurs machines fixes en réseau et un serveurs NFS.

Pour alléger la charge réseau et la charge des miroirs, on peut créer sur le serveur NFS un dossier qui contiendra les paquets de toutes nos machines et sur chaque client, on pourra installer nfs-utils.

Ensuite, c'est simple comme chou, on ajoute une ligne au fstab :

Fichier: /etc/fstab
serveur:/chemin/vers/dossier/cachepacman                        /var/cache/pacman       nfs4    noauto,x-systemd.automount      0       0

On a maintenant un cache pacman monté en réseau. Pour éviter les suppressions maladroites de paquets installés sur une machine X mais pas une machine Y, il faut changer la méthode de conservation de pacman :

Fichier: /etc/pacman.conf
[options]
CleanMethod = KeepCurrent

PC portable

Une autre méthode, plus "plug'n'play" est d'utiliser pacserve qui agit comme une bibliothèque partagée de paquets : si mon voisin a un paquet et moi non, j'irai le prendre chez lui.

Pacserve crée un dépôt local et annonce en broadcast qu'il y a un dépôt sur la machine (http://ip_du_serveur_pacserve:15678/pkg).

Pour utiliser et lancer pacserve : il suffit d'utiliser pacsrv plutôt que pacman pour le client et de lancer le service pacserve.service pour le serveur.

L'intégration avec yaourt se fait simplement :

Fichier: /etc/yaourtrc
PACMAN=/usr/bin/pacsrv

Si de plus vous utilisez powerpill :

Fichier: /etc/yaourtrc
PACMAN=/usr/bin/powerpill
Fichier: /etc/powerpill/powerpill.json
[...]
  "pacman": {
    "config": "/etc/pacman.conf",
    "path": "/usr/bin/pacsrv"
  },
  "pacserve": {
    "server": "http://localhost:15678"
  },
[...]

Vitesse de téléchargement

Choisir de bons miroirs

Facile à faire : on ne prend pas les miroirs américains si on est en France...

On peut aussi utiliser des outils comme reflector pour générer une liste à jour des serveurs les plus rapides.

Aria

aria2 est un logiciel de téléchargement comme wget ou curl, à ceci près qu'il supporte le téléchargement parallèle ou par segments : il fera plusieurs requêtes au serveur pour télécharger des bouts du fichier demandé en parallèle puis les coller ensemble une fois que c'est fini.

Fichier: /etc/pacman.conf
XferCommand = /usr/bin/aria2c --allow-overwrite=true -c --file-allocation=none --log-level=error -m2 -x2 --max-file-not-found=5 -k5M --no-conf -Rtrue --summary-interval=60 -t5 -d / -o %o %u

Et le détail des options :

/usr/bin/aria2c
chemin complet vers aria2 ;
--allow-overwrite=true
Relancer un téléchargement si le fichier de contrôle n'existe pas (Defaut: false) ;
-c, --continue
Continuer un téléchargement si un fichier partiellement téléchargé possède un fichier de contrôle ;
--file-allocation=none
Ne pas pré-allouer d'espace avant le début du téléchargement (Defaut: prealloc)
--log-level=error
Ne donner que les erreurs en sortie (Defaut: debug) ;
-m2, --max-tries=2
2 essais maximum de téléchargement par fichier (Defaut: 5) ;
-x2, --max-connection-per-server=2
2 connections maximum par serveur pour chaque fichier (Defaut: 1) ;
--max-file-not-found=5
forcer le téléchargement à entrer en mode échec si aucun octet n'est reçu après 5 essais (Defaut: 0) ;
-k5M, --min-split-size=5M
Ne couper le fichier que si sa taille est supérieure à 2x5MB = 10MB (Defaut: 20M) ;
--no-conf
Ne pas charger de fichier local de configuration s'il en existe un (Defaut: ~/.aria2/aria2.conf) ;
-Rtrue, --remote-time=true
Appliquer les timestamps distants sur les fichiers locaux (Defaut: false) ;
--summary-interval=60
Donner le statut toutes les 60 secondes (Default: 60)
-t5, --timeout=5
Configurer le timeout à 5 secondes lorsque la connexion a été établie avec le miroir (Defaut: 60) ;
-d, --dir
Le dossier où mettre les fichiers téléchargés, tel que spécifié par pacman ;
-o, --out
Le nom des fichiers téléchargés ;
%o
Variable qui représente le nom de fichier local, telle que spécifiée par pacman ;
%u
Variable qui représente l'URL de téléchargement telle que spécifiée par pacman.

powerpill

powerpill est un "wrapper" de pacman et utilise aria2 pour télécharger les paquets depuis plusieurs différents miroirs simultanément (ceux spécifiés dans /etc/pacman.d/mirrorlist) (ce n'est pas le cas de la technique précédente qui ne demande qu'à un seul miroir).

powerpill s'utilise exactement comme pacman, à grands coups de -S, -Syu, etc.

On peut utiliser powerpill dans yaourt, il suffit pour celà :

Fichier: /etc/yaourtrc
PACMAN="/usr/bin/powerpill"

Nettoyage du cache

Bon, tout ça c'est bien mignon, mais les vieux paquets ça prend de la place, et à un moment, il faut purger le cache.

pacman

pacman -Sc va nettoyer le cache et ne garder --selon votre configuration de CleanMethod-- que les paquets installés ou les paquets encore disponibles sur les miroirs.

Attention: Après avoir lancé ça, pas de pacman -U (downgrade en utilisant le cache).

paccache

paccache est un script intégré à pacman qui se charge du nettoyage du cache, de façon moins kamikaze que pacman -Sc.

À la main

paccache -rvk3

Explication (cf. paccache -h pour l'aide exhaustive) :

  • -r pour supprimer
  • -v pour verbose
  • -k 3 pour conserver 3 versions des paquets

Dans un timer

Il semble que nettoyer son cache une fois par mois est raisonnable, d'où les timer et unit suivants :

Fichier: /etc/systemd/system/timer-paccache.timer
[Unit]
Description=Monthly Timer for paccache (clean pacman cache)

[Timer]
OnCalendar=monthly
AccuracySec=5d
Persistent=true
Unit=paccache.service

[Install]
WantedBy=multi-user.target
Fichier: /etc/systemd/system/paccache.service
[Unit]
Description=Clean pacman's cache and keep the 2 previous versions of packages too

[Service]
Nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
Type=oneshot
ExecStart=/usr/bin/paccache -rvk 3

pkgcacheclean

pkgcacheclean est un petit programme qui nettoie le cache pacman mais conserve n versions du paquet dans le cache.

Note: pkgcacheclean est un programme sur AUR alors que paccache présenté plus haut est intégré à pacman

À la main

pkgcacheclean -nv 3

Cette commande va afficher (et seulement afficher, aucun fichier n'est modifié) ce qu'il ferait si vous vouliez conserver 3 versions pour chaque paquet installé. Pour effectuer les changements sur le disque :

pkgcacheclean -v 3

Voilà, un cache pacman plus léger et une solution moins kamikaze que pacman -Sc.

Dans un timer

Il semble que nettoyer son cache une fois par mois est raisonnable, d'où les timer et unit suivants :

Fichier: /etc/systemd/system/timer-pkgcacheclean.timer
[Unit]
Description=Monthly Timer for pkgcacheclean (clean pacman cache)

[Timer]
OnCalendar=monthly
AccuracySec=5d
Persistent=true
Unit=pkgcacheclean.service

[Install]
WantedBy=multi-user.target
Fichier: /etc/systemd/system/pkgcacheclean.service
[Unit]
Description=Clean pacman's cache and keep the 2 previous versions of packages too

[Service]
Nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
Type=oneshot
ExecStart=/usr/bin/pkgcacheclean -v 3

Voir aussi