¿Cómo elimino las versiones antiguas del kernel para limpiar el menú de arranque?

668

Cada vez que instalo un nuevo kernel de Linux, se queda en el grub_config, haciendo que el menú de arranque sea más largo cada vez.

Sé que puedo buscar manualmente a través de los paquetes instalados y eliminarlos.

¿Ubuntu proporciona alguna forma más fácil de limpiarlos o evitar que aparezcan en la lista de arranque?

    
pregunta Hans 22.01.2016 - 16:20

37 respuestas

576

16.04 y versiones más recientes de Ubuntu

sudo apt autoremove

Este comando elimina los paquetes que se instalaron automáticamente para resolver una dependencia, pero ahora ya no dependen de ellos. Esto incluye versiones anteriores de linux-headers-* y linux-image-* . (También es inteligente sobre este proceso, ¡dejando una versión de repuesto del kernel como una alternativa!)

11.10 y versiones más nuevas de Ubuntu

GRUB2 y su visualización de todos los núcleos

Las últimas versiones de Grub2 instaladas en Ubuntu muestran automáticamente el último kernel y ocultan los kernels más antiguos que puede haber instalado.

Sinovesugrub,recuerdepresionarShiftmientrasarranca.

Comopuedever,solosemuestraelúltimokernel.

Siseleccionalaopciónquesemuestra(presioneIngresar),todoslosnúcleosantiguosseharánvisiblesyestarándisponiblesparaarrancar.

Cómo eliminar de forma permanente los kernels antiguos

Primer arranque con el último kernel disponible.

Hay varias formas de eliminar los kernels antiguos. Personalmente, no tocaría Computer Janitor ya que se reconoce que rompe su computadora con sus sugerencias.

synaptic

Una alternativa es Synaptic ( sudo apt install synaptic )

busque linux-image , haga clic con el botón derecho en un kernel y elija la eliminación completa y finalmente haga clic en el botón Aplicar para eliminar el kernel.

Repitalabúsqueda,peroestavezparalinux-header:puedeeliminarlosencabezadosasociadosparalaimagendelkernelelegidaanteriormente.

Synaptic,aunquenointentaráverificarloqueestáintentandoeliminar...podríaeliminarinadvertidamentesukernelmásreciente,oinclusoeliminartodossuskernelsatravésdeestaherramienta,loqueledejaconunarranquenoválidoUbuntu!.

Recuerdecomprobarquékernelestáutilizando:

uname-r

Elresultadoseríasimilara:

Recuerde el resultado y el número; asegúrese de no eliminar la imagen o el encabezado correspondiente.

Recomendación

Mi recomendación es mantener al menos dos o preferiblemente tres núcleos, incluyendo el último. El motivo de la recomendación es que tendrá al menos uno / dos otros núcleos con los que iniciar, si por cualquier motivo, el último núcleo con el que no puede iniciar o presenta una capacidad de retroceso, como una conexión inalámbrica rota.

    
respondido por el fossfreedom 08.05.2018 - 18:09
367

Primero, reinicia tu sistema para asegurarte de que está utilizando el último kernel. Luego abre la terminal y revisa tu kernel actual:

uname -r 

¡NO QUITES ESTE KERNEL!

A continuación, escriba el comando a continuación para ver / listar todos los kernels instalados en su sistema.

dpkg --list | grep linux-image 

Encuentra todos los kernels que están por debajo de tu kernel actual. Cuando sepa qué núcleo eliminar, continúe a continuación para eliminarlo. Ejecute los comandos a continuación para eliminar el kernel que seleccionó.

sudo apt-get purge linux-image-x.x.x-x-generic 

Finalmente, ejecute los comandos a continuación para actualizar grub2

sudo update-grub2 

Reinicia tu sistema.

    
respondido por el penreturns 11.07.2018 - 10:33
266

Mi one-liner para eliminar kernels antiguos (esto también libera espacio en el disco)

dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/''uname -r''/q;p' | xargs sudo apt-get -y purge

Explicación (recuerde, | usa la salida del comando anterior como la entrada del siguiente)

  • dpkg --list lista todos los paquetes instalados
  • grep linux-image busca las imágenes de linux instaladas
  • awk '{ print $2 }' solo genera la segunda columna (que es el nombre del paquete)
  • sort -V pone los artículos en orden por número de versión
  • sed -n '/''uname -r''/q;p' imprime las líneas antes del kernel actual
  • xargs sudo apt-get -y purge purga los núcleos encontrados

Desenrollando la invocación sed :

  • -n le dice a sed que se quede callado
  • 'uname -r' genera la versión actual del kernel instalado: la incluimos en backticks para que la salida se incluya como parte del comando (también puede ver esto como $(uname -r)
  • /something/q dice que se detenga cuando coincida con 'algo' (en este caso, algo se genera como uname -r ): el / rodea una expresión regular
  • p está impreso
  • ; es el comando separtor, por lo que /something/q;p dice que se cierre cuando coincida con algo, de lo contrario, imprima

en conjunto, sed -n '/''uname -r''/q;p' imprime las líneas hasta que coincida con el nombre del kernel actual.

Si estás paranoico (como yo), puedes hacer la última parte xargs echo sudo apt-get -y purge para que se imprima el comando para purgar los núcleos antiguos, luego puedes verificar que no se incluye nada inesperado antes de ejecutarlo.

Versión modificada para eliminar encabezados:

dpkg --list | grep 'linux-image' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)//")"'/q;p' | xargs sudo apt-get -y purge
dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)//")"'/q;p' | xargs sudo apt-get -y purge

Nota: la invocación sed se modifica. "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)//")" extrae solo la versión (por ejemplo, "3.2.0-44"), sin "-generic" o similar de uname -r

Versión todo en uno para eliminar imágenes y encabezados (combina las dos versiones anteriores):

echo $(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/''uname -r''/q;p') $(dpkg --list | grep linux-headers | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)//")"'/q;p') | xargs sudo apt-get -y purge
    
respondido por el David Kemp 21.07.2015 - 08:27
56

Ubuntu 16.04+:

$ sudo apt autoremove
...
The following packages will be REMOVED:
  linux-headers-4.4.0-57 linux-headers-4.4.0-57-generic linux-image-4.4.0-57-generic linux-image-extra-4.4.0-57-generic linux-tools-4.4.0-57 linux-tools-4.4.0-57-generic

Ubuntu 15.10 e inferior:

Encuentro que esta es la forma más fácil y rápida. Mantiene el último kernel y dos más:

sudo apt-get install bikeshed
sudo purge-old-kernels

Para cambiar el número de núcleos adicionales que se mantienen:

sudo purge-old-kernels --keep 3
    
respondido por el bmaupin 21.05.2017 - 20:34
42

Eliminando entradas de Grub 2 Las entradas deben eliminarse editando o eliminando archivos en la carpeta /etc/grub.d. El archivo /boot/grub/grub.cfg es de solo lectura y normalmente no debería requerir edición.

¿Demasiados núcleos?

  • Si no está seguro del kernel que está usando actualmente, escriba uname -r en un terminal.

  • Los núcleos eliminados a través de APT (Synaptic, "apt-get remove", etc.) actualizarán automáticamente grub.cfg y no se requiere ninguna acción por parte del usuario.

  • Una gran herramienta para eliminar kernels (y entradas de menú) es Ubuntu-Tweak, una aplicación GUI segura y fácil de usar.

  • Instalar ubuntu tweak

  • Ubuntu-Tweak estará disponible en Aplicaciones > Herramientas del sistema.

Eliminar entradas antiguas del kernel

  • Seleccione "Package Cleaner" a la izquierda y "Clean Kernel" en el panel derecho.

  • Presiona el botón "Desbloquear" en la esquina inferior derecha, ingresa tu contraseña.

  • Seleccione de la lista mostrada las imágenes del núcleo y los encabezados que desea eliminar. El núcleo en uso no está en la lista.

  • Presiona el botón "Limpiar" en la esquina inferior derecha para eliminar las imágenes y encabezados del kernel seleccionados.

Eliminar sistemas operativos del menú Grub

  • Otros sistemas operativos que se hayan eliminado de la computadora también se eliminarán del menú una vez que se ejecute "update-grub" como root.

  • Los elementos del menú se colocan en el menú de Grub2 mediante scripts. Si no desea que se ingresen otros sistemas operativos en el menú, desactive /etc/grub.d/30_osprober

  • Ejecute este comando para evitar que el script ejecute
    sudo chmod -x /etc/grub.d/30_os-prober

  • DISABLE_30_OS-PROBER = 'true' en / etc / default / grub

Eliminar Memtest86 + del menú de Grub
sudo chmod -x /etc/grub.d/20_memtest86+

  • Ejecute el comando update-grub para permitir que los cambios se incorporen en grub.cfg

Fuente

Nota: Después de las actualizaciones del kernel, se agrega una nueva entrada al menú de GRUB. Si lo desea, puede eliminar la más antigua. Sin embargo, los usuarios más experimentados le aconsejarán que conserve al menos una entrada de repuesto en caso de que algo salga mal con una actualización y usted necesite inicie una versión anterior del kernel para solucionar problemas.

Una forma alternativa de eliminar las entradas del Kernel (antes de 10.04)

para GRUB no GRUB2

startupmanager

Puede encontrarlo en Sistema > > Administración > >

¿Ve en la segunda captura de pantalla que puede seleccionar cuántos núcleos mostrar? Por lo general, solo lo mantengo en 1, pero cuando obtengo una actualización del kernel, siempre lo cambio a 2 antes de reiniciar para poder seleccionar el kernel anterior si el nuevo kernel tiene problemas con mi hardware. Una vez que sé que el nuevo kernel está funcionando bien, lo cambio de nuevo a 1.

    
respondido por el karthick87 11.03.2017 - 19:59
39

Puramente línea de comando, esto eliminará todo menos el actual y el segundo más actual (a través del "-2" en el comando principal a continuación):

OLD=$(ls -tr /boot/vmlinuz-* | head -n -2 | cut -d- -f2- |
    awk '{print "linux-image-" $0 " linux-headers-" $0}' )
if [ -n "$OLD" ]; then
    apt-get -qy remove --purge $OLD
fi
apt-get -qy autoremove --purge
    
respondido por el Kees Cook 08.05.2015 - 19:01
34

Actualización: purge-old-kernels es en desuso en la actualidad.

Hice un script para purgar los núcleos incluso en condiciones difíciles. Se llama linux-purge y puede encontrarlo aquí .

Si solo desea purgar los kernels (y los paquetes relacionados) que son más antiguos que el kernel utilizado actualmente, cuando el sistema no esté dañado, puede usar este script .

También hay una página de documentación de Ubuntu en la que contribuí para eliminar los núcleos antiguos aquí .

    
respondido por el jarno 19.11.2017 - 16:00
29

Puede seguir la sección Uso de la sección "actualizaciones desatendidas" de Actualizaciones automáticas de seguridad en Ubuntu Wiki para realizar esto.

Necesitas cambiar la siguiente línea en el archivo /etc/apt/apt.conf.d/50unattended-upgrades ;

//Unattended-Upgrade::Remove-Unused-Dependencies "false";

con

Unattended-Upgrade::Remove-Unused-Dependencies "true";

para eliminar automáticamente los paquetes antiguos, incluidos los núcleos.

También elimine o comente la línea

"^linux-image.*"; 

en la sección "NeverAutoRemove" del archivo /etc/apt/conf.d/01autoremove.

    
respondido por el Qwerty 01.03.2013 - 13:44
27

La manera más rápida / sencilla (aplicable al menos desde 12.04) posible que ya viene con Ubuntu es apt-get . Haga lo siguiente si desea eliminar todas las versiones anteriores del kernel que no están en uso (excepto la anterior que no está usando. Esto es para asegurarse de que si la versión actual del kernel falla de alguna manera, tenga una manera de hacerlo. volver a un estado anterior). Haz lo siguiente:

sudo apt-get autoclean

Esto eliminará cualquier archivo antiguo (incluidas las versiones de kernel) que pueda tener. Tenga en cuenta que si tiene muchas versiones anteriores, tomará un tiempo, ya que tiene que asegurarse de que eliminar la versión del kernel no tenga problemas. Para mí, quitar las últimas 12 versiones del kernel tomó aproximadamente 2 minutos. También puedes hacer lo siguiente:

sudo apt-get clean

Lo que eliminará todo lo descargado y almacenado en la carpeta de caché de apt. Por último tienes:

sudo apt-get autoremove

que verificará si hay paquetes no utilizados y los eliminará si es necesario. Esto es excelente para aquellas bibliotecas y paquetes de dependencia que ya no son necesarios para ninguna aplicación instalada.

    
respondido por el Luis Alvarado 22.08.2017 - 21:44
25

10.04 Método GUI

Computer Janitor puede limpiar los núcleos antiguos y creo que está instalado de forma predeterminada en Ubuntu (pero no en Kubuntu).

GRUB 1, si está usando eso, tiene una opción en /boot/grub/menu.lst para especificar cuántos núcleos debería mostrar como máximo. GRUB 2, por lo que puedo decir, no lo hace.

    
respondido por el maco 26.03.2012 - 10:58
24

Para averiguar qué kernels y encabezados están instalados, use

dpkg -l | grep linux-image

dpkg -l | grep linux-headers

Luego puedes eliminarlos uno por uno o juntos, solo asegúrate de mantener el más reciente.

También hay algunos comandos y scripts útiles para automatizar la eliminación.

enlace

Los siguientes reclamos para eliminar todos los kernels y encabezados no utilizados:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)//")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*//;/[0-9]/!d'|grep -E "(image|headersmodules)" | xargs sudo apt-get -y purge

Esto es lo que sucede cuando se ejecuta el 18.04.1:

~$ dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]

\+\)//")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*//;/[0-9]/!d'|grep -E "(image|headers|modules)" | xargs sudo apt-get -y purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  linux-headers-4.15.0-33* linux-headers-4.15.0-33-generic* linux-headers-4.15.0-34* linux-headers-4.15.0-34-generic* linux-image-4.15.0-33-generic* linux-image-4.15.0-34-generic*
  linux-modules-4.15.0-33-generic* linux-modules-4.15.0-34-generic* linux-modules-extra-4.15.0-33-generic* linux-modules-extra-4.15.0-34-generic*
0 upgraded, 0 newly installed, 10 to remove and 1 not upgraded.
After this operation, 671 MB disk space will be freed.
(Reading database ... 227403 files and directories currently installed.)
Removing linux-headers-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-headers-4.15.0-33 (4.15.0-33.36) ...
Removing linux-headers-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-headers-4.15.0-34 (4.15.0-34.37) ...
Removing linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-image-4.15.0-33-generic (4.15.0-33.36) ...
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-33-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Found linux image: /boot/vmlinuz-4.15.0-34-generic
Found initrd image: /boot/initrd.img-4.15.0-34-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-image-4.15.0-34-generic (4.15.0-34.37) ...
I: /vmlinuz.old is now a symlink to boot/vmlinuz-4.15.0-36-generic
I: /initrd.img.old is now a symlink to boot/initrd.img-4.15.0-36-generic
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-34-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
(Reading database ... 156180 files and directories currently installed.)
Purging configuration files for linux-image-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
dpkg: warning: while removing linux-modules-4.15.0-33-generic, directory '/lib/modules/4.15.0-33-generic' not empty so not removed
Purging configuration files for linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-image-4.15.0-33-generic (4.15.0-33.36) ...
Purging configuration files for linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
~$ uname -r
4.15.0-36-generic
    
respondido por el mikewhatever 20.10.2018 - 15:45
16

Para eliminar los núcleos de imagen de Linux más antiguos, primero inicie el núcleo que desea conservar.

También puede verificar la versión del kernel usando el comando uname -r para que no elimine la incorrecta por error.

Ahora vaya al administrador de paquetes synaptic y busque linux-image y elimine las versiones anteriores excepto la que se muestra con el comando superior. Generalmente prefiero ir con la última.

Ahora, cuando reinicies, verás un menú de grub más limpio.

    
respondido por el anurag-jain 03.03.2011 - 14:10
14

Puede instalar ubuntu-tweak y luego Ir a Aplicaciones - > Herramienta del sistema - > ubuntu tweak y

haga clic en package cleaner y limpie kernels. no muestra el kernel utilizado actualmente, por lo que siempre estará seguro.

    
respondido por el Lincity 03.03.2011 - 14:26
8

Personalmente, me gusta usar Synaptic . Me hace sentir más seguro sobre lo que está pasando. La única aplicación que he usado que tiene una opción para eliminar los kernels antiguos es Ubuntu Tweak .

Cómo eliminar los kernels que no está utilizando:

  • Abre UbuntuTweak
  • Haga clic en 'Limpiador de paquetes' en 'Aplicaciones' en el panel de la izquierda
  • En el lado derecho de la 'vista de limpieza', presione 'Limpiar kernels'
  • Seleccionar todos los kernels: creo que el que está en uso no está en la lista, pero en caso de que se ejecute uname -a en una terminal
respondido por el Alan Featherston 08.04.2013 - 02:24
6

Puedes desinstalar los kernels antiguos (paquetes de linux-image-... ) usando Synaptic, y eso los eliminará del menú de arranque. Tenga cuidado de no eliminar el kernel en ejecución (puede verificar su versión con uname -r ).

Tenga en cuenta que tener una o dos versiones anteriores puede ayudarlo a solucionar problemas, si algo sale mal.

Alternativamente, puede editar / eliminar las entradas manualmente ( gksu gedit /boot/grub/grub.cfg ), pero se volverán a generar cuando actualice a un kernel más nuevo. Si está pensando en eliminar las opciones de recovery mode , no lo haga. Pueden ser útiles si rompes algo que te impide arrancar.

Consulte esta página.

    
respondido por el evgeny 13.04.2017 - 14:14
4

Esta es una solución de línea de comando pura.

Primero genere una lista de todas las versiones instaladas del kernel, excepto el kernel actualmente en ejecución:

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    grep -v $(uname -r | cut -d- -f1,2))

También puede generar una lista de todas las versiones instaladas del kernel, excepto las dos últimas:

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    sort -V | head -n -2)

Examina la lista. Asegúrese de que las versiones del kernel que desea conservar no sean parte de la lista. Use el comando uname -r para ver la versión del kernel actualmente en ejecución.

Si está satisfecho con los resultados, puede usar apt-get para eliminar los paquetes.

Primero una ejecución en seco (usando el primer generador como ejemplo):

sudo apt-get --dry-run purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))

Entonces una carrera real:

sudo apt-get purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))

Si desea automatizar el proceso, añada el parámetro --yes :

sudo apt-get --yes purge $(
  ...)
    
respondido por el lesmana 16.05.2015 - 18:18
3

La ventaja de esta respuesta es que Ubuntu Bash nativo se usa sin instalar aplicaciones de terceros. Los usuarios de kernels personalizados que no usaron apt o dpkg pueden cambiar este script de bash para satisfacer sus necesidades. Esta respuesta se basa en ( Cómo purgar selectivamente núcleos viejos todos a la vez ).

Solución basada en Zenity

Zenity proporciona una interfaz de interfaz gráfica de usuario agradable al terminal para procesar una lista y seleccionar elementos con botones de opción :

Comoeltítuloindicaqueelkernelactualconelqueiniciónosepuedeeliminarynoestáincluidoenlalista.Eltamañoinformadoescuántoseguardaráeneldirectorio/boot.Seguardamásensudiscoporquelosbinariosdelnúcleoresidenenotrasáreastambién.Notadel27dejuliode2017:losdirectorios/usr/src/*kernel_version*y/lib/modules/*kernel_version*tambiénseincluyenahora.

LaFechademodificaciónsedescubremedianteelcomandostat.Enmisistema,esafechaestá"tocada" cada vez que se arranca el kernel usando esto ( ¿Cómo averigua cuándo se inició por última vez una versión específica del kernel? ) cron secuencia de reinicio. Sin embargo, en su sistema, la fecha será la fecha de lanzamiento del kernel, no la última vez que lo inició.

apt-get purge te da la oportunidad de abortar

Se le da una última oportunidad para ver todo lo que se purgará y ver el espacio total en disco (algo engañoso) que se recuperará:

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] 

El Código

Copie este código en un archivo ejecutable llamado 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

NOTA: necesita sudo sudo para crear el archivo, así que use:

gksu gedit /usr/local/bin/rm-kernels

Para hacer uso ejecutable de archivo:

sudo chmod +x /usr/local/bin/rm-kernels

Versión del servidor

rm-kernels-server es la versión del servidor para eliminar de forma selectiva todos los núcleos a la vez. En lugar de un cuadro de diálogo GUI (gráfico), se utiliza un cuadro de diálogo basado en texto para seleccionar núcleos para purgar.

  • Antes de ejecutar el script, debe instalar la función de diálogo usando:

    sudo apt install dialog

El cuadro de diálogo está en la instalación predeterminada de Ubuntu Desktop pero no en Ubuntu Server.

Pantalla de muestra

rm-kernels-servercódigobash

#!/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

NOTA: En la llamada a dialog , la directiva --ascii-lines se pasa para reemplazar el conjunto de caracteres extendidos de dibujo de línea (que no le gusta a ssh ) con "+ --- - + "para dibujar cuadros. Si no te gusta esta apariencia, puedes usar la directiva --no-lines para ninguna casilla.

Actualizaciones del 28 de julio de 2017

El tamaño calculado de cada kernel se tomó de /boot/*kernel_version* , que eran 5 archivos con un total de ~ 50 MB. La fórmula ha cambiado para incluir los archivos en /usr/src/*kernel_version* y /lib/modules/*kernel_version* . El tamaño calculado para cada kernel ahora es de ~ 400 MB. El código anterior para rm-kernels y rm-kernels-server se ha actualizado. Sin embargo, las pantallas de muestra anteriores todavía no reflejan estos cambios.

El valor predeterminado es calcular el tamaño de los archivos para los encabezados de linux a 125 MB y la imagen de linux a 220 MB porque du puede ser extremadamente lento a menos que los archivos estén en caché. Para obtener el tamaño real utilizando du , pase cualquier parámetro al script.

El total de todos los tamaños de kernel (excluyendo la versión actual en ejecución que no se puede eliminar) ahora se muestra en la barra de título.

El cuadro de diálogo que se usa para mostrar la última fecha de acceso de cada kernel. Esta fecha puede sobrescribirse en masa para todos los núcleos durante la copia de seguridad o operaciones similares. El cuadro de diálogo ahora muestra la Fecha de modificación en su lugar.

    
respondido por el WinEunuuchs2Unix 29.07.2017 - 00:35
2

Una forma fácil de deshacerse de casi todos los paquetes obsoletos, paquetes que ya no están en ninguna lista de paquetes, junto con núcleos obsoletos, es hacer una de las siguientes acciones:

dpkg --purge $(aptitude search ?obsolete)

Sin embargo, esto faltará a los paquetes que aún son recomendados por otros paquetes, y el argumento -R / - without-recomienda no resuelve este problema.

dselect después de cambiar el modo de clasificación con 'o' mostrará todos los paquetes obsoletos, incluidos los que faltan en aptitude, pero a algunas personas no les gusta usarlo.

    
respondido por el Chris Cheney 06.04.2013 - 05:03
2

La respuesta aceptada que usa sed para eliminar los kernels más antiguos tiene algunas fallas de forma permanente. Si alguien no ha reiniciado la computadora después de actualizar el kernel, el comando también eliminará el kernel más nuevo.

Aquí hay una solución alternativa que considerará todas las situaciones para eliminar solo los núcleos más antiguos:

#!/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 tienes una versión más reciente que la actual, te dará una advertencia para que reinicies tu computadora primero. También tenga en cuenta que los núcleos más antiguos se conservan debido a una buena razón que es que si de alguna manera desordena su núcleo actual haciendo que su sistema sea inestable, entonces debería poder iniciar cualquier núcleo antiguo.

    
respondido por el heemayl 17.04.2015 - 21:21
1

ailurus tiene la función de eliminar núcleos antiguos así como configuraciones no utilizadas. Personalmente lo elimino manualmente de synaptic. Puede instalar ailurus desde getdeb , así como ppa

    
respondido por el sagarchalise 17.09.2010 - 12:53
1

Puedes usar ukuu, es todo GUI, para actualizar y eliminar Kernels antiguos. Funciona para mí!

Solo recuerda dejar los últimos 2 instalados y, obviamente, el kernel 'en ejecución'.

También puede configurar ukuu para que muestre solo las versiones principales, incluso los núcleos RC, las versiones de ocultación.

PuedeencontrarukuuenSynaptic,olasinstruccionesestánaquí:

OMG! Instrucciones de instalación de Ubuntu ukuu

    
respondido por el sprocketoctopus 07.09.2017 - 12:39
0

aquí hay un resumen de lo que hice, cuidado, ya que no soy un experto en Linux, asegúrese de saber lo que está haciendo y de haber realizado una copia de seguridad de los archivos que está modificando.

gedit /boot/grub/grub.cfg

A continuación, busque las entradas que desea conservar, las resaltaremos y las copiaremos

cd /etc/grub.d
ls

verá una lista de archivos como 10_linux y 30_os-prober

sudo chmod -x 10_linux

esto detendrá la forma automática de agregar todas las entradas de Linux en el menú de arranque de grub.

gksudo gedit 40_custom

abra el archivo del menú de inicio personalizado, luego regrese a grub.cfg (que aún debería estar abierto en gedit), y copie las entradas que desea conservar ... como

menuentry "My Default Karmic" {
  set root=(hd0,1)
  search --no-floppy --fs-uuid --set cb201140-52f8-4449-9a95-749b27b58ce8
  linux /boot/vmlinuz-2.6.31-11-generic root=UUID=cb201140-52f8-4449-9a95-749b27b58ce8 ro quiet splash
  initrd /boot/initrd.img-2.6.31-11-generic
}

pégalos en 40_custom , y luego guárdalos.

sudo chmod 755 40_custom

lo hace ejecutable, luego finalmente actualizamos grub que cambiará el archivo grub.cfg:

sudo update-grub

Ahora, CUIDADO, si actualiza su kernel o sistema operativo, su menú de arranque probablemente no se actualizará ... tendrá que hacerlo manualmente. Pero hacer este procedimiento le permitirá personalizar el menú de arranque un poco más, como eliminar la versión del kernel y simplemente poner el nombre de ubuntu ... es decir, Ubuntu Lucid 10.04, etc ...

Espero que alguien encuentre esto útil, ya que me tomó un tiempo darme cuenta de que ... no vi esta solución en ninguna parte ...

    
respondido por el Joe 09.01.2012 - 00:31
0

Instale el administrador de paquetes synaptic y vaya a la pestaña de filtros (creo que los filtros, si no los prueba todos los 5) y seleccione "local". Esto le mostrará los paquetes huérfanos en su sistema, como los núcleos. Después de desinstalarlos, ejecute update-grub . Ese comando actualiza la lista de opciones de arranque para grub.

Si esto falla, siempre puedes probar apt-get remove linux-image-version-generic .

    
respondido por el Relish 29.05.2013 - 18:41
0

Basado en una respuesta anterior de David Kemp, la siguiente secuencia de comandos borrará todos los encabezados e imágenes, excepto las versiones últimas 2 .

#!/bin/sh
# This script assumes that the installed linux-image and linux-headers packages
# share the same versions (i.e. if a linux-image version number is installed,
# the corresponding linux-headers package will also be installed, and vice
# versa.)

SECONDTOLASTVER=$(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -r -n | sed '/^[^0-9]\+$/d' | sed 's/^.*-\([0-9\.]\+-[0-9]\+\).*//' | uniq | sed -n 2p)

# get a list of package names matching the argument passed to the function, and
# return only those package names which should be removed
get_pkgs_to_remove_matching () {
    if [ -n "$SECONDTOLASTVER" ]; then
        echo $(dpkg --list | grep $1 | awk '{ print $2 }' | sort | sed -n '/'"$SECONDTOLASTVER"'/q;p')
    fi
}

echo $(get_pkgs_to_remove_matching linux-image) $(get_pkgs_to_remove_matching linux-headers) | xargs sudo apt-get -y purge
    
respondido por el Mark 12.06.2013 - 20:42
0

La siguiente cadena de comandos purgará cualquier kernel de Linux instalado, excepto el que se ejecuta actualmente (grep -v uname -r ) y el último kernel disponible (dpkg -l | .... | tail -1):

dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | grep -v 'dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | tail -1' | grep -v 'uname -r' | xargs apt-get -y purge

Utilizo esto para mantener los volúmenes de arranque del escritorio relativamente limpios, pero en una situación de servidor probablemente querrá expandir la lógica y escribir algunos scripts adicionales para mantener una lista de los últimos kernels X que el servidor ha iniciado.

Algo como un script de inicio que hace:

uname -r >> /root/bootedkernels
cat /root/bootedkernels | sort -u | tail -3 > /root/bootedkernels # Keep the last 3 booted kernels

y luego usa:

dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | grep -vf /root/bootedkernels | grep -v 'dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | tail -1' | grep -v 'uname -r' | xargs apt-get -y purge
    
respondido por el Alexander Thompson 30.06.2013 - 20:37
0

Para tener un poco más de control sobre qué versiones conservar, seleccione explícitamente las que desea eliminar. Por ejemplo, si desea eliminar las versiones del kernel 3.2.0. [49-53], use un simple for loop:

for k in 49 51 52 53 ; do aptitude remove --purge linux-image-3.2.0-${k}-generic ; done

Ajusta la lista de versiones del kernel para que se ajusten.

    
respondido por el NeilNjae 08.11.2013 - 13:51
0

Prueba esto. Ejecutarlo como root.

Guarde este script como, diga ./keep-n-kernels.sh

Pase, como argumento de la línea de comando, el número de kernels más recientes que desea conservar.

    
#!/bin/bash

# pass n as a command line argument, and it will find all the installed
# kernels and keep only the n most recent ones => uninstall all older ones

# dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)//")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*//;/[0-9]/!d'
# this command gives the list of all packages EXCEPT for the latest kernel.
# source : https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels

n=$1

# find the installed kernel versions :
# dpkg-query -W -f='${Version}\n' 'linux-image-*' | grep . | sort -n
# gives version numbers, one in each line
# dpkg-query -W -f='${Version}\n' 'linux-image-*' | grep . | sed 's/\...$//g' | grep -v '\...$'| sort -u
# gives only the ones that appear in linux-image

# suffix, e.g. -generic-pae
# the kind of kernel you boot into
suffix=$(uname -r | sed 's:^[0-9]\.[0-9]\.[0-9]\-[0-9]\{2\}::g')

command="apt-get purge "

for version in $(dpkg-query -W -f='${Version}\n' 'linux-image-*' | grep . | sed 's/\...$//g' | grep -v '\...$'| sort -u | head -n -${n})
do
    command=${command}"^linux-image-${version}${suffix} "
done

$command

Uso de muestra:

# ./keep-n-kernels.sh 4 # launch the apt-get command to remove all but the 4 most recent kernels

Si desea [Y A SU PROPIO RIESGO], puede agregar un -y (o un indicador de fuerza) al comando apt-get y hacerlo no interactivo.

    
respondido por el Sankalp 28.01.2014 - 21:47
0

Estoy usando un escritorio KDE, y la opción más fácil que encontré fue usar la aplicación kde-config-grub2 como se sugiere aquí: enlace (que ya tenía instalado para configurar la imagen de fondo, la opción de inicio predeterminada y similares). Junto al cuadro desplegable donde puede elegir la entrada predeterminada, hay un botón "Eliminar entradas antiguas". Al hacer clic en este botón, aparece una lista de todos los kernels instalados y puede seleccionar cuáles eliminar. Cuando apliques los cambios, utilizará dpkg para eliminarlos del sistema y del menú de GRUB.

    
respondido por el Ben 06.07.2014 - 19:44
0

Sólo para activar, también puede emitir

apt-get remove linux-{image,headers}-x.y.z-{1,2,...,n}

como root, y se hará el trabajo.

    
respondido por el Severo Raz 27.11.2014 - 03:26
0

Tengo un script para esto que no necesita un análisis de cadenas muy elegante.

Eliminar encabezados e imágenes, excepto la actual para liberar espacio

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)+
    
respondido por el Paulo Santos 16.05.2015 - 11:40

Lea otras preguntas en las etiquetas