TIP Art de gérer les sources de noyaux

Un article de Gentoo Linux Wiki.

Cet article fait partie des Trucs et Astuces.

Terminaux / Shells CD Live X Portage Système Systèmes de fichier Autres


Imaginez. Vous avez d'installé sur votre Gentoo les noyaux development-sources, mm-sources, gentoo-dev-sources (et pourquoi pas plus). Les version grimpent vite, vous êtes en ~arch, vous mettez souvent à jour, il y a des paquets pour chaque -rc (release candidate), bref vous vous retrouvez facilement avec 3 ou 4 nouveaux répertoires de sources par semaine. C'est parfois pénible ...

Sommaire

[modifier] Nettoyage

[modifier] Méthode initiale

Tous correspondent à des SLOT différents, donc les séances de nettoyage ressemblent typiquement à ceci :

Code : nettoyage
% emerge -C =development-sources-2.6.2_rc1  =development-sources-2.6.2-rc2  =mm-sources-2.6.2_rc2-r1

bref c'est casse-pieds à taper, et en plus ça ne nettoie pas grand chose, vu que ça ne supprime pas les fichiers compilés, donc on doit de toute façon les supprimer à la main :

Code : Suppression des binaires
% rm -rf /usr/src/linux-2.6.2-rc1 /usr/src/linux-2.6.2-rc2 /usr/src/linux-2.6.2-rc2-mm1


[modifier] Amélioration

Nous allons donc procéder de la manière suivante :

  • d'abord supprimer les répertoires dont on ne veut plus
  • ensuite, nettoyer automatiquement les paquets. Pour ça, j'utilise un petit script qui supprime les paquets correspondants à des sources effacées :
Fichier : /usr/local/sbin/clean-kernels
#!/bin/bash
#/usr/local/sbin/clean-kernels

PROG=`basename ${0}`

if [ ! `whoami` = "root" ]; then
   echo "Error: you must be root." >&2
   exit 1
fi

if [ $# -gt 1 ] ; then
   echo "Usage: $PROG [-p]" >&2
   exit 1
fi

if [ $# -eq 1 ] ; then
   if [ "$1" == "-p" ]; then
      pretend="-p"
   else
      echo "Usage: $PROG [-p]" >&2
      exit 1
   fi
else
   pretend=""
fi

kdirs="$(find /usr/src -maxdepth 1 -type d -name "linux-[0-9]*")"
find_pkgs() {
   for d in /var/db/pkg/sys-kernel/* ; do
      if [ -f ${d}/CONTENTS ] ; then
         if grep -q /usr/src/linux ${d}/CONTENTS ; then
            if ( for k in ${kdirs} ; do
                    grep -qx "dir ${k}" ${d}/CONTENTS && exit 1
                 done
                 exit 0 )
            then
               echo "${d}"
            fi
         fi
      fi
   done | sed 's:/var/db/pkg/:=:'
}
kpgs=$(find_pkgs)
if [ -n "${kpgs}" ]; then
   /usr/bin/emerge -C ${pretend} `find_pkgs`
   exit $?
else
   echo "No kernel packages to clean was found."
   exit 0
fi


[modifier] Complétion bash

Pareil, à chaque fois qu'on change de noyau, on doit effectuer un lien symbolique /usr/src/linux (important au moins si on veut emerger des drivers pour ce noyau). Comme cela peut vite devenir fastidieux, on va utiliser une petite fonction bash, définie dans mon /root/.bash_profile:

Fichier : /root/.bash_profile
### setkernel: change the /usr/src/linux symlink.
### See also completion function in /etc/bash_completion.d/tgl
setkernel() {
   if [ $# -lt 1 ] ; then
      echo "Usage: setkernel <version>" >&2
      return 1
   fi
   version="$1"
   if [ ! -d "/usr/src/linux-${version}" ] ; then
      echo "Error: not found /usr/src/linux-${version}" >&2
      return 1
   fi
   rm -f /usr/src/linux
   ln -sf ./linux-${version} /usr/src/linux
   # never realy understood what linux-beta was for, but anyway...
   rm -f /usr/src/linux-beta
   ln -sf ./linux-${version} /usr/src/linux-beta
   return 0
}

[modifier] Fonction de complétion

Voici une fonction de complétion pour bash qui vous propose juste les versions disponibles. Vous pouvez mettre cette fonction dans un fichier quelconque, dans /etc/bash_completion.d (de préférence un fichier personnel, pour ne pas être gêné par les mises à jours des fichiers officiels). Ça suppose bien sûr que vous ayez installé le paquet bash-completion.


Fichier : completion_sources
# setkernel <version>
# (function from /root/.bash_profile)
_setkernel()
{
   local cur versions
   versions=$( find /usr/src -maxdepth 1 -type d -name "linux-*" \
      | sed -e 's:/usr/src/linux\-::' )
   cur=${COMP_WORDS[COMP_CWORD]}
   COMPREPLY=( $( compgen -W "$versions" -- $cur ) )
   return 0
}
complete -F _setkernel setkernel


Voilà, c'est tout, pas grand chose en fait mais un système un tout petit peu plus confortable encore.


MAJ : 27/02/2004
Source : http://forums.gentoo.org/viewtopic.php?t=133533
Auteur initial : TGL
Licence : le document original est sous licence Creative Commons License