Come rimuovo le vecchie versioni del kernel per pulire il menu di avvio?

669

Ogni volta che installo un nuovo kernel Linux, viene lasciato in grub_config, rendendo il menu di avvio più lungo ogni volta.

So che posso cercare manualmente tra i pacchetti installati e rimuoverli.

Ubuntu fornisce un modo più semplice per ripulirle o impedirle di essere visualizzate nell'elenco di avvio?

    
posta Hans 22.01.2016 - 16:20

30 risposte

577

16.04 e versioni più recenti di Ubuntu

sudo apt autoremove

Questo comando rimuove i pacchetti che sono stati installati automaticamente per risolvere una dipendenza, ma che ora non dipendono più. Ciò include le vecchie versioni di linux-headers-* e linux-image-* . (È anche intelligente su questo processo, lasciando una versione di riserva del kernel come una riserva!)

11.10 e versioni più recenti di Ubuntu

GRUB2 e la sua visualizzazione di tutti i kernel

Le ultime versioni di Grub2 installate in Ubuntu mostrano automaticamente il kernel più recente e nascondono i kernel più vecchi che potresti aver installato.

Senonvediiltuogrub-ricordadipremereMaiuscdurantel'avvio.

Comepuoivedere,vienevisualizzatosoloilkernelpiùrecente.

Seselezionil'opzionemostrata(premiInvio),tuttiivecchikerneldiventanovisibiliedisponibiliperl'avvio.

Come eliminare definitivamente i kernel più vecchi

Primo avvio con l'ultimo kernel disponibile.

Esistono diversi modi per eliminare i vecchi kernel. Personalmente, non toccherò Computer Janitor poiché questo è riconosciuto per rompere il computer con i suoi suggerimenti.

sinaptica

Un'alternativa è Synaptic ( sudo apt install synaptic )

cerca linux-image , fai clic con il pulsante destro del mouse su un kernel e scegli la rimozione completa e infine fai clic sul pulsante Applica per eliminare il kernel.

Ripetilaricercamaquestavoltaperlinux-header-puoieliminareleintestazioniassociateperl'immaginedelkernelsceltainprecedenza.

Synapticperònontenteràdiverificareciòchestaicercandodirimuovere...potrestiinavvertitamentecancellareiltuonuovokernel-oaddiritturaeliminaretuttiituoikernelconquestostrumentolasciandotiununbootableUbuntu!.

Ricordatidicontrollarequalekernelstaiusandotype:

uname-r

Ilrisultatosarebbesimilea:

Ricorda il risultato e il numero - assicurati di non eliminare l'immagine o l'intestazione corrispondenti.

Raccomandazione

La mia raccomandazione è di mantenere almeno due o preferibilmente tre kernel compreso l'ultimo. Il motivo della raccomandazione è che avremo almeno uno / due altri kernel con cui avviare, se per qualsiasi ragione l'ultimo kernel non è in grado di avviarsi o introducendo una funzionalità regressata come la connessione wireless.

    
risposta data fossfreedom 08.05.2018 - 18:09
367

Per prima cosa, riavvia il sistema per essere sicuro che stia usando il kernel più recente. Quindi apri il terminale e controlla il tuo kernel corrente:

uname -r 

NON RIMUOVERE QUESTO KERNEL!

Successivamente, digita il comando seguente per visualizzare / elencare tutti i kernel installati sul tuo sistema.

dpkg --list | grep linux-image 

Trova tutti i kernel che sono inferiori al tuo attuale kernel. Quando sai quale kernel rimuovere, continua qui sotto per rimuoverlo. Esegui i comandi qui sotto per rimuovere il kernel selezionato.

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

Infine, esegui i comandi qui sotto per aggiornare grub2

sudo update-grub2 

Riavvia il sistema.

    
risposta data penreturns 11.07.2018 - 10:33
267

Il mio one-liner per rimuovere i vecchi kernel (questo consente anche di liberare spazio sul disco)

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

Spiegazione (ricorda che | usa l'output del comando precedente come input per il prossimo)

  • dpkg --list elenca tutti i pacchetti installati
  • grep linux-image cerca le immagini linux installate
  • awk '{ print $2 }' mostra solo la seconda colonna (che è il nome del pacchetto)
  • sort -V mette gli articoli in ordine per numero di versione
  • sed -n '/''uname -r''/q;p' stampa le righe prima del kernel corrente
  • xargs sudo apt-get -y purge elimina i kernel trovati

Disattiva la chiamata sed :

  • -n dice a sed di essere tranquillo
  • 'uname -r' restituisce la versione attuale del kernel installata - la includiamo nei backtick in modo che l'output sia incluso come parte del comando (potresti anche vederlo come $(uname -r)
  • /something/q dice stop quando si abbina "qualcosa" (in questo caso, qualcosa viene emesso di uname -r ) - il / racchiude un'espressione regolare
  • p è stampa
  • il ; è il comando separtor, quindi /something/q;p dice quit quando si abbina qualcosa, altrimenti print

complessivamente, sed -n '/''uname -r''/q;p' stampa le linee finché non corrisponde al nome del kernel corrente.

Se sei paranoico (come me), puoi creare l'ultima parte xargs echo sudo apt-get -y purge in modo che venga stampato il comando per eliminare i vecchi kernel, quindi puoi verificare che non sia incluso nulla di inaspettato prima di eseguirlo.

Versione modificata per rimuovere le intestazioni:

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: l'invocazione sed è stata modificata. "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)//")" estrae solo la versione (ad es. "3.2.0-44"), senza "-generico" o simile da uname -r

Versione all-in-one per rimuovere immagini e intestazioni (combina le due versioni precedenti):

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
    
risposta data 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 seguenti:

Trovo che questo sia il modo più semplice e veloce. Mantiene l'ultimo kernel e altri due:

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

Per cambiare il numero di kernel aggiuntivi che vengono mantenuti:

sudo purge-old-kernels --keep 3
    
risposta data bmaupin 21.05.2017 - 20:34
42

Rimozione di voci da Grub 2 Le voci devono essere rimosse modificando o rimuovendo i file nella cartella /etc/grub.d. Il file /boot/grub/grub.cfg è di sola lettura e normalmente non dovrebbe essere modificato.

Troppi kernel?

  • Se non sei sicuro del kernel che stai utilizzando, in un tipo di terminale uname -r .

  • I kernel rimossi tramite APT (Synaptic, "apt-get remove", ecc.) aggiorneranno automaticamente grub.cfg e non è richiesta alcuna azione da parte dell'utente.

  • Un ottimo strumento per la rimozione di kernel (e voci di menu) è Ubuntu-Tweak, un'app GUI sicura e facile da usare.

  • Installa modifica di ubuntu

  • Ubuntu-Tweak sarà disponibile in Applicazioni & gt; Strumenti di sistema.

Rimuovi le voci del kernel precedenti

  • Seleziona "Pulisci pacchetto" a sinistra e "Pulisci kernel" dal pannello di destra.

  • Premi il pulsante "Unlock" in basso a destra, inserisci la password.

  • Seleziona dall'elenco visualizzato le immagini e le intestazioni del kernel che desideri rimuovere. Il kernel in uso non è elencato.

  • Premi il pulsante "Pulizia" in basso a destra per rimuovere le immagini e le intestazioni del kernel selezionate.

Rimuovi i sistemi operativi dal menu di Grub

  • Anche altri sistemi operativi che sono stati rimossi dal computer verranno rimossi dal menu quando "update-grub" verrà eseguito come root.

  • Le voci di menu sono posizionate nel menu di Grub2 tramite script. Se non vuoi che altri sistemi operativi vengano inseriti nel menu, disabilita /etc/grub.d/30_osprober

  • Esegui questo comando per interrompere l'esecuzione dello script
    sudo chmod -x /etc/grub.d/30_os-prober

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

Rimuovi Memtest86 + dal menu Grub
sudo chmod -x /etc/grub.d/20_memtest86+

  • Esegui il comando update-grub per consentire l'incorporamento delle modifiche in grub.cfg

Origine

Nota: Dopo gli aggiornamenti del kernel, una nuova voce viene aggiunta al menu di GRUB. Se vuoi, puoi rimuovere quello più vecchio. Tuttavia, gli utenti più esperti ti consigliano di conservare almeno una voce di riserva nel caso in cui qualcosa vada storto con un aggiornamento ed è necessario avviare una versione precedente del kernel per la risoluzione dei problemi.

Modo alternativo per rimuovere le voci del kernel (prima della 10.04)

per GRUB non GRUB2

startupmanager

Puoi trovarlo in Sistema & gt; & gt; Amministrazione & gt; & gt;

Vedi nel secondo screenshot puoi selezionare quanti kernel mostrare? Generalmente lo terrò su 1, ma quando avrò un aggiornamento del kernel lo cambierò sempre in 2 prima di ricominciare, così posso selezionare il kernel più vecchio se il nuovo kernel ha problemi con il mio hardware. Una volta che so che il nuovo kernel sta funzionando bene, lo cambio in 1.

    
risposta data karthick87 11.03.2017 - 19:59
39

Puramente da linea di comando, questo rimuoverà tutto tranne il corrente e il secondo più corrente (tramite "-2" nel comando principale sotto):

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
    
risposta data Kees Cook 08.05.2015 - 19:01
34

Aggiornamento: purge-old-kernels è deprecato al giorno d'oggi.

Ho realizzato uno script per eliminare i kernel anche in condizioni difficili. Si chiama linux-purge e puoi trovarlo qui .

Se vuoi solo eliminare i kernel (e i pacchetti correlati) che sono più vecchi del kernel attualmente usato, quando il sistema non è rotto, puoi usare questo script .

C'è anche una pagina di documentazione di Ubuntu che ho contribuito a rimuovere i vecchi kernel qui .

    
risposta data jarno 19.11.2017 - 16:00
29

Puoi seguire Utilizzare la sezione del pacchetto "aggiornamenti automatici" di Aggiornamenti automatici sulla sicurezza su Ubuntu Wiki per eseguire questo.

Devi modificare la seguente riga nel file /etc/apt/apt.conf.d/50unattended-upgrades ;

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

con

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

per rimuovere automaticamente i vecchi pacchetti, inclusi i kernel.

Rimuovi o commenta la linea

"^linux-image.*"; 

nella sezione "NeverAutoRemove" del file /etc/apt/apt.conf.d/01autoremove.

    
risposta data Qwerty 01.03.2013 - 13:44
27

Il modo più veloce / più semplice (Applicabile almeno dal 12.04) possibile che già viene fornito con Ubuntu è apt-get . Effettuate le seguenti operazioni se desiderate rimuovere tutte le vecchie versioni del kernel che non sono in uso (tranne il precedente che non state usando. Questo per assicurarsi che se la versione corrente del kernel fallisce in qualche modo, avete un modo per andare torna a uno stato precedente). Effettua le seguenti operazioni:

sudo apt-get autoclean

Questo eliminerà tutti i vecchi file (incluse le versioni del kernel) che potresti avere. Nota che se hai molte vecchie versioni, ci vorrà un po 'di tempo poiché deve assicurarsi che la rimozione della versione del kernel non abbia problemi. Per me, la rimozione delle ultime 12 versioni del kernel ha richiesto circa 2 minuti. Puoi anche fare quanto segue:

sudo apt-get clean

Che eliminerà tutto scaricato e memorizzato nella cartella cache di apt. Infine hai:

sudo apt-get autoremove

che controlla eventuali pacchetti inutilizzati e li rimuove se necessario. Questo è ottimo per quelle librerie e pacchetti di dipendenze che non sono più necessari da nessuna app installata.

    
risposta data Luis Alvarado 22.08.2017 - 21:44
25

10.04 Metodo GUI

Computer Janitor può ripulire i vecchi kernel e credo sia installato di default in Ubuntu (ma non in Kubuntu).

GRUB 1, se lo stai usando, ha un'opzione in /boot/grub/menu.lst per specificare quanti kernel deve mostrare al massimo. GRUB 2, per quello che posso dire, no.

    
risposta data maco 26.03.2012 - 10:58
24

Per capire quali kernel e intestazioni sono installati, usa

dpkg -l | grep linux-image

dpkg -l | grep linux-headers

Puoi quindi rimuoverli uno ad uno o insieme, assicurati di mantenere il più recente.

Ci sono anche alcuni comodi comandi e script per automatizzare la rimozione.

link

Le seguenti affermazioni per rimuovere tutti i kernel e le intestazioni non utilizzati:

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

Ecco cosa succede quando si esegue il 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
    
risposta data mikewhatever 20.10.2018 - 15:45
16

Per rimuovere i vecchi kernel di immagini Linux, prima fai il boot nel kernel che vuoi mantenere.

Puoi anche controllare la versione del kernel usando il comando uname -r in modo da non rimuovere quello sbagliato per errore.

Ora vai al gestore di pacchetti sinaptici e cerca linux-image e rimuovi le versioni precedenti tranne quella mostrata dal comando superiore. In genere preferisco andare con l'ultimo.

Ora al riavvio vedrai un menu di grub più pulito.

    
risposta data anurag-jain 03.03.2011 - 14:10
14

Potresti installare Ubuntu-tweak e poi vai su Applicazioni - & gt; Strumento di sistema - & gt; Ubuntu tweak e

fai clic su pulisci pacchetto e pulisci kernel. non mostra il kernel attualmente in uso in modo da essere sempre al sicuro.

    
risposta data Lincity 03.03.2011 - 14:26
8

Personalmente, mi piace usare Synaptic . Mi fa sentire più sicuro su quello che sta succedendo. L'unica app che ho usato che ha un'opzione per rimuovere i vecchi kernel è Ubuntu Tweak .

Come rimuovere i kernel che non stai utilizzando:

  • Apri UbuntuTweak
  • Fai clic su "Pulisci pacchetto" in "Applicazioni" nel riquadro a sinistra
  • Sul lato destro della "visualizzazione pulizia", premere "Pulisci kernel"
  • Seleziona tutti i kernel - Penso che quello in uso non sia elencato, ma nel caso verifichi l'esecuzione di uname -a in un terminale
risposta data Alan Featherston 08.04.2013 - 02:24
6

Puoi disinstallare i vecchi kernel (pacchetti linux-image-... ) usando Synaptic e questo li rimuoverà dal menu di avvio. Fai attenzione a non rimuovere il kernel in esecuzione (puoi controllarne la versione con uname -r ).

Ricorda che avere una o due versioni precedenti può aiutarti a risolvere i problemi, in caso di problemi.

In alternativa, puoi modificare / rimuovere le voci manualmente ( gksu gedit /boot/grub/grub.cfg ), ma saranno rigenerate quando si aggiorna a un kernel più recente. Se stai pensando di rimuovere recovery mode opzioni - no. Possono tornare utili se si interrompe qualcosa che impedisce l'avvio.

Fai riferimento a questa pagina.

    
risposta data evgeny 13.04.2017 - 14:14
4

Questa è una pura soluzione da riga di comando.

Per prima cosa genera un elenco di tutte le versioni del kernel installate ad eccezione del kernel attualmente in esecuzione:

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

In alternativa, genera un elenco di tutte le versioni del kernel installate tranne le ultime due:

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

Esamina l'elenco. Assicurati che le versioni del kernel che vuoi mantenere non facciano parte dell'elenco. Usa il comando uname -r per vedere la versione del kernel attualmente in esecuzione.

Se sei soddisfatto dei risultati, puoi utilizzare apt-get per rimuovere i pacchetti.

Prima una prova a secco (utilizzando il primo generatore come esempio):

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

Quindi una corsa reale:

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

Se vuoi automatizzare il processo, aggiungi il parametro --yes :

sudo apt-get --yes purge $(
  ...)
    
risposta data lesmana 16.05.2015 - 18:18
3

Il vantaggio di questa risposta è nativo Ubuntu Bash viene utilizzato senza installare applicazioni di terze parti. Gli utenti di kernel personalizzati che non hanno utilizzato apt o dpkg possono modificare questo script bash in base alle proprie esigenze. Questa risposta è basata su ( Come eliminare selettivamente vecchi kernel tutti in una volta ).

Soluzione basata su Zenity

Zenity fornisce un'interfaccia GUI per il terminale per elaborare un elenco e selezionare elementi con pulsanti di opzione :

Poichéiltitoloindicacheilkernelcorrenteconcuièstatoavviatononpuòessererimossoenonèinclusonell'elenco.Ladimensioneriportataèquantoverràsalvatonelladirectory/boot.Altroèsalvatosuldiscoperchéibinaridelkernelrisiedonoancheinaltrearee.27luglio2017nota:orasonoincluseancheledirectory/usr/src/*kernel_version*e/lib/modules/*kernel_version*.

LaDatadimodificavienerilevatautilizzandoilcomandostat.Sulmiosistemaquelladataè"toccata" ogni volta che il kernel viene avviato usando questo ( Come fai a sapere quando è stata avviata l'ultima versione del kernel? ) cron script di riavvio. Tuttavia, sul tuo sistema la data sarà la data di rilascio del kernel, non l'ultima volta che l'hai avviato.

apt-get purge ti dà la possibilità di abortire

Ti viene offerta l'ultima opportunità di visualizzare tutto ciò che verrà eliminato e di vedere lo spazio totale del disco (in qualche modo fuorviante) che verrà ripristinato:

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] 

Il codice

Copia questo codice in un file eseguibile denominato 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 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: hai bisogno dell'autorizzazione sudo per creare il file, quindi utilizza:

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

Per rendere eseguibile il file usa:

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

Versione server

rm-kernels-server è la versione del server per eliminare selettivamente i kernel tutti in una volta. Invece di una finestra di dialogo grafica (grafica) una finestra di dialogo basata su testo viene utilizzata per selezionare i kernel da eliminare.

  • Prima di eseguire lo script devi installare la funzione di dialogo utilizzando:

    sudo apt install dialog

La finestra di dialogo è nell'installazione predefinita di Ubuntu Desktop ma non in Ubuntu Server.

Schermata di esempio

rm-kernels-servercodicebash

#!/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: nella chiamata a dialog la direttiva --ascii-lines viene passata per sostituire il set di caratteri estesi line-draw (a cui ssh non piace) con "+ --- - + "per disegnare scatole. Se non ti piace questo aspetto, puoi utilizzare la direttiva --no-lines per nessuna casella.

Aggiornamenti del 28 luglio 2017

Le dimensioni calcolate di ogni kernel sono state prese da /boot/*kernel_version* che erano 5 file per un totale di ~ 50 MB. La formula è stata modificata per includere i file in /usr/src/*kernel_version* e /lib/modules/*kernel_version* . La dimensione calcolata per ogni kernel è ora ~ 400 MB. Il codice sopra per rm-kernels e rm-kernels-server è stato aggiornato. Tuttavia, le schermate di esempio sopra non riflettono ancora questi cambiamenti.

L'impostazione predefinita è di stimare la dimensione dei file per linux-headers a 125 MB e linux-image a 220 MB perché du può essere dolorosamente lento a meno che i file non siano nella cache. Per ottenere la dimensione reale utilizzando du , passa qualsiasi parametro allo script.

Il totale di tutte le dimensioni del kernel (esclusa la versione corrente corrente che non può essere rimossa) è ora mostrato nella barra del titolo.

La finestra di dialogo utilizzata per visualizzare la Data ultimo accesso di ogni kernel. Questa data può essere sovrascritta per tutti i kernel durante il backup o operazioni simili. La finestra di dialogo ora mostra invece Data modificata .

    
risposta data WinEunuuchs2Unix 29.07.2017 - 00:35
2

Un modo semplice per sbarazzarsi di quasi tutti i pacchetti obsoleti, i pacchetti non più in alcun elenco di pacchetti, insieme ai kernel obsoleti è quello di fare una delle seguenti:

dpkg --purge $(aptitude search ?obsolete)

Tuttavia, mancheranno pacchetti che sono ancora raccomandati da altri pacchetti, e l'argomento -R / - without-recommended non risolve questo problema.

dselect dopo aver cambiato modalità di ordinamento con 'o' mostrerà tutti i pacchetti obsoleti inclusi quelli mancanti di aptitude, ma ad alcune persone non piace usarlo.

    
risposta data Chris Cheney 06.04.2013 - 05:03
2

La risposta accettata che usa sed per rimuovere permanentemente i kernel più vecchi ha alcuni difetti, se qualcuno non ha riavviato il computer dopo aver aggiornato il kernel, il comando rimuoverà anche il kernel più recente.

Ecco una soluzione alternativa che prenderà in considerazione tutte le situazioni per rimuovere solo i vecchi kernel attuali:

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

Se hai una versione più recente di quella corrente, ti verrà dato un avvertimento per riavviare il tuo computer prima. Nota anche che i kernel più vecchi sono conservati a causa di una buona ragione che è se in qualche modo incasini il tuo kernel attuale rendendo il tuo sistema instabile, quindi dovresti essere in grado di eseguire l'avvio in qualsiasi kernel precedente.

    
risposta data heemayl 17.04.2015 - 21:21
1

ailurus ha la funzione di rimuovere i vecchi kernel e le configurazioni inutilizzate. Personalmente lo rimuovo manualmente da synaptic. Puoi installare ailurus da getdeb così come ppa

    
risposta data sagarchalise 17.09.2010 - 12:53
1

Puoi usare ukuu - è tutta la GUI - per aggiornare ed eliminare i vecchi kernel. Funziona per me!

Ricorda solo di lasciare gli ultimi 2 installati e ovviamente il kernel 'in esecuzione'.

Puoi anche impostare ukuu in modo che mostri solo le uscite della linea principale, anche i kernel RC, nascondi i rilasci dei punti.

PuoitrovareukuuinSynapticoleistruzionisonoqui:

OMG! Ubuntu ukuu istruzioni per l'installazione

    
risposta data sprocketoctopus 07.09.2017 - 12:39
0

qui c'è un abbozzo di ciò che ho fatto, attento poichè non sono un esperto di linux, assicurati di sapere cosa stai facendo e di aver eseguito il backup dei file che stai modificando.

gedit /boot/grub/grub.cfg

quindi trova le voci che desideri conservare, le evidenziamo e le copiamo

cd /etc/grub.d
ls

vedrai un elenco di file come 10_linux e 30_os-prober

sudo chmod -x 10_linux

questo si fermerà automaticamente aggiungendo tutte le voci di linux nel menu di avvio di grub.

gksudo gedit 40_custom

apri il file del menu di avvio personalizzato, quindi torna a grub.cfg (che dovrebbe essere ancora aperto in gedit) e copia le voci che vuoi mantenere ... come

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
}

incollali in 40_custom , quindi salvali.

sudo chmod 755 40_custom

lo rende eseguibile, quindi finalmente aggiorniamo grub che cambierà il file grub.cfg:

sudo update-grub

Ora, ATTENZIONE, se aggiorni il tuo kernel o sistema operativo, probabilmente il tuo menu di avvio non si aggiornerà ... dovrai farlo manualmente. Ma questa procedura ti consentirà di personalizzare il menu di avvio un po 'di più, come rimuovere la versione del kernel e semplicemente inserire il nome di Ubuntu ... cioè Ubuntu Lucid 10.04, ecc ...

Spero che qualcuno lo trovi utile, perché mi ci è voluto un po 'per capire ... non ho visto questa soluzione da nessuna parte ...

    
risposta data Joe 09.01.2012 - 00:31
0

Installa Gestore pacchetti sinaptici e vai alla scheda dei filtri (penso che i filtri, se non provi tutti e 5) e seleziona "locale". Questo mostrerà pacchetti orfani sul tuo sistema, come i kernel. Dopo averli disinstallati, esegui update-grub . Questo comando aggiorna l'elenco delle opzioni di avvio per grub.

Se fallisce, puoi sempre provare apt-get remove linux-image-version-generic .

    
risposta data Relish 29.05.2013 - 18:41
0

Sulla base di una precedente risposta di David Kemp, il seguente script eliminerà tutte le intestazioni e le immagini ad eccezione delle ultime 2 versioni.

#!/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
    
risposta data Mark 12.06.2013 - 20:42
0

La seguente stringa di comandi eliminerà qualsiasi kernel di Linux installato ad eccezione di quello attualmente in esecuzione (grep -v uname -r ) e l'ultimo kernel disponibile (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

Lo uso per mantenere i volumi di avvio del desktop relativamente puliti, ma in una situazione server probabilmente vorresti espandere la logica e scrivere degli script aggiuntivi per mantenere un elenco degli ultimi kernel X che il server ha avviato.

Qualcosa come uno script di avvio che:

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

e quindi utilizzare:

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
    
risposta data Alexander Thompson 30.06.2013 - 20:37
0

Per avere un po 'più di controllo su quali versioni mantenere, seleziona esplicitamente quelli che vuoi rimuovere. Ad esempio, se vuoi rimuovere le versioni del kernel 3.2.0. [49-53], usa un semplice ciclo for :

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

Modifica l'elenco delle versioni del kernel per adattarle.

    
risposta data NeilNjae 08.11.2013 - 13:51
0

Prova questo. Eseguilo come root.

Salva questo script come, ad esempio ./ keep-n-kernels.sh

Passa, come argomento della riga di comando, il numero dei kernel più recenti che vuoi conservare.

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

Esempio di utilizzo:

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

Se vuoi [E AL PROPRIO RISCHIO], puoi aggiungere un -y (o un flag di forza) al comando apt-get e renderlo non interattivo.

    
risposta data Sankalp 28.01.2014 - 21:47
0

Sto usando un desktop KDE e l'opzione più semplice che ho trovato è stata l'utilizzo dell'applicazione kde-config-grub2 come suggerito qui: link (che avevo già installato per l'impostazione dell'immagine di sfondo, l'opzione di avvio predefinita e simili). Accanto alla casella a discesa in cui è possibile scegliere la voce predefinita, c'è un pulsante "Rimuovi voci precedenti". Facendo clic su questo pulsante ti viene presentato un elenco di tutti i kernel installati e puoi selezionare quali rimuovere. Quando applichi le modifiche, userà dpkg per rimuoverle dal sistema e dal menu di GRUB.

    
risposta data Ben 06.07.2014 - 19:44
0

Solo per interpellare, puoi anche emettere

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

come root, e il lavoro sarà fatto.

    
risposta data Severo Raz 27.11.2014 - 03:26
0

Ho uno script per questo che non ha bisogno di un parsing di stringhe molto elaborato.

Rimuovi le intestazioni e le immagini tranne quella corrente per liberare spazio

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)+
    
risposta data Paulo Santos 16.05.2015 - 11:40

Leggi altre domande sui tag