Le très bien noté Q & A Comment puis-je supprimer les anciennes versions du noyau pour nettoyer le menu de démarrage? ne fournit pas un moyen facile de purger sélectivement les anciens noyaux à moins que des applications supplémentaires ne soient installées, c'est-à-dire Ubuntu-Tweak .
Le Bash one-liner ne supprime que les anciens noyaux Q & A fournit une solution "tout purger à l’ancien", mais je souhaite conserver le dernier noyau de chaque génération. c'est-à-dire supprimer 4.7.1, 4.7.2 ... mais garder 4.7.5.
Est-il possible de faire défiler une liste de tous les noyaux installés et de sélectionner ceux à purger? Cela ne devrait pas permettre la purge du noyau en cours d'exécution.
L'avantage de cette réponse est que Ubuntu Bash natif est utilisé sans installer d'applications tierces. Les utilisateurs de noyaux personnalisés qui n'ont pas utilisé apt
ou dpkg
peuvent modifier ce script bash en fonction de leurs besoins.
Zenity fournit une interface graphique au terminal. Ici, il est utilisé pour traiter une liste de noyaux et sélectionner des noyaux individuels:
Le titre de la boîte de dialogue indique le nombre de noyaux, leur taille totale et la version actuelle du noyau démarrée. Le noyau actuel est exclu des totaux du titre et n'apparaît pas dans la liste des noyaux.
La date de modification est normalement la date à laquelle le noyau a été publié. Sur mon système, cette date est "touchée" à chaque démarrage du noyau à l'aide d'un script de redémarrage cron ( Comment savoir quand une version spécifique du noyau a été démarrée pour la dernière fois? ).
Pour chaque noyau, sa taille dans le répertoire /boot
est indiquée. Ensuite, la taille totale du noyau est additionnée pour les trois répertoires./boot,/usr/src/ version_version et/lib/modules/ version_version .
Si aucun paramètre n'est passé à rm-kernels
, la taille totale est estimée et le titre indique "Total estimé". Cela permet de gagner du temps en exécutant la commande du
qui peut prendre de 30 secondes à 90 minutes en fonction du nombre de noyaux que vous possédez et du fait que vous disposiez d'un disque SSD ou d'un disque dur. Si vous ne transmettez aucun paramètre, du
est utilisé pour obtenir la taille du noyau et le titre indique "Real Total", comme illustré dans l'exemple ci-dessus.
apt-get purge
vous donne une chance d'abandonnerVous pouvez voir tout ce qui sera purgé par apt purge
et avoir la possibilité de continuer ou d’abandonner:
The following packages will be REMOVED:
linux-headers-4.4.0-78* linux-headers-4.4.0-78-generic*
linux-headers-4.4.8-040408* linux-headers-4.4.8-040408-generic*
linux-headers-4.6.3-040603* linux-headers-4.6.3-040603-generic*
linux-headers-4.8.12-040812* linux-headers-4.8.12-040812-generic*
linux-headers-4.9.0-040900* linux-headers-4.9.0-040900-generic*
linux-headers-4.9.9-040909* linux-headers-4.9.9-040909-generic*
linux-image-4.4.0-78-generic* linux-image-4.4.8-040408-generic*
linux-image-4.6.3-040603-generic* linux-image-4.8.12-040812-generic*
linux-image-4.9.0-040900-generic* linux-image-4.9.9-040909-generic*
linux-image-extra-4.4.0-78-generic*
0 upgraded, 0 newly installed, 19 to remove and 1 not upgraded.
After this operation, 1,794 MB disk space will be freed.
Do you want to continue? [Y/n]
apt purge
rapports 1.784 MB seront libérés, mais le total réel 2.379 MB. Je ne sais pas pourquoi c'est différent.
Plutôt que de purger les noyaux un à un et que update-grub
soit appelé de manière répétitive dans une boucle fastidieuse, les sélections sont purgées en une seule fois.
Copiez ce code dans un fichier nommé rm-kernels
in /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 Aug 5, 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.
# With a magnetic hard disk, and empty memory cache:
# the first `du` command averages about 20 seconds per kernel.
# the second `du` command averages about 2.5 seconds per kernel.
# 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
n=$(( n + 1 )) # increment number of kernels
# 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
c=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
s=$(( ${s//[^0-9]*} )) # Strip out M to make " MB" below which looks nicer
t=$(( t + c ))
s=$s" MB"
c=$c" MB"
d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
choices=("${choices[@]}" false "$v" "$d" "$s" "$c")
done
# Write Kernel version and array index to unsorted file
> ~/.rm-kernels-plain # Empty any existing file.
for (( i=1; i<${#choices[@]}; i=i+5 )) ; do
echo "${choices[i]}|$i" >> ~/.rm-kernels-plain
done
# Sort kernels by version number
sort -V -k1 -t'|' ~/.rm-kernels-plain -o ~/.rm-kernels-sorted
# Strip out keys leaving Sorted Index Numbers
cut -f2 -d '|' ~/.rm-kernels-sorted > ~/.rm-kernels-ndx
# Create sorted array
SortedArr=()
while read -r ndx; do
end=$(( ndx + 4 ))
for (( i=$(( ndx - 1 )); i<end; i++ )); do
SortedArr+=("${choices[i]}")
done
done < ~/.rm-kernels-ndx
rm ~/.rm-kernels-plain ~/.rm-kernels-sorted ~/.rm-kernels-ndx
if [[ $# -ne 0 ]] ; then # Was a parameter passed?
VariableHeading="Real Total"
else
VariableHeading="Est. Total"
fi
# 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 - $n 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=800 \
--height=480 \
--column "Select" \
--column "Kernel Version Number" \
--column "Modified Date" \
--column "/boot Size" \
--column "$VariableHeading" \
"${SortedArr[@]}"`)
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 utiliser Sudo
powers pour enregistrer le fichier avec votre éditeur favori.
Pour rendre le fichier exécutable, utilisez:
Sudo chmod +x /usr/local/bin/rm-kernels
rm-kernels-server
est la version du serveur permettant de supprimer sélectivement les noyaux en une seule 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.
Avant d'exécuter le script, vous devez installer la fonction de dialogue à l'aide de:
Sudo apt install dialog
La boîte de dialogue se trouve dans l'installation par défaut du bureau Ubuntu, mais pas dans Ubuntu Server.
rm-kernels-server
code bash#!/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 Aug 5, 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.
# With a magnetic hard disk, and empty memory cache:
# the first `du` command averages about 20 seconds per kernel.
# the second `du` command averages about 2.5 seconds per kernel.
# 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
n=$(( n + 1 )) # increment number of kernels
# 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
c=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
s=$(( ${s//[^0-9]*} )) # Strip out M to make " MB" below which looks nicer
t=$(( t + c ))
s=$s" MB"
c=$c" MB"
d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
item_list=("${item_list[@]}" "$i" "$v ! $d ! $s ! $c" off)
done
# Write Kernel version and array index to unsorted file
> ~/.rm-kernels-plain # Empty any existing file.
for (( i=1; i<${#item_list[@]}; i=i+3 )) ; do
echo "${item_list[i]}|$i" >> ~/.rm-kernels-plain
done
# Sort kernels by version number
sort -V -k1 -t'|' ~/.rm-kernels-plain -o ~/.rm-kernels-sorted
# Strip out keys leaving Sorted Index Numbers
cut -f2 -d '|' ~/.rm-kernels-sorted > ~/.rm-kernels-ndx
# Create sorted array
SortedArr=()
i=1
while read -r ndx; do
SortedArr+=($i "${item_list[$ndx]}" "off")
(( i++ ))
done < ~/.rm-kernels-ndx
rm ~/.rm-kernels-plain ~/.rm-kernels-sorted ~/.rm-kernels-ndx
cmd=(dialog --backtitle "rm-kernels-server - $n Kernels, 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 /boot Size Total" 20 70 15)
selections=$("${cmd[@]}" "${SortedArr[@]}" 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 ${SortedArr[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 étendus dessiné à la ligne (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 zone. Si vous n'utilisez pas ssh
, vous pouvez supprimer le --ascii-lines
et votre affichage sera formaté avec des caractères de trait:
La taille calculée de chaque noyau a été prise à partir de /boot/*kernel_version*
qui consistait en 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.
La valeur par défaut consiste à estimer la taille des fichiers pour les en-têtes linux à 125 Mo et celle de linux-image à 220 Mo, car du
peut être extrêmement lent à moins que les fichiers ne soient mis en cache dans la mémoire. Pour obtenir la taille réelle à l'aide de du
, transmettez un 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 de 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 maintenant la date modifiée .
La liste du noyau est maintenant triée par version du noyau plutôt que par ordre alphabétique.
Une colonne supplémentaire a été ajoutée pour /boot size
. Dans la version graphique de Zenity, la dernière colonne bascule entre "Total réel" et "Total estimé" (Estimation) en fonction du paramètre 1 transmis ou non.