L'avantage de cette réponse est le fait que Ubuntu Bash est natif sans installation d'applications tierces. Les utilisateurs de noyaux personnalisés n'ayant pas utilisé apt
ou dpkg
peuvent modifier ce script bash en fonction de leurs besoins.
Cette réponse est basée sur ( Comment purger de manière sélective tous les anciens noyaux à la fois ).
Solution basée sur Zenity
Zenity fournit au terminal une interface graphique conviviale permettant de traiter une liste et de sélectionner des éléments avec des boutons radio :

Commeletitrel'indique,lenoyauactuelaveclequelvousavezdémarrénepeutpasêtresuppriméetn'estpasinclusdanslaliste.Latailleindiquéecorrespondaumontantquiseraenregistrédanslerépertoire/boot
.Plusestenregistrésurvotredisque,carlesfichiersbinairesdunoyaurésidentégalementdansd’autresdomaines.Remarquedu27juillet2017:lesrépertoires/usr/src/*kernel_version*
et/lib/modules/*kernel_version*
sontégalementinclus.
Ladatedemodificationestdécouverteàl'aidedelacommandestat
.Surmonsystème,cettedateest"touchée" à chaque démarrage du noyau à l'aide de cette option ( Comment savoir quand une version du noyau spécifique a été initialisée? ) Cron script de redémarrage. Cependant, sur votre système, la date sera la date de publication du noyau, et non la dernière fois que vous l’avez initialisé.
apt-get purge
vous donne une chance d'avorter
Vous avez enfin la possibilité de voir tout ce qui sera purgé et de voir l'espace disque total (quelque peu trompeur) qui sera récupéré:
The following packages will be REMOVED:
linux-headers-4.7.1-040701* linux-headers-4.7.1-040701-generic*
linux-headers-4.7.2-040702* linux-headers-4.7.2-040702-generic*
linux-headers-4.7.3-040703* linux-headers-4.7.3-040703-generic*
linux-headers-4.8.1-040801* linux-headers-4.8.1-040801-generic*
linux-headers-4.8.10-040810* linux-headers-4.8.10-040810-generic*
linux-headers-4.8.11-040811* linux-headers-4.8.11-040811-generic*
linux-headers-4.8.4-040804* linux-headers-4.8.4-040804-generic*
linux-headers-4.8.5-040805* linux-headers-4.8.5-040805-generic*
linux-image-4.7.1-040701-generic* linux-image-4.7.2-040702-generic*
linux-image-4.7.3-040703-generic* linux-image-4.8.1-040801-generic*
linux-image-4.8.10-040810-generic* linux-image-4.8.11-040811-generic*
linux-image-4.8.4-040804-generic* linux-image-4.8.5-040805-generic*
0 upgraded, 0 newly installed, 24 to remove and 2 not upgraded.
After this operation, 2,330 MB disk space will be freed.
Do you want to continue? [Y/n]
Le code
Copiez ce code dans un fichier exécutable nommé rm-kernels
dans /usr/local/bin
:
#!/bin/bash
# NAME: rm-kernels
# PATH: /usr/local/bin
# DESC: Provide zenity item list of kernels to remove
# DATE: Mar 10, 2017. Modified Jul 28, 2017.
# NOTE: Will not delete current kernel.
# With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
# # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
# First time for 'du' 34 seconds.
# Second time for 'du' 1 second.
# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
# By default 'du' is not used and estimated size is displayed.
# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
zenity --error --text "root access required. Use: sudo rm-kernels"
exit 99
fi
OLDIFS="$IFS"
IFS="|"
choices=()
current_version=$(uname -r)
for f in /boot/vmlinuz*
do
if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
[[ $f =~ vmlinuz-(.*) ]]
v=${BASH_REMATCH[1]} # example: 4.9.21-040921-generic
v_main="${v%-*}" # example: 4.9.21-040921
# Kernel size in /boot/*4.9.21-040921-generic*
s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')
if [[ $# -ne 0 ]] ; then # Was a parameter passed?
if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
# Kernel headers size in /usr/src/*4.9.21-040921*
s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
else
s2="0M" # Linux Headers are not installed
fi
# Kernel image size in /lib/modules/4.9.21-040921-generic*
s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
else
# Estimate sizof of optional headers at 125MB and size of image at 220MB
if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
s2="125M"
else
s2="0M" # Linux Headers are not installed
fi
s3="220M"
fi
# Strip out "M" provided by human readable option of du and add 3 sizes together
s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
t=$(( t + s ))
s=$s" MB"
d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
choices=("${choices[@]}" false "$v" "$d" "$s")
done
# adjust width & height below for your screen 640x480 default for 1920x1080 HD screen
# also adjust font="14" below if blue text is too small or too large
choices=('zenity \
--title "rm-kernels - Total: $t MB excluding: $current_version" \
--list \
--separator="$IFS" \
--checklist --multiple \
--text '<span foreground="blue" font="14">Check box next to kernel(s) to remove</span>' \
--width=640 \
--height=480 \
--column "Select" \
--column "Kernel Version Number" \
--column "Modified Date" \
--column " Size " \
"${choices[@]}"')
IFS="$OLDIFS"
i=0
list=""
for choice in "${choices[@]}" ; do
if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
((i++))
short_choice=$(echo $choice | cut -f1-2 -d"-")
header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)
# If -lowlatency and -generic are purged at same time the _all header directory
# remains on disk for specific version with no -generic or -lowlatency below.
if [[ $header_count -lt 3 ]]; then
# Remove all w.x.y-zzz headers
list="$list""linux-image-$choice- linux-headers-$short_choice"
else
# Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
list="$list""linux-image-$choice- linux-headers-$choice"
fi
done
if [ "$i" -gt 0 ] ; then
apt-get purge $list
fi
REMARQUE: vous devez disposer de l'autorisation sudo pour créer le fichier. Veuillez utiliser:
gksu gedit /usr/local/bin/rm-kernels
Pour rendre le fichier exécutable, utilisez:
sudo chmod +x /usr/local/bin/rm-kernels
Version du serveur
rm-kernels-server
est la version du serveur permettant de supprimer sélectivement tous les noyaux à la fois. Au lieu d’une boîte de dialogue graphique (graphique), une boîte de dialogue textuelle est utilisée pour sélectionner les noyaux à purger.
La boîte de dialogue se trouve dans l'installation par défaut du bureau Ubuntu, mais pas dans Ubuntu Server.
Exemple d'écran

rm-kernels-server
codebash
#!/bin/bash
# NAME: rm-kernels-server
# PATH: /usr/local/bin
# DESC: Provide dialog checklist of kernels to remove
# Non-GUI, text based interface for server distro's.
# DATE: Mar 10, 2017. Modified Jul 28, 2017.
# NOTE: Will not delete current kernel.
# With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
# # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
# First time for 'du' 34 seconds.
# Second time for 'du' 1 second.
# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
# By default 'du' is not used and estimated size is displayed.
# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
echo "root access required. Use: sudo rm-kernels-server"
exit 99
fi
# Must have the dialog package. On Servers, not installed by default
command -v dialog >/dev/null 2>&1 || { echo >&2 "dialog package required but it is not installed. Aborting."; exit 99; }
OLDIFS="$IFS"
IFS="|"
item_list=() # Deviate from rm-kernels here.
current_version=$(uname -r)
i=0
for f in /boot/vmlinuz*
do
if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
[[ $f =~ vmlinuz-(.*) ]]
((i++)) # Item List
v=${BASH_REMATCH[1]} # example: 4.9.21-040921-generic
v_main="${v%-*}" # example: 4.9.21-040921
# Kernel size in /boot/*4.9.21-040921-generic*
s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')
if [[ $# -ne 0 ]] ; then # Was a parameter passed?
if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
# Kernel headers size in /usr/src/*4.9.21-040921*
s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
else
s2="0M" # Linux Headers are not installed
fi
# Kernel image size in /lib/modules/4.9.21-040921-generic*
s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
else
# Estimate sizof of optional headers at 125MB and size of image at 220MB
if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
s2="125M"
else
s2="0M" # Linux Headers are not installed
fi
s3="220M"
fi
# Strip out "M" provided by human readable option of du and add 3 sizes together
s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
t=$(( t + s ))
s=$s" MB"
d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
item_list=("${item_list[@]}" "$i" "$v ! $d ! $s" off)
done
cmd=(dialog --backtitle "rm-kernels-server - Total: $t MB excluding: $current_version" \
--title "Use space bar to toggle kernel(s) to remove" \
--column-separator "!" \
--separate-output \
--ascii-lines \
--checklist " Kernel Version --------- Modified Date Size" 20 60 15)
selections=$("${cmd[@]}" "${item_list[@]}" 2>&1 >/dev/tty)
IFS=$OLDIFS
if [ $? -ne 0 ] ; then
echo cancel selected
exit 1
fi
i=0
choices=()
for select in $selections ; do
((i++))
j=$(( 1 + ($select - 1) * 3 ))
choices[i]=$(echo ${item_list[j]} | cut -f1 -d"!")
done
i=0
list=""
for choice in "${choices[@]}" ; do
if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
((i++))
short_choice=$(echo $choice | cut -f1-2 -d"-")
header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)
# If -lowlatency and -generic are purged at same time the _all header directory
# remains on disk for specific version with no -generic or -lowlatency below.
if [[ $header_count -lt 3 ]]; then
# Remove all w.x.y-zzz headers
list="$list""linux-image-$choice- linux-headers-$short_choice"
else
# Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
list="$list""linux-image-$choice- linux-headers-$choice"
fi
done
if [ "$i" -gt 0 ] ; then
apt-get purge $list
fi
REMARQUE: dans l'appel à dialog
, la directive --ascii-lines
est transmise pour remplacer le jeu de caractères étendu de tracé (ce que ssh
n'aime pas) par "+ --- - + "pour les boîtes à dessin. Si vous n'aimez pas cette apparence, vous pouvez utiliser la directive --no-lines
sans aucune boîte.
Mises à jour du 28 juillet 2017
La taille calculée de chaque noyau a été prise à partir de /boot/*kernel_version*
, soit 5 fichiers totalisant environ 50 Mo. La formule a été modifiée pour inclure les fichiers dans /usr/src/*kernel_version*
et /lib/modules/*kernel_version*
. La taille calculée pour chaque noyau est maintenant d’environ 400 Mo. Le code ci-dessus pour rm-kernels
et rm-kernels-server
a été mis à jour. Cependant, les exemples d'écrans ci-dessus ne reflètent pas encore ces modifications.
La valeur par défaut consiste à estimer la taille des fichiers pour les en-têtes linux à 125 Mo et celle à linux-image à 220 Mo car du
peut être très lent à moins que les fichiers ne soient en cache. Pour obtenir la taille réelle en utilisant du
, transmettez n’importe quel paramètre au script.
Le total de toutes les tailles de noyau (à l'exception de la version en cours d'exécution qui ne peut pas être supprimée) est maintenant affiché dans la barre de titre.
La boîte de dialogue utilisée pour afficher la date du dernier accès de chaque noyau. Cette date peut être écrasée en masse pour tous les noyaux lors d'une sauvegarde ou d'opérations similaires. La boîte de dialogue affiche désormais la date de modification .