Page 1 sur 2
Modifier le comportement d'autoremove concernant les noyaux
Posté : sam. 23 nov. 2024 10:26
par damad
Bonjour à toutes et à tous !!
Lorsqu'il y a un nouveau noyau disponible avec apt update, je l'installe, je redémarre et j'effectue autoremove pour ne garder que les deux derniers noyaux. Le problème est que j'utilise des noyaux faible latence correspondants aux noyaux de base, ce qui fait que j'ai deux noyaux pour une même version. Vous me voyez venir...
Sur Mint 21.x, autoremove me garde en fait 4 noyaux, les deux de base et les faible latence correspondants. Ce qui est très bien. Mais sur Mint 22, autoremove me garde exactement que les deux derniers noyaux. Je ne sais pas si je me fais bien comprendre...
En gros, autoremove sur Mint 21.x garde les deux dernières versions des noyaux, indépendamment du nombre de noyaux que ces versions contiennent. Alors que sur Mint 22, autoremove garde strictement les deux derniers noyaux, même s'ils sont de la même version.
Voici donc ma question : est-il possible de modifier le comportement d'autoremove concernant les noyaux ? Au minimum pouvoir définir le nombre de noyaux à garder ?
Merci d'avance pour vos réponses !!
Re: Modifier le comportement d'autoremove concernant les noyaux
Posté : sam. 23 nov. 2024 12:20
par damad
Merci cyrille pour ta réponse.
J'avais effectivement vu qu'on pouvait modifier le nombre de noyaux à garder il y a quelques années mais la parade ne fonctionne plus.
cyrille a écrit : sam. 23 nov. 2024 11:05
mais je pense que tu peux demander à ne pas supprimer les kernels que tu veux garder en les marquant comme "hold"
J'y avais pensé, mais en dernière option, car j'imaginais quelque chose de plus simple.
Qu'à cela ne tienne, je vais m'amuser à faire un script qui automatise le "hold" et "unhold" des noyaux comme je le souhaite !!
Je posterai le résultat, si j'y arrive, autrement je vous solliciterai à nouveau !!

Re: Modifier le comportement d'autoremove concernant les noyaux
Posté : dim. 24 nov. 2024 09:02
par damad
Ces liens sont parmi ceux que j'avais trouvés. Dommage que l'ancienne parade ne fonctionne plus...
Il ne me reste plus qu'à réussir mon script, et c'est pas gagné. Mais j'y arriverai !!

Re: Modifier le comportement d'autoremove concernant les noyaux
Posté : dim. 24 nov. 2024 15:10
par damad
En me basant sur les documentations de grep, cut et sed, j'ai finalement réussi à faire un script qui me garde les deux derniers noyaux generic et les deux derniers lowlatency.
Je ne peux pas le tester en vrai car il faut attendre des mises à jour de noyaux. Alors j'ai fait un fichier "fake" qui contient une liste de plein de noyaux fictifs et au lieu de "dpkg -l" comme source, j'ai utilisé "cat fake". Et ça fonctionne.
Voici donc mon script mais soyez indulgents, je suis débutant en scripting...
Code : Tout sélectionner
#!/bin/bash
dpkg -l | grep 'linux-image-[0-9]' | grep generic | cut -d ' ' -f 3 > tmp1.sh
dpkg -l | grep 'linux-image-[0-9]' | grep lowlatency | cut -d ' ' -f 3 > tmp2.sh
sed -i -e '1,2s/^/sudo apt-mark hold /' tmp1.sh tmp2.sh
sed -i -e '3,$s/^/sudo apt-mark unhold /' tmp1.sh tmp2.sh
sed -i '1i \#!/bin/bash' tmp1.sh tmp2.sh
chmod -R 755 tmp1.sh tmp2.sh
tmp1.sh
tmp2.sh
rm tmp1.sh
rm tmp2.sh
sudo apt autoremove --purge
Re: Modifier le comportement d'autoremove concernant les noyaux
Posté : mer. 27 nov. 2024 11:14
par damad
Voici la version finale de mon script où j'ai ajouté (entre autres quelques petites modifications) la commande "sort -r" pour trier les noyaux par ordre décroissant afin d'être sûr que les derniers noyaux sont listés en premier :
Code : Tout sélectionner
#!/bin/bash
dpkg -l | grep 'linux-image-[0-9]' | grep generic | cut -d ' ' -f 3 | sort -r > tmp1.sh
dpkg -l | grep 'linux-image-[0-9]' | grep lowlatency | cut -d ' ' -f 3 | sort -r > tmp2.sh
sed -i -e '1,2s/^/sudo apt-mark hold /' tmp1.sh tmp2.sh
sed -i -e '3,$s/^/sudo apt-mark unhold /' tmp1.sh tmp2.sh
sed -i '1i \#!/bin/bash' tmp1.sh tmp2.sh
chmod 755 tmp1.sh tmp2.sh
tmp1.sh
tmp2.sh
rm tmp1.sh tmp2.sh
sudo apt-get autoremove --purge
Qu'en pensez-vous ?
Re: Modifier le comportement d'autoremove concernant les noyaux
Posté : jeu. 28 nov. 2024 10:54
par damad
Merci cyrille pour ces précisions enrichissantes.
Concernant la commande « sort » : après quelques recherches, j'ai trouvé la solution avec l'option « -V ». Doublé de l'option « -r », les noyaux sont triés correctement même au passage à la centaine.
Concernant les fichiers temporaires, je les garde car j'en ai besoin pour la suite de mon script.
Pour le unhold, utilise tail (c'est la dernière sortie qui t'interesse). Un exemple
En fait, c'est toutes les sorties éventuelles après les deux premières qui m'intéressent pour le unhold.
Voilà donc ce que donne mon script après corrections :
Code : Tout sélectionner
#!/bin/bash
if [ "$EUID" -ne 0 ]
then
echo "Lancer ce script en mode administrateur."
exit
fi
PREFIX=/tmp/
dpkg -l | grep 'linux-image-[0-9]' | grep generic | cut -d ' ' -f 3 | sort -V -r > ${PREFIX}tmp1.sh
dpkg -l | grep 'linux-image-[0-9]' | grep lowlatency | cut -d ' ' -f 3 | sort -V -r > ${PREFIX}tmp2.sh
sed -i -e '1,2s/^/sudo apt-mark hold /' ${PREFIX}tmp1.sh ${PREFIX}tmp2.sh
sed -i -e '3,$s/^/sudo apt-mark unhold /' ${PREFIX}tmp1.sh ${PREFIX}tmp2.sh
sed -i '1i \#!/bin/bash' ${PREFIX}tmp1.sh ${PREFIX}tmp2.sh
chmod 755 ${PREFIX}tmp1.sh ${PREFIX}tmp2.sh
echo -e "\ncontenu de tmp1.sh :\n********************\n"
cat ${PREFIX}tmp1.sh
echo -e "\ncontenu de tmp2.sh :\n********************\n"
cat ${PREFIX}tmp2.sh
menu()
{
echo -e "\n***************************************************"
echo "***************************************************"
echo "*** Exécuter et effacer tmp1.sh et tmp2.sh : 1 ***"
echo "*** Exécuter et garder tmp1.sh et tmp2.sh : 2 ***"
echo "*** Quitter et effacer tmp1.sh et tmp2.sh : 3 ***"
echo "*** Quitter et garder tmp1.sh et tmp2.sh : 4 ***"
echo "***************************************************"
echo -e "***************************************************\n"
read menu
case $menu in
1)
${PREFIX}tmp1.sh
${PREFIX}tmp2.sh
rm ${PREFIX}tmp1.sh ${PREFIX}tmp2.sh
;;
2)
${PREFIX}tmp1.sh
${PREFIX}tmp2.sh
echo -e "\nLes fichiers tmp1.sh et tmp2.sh sont dans le dossier ${PREFIX}.\n"
;;
3)
rm ${PREFIX}tmp1.sh ${PREFIX}tmp2.sh
;;
4)
echo -e "\nLes fichiers tmp1.sh et tmp2.sh sont dans le dossier ${PREFIX}.\n"
;;
*)
echo -e "\nChoix inexistant. Veuillez recommencer.\n"
menu
;;
esac
}
menu
menu2()
{
echo -e "\n********************************"
echo "********************************"
echo "*** Exécuter autoremove : 1 ***"
echo "*** Quitter : 2 ***"
echo "********************************"
echo -e "********************************\n"
read menu2
case $menu2 in
1)
apt-get autoremove
exit
;;
2)
exit
;;
*)
echo -e "\nChoix inexistant. Veuillez recommencer.\n"
menu2
;;
esac
}
menu2
Il me reste une question basique mais que je n'arrive pas à résoudre : comment logger mon script ?
Re: Modifier le comportement d'autoremove concernant les noyaux
Posté : jeu. 28 nov. 2024 12:15
par Armaggion
Il te suffit de rediriger le contenu de ton choix vers un fichier, en append (donc en ajout à la fin, sans écraser le contenu existant) avec l'opérateur >>
En bonnes pratiques :
- Tu peux ajouter un timestamp au début de "ce que tu veux logger" en insérant la variable
- Tu commences une session par un "Starting..." et tu finis par un "...Stopped" qui te permettront de facilement isoler des lancements distincts.
- Tu peux veiller à limiter la taille de ton fichier au cas où ton script parte en boucle infinie en précédant ta commande echo par (pour une taille limite de 1Mo)
Re: Modifier le comportement d'autoremove concernant les noyaux
Posté : jeu. 28 nov. 2024 13:41
par damad
Merci Armaggion, mais ça me paraît un peu fastidieux à faire pour chaque commande... Il n'y a pas un moyen de logger tout le script d'un seul coup ?
Mais en y réfléchissant, je me demande si le logging est nécessaire, dans ce cas précis bien sûr. Car on peut considérer les fichiers tmp1.sh et tmp2.sh comme des logs. Et je les vérifie avant l'application des modifications. Et avec « apt-mark showhold », je peux voir si ça a marché. Ce que j’inclurai dans la prochaine version du script avant et après le choix de l'exécution d'autoremove. Comme ça, le script deviendra son propre log.
Je vais encore inclure le choix du nombre de noyaux de chaque type à garder (generic ou lowlatency) et je vous posterai le résultat.
Re: Modifier le comportement d'autoremove concernant les noyaux
Posté : jeu. 28 nov. 2024 14:43
par Armaggion
damad a écrit : jeu. 28 nov. 2024 13:41Il n'y a pas un moyen de logger tout le script d'un seul coup
Désolé je ne comprends pas ta demande. Ecris un petit exemple du résultat attendu afin qu'on comprenne ce dont tu parles.
Re: Modifier le comportement d'autoremove concernant les noyaux
Posté : ven. 29 nov. 2024 10:29
par damad
@Armaggion :
Ecris un petit exemple du résultat attendu afin qu'on comprenne ce dont tu parles
Je pensais au résultat de toutes les commandes du script. Mais le résultat je l'ai déjà avec mes fichiers tmp1.sh et tmp2.sh et aussi avec apt-mark showhold avant et après l'exécution d'autoremove. Ce que j'écrivais dans mon précédant post.
@cyrille :
Exemple simple, que deviens ton script si lancé et que le serveur apt n'est accessible ?
Je n'avais pas pensé à ça. Mais je dirais que si le serveur apt est inaccessible, je n'aurais pas pu faire les mises à jour, donc je n'aurais pas pu voir si un nouveau noyau est sorti, donc je ne lancerais pas mon script.
Si tu relances ton script, même si gardé, ces fichiers seront effacés (entrée est > , donc effacera le fichier et en gégérera un nouveau)
Je sais, ils ne sont pas destinés à être gardés éternellement. Et si je redémarre, ils sont effacés aussi vu qu'ils sont dans /tmp/. C'est juste au cas où je voulais les garder entre deux utilisations du script.
@Armaggion et @cyrille :
Une question me taraude l'esprit. Que loggeriez-vous si c'était votre script ?
Et voici la nouvelle version de mon script (ajouts : choix du nombre de noyaux à garder et apt-mark showhold avant et après l'exécution d'autoremove) :
Code : Tout sélectionner
#!/bin/bash
if [ "$EUID" -ne 0 ]
then
echo "Lancer ce script en mode administrateur."
exit
fi
PREFIX=/tmp/
echo -e "\nEntrer le nombre de noyaux generic à garder :"
read a
b=$(($a + 1))
echo -e "\nEntrer le nombre de noyaux lowlatency à garder :"
read c
d=$(($c + 1))
dpkg -l | grep 'linux-image-[0-9]' | grep generic | cut -d ' ' -f 3 | sort -V -r > ${PREFIX}tmp1.sh
dpkg -l | grep 'linux-image-[0-9]' | grep lowlatency | cut -d ' ' -f 3 | sort -V -r > ${PREFIX}tmp2.sh
sed -i -e '1,'"$a"'s/^/apt-mark hold /' ${PREFIX}tmp1.sh
sed -i -e "$b"',$s/^/apt-mark unhold /' ${PREFIX}tmp1.sh
sed -i -e '1,'"$c"'s/^/apt-mark hold /' ${PREFIX}tmp2.sh
sed -i -e "$d"',$s/^/apt-mark unhold /' ${PREFIX}tmp2.sh
sed -i '1i \#!/bin/bash' ${PREFIX}tmp1.sh ${PREFIX}tmp2.sh
chmod 755 ${PREFIX}tmp1.sh ${PREFIX}tmp2.sh
echo -e "\ncontenu de tmp1.sh :\n********************\n"
cat ${PREFIX}tmp1.sh
echo -e "\ncontenu de tmp2.sh :\n********************\n"
cat ${PREFIX}tmp2.sh
menu()
{
echo -e "\n***************************************************"
echo "***************************************************"
echo "*** Exécuter et effacer tmp1.sh et tmp2.sh : 1 ***"
echo "*** Exécuter et garder tmp1.sh et tmp2.sh : 2 ***"
echo "*** Quitter et effacer tmp1.sh et tmp2.sh : 3 ***"
echo "*** Quitter et garder tmp1.sh et tmp2.sh : 4 ***"
echo "***************************************************"
echo -e "***************************************************\n"
read menu
case $menu in
1)
${PREFIX}tmp1.sh
${PREFIX}tmp2.sh
rm ${PREFIX}tmp1.sh ${PREFIX}tmp2.sh
;;
2)
${PREFIX}tmp1.sh
${PREFIX}tmp2.sh
echo -e "\nLes fichiers tmp1.sh et tmp2.sh sont dans le dossier ${PREFIX}.\n"
;;
3)
rm ${PREFIX}tmp1.sh ${PREFIX}tmp2.sh
;;
4)
echo -e "\nLes fichiers tmp1.sh et tmp2.sh sont dans le dossier ${PREFIX}.\n"
;;
*)
echo -e "\nChoix inexistant. Veuillez recommencer.\n"
menu
;;
esac
}
menu
echo -e "\nretour de apt-mark showhold :\n*****************************\n"
apt-mark showhold
menu2()
{
echo -e "\n********************************"
echo "********************************"
echo "*** Exécuter autoremove : 1 ***"
echo "*** Quitter : 2 ***"
echo "********************************"
echo -e "********************************\n"
read menu2
case $menu2 in
1)
apt-get autoremove
echo -e "\nretour de apt-mark showhold :\n*****************************\n"
apt-mark showhold
exit
;;
2)
exit
;;
*)
echo -e "\nChoix inexistant. Veuillez recommencer.\n"
menu2
;;
esac
}
menu2
Merci pour votre aide précieuse !!