748 votes

Comment supprimer les anciennes versions du noyau pour nettoyer le menu de démarrage ?

Chaque fois que j'installe un nouveau noyau Linux, il est laissé dans le grub_config, rendant le menu de démarrage plus long à chaque fois.

Je sais que je peux rechercher manuellement dans les paquets installés et les supprimer.

Ubuntu propose-t-il un moyen plus simple de les nettoyer ou de les empêcher d'apparaître dans la liste de démarrage ?

0 votes

En plus de supprimer les anciens noyaux, décommentez cette ligne dans le fichier /etc/default/grub si vous voulez vous débarrasser des éléments de "récupération" dans le menu : #GRUB_DISABLE_LINUX_RECOVERY="true"

0 votes

Dans les versions récentes Ubuntu cache les noyaux dans le sous menu de Grub, donc ce n'est pas si gênant. Cependant, il peut être une bonne idée de supprimer les noyaux supplémentaires pour économiser de l'espace, surtout, si vous avez une petite partition /boot séparée.

10 votes

Il existe une commande ubuntu appelée purge-old-kernels pour faire ce travail. Voir mon réponse pour plus d'informations.

5voto

WinEunuuchs2Unix Points 91128

L'avantage de cette réponse est que l'on utilise le Bash natif d'Ubuntu sans installer d'applications tierces. Les utilisateurs de noyaux personnalisés qui n'ont pas utilisé le logiciel apt o dpkg peuvent modifier ce bash script pour répondre à leurs besoins. Cette réponse est basée sur ( Comment purger sélectivement les vieux noyaux d'un seul coup ? ).

Solution basée sur Zenity

Zenity fournit une belle interface graphique au terminal pour traiter une liste et sélectionner des éléments avec boutons radio :

rm-kernels 1

Comme le titre l'indique, le noyau actuel avec lequel vous avez démarré ne peut pas être supprimé et n'est pas inclus dans la liste. La taille indiquée est la quantité qui sera sauvegardée dans le fichier /boot répertoire. Une plus grande partie est sauvegardée sur votre disque car les binaires du noyau résident également dans d'autres zones. Note du 27 juillet 2017 : Les répertoires /usr/src/*kernel_version* y /lib/modules/*kernel_version* sont maintenant inclus également.

El Date de modification est découvert en utilisant le stat commande. Sur mon système, cette date est "touché" à chaque fois que le noyau est démarré en utilisant cette méthode ( Comment savoir quand une version spécifique du noyau a été démarrée pour la dernière fois ? ) cron redémarrer le script. Cependant, sur votre système, la date sera la date de sortie du noyau, et non la dernière fois que vous l'avez démarré.

apt-get purge vous donne la possibilité d'avorter

Vous avez une dernière possibilité de visualiser 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 en /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

NOTE : Vous avez besoin de la permission sudo pour créer le fichier à 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 serveur pour supprimer sélectivement les noyaux en une seule fois. Au lieu d'une boîte de dialogue GUI (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 le programme fonction de dialogue en utilisant :

    sudo apt install dialog

Dialog est présent dans l'installation par défaut d'Ubuntu Desktop mais pas dans Ubuntu Server.

Écran d'échantillonnage

rm-kernels-server 1

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 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

NOTE : Dans l'appel à dialog la directive --ascii-lines est passé pour remplacer le jeu de caractères étendu de dessin à la ligne (qui ssh n'aime pas) avec "+-----+" pour les cases de dessin. Si vous n'aimez pas cette apparence, vous pouvez utiliser la fonction --no-lines pour ne pas avoir de boîte du tout.


Mises à jour du 28 juillet 2017

La taille calculée de chaque noyau a été tirée de /boot/*kernel_version* qui étaient 5 fichiers totalisant ~50 MB. La formule a été modifiée pour inclure les fichiers dans /usr/src/*kernel_version* y /lib/modules/*kernel_version* . La taille calculée pour chaque noyau est maintenant de ~400 MB. Le code ci-dessus pour rm-kernels y rm-kernels-server a été mis à jour. Cependant, les exemples d'écrans ci-dessus ne reflètent pas encore ces changements.

Par défaut, la taille des fichiers est estimée à 125 Mo pour linux-headers et à 220 Mo pour linux-image car du peut être terriblement lent, sauf si les fichiers sont dans le cache. Pour obtenir la taille réelle en utilisant du passer 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 être supprimée) est maintenant affiché dans la barre de titre.

La boîte de dialogue utilisée pour afficher le nom de chaque noyau. Date du dernier accès . Cette date peut être écrasée en masse pour tous les noyaux lors de la sauvegarde ou d'opérations similaires. La boîte de dialogue affiche maintenant le Date de modification à la place.

3voto

Chris Cheney Points 11

Un moyen facile de se débarrasser de presque tous les paquets obsolètes, ceux qui ne figurent plus dans aucune liste de paquets, ainsi que des noyaux obsolètes, est de faire l'une des choses suivantes :

dpkg --purge $(aptitude search ?obsolete)

Cependant, cela manquera des paquets qui sont toujours recommandés par d'autres paquets, et l'argument -R/--without-recommends ne résout pas ce problème.

dselect, après avoir changé de mode de tri avec 'o', affiche tous les paquets obsolètes, y compris ceux qu'aptitude a oubliés, mais certaines personnes n'aiment pas l'utiliser.

0 votes

La commande donnée ne purge pas les vieux noyaux et n'affecte pas le menu Grub selon mon expérience.

3voto

heemayl Points 85741

La réponse acceptée utilisant sed pour supprimer les anciens noyaux de façon permanente a quelques défauts, si quelqu'un n'a pas redémarré l'ordinateur après la mise à niveau du noyau, la commande supprimera le noyau plus récent aussi.

Voici une solution alternative qui prendra en compte toutes les situations pour supprimer uniquement les anciens noyaux actuels :

#!/bin/bash
kernels=( $(grep -Po "^linux-image-[^-]+-[^-]+-generic\b" < <(dpkg --get-selections)) )
cur_rel=$(grep -Po ".*(?=-[a-z]*$)" < <(uname -r))

for kernel in "${kernels[@]}"; do
    ker_rel=$(grep -Po "[0-9].*(?=-[a-z]*)" <<< "$kernel")
    dpkg --compare-versions "$ker_rel" gt "$cur_rel" && echo "Please Restart your computer first" && break
    dpkg --compare-versions "$ker_rel" lt "$cur_rel" && sudo apt-get remove "$kernel"
done

Si vous avez une version plus récente que la version actuelle, vous recevrez un avertissement vous invitant à redémarrer votre ordinateur. Notez également que les noyaux plus anciens sont conservés pour une bonne raison : si vous perturbez votre noyau actuel et rendez votre système instable, vous devriez être en mesure de démarrer dans n'importe quel noyau plus ancien.

0 votes

Cela ne supprimera pas les noyaux à faible latence ou les noyaux de toute autre saveur que générique.

0 votes

Je suppose que vous faites référence à ce sed solutions.

0 votes

@jarno : Que diriez-vous de remplacer grep -Po "^linux-image-[^-]+-[^-]+-generic\b" con grep -Eo "^linux-(image|headers|tools)-[^-]+-[^-]+(|-generic)\s" | sed -e "s/\s//g" y grep -Po ".*(?=-[a-z]*$)" con grep -Eo "^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+" y grep -Po "[0-9].*(?=-[a-z]*)" con grep -Eo "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+" ?

3voto

Julio Gorgé Points 8061

J'ai un script pour cela qui n'a pas besoin d'un parsing de chaîne très fantaisiste.

Supprimez les en-têtes et les images, sauf l'image actuelle, pour libérer de l'espace.

sudo apt-get autoremove --purge 'linux-headers-[0-9].*' linux-headers-$(uname -r)+ linux-headers-$(uname -r | cut -d- -f1,2)+ 'linux-image-[0-9].*' linux-image-$(uname -r)+

2voto

rck Points 151

ailurus a la particularité de supprimer les anciens noyaux ainsi que les configurations inutilisées. Personnellement, je le supprime manuellement depuis synaptic. Vous pouvez installer ailurus à partir de getdeb ainsi que ppa

0 votes

"Ailurus est un outil permettant de sauvegarder une liste nominative des logiciels installés. ... Dans le passé, Ailurus avait plusieurs fonctions. Maintenant, il n'a qu'une seule fonction. Parce que je pense qu'une fonction vraiment utile est mieux que des dizaines de fonctions moins utiles."

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X