====== Optimiser pacman ====== Vous voulez améliorer la vitesse d'éxécution de pacman, le gestionnaire de paquet d'Archlinux ? Vous ne comprenez pas pourquoi pacman est si lent ? Aller : hop, hop, hop, améliorons tout ça. ===== Quelques précisions ===== La base de donnée de pacman repose sur l'utilisation de petits fichiers. Il a été conçu comme ça et est de reste extrêmement puissant pour les tâches auquel il est destiné. Ces fichiers se fragmentent rapidement et entraîne le ralentissement de pacman, au point d'attendre 30 secondes pour obtenir le résultat d'une recherche faîte à l'aide d'un pacman -Ss. C'est anormal. Voyons comment y remédier. ===== Utiliser une partition de type reiserfs ===== Étant donné que pacman utilise un nombre important de petits fichiers, il est préférable d'utiliser une partition de type **reiserfs**, du moins pour la partition qui accueillera la base de donnée de pacman ( qui se trouve dans /var/lib/pacman ). Le format reiserfs gère en effet mieux les petits fichiers, en évitant que ceux-ci fragmentent le disque, ce qui rend la lecture plus lente. \\ \\ Reiserfs est offert lors de l'installation d'Arch Linux. Sinon, il est possible de formater une partition en reiserfs en suivant ces 2 étapes : * Installer le paquet **reiserfsprogs** * Formater avec la commande mkreiserfs $ mkreiserfs /dev/hda1 \\ Attention! : Le formatage d'une partition détruira l'ensemble des fichiers qui s'y trouvent, assurez-vous de faire vos sauvegardes avant et de bien désigner la bonne partition. \\ ===== pacman-optimize ===== **pacman-optimize** est un petit script bash inclus avec pacman depuis la version 3.0 . Celui-ci tente de relocaliser l'ensemble des petits fichiers de la base de donnée de pacman sur une section contigue du disque dur, ce qui diminue les déplacements de la tête de lecture du disque et réduit donc le temps de lecture.\\ \\ Pour utiliser la commande, il suffit de la lancer directement : \\ $ pacman-optimize \\ Il est recommandé de lancer pacman-optimize de façon périodique, par exemple à tous les mois. Pour ce faire, vous pouvez créer un lien vers **/usr/bin/pacman-optimize** dans **/etc/cron.monthly/** \\ $ ln -s /usr/bin/pacman-optimize /etc/cron.monthly/ \\ Assurez-vous aussi que le service cron est activé sur vôtre système. Le service **'cron'** doit être ajouté à la liste DAEMONS= du fichier /etc/rc.conf s'il n'y figure pas déjà. \\ ===== pacman-cage ===== pacman-cage a été écrit par ody. Ce programme publié depuis longtemps sur le [[http://bbs.archlinux.org/viewtopic.php?t=20385|forum anglais]] permet d'accélérer incroyablement le fonctionnement de pacman (et de yaourt). \\ Vous trouverez une version améliorée sur le dépôt [archlinuxfr]: [archlinuxfr] Server = http://repo.archlinux.fr/i686 \\ __**Sauvegarde:**__ Avant de faire quoi que ce soit, il est recommendé d'effectuer une sauvegarde de la base pacman. Pour cela, lancez: yaourt -B \\ __**Utilisation:**__ Installez le paquet **'pacman-cage'**.\\ Lancez en root la commande **pacman-cage**\\ => pacman-cage va sauvegarder les fichiers nécessaires au fonctionnement de pacman et créer une base de données de ces fichiers (un fichier loopback)\\ Vous pouvez tout de suite utiliser pacman et tous les outils habituels (yaourt, pacmenu, srcpac, jacman, gtkpacman etc...) avec une vitesse largement améliorée !! :) \\ Ajoutez 'pacmandb' à votre fichier /etc/rc.conf dans la liste des daemons (avant 'nvidia' si vous l'utilisez).\\ \\ Les améliorations apportées sont:\\ - vérification du support de loopback device dans le kernel \\ - utilisation d'un démon pour lancer au démarrage une vérification de l'intégrité de la base avant le montage du fichier loopback\\ - vérification de sécurité dans pacman-uncage\\ \\ ===== pacman-drive ===== Pacman-drive est un script qui a été écrit par gandalf, un membre du forum anglais d'archlinux Ce script se charge de sauvegardé la base de donnée de pacman de lui créer un espace réservé et enfin de l'y copier. Cela permet de ne plus se préoccuper de la fragmentation ==== Récupération et installation du script ==== Le script peut-être récupéré sur le [[http://bbs.archlinux.org/viewtopic.php?t=22600|sujet]] du forum anglais, sur le [[http://forums.archlinux.fr/viewtopic.php?t=30|dépôt archlinux.fr]] ou ci-dessous. Il suffit de se connecter en tant que root, de copier le script récupérer dans le répertoire sbin (par exemple) # ''cp /home/user/pacman-drive /sbin/pacman-drive'', de le rendre exécutable par la commande ''# chmod +x /sbin/pacman-drive'', et enfin de l'exécuter : ''# /sbin/pacman-drive create''. Le script : #!/bin/sh ### # This script will create a small drive for pacman usage # It will increase pacman speed around 60% # Copyright (C) 2006, Wael Nasreddine # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ### # $Author: wael $ # $Revision: 348 $ # $Date: 2006-06-26 01:54:37 +0200 (Mon, 26 Jun 2006) $ . /etc/rc.conf . /etc/rc.d/functions . /etc/makepkg.conf myver='1.0' pacman_db="/var/lib/pacman" pacman_drive="/var/lib/pacman.img" pacman_backup="/root/pacman-database.tar.bz2" img_size=200 # In Mega-byte ### # Ripped from Phoenix pacman-functions ### plain() { local msg i for i in ${@}; do msg="${msg} ${i}" done if [ "$USE_COLOR" = "Y" -o "$USE_COLOR" = "y" ]; then echo -e " \033[1;1m${msg}\033[1;0m" >&2 else echo " ${msg}" >&2 fi } msg() { local msg i for i in ${@}; do msg="${msg} ${i}" done if [ "$USE_COLOR" = "Y" -o "$USE_COLOR" = "y" ]; then echo -e "\033[1;32m==>\033[1;0m \033[1;1m${msg}\033[1;0m" >&2 else echo "==> ${msg}" >&2 fi } warning() { local msg i for i in ${@}; do msg="${msg} ${i}" done if [ "$USE_COLOR" = "Y" -o "$USE_COLOR" = "y" ]; then echo -e "\033[1;33m==> WARNING:\033[1;0m \033[1;1m${msg}\033[1;0m" >&2 else echo "==> WARNING: ${msg}" >&2 fi } error() { local msg i for i in ${@}; do msg="${msg} ${i}" done if [ "$USE_COLOR" = "Y" -o "$USE_COLOR" = "y" ]; then echo -e "\033[1;31m==> ERROR:\033[1;0m \033[1;1m${msg}\033[1;0m" >&2 else echo "==> ERROR: ${msg}" >&2 fi } Pdie() { [[ ! -z $1 ]] && error $@ exit 2 } check_root() { if [ "$(id -u)" -ne 0 ]; then return 1 fi } ### # End alternate copyright ### die () { cleanup rm -f /tmp/pacman.lck if [ "${action}" = "delete" ]; then # If we were trying to delete the pacman-drive # we should mount back the database! mount -t ext2 -o loop "${pacman_drive}" "${pacman_db}" >/dev/null 2>&1 fi Pdie "$@" } usage () { echo "pacman-drive $myver" echo "usage: $0 " echo "action can be:" echo " create create the pacman-drive and use it." echo " delete delete the pacman-drive and use the usual folder." echo "" echo "This script will create a small (200 Mb) image to use it as" echo "pacman database, the file will have an ext2 filesystem." } ### Generate md5sum of a directory and print it into a file # @param directory to get the md5 for # @param file to put the output in ## get_dir_md5() { [ -z "${1}" -o -z "${2}" ] && \ return 1 [ ! -d "${1}" -o -f "${2}" ] && \ return 1 find "${1}" -type f | sort | xargs md5sum > "${2}" 2>/dev/null || \ die "Error generating md5sum of ${1}" return 0 } prepare_drive() { if [ -f "${pacman_backup}" ]; then die "${pacman_backup} file already exists, please remove it first." else msg "backing up the pacman database." tar cjf "${pacman_backup}" "${pacman_db}" >/dev/null 2>&1 || \ die "Error creating the backup tarball." fi pacdrivetmp="$(mktemp -d /tmp/pacdrivetmp.XXXX)" paclibtmp="$(mktemp -d /tmp/paclibtmp.XXXX)" old_md5="$(mktemp /tmp/pac-db-old.XXXX)" new_md5="$(mktemp /tmp/pac-db-new.XXXX)" touch /tmp/pacman.lck } cleanup() { if grep -q "${pacdrivetmp}" /proc/mounts &>/dev/null; then umount "${pacdrivetmp}" >/dev/null 2>&1 fi rm -rf "${pacdrivetmp}" "${paclibtmp}" "${old_md5}" "${new_md5}" /tmp/pacman.lck } create_drive() { prepare_drive if [ -f "${pacman_drive}" ]; then die "${pacman_drive} already exist." fi msg "creating pacman.img loopback file..." dd if=/dev/zero of="${pacman_drive}" bs=1M count="${img_size}" > /dev/null 2>&1 || \ die "Error create the pacman image drive." yes | mkfs.ext2 -O dir_index -b 1024 -i 1024 -m 0 "${pacman_drive}" > /dev/null 2>&1 || \ die "Could not create image filesystem." msg "mounting pacman-drive to a temporary mount point." mount -t ext2 -o loop "${pacman_drive}" "${pacdrivetmp}" >/dev/null 2>&1 || \ die "Error mounting pacman drive to a temporary mount point." msg "Copying pacman database to the temporary mount point." cp -a "${pacman_db}/." "${pacdrivetmp}/" >/dev/null 2>&1 || \ die "Error copying the database." msg "Generating md5sum of the old and new database." get_dir_md5 "${pacman_db}" "${old_md5}" get_dir_md5 "${pacdrivetmp}" "${new_md5}" msg "Unmount the temporary mount point." umount "${pacdrivetmp}" || \ die "Error while unmounting the temporary mount point." msg "Comparing the old and new database." diff "${old_md5}" "${new_md5}" &>/dev/null if [ $? -ne 0 ]; then rm -f "${pacman_drive}" die "md5 of the old and new database does not match, Aborting..." fi # Ok now let's remove the old database folder, and finishing the task msg "removing the old database folder." rm -rf "${pacman_db}" # mounting the new db mkdir -p "${pacman_db}" mount -t ext2 -o loop "${pacman_drive}" "${pacman_db}" || \ die "Error mounting pacman-drive." # adding the loop device to fstab if ! grep -q "${pacman_drive}" /etc/fstab &>/dev/null; then msg "Adding loop device to fstab." echo "${pacman_drive} ${pacman_db} ext2 loop,defaults 0 0" >> /etc/fstab else warning "pacman-drive entry already exist in fstab. Skipping..." fi msg "Removing leftover files." cleanup msg "Done..." } delete_drive() { prepare_drive if [ ! -f "${pacman_drive}" ]; then die "${pacman_drive} does not exist, aborting..." fi msg "Unmounting pacman database." umount "${pacman_db}" >/dev/null 2>&1 || \ die "Error while unmounting the old database." msg "mounting pacman-drive to a temporary mount point." mount -t ext2 -o loop "${pacman_drive}" "${pacdrivetmp}" >/dev/null 2>&1 || \ die "Error mounting pacman drive to a temporary mount point." msg "Copying pacman-database to a new folder." cp -a "${pacdrivetmp}/." "${paclibtmp}/" >/dev/null 2>&1 || \ die "Error while copying pacman-database to a new folder." msg "Generating md5 of the old and new database." get_dir_md5 "${pacdrivetmp}" "${old_md5}" get_dir_md5 "${paclibtmp}" "${new_md5}" msg "Unmount the temporary mount point." umount "${pacdrivetmp}" || \ die "Error while unmounting the temporary mount point." msg "Comparing the old and new database." diff "${old_md5}" "${new_md5}" &>/dev/null if [ $? -ne 0 ]; then die "md5 of the old and new database does not match, Aborting..." fi # Ok everything checked let's continue msg "Unmounting pacman database (if mounted)" umount "${pacman_db}" >/dev/null 2>&1 msg "Removing the pacman-drive loopback file..." rm -rf "${pacman_db}" || \ die "Couldn't remove the old pacman database..." rm -f "${pacman_drive}" || \ die "Couldn't remove the pacman-drive loopback file..." msg "moving the new one to ${pacman_db}" mv "${paclibtmp}" "${pacman_db}" >/dev/null 2>&1 || \ die "Error while moving the new one to ${pacman_db}." # We don't need the lost+found folder rm -rf "${pacman_db}/lost+found" >/dev/null 2>&1 msg "Removing pacman-drive entry from fstab" sed -e "s@.*${pacman_drive}.*${pacman_db}.*@@g" -i /etc/fstab msg "Removing leftover files." cleanup msg "Done..." } # Sanity checks check_root || die "You must be root to run pacman-drive" # Check if kernel has BLK_DEV_LOOP support if [ -f /proc/config.gz ]; then unset temp temp="$(zcat /proc/config.gz | grep "BLK_DEV_LOOP")" if [ "${temp}" != "CONFIG_BLK_DEV_LOOP=y" -a "${temp}" != "CONFIG_BLK_DEV_LOOP=m" ]; then error "Your kernel does not support loopback device, please recompile your kernel" plain "and make sure that CONFIG_BLK_DEV_LOOP equal m or y (NOT n)" exit 1 fi unset temp else unset agree warning "/proc/config.gz does not exist.. Cannot check for BLK_DEV_LOOP support." plain "If you are sure that your kernel support loopback device, type :" while [ "${agree}" != "I AM SURE THAT MY KERNEL SUPPORT LOOPBACK DEVICE" ]; do plain "I AM SURE THAT MY KERNEL SUPPORT LOOPBACK DEVICE" read agree agree="${agree}" #trim spaces... done unset agree fi if [ -f /tmp/pacman.lck ]; then error "Cannot run pacman-drive while using pacman." exit 1 fi action="${1}" if [ -z "${action}" -o \( "${action}" != "create" -a "${action}" != "delete" \) ]; then usage exit 1 fi case "${action}" in create) create_drive ;; delete) delete_drive ;; *) usage; exit 1 ;; esac # End Of File # vim: set ft=sh ts=4 sts=4 sw=4 expandtab: