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


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

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

Ubuntu fornisce un modo più semplice per ripulirle o impedirle di mostrare nella lista di avvio?


658


origine


Oltre a rimuovere i vecchi kernel, decommentare questa riga /etc/default/grub se vuoi eliminare gli elementi di "recupero" nel menu: # GRUB_DISABLE_LINUX_RECOVERY = "true" - poolie
Nelle versioni recenti Ubuntu nasconde i kernel nel sottomenu di Grub, quindi non è così invadente. Tuttavia, potrebbe essere una buona idea rimuovere i kernel aggiuntivi per risparmiare spazio, specialmente se si dispone di una partizione piccola / di avvio separata. - jarno
C'è un comando di ubuntu chiamato purge-old-kernels per fare il lavoro. Guarda il mio risposta per maggiori informazioni. - jarno
sudo apt-get autoremove dovrebbe fare il trucco su Ubuntu 14.04+ - hobs
L'accumulo di vecchi kernel è un bug, con fix in corso: bugs.launchpad.net/bugs/1357093 . Quando viene rilasciata la correzione, i kernel più vecchi eseguiranno automaticamente l'auto-ottimizzazione. - user535733


risposte:


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 installato in Ubuntu mostra automaticamente il kernel più recente e nasconde i kernel più vecchi che potresti aver installato.

GNU GRUB

Se non vedi il tuo larva - quindi ricorda di premere Cambio durante l'avvio.

Come puoi vedere, viene visualizzato solo il kernel più recente.

Se si seleziona l'opzione visualizzata (premere accedere) quindi tutti i vecchi kernel diventano visibili e disponibili per l'avvio.

GNU GRUB Previous versions 

Come eliminare definitivamente i kernel più vecchi

Primo avvio con l'ultimo kernel disponibile.

Esistono diversi modi per eliminare i vecchi kernel. Personalmente, non vorrei toccare Computer Janitor dal momento che questo è riconosciuto per rompere il computer con i suoi suggerimenti.

sinaptica

Un'alternativa è Synaptic (sudo apt install synaptic)

Cercare linux-image, fare clic con il pulsante destro del mouse su un kernel e scegliere la rimozione completa e infine fare clic su Applicare pulsante per cancellare il kernel.

Synaptic Package Manager

Ripeti la ricerca ma questa volta per linux-header - è possibile eliminare le intestazioni associate per l'immagine del kernel scelta in precedenza.

Synaptic anche se non tenterà di verificare ciò che stai cercando di rimuovere ... potresti inavvertitamente cancellare il tuo nuovo kernel - o addirittura cancellare tutti i tuoi kernel con questo strumento lasciandoti un un boot non avviabile Ubuntu!.

Ricordati di controllare quale kernel stai usando tipo:

uname -r

Il risultato sarebbe simile a:

Terminal <uname -r>

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 il kernel più recente non si è in grado di avviare o di introdurre funzionalità regresse come wireless.


568



La rimozione dei vecchi pacchetti "linux-image *" usando synaptic, ha funzionato bene anche con la 10.04. (Lo dico perché il titolo suggerisce che potrebbe essere solo per 11.10 e oltre) - mivk
il -y interruttore alla fine del apt-get linea è necessaria, altrimenti apt-get chiede solo conferma e poiché l'input è una pipe, si interrompe. Quindi dovrebbe finire in: | xargs sudo apt-get purge -y - Josh
Rimozione di circa 20 versioni precedenti linux-image e linux-headers liberato 4,5 GB di spazio sulla mia macchina. - Andrew Mao
Questo metodo funziona bene, ma la cancellazione di ogni kernel rigenera eccessivamente grub.cfg, che richiede tempo. C'è un modo per disabilitare questo per l'eliminazione batch, quindi rigenerarlo una volta? - spacediver
Ho in secondo luogo la domanda da @spacediver - questo è un processo lento-pazzo quando si hanno 38 kernel non necessari, poiché man mano che vengono disinstallati, passano attraverso tutti i restanti mentre si genera un nuovo grub.cfg. Questo è ciò che chiamiamo un'operazione N ^ 2: elabora un kernel su (38 ^ 2/2) = 722 volte ed è molto lento. Sicuramente Ubuntu può venire con qualcosa di meglio .... - nealmcb


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!

Quindi, 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.


365



Facendo questo in 10.04 e 12.04, ho trovato che update-grub veniva eseguito automaticamente durante il processo di eliminazione. - aidan
bash rinforzare l'espansione può essere usato, ad es. sudo apt-get purge linux-image-3.2.0-3{0..5}-generic (rimuove 30,31, .., 35) - ajo
Non è necessario riavviare il sistema in seguito. Di fatto, è necessario riavviare il sistema prima eseguendo questi passaggi, per assicurarti di utilizzare l'ultima versione del kernel che probabilmente hai appena scaricato e installato (hai fatto un aggiornamento apt-get e apt-get prima di questo, giusto ??) - Ricket
Si consiglia inoltre di disinstallare il linux-signed-image pacchetti che possono essere installati nei sistemi UEFI: sudo apt-get purge linux-signed-image-3.11.0-{12,14,24}-generic che rimuoverebbe 12, 14 e 24 - devius
@ jarno Non so se sto usando un kernel firmato o meno, ma uname -r non ne ha signed stringa sul mio sistema. Mi sembra di avere un'immagine firmata installata e l'output di quello ls il comando è: /boot/vmlinuz-3.19.0-16-generic.efi.signed. - devius


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, | usa l'output del comando precedente come input per il prossimo)

  • dpkg --list elenca tutti i pacchetti installati
  • grep linux-image cerca le immagini di 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 linee prima del kernel corrente
  • xargs sudo apt-get -y purge purifica i gherigli trovati

Svolgimento del sed invocazione:

  • -n dice sed stare zitto
  • `uname -r` restituisce l'attuale versione 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, viene prodotto qualcosa uname -r) - il / circondare un'espressione regolare
  • p è stampato
  • il ; è il comando separtor, quindi /something/q;p dice uscire quando si abbina qualcosa, altrimenti stampare

del tutto, sed -n '/'`uname -r`'/q;p' stampa le linee finché non coincide con il nome del kernel corrente.

Se sei paranoico (come me), puoi fare l'ultima parte xargs echo sudo apt-get -y purge in modo che venga stampato il comando per eliminare i vecchi kernel, quindi è possibile 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]\+\)/\1/")"'/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]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge

Notare la sed l'invocazione è stata modificata. "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")" estrae solo la versione (ad esempio "3.2.0-44"), senza "-generico" o simile da uname -r


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

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]\+\)/\1/")"'/q;p') | xargs sudo apt-get -y purge

261



Nota che è un po 'pericoloso far corrispondere la versione attuale del kernel con un'espressione regolare come quella: i punti corrispondono a qualsiasi personaggio e 3.1.2-23 corrisponde a 3.1.2-2 (o è il contrario). Vedi anche il mio risposta. - jarno
Ecco una versione all-in-one ottimizzata: sudo apt-get purge $(for tag in "linux-image" "linux-headers"; do dpkg-query -W -f'${Package}\n' "$tag-[0-9]*.[0-9]*.[0-9]*" | sort -V | awk 'index($0,c){exit} //' c=$(uname -r | cut -d- -f1,2); done) Vedi anche il mio risposta. - jarno
@jarno che mi ha aiutato ad estendere molto ... Complimenti al tuo unico rivestimento - Clain Dsilva
A causa di dipendenze non soddisfatte, avevo bisogno di usarlo con dkpg -Panziché. Ecco la versione completa: dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo dpkg -P - Sebastian Sastre
NO NON FARE QUESTO! "Quella oneliner sembra un po 'pericolosa, ma sicuramente 220 uptoters non possono essere sbagliati!" Ho pensato a me stesso e ho copiato alla cieca. Riavviato, direttamente a GRUB. Quel comando ha cancellato tutti i miei kernel, incluso quello che stavo usando. Forse stavo usando un kernel in tempo reale, non ricordo nemmeno. Attualmente guardo in giro per casa mia per una chiavetta USB per installare Ubuntu Live CD su :( - Andreas Jansson


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 sono tenuti:

sudo purge-old-kernels --keep 3

55



Questo comando è uno script di shell, di cui puoi trovare la posizione which purge-old-kernels. - jarno
Sono contento che l'abbiano reso molto più semplice in 16.04! Spero che questa risposta continui a salire ... - Toby J
Su Ubuntu 16.04 ho purge-old-kernels senza bikehed (strumenti utili casuali che non hanno ancora una casa permanente) pacchetto o qualsiasi particolare. Evitare l'uso apt-get -y opzione, è come chiudere gli occhi e sperare che tutto vada per il meglio. Anche Qui è come autoremove decide quanti vecchi kernel mantenere. - Pablo Bianchi
Nel 16.04 purge-old-kernels è fornito dal pacchetto byobu (suggerimento: apt-file search purge-old-kernels). Essere d'accordo apt-get -y, Lo rimuoverò. - bmaupin
@ Dal momento che non uso versioni non LTS non ero sicuro esattamente quando è iniziato. Ma posso dirlo con certezza sudo apt-get autoremove non rimuove i kernel in 14.04. Sentiti libero di aggiornare la risposta con la versione specifica se sai di cosa si tratta! - bmaupin


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 richiede la modifica.

Troppi kernel? 

  • Se non si è sicuri del kernel che si sta 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> 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 tua 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 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 siano 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+

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

fonte 

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 del kernel precedente per la risoluzione dei problemi.

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

per GRUB non GRUB2

startupmanager  Install startupmanager

Puoi trovarlo in Sistema >> Amministrazione >> alt text
alt text
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 di nuovo a 1.


41



In realtà, startupmanager dint mi fornisce una finestra come questa su Ubuntu 10.04, invece ha dato una finestra con due schede -> Opzioni di avvio e Avanzate .. e in avanzato ha la possibilità di limitare il numero di kernel. Quindi per favore aggiorna la risposta per Ubuntu 10.04 (ed ecco perché ho votato questo ..) - Sen
Qualche idea su come "il numero di kernel da mantenere" può essere definito su una macchina che non ha una GUI installata (server)? - sylvainulg
startupmanager è obsoleto. Vedere grup-customizer - muhasturk


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

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

38



one-liner da Là: dpkg -l linux-* | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | xargs sudo apt-get -y purge - Dmitry Verkhoturov
@DmitryPaskal, dovresti aggiungere questa come una nuova risposta. - saji89
@DmitryPaskal Come sempre, non limitarti a copiare e incollare questi elementi senza comprenderli. Sulla mia macchina anche questa one-liner corrisponde linux-libc-dev:amd64 che non dovrebbe essere rimosso. - jamesadney
@Kees Cook, l'argomento awk non dovrebbe essere circondato solo da virgolette singole? Se il tuo intento è di anteporre "linux-image-" alle linee di pipe, questo sembra funzionare solo se lo usi awk '{print "linux-image-" $0}'. - Mark
questo non funziona per me, include il mio kernel installato personalizzato (Ubuntu 14.04 con 3.17) - Alex R


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

Ho realizzato una sceneggiatura per eliminare i kernel anche in condizioni difficili. È chiamato 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.


34



Sembra purge-old-kernels non è nella versione precisa (1.22) del bikehed. Esiste un modo ragionevole / sicuro per ottenere un bikehed più recente per il preciso? O sarebbe più semplice / più sicuro installare semplicemente lo script? Preferirei usare un repository, nonostante la lunga lista di dipendenze .. - drevicko
@drevicko Vedi Qui. - jarno
Ancora una domanda leggermente tangenziale: a corto di andare alla fonte, c'è un modo per determinare quali comandi diventano disponibili quando si installa Bikehed? - drevicko
@drevicko, certo, dlocate -lsbin bikeshed - jarno
@drevicko, guarda anche un'altra domanda - jarno


Puoi seguire il Utilizzando la sezione del pacchetto "aggiornamenti automatici" di Aggiornamenti di sicurezza automatici articolo su Ubuntu Wiki per eseguire questo.

È necessario modificare la seguente riga in file /etc/apt/apt.conf.d/50unattended-upgrades file;

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

con

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

per rimuovere automaticamente i vecchi pacchetti, compresi i kernel.

Rimuovi o commenta anche la linea

"^linux-image.*"; 

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


29



L'ho fatto ma raccoglieva ancora più vecchi kernel che consumavano centinaia di MB. Quindi ho aggiunto apt-get autoremove al mio lavoro cron quotidiano che fa effettivamente gli aggiornamenti, dal momento che non sempre passa attraverso built-in update-manager. - Marcos
Penso che funzioni in Trusty solo per i kernel che sono stati installati automaticamente. - jarno
Questo è ottimo per prevenire l'accumulo di vecchi kernel durante l'aggiornamento automatico dei pacchetti, ad es. con aggiornamenti non presidiati. Tuttavia, se non si riavvia, si potrebbe scoprire che il pacchetto per il kernel attualmente in esecuzioneè stato disinstallato! Un problema può causare: i nuovi dispositivi che si collegano potrebbero non funzionare, perché il modulo per loro non può essere caricato a caldo, perché non è più sul disco. (Una soluzione rapida per questo è solo per installare di nuovo il pacchetto del kernel, e quindi scollegare e ricollegare il dispositivo.) - joeytwiddle
ho creato una soluzione automatizzata alla questione di cui sopra. Se pensi che questo sia un buon approccio, allora sentiti libero di aggiungerlo alla risposta di Qwerty. - joeytwiddle