Ca marche !
J'ai fait ça aussi méthodiquement que possible. Voici le résultat (sorry pour le côté pompeux mais ça me permet un copier/coller à partir de ce que j'ai sur disque) :
-----DEBUT DE NOTES.TXT ------
26/11/2006 - installonlyn_patch (sur base installonlyn 0.90 pour Fedora Core 5)
BUT : Modification du plugin yum installonlyn, afin qu'il n'efface jamais le noyau 2.6.17 utile aux VMware Tools de VMware Workstation 5.0, sans pour autant bloquer la mise à jour vers un noyau plus récent. Et ce quelle que soit la valeur "tokeep" de "/etc/yum/pluginconf.d/installonlyn.conf" et le nombre de noyaux actuellement installés.
NB : Par extrapolation, il est possible de protéger n'importe quelle version en l'indiquant en lieu et place du literal "2.6.17" dans le source Python installonlyn.py
ORG : Idée née sur
http://forums.fedora-fr.org/viewtopic.php?pid=112688 en discutant avec remi et bochecha.
TEST : Ayant actuellement un noyau 2.6.17 et 2.6.18, j'ai forcé l'installation d'un 2.6.15 (kernel et kernel-devel). J'ai ensuité désinstallé le 2.6.18 (toujours kernel et kernel-devel) pour être à deux noyaux. Puis, j'ai rebooté sur le noyau 2.6.15 et vérifié que l'option tokeep (cf. BUT) était bien à 2. J'ai lancé une mise à jour du kernel (et kernel-devel) afin de retrouver le 2.6.18. Au final, le 2.6.17 qui aurait dû être supprimé (puisqu'il ne tourne pas au moment de la mise à jour et que l'ajout du 2.6.18 fait passer le nombre de noyaux installés à 1 de trop vis à vis des 2 autorisés par tokeep) ne l'a pas été.
INSTALL : Sauvegarder /usr/lib/yum-plugins/installonlyn.*, effacer .pyc et .pyo, écraser .py avec celui fourni ici, lancer yum pour vérifier qu'il génère bien le .pyc
FUTUR POSSIBLE : ajouter et gérer une option "dontremove" à "/etc/yum/pluginconf.d/installonlyn.conf"
-----FIN DE NOTES.TXT ------
Et pour le source modifié du plugin installonlyn, il faut chercher les deux petites lignes avec "# ***ELN-PATCH" dans le commentaire :
-----DEBUT DE INSTALLONLYN 0.90 MODIFIE ------
# A plugin for yum which only leaves n 'kernel' packages installed instead
# of infinitely doing installonly
#
# Copyright 2005 Red Hat, Inc.
# Jeremy Katz <
katzj@redhat.com>
#
# 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.
#
# version 0.90
import os
from rpmUtils import miscutils
from yum.constants import *
from yum.plugins import TYPE_CORE, TYPE_INTERFACE, PluginYumExit
from yum.packages import YumInstalledPackage
requires_api_version = '2.1'
plugin_type = (TYPE_CORE,)
def sortPackages(pkg1,pkg2):
"""sort pkgtuples by evr"""
return miscutils.compareEVR((pkg1[2:]),(pkg2[2:]))
def get_running_kernel_version_release():
"""This takes the output of uname and figures out the (version, release)
tuple for the running kernel."""
ver = os.uname()[2]
for s in ("bigmem", "enterprise", "smp", "hugemem",
"guest", "hypervisor", "xen0", "xenU"):
if ver.endswith(s):
ver = ver.replace(s, "")
if ver.find("-") != -1:
(v, r) = ver.split("-", 1)
return (v, r)
return (None, None)
def config_hook(conduit):
global num_tokeep
num_tokeep = conduit.confInt('main', 'tokeep', default=2)
def postresolve_hook(conduit):
ts = conduit.getTsInfo()
rpmdb = conduit.getRpmDB()
conf = conduit.getConf()
mems = ts.getMembers()
toremove = []
for instpkg in conf.installonlypkgs:
for m in mems:
if (m.name == instpkg or instpkg in m.po.getProvidesNames()) \
and m.ts_state in ('i', 'u'):
installed = rpmdb.returnTupleByKeyword(name=m.name)
if len(installed) >= num_tokeep - 1: # since we're adding one
numleft = len(installed) - num_tokeep + 1
(curv, curr) = get_running_kernel_version_release()
installed.sort(sortPackages)
for (n, a, e, v, r) in installed:
if (v, r) == (curv, curr): # don't remove running
continue
if v == "2.6.17": # ***ELN_PATCH :
continue # don't remove the 2.6.17-* kernel's
if numleft == 0:
break
toremove.append(YumInstalledPackage(rpmdb.returnHeaderByTuple((n,a,e,v,r))[0]))
numleft -= 1
map(lambda x: ts.addErase(x), toremove)
-----FIN DE INSTALLONLYN MODIFIE ------
F'est tout ! Le mieux serait ce qui est dit en rubrique "FUTUR POSSIBLE" plus haut, mais bon, enfin, c'est réglé pour ce qui est de l'urgence 😉