TIP Art de gérer les sources de noyaux
Un article de Gentoo Linux Wiki.
|
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 :
% 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 :
% 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
