Jak usunąć stare wersje jądra, aby wyczyścić menu startowe?

701

Za każdym razem, gdy instaluję nowe jądro Linuksa, zostaje ono pozostawione w grub_config, dzięki czemu menu startowe jest za każdym razem dłuższe.

Wiem, że mogę ręcznie przeszukiwać zainstalowane pakiety i je usuwać.

Czy Ubuntu zapewnia łatwiejszy sposób na ich wyczyszczenie lub powstrzymanie od pokazywania się na liście rozruchowej?

Hans
źródło
10
Do wykonania tego zadania służy komenda ubuntu o nazwie purge-old-kernels. Zobacz moją odpowiedź, aby uzyskać więcej informacji.
jarno
29
sudo apt-get autoremovepowinien załatwić sprawę na Ubuntu 14.04+
płyty
1
Nagromadzenie starych jąder jest błędem, a naprawa jest w toku: bugs.launchpad.net/bugs/1357093 . Kiedy poprawka zostanie wydana, starsze jądra będą domyślnie pisane.
user535733,
1
@ Hobs Polecenie to nie rozwiązuje problemu w Ubuntu Studio 14.04, jeśli jądra nie zostały zainstalowane automatycznie, ale przez Software Updater.
jarno
1
Powracam do tej strony ... komentarz @hobs działa tylko wtedy, gdy twoje jądra zostały automatycznie zainstalowane - jednak sudo apt-get autoremove --purge odpowiadasz , postępując zgodnie ze apt-markwskazówkami na https://help.ubuntu.com/community/RemoveOldKernels
earcam

Odpowiedzi:

602

16.04 i nowsze wersje Ubuntu

sudo apt autoremove

To polecenie usuwa pakiety, które zostały automatycznie zainstalowane w celu rozwiązania zależności, ale od których nie są już zależne. Obejmuje to stare wersje linux-headers-*i linux-image-*. (Jest również sprytny w tym procesie, pozostawiając jedną zapasową wersję jądra jako awarię!)

11.10 i nowsze wersje Ubuntu

GRUB2 i jego wyświetlanie wszystkich jąder

Najnowsze wersje Grub2 zainstalowane w Ubuntu automatycznie wyświetlają najnowsze jądro i ukrywają starsze jądra, które mogłeś zainstalować.

GNU GRUB

Jeśli nie widzisz swojego gruba - pamiętaj, aby nacisnąć Shiftpodczas uruchamiania.

Jak widać, wyświetlane jest tylko najnowsze jądro.

Jeśli wybierzesz pokazaną opcję (naciśnij Enter), wszystkie stare jądra staną się widoczne i będą dostępne do rozruchu.

GNU GRUB Poprzednie wersje

Jak trwale usunąć starsze jądra

Pierwsze uruchomienie z najnowszym dostępnym jądrem.

Istnieje wiele sposobów usuwania starych jąder. Osobiście nie dotykać komputera woźny ponieważ uznaje się przełamać komputer z jego sugestii.

synaptyczny

Alternatywą jest Synaptic ( sudo apt install synaptic)

wyszukaj obraz linux , kliknij jądro prawym przyciskiem myszy i wybierz całkowite usunięcie, a na koniec kliknij przycisk Zastosuj , aby usunąć jądro.

Menedżer pakietów Synaptic

Powtórz wyszukiwanie, ale tym razem dla nagłówka linux - możesz usunąć powiązane nagłówki dla wcześniej wybranego obrazu jądra.

Synaptic jednak nie będzie próbował zweryfikować tego, co próbujesz usunąć ... możesz przypadkowo usunąć swoje najnowsze jądro - lub nawet usunąć wszystkie jądra za pomocą tego narzędzia, pozostawiając Ci niemożliwy do uruchomienia Ubuntu !.

Pamiętaj, aby sprawdzić, którego jądra używasz:

uname -r

Wynik byłby podobny do:

Terminal <uname -r>

Zapamiętaj wynik i liczbę - upewnij się, że nie usuwasz odpowiedniego obrazu lub nagłówka.

Zalecenie

Radzę zachować przynajmniej dwa lub najlepiej trzy jądra, w tym najnowsze. Powodem tego zalecenia jest to, że będziesz mieć co najmniej jedno / dwa inne jądra do uruchomienia, jeśli z jakiegokolwiek powodu najnowszego jądra nie będziesz w stanie uruchomić lub nie wprowadzisz funkcji regresji, takiej jak zepsute połączenie bezprzewodowe.

fossfreedom
źródło
3
Usuwanie starych pakietów „linux-image *” za pomocą synaptic, działało również dobrze z 10.04. (Wspominam o tym, ponieważ tytuł sugeruje, że może to być tylko od 11.10 i więcej)
mivk
4
-yprzełącznik na końcu apt-getlinii jest konieczne, w przeciwnym razie apt-get po prostu prosi o potwierdzenie, a ponieważ wejście jest rura, po prostu przerywa. Powinien więc kończyć się za:| xargs sudo apt-get purge -y
Josh
37
Usuwanie około 20 wersji starej linux-imagei linux-headerszwolnionej 4,5 GB przestrzeni na moim komputerze.
Andrew Mao,
16
Ta metoda działa dobrze, ale usunięcie każdego jądra nadmiernie regeneruje plik grub.cfg, co zajmuje dużo czasu. Czy jest jakiś sposób na wyłączenie tej opcji w celu usunięcia partii, a następnie jednorazowe jej zregenerowanie?
spacediver
15
Drugie pytanie od @spacediver - jest to szalenie powolny proces, gdy masz 38 niepotrzebnych jąder, ponieważ po każdym odinstalowaniu przechodzi przez wszystkie pozostałe podczas generowania nowego pliku grub.cfg. To właśnie nazywamy operacją N ^ 2 - przetwarza jądro około (38 ^ 2/2) = 722 razy i jest bardzo wolne. Z pewnością Ubuntu może wymyślić coś lepszego ....
nealmcb
384

Najpierw uruchom ponownie system, aby upewnić się, że używa najnowszego jądra. Następnie otwórz terminal i sprawdź swoje bieżące jądro:

uname -r 

NIE USUWAJ TEGO Jądra!

Następnie wpisz poniższe polecenie, aby wyświetlić / wyświetlić listę wszystkich zainstalowanych jąder w systemie.

dpkg --list 'linux-image-*'

Znajdź wszystkie jądra, które są niższe niż twoje obecne jądro. Kiedy wiesz, które jądro należy usunąć, przejdź poniżej, aby je usunąć. Uruchom poniższe polecenia, aby usunąć wybrane jądro.

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

Na koniec uruchom poniższe polecenia, aby zaktualizować grub2

sudo update-grub2 

Uruchom ponownie system.

penreturns
źródło
34
Kiedy robiłem to w 10.04 i 12.04, zauważyłem, że aktualizacja-grub została automatycznie uruchomiona podczas procesu czyszczenia.
aidan
93
Bash za rozszerzenie klamra może być używany, na przykład sudo apt-get purge linux-image-3.2.0-3{0..5}-generic(usuwa 30,31, .., 35)
ajo
12
Nie ma potrzeby późniejszego ponownego uruchamiania systemu. W rzeczywistości powinieneś zrestartować system przed wykonaniem tych kroków, aby upewnić się, że używasz najnowszej wersji jądra, którą prawdopodobnie właśnie pobrałeś i zainstalowałeś (wcześniej zrobiłeś aktualizację apt-get i & apt-get upgrade, prawda?)
Ricket
4
Możesz także odinstalować linux-signed-imagepakiety, które mogą być zainstalowane w systemach UEFI: sudo apt-get purge linux-signed-image-3.11.0-{12,14,24}-genericktóre usuną 12, 14 i 24
devius
1
@jarno Nie wiem, czy używam podpisanego jądra, czy nie, ale uname -rnie mam żadnego signedłańcucha w moim systemie. I zdają się mieć zainstalowany podpisany obrazu i wyjście tego lspolecenia jest następująca: /boot/vmlinuz-3.19.0-16-generic.efi.signed.
devius
283

Mój jeden wiersz do usuwania starych jąder (to również zwalnia miejsce na dysku)

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

Objaśnienie (pamiętaj, |używa danych wyjściowych z poprzedniego polecenia jako danych wejściowych do następnego)

  • dpkg --list wyświetla wszystkie zainstalowane pakiety
  • grep linux-image szuka zainstalowanych obrazów systemu Linux
  • awk '{ print $2 }' po prostu wyświetla drugą kolumnę (która jest nazwą pakietu)
  • sort -V porządkuje elementy według numeru wersji
  • sed -n '/'`uname -r`'/q;p' wypisuje linie przed bieżącym jądrem
  • xargs sudo apt-get -y purge czyści znalezione jądra

Odwijanie sedwywołania:

  • -nmówi, sedżeby być cicho
  • `uname -r` wypisuje bieżącą zainstalowaną wersję jądra - umieszczamy ją w backtickach, aby wynik był dołączany jako część polecenia (możesz również zobaczyć to jako $(uname -r)
  • /something/qmówi stop, gdy dopasujesz „coś” (w tym przypadku coś jest wyprowadzane uname -r) - /surround wyrażenie regularne
  • p jest drukowany
  • ;jest separtor poleceń, tak /something/q;pmówi rzucić gdy dopasujesz coś innego druku

w sumie sed -n '/'`uname -r`'/q;p'wypisuje linie, aż dopasuje się do bieżącej nazwy jądra.

Jeśli jesteś paranoikiem (tak jak ja), możesz zrobić ostatnią część, xargs echo sudo apt-get -y purgeaby wydrukować polecenie oczyszczenia starych jąder, a następnie możesz sprawdzić, czy przed uruchomieniem nie ma niczego nieoczekiwanego.


Zmodyfikowana wersja do usuwania nagłówków:

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

Uwaga: sedwywołanie zostało zmodyfikowane. "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"wypakowuje tylko wersję (np. „3.2.0-44”), bez „-generic” lub podobnego zuname -r


Wersja all-in-one do usuwania obrazów i nagłówków (łączy dwie powyższe wersje):

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
David Kemp
źródło
1
Zauważ, że trochę niebezpiecznie jest dopasować bieżącą wersję jądra jako takie wyrażenie regularne: Kropki pasują do dowolnego znaku, a 3.1.2-23 pasują do 3.1.2-2 (lub odwrotnie). Zobacz także moją odpowiedź .
jarno
19
Oto dostrojona wersja „wszystko w jednym”: 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)Zobacz także moją odpowiedź .
jarno
1
@jarno, który pomógł mi w bardzo dużym stopniu ... Uznanie dla twojego jednego liniowca
Clain Dsilva
5
Z powodu niezaspokojonych zależności musiałem go używać dkpg -Pzamiast tego. Oto pełna wersja: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
3
NIE NIE RÓB TEGO! „Ten oneliner wygląda trochę niebezpiecznie, ale z pewnością 220 upvoterów nie może się mylić!” Pomyślałem sobie i na ślepo wkleiłem. Zrestartowano, prosto do GRUB-a. To polecenie wyczyściło wszystkie moje jądra, łącznie z tym, którego używałem. Może korzystałem z jądra w czasie rzeczywistym, nawet nie pamiętam. Obecnie rozglądam się po domu w poszukiwaniu pamięci USB do zainstalowania Ubuntu Live CD na :(
Andreas Jansson
60

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 i nowsze:

Uważam to za najłatwiejszy i najszybszy sposób. Zachowuje najnowsze jądro, a także dwa kolejne:

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

Aby zmienić liczbę przechowywanych dodatkowych jąder:

sudo purge-old-kernels --keep 3
bmaupin
źródło
1
To polecenie jest skryptem powłoki, którego lokalizację można znaleźć which purge-old-kernels.
jarno
Cieszę się, że w 16.04 było to o wiele łatwiejsze! Mam nadzieję, że ta odpowiedź wciąż rośnie ...
Toby J
Na Ubuntu 16.04 mam purge-old-kernelspakiet bez rowerów ( losowo przydatne narzędzia, które nie mają jeszcze stałego domu ) ani żadnego innego. Unikaj używania apt-get -yopcji, to jak zamykanie oczu i mieć nadzieję, że wszystko będzie dobrze. Również tutaj jest jak autoremove decyduje ile stare jądra zachować.
Pablo A
2
W 16.04 jądro purge-old-kernels jest dostarczane przez pakiet byobu (wskazówka:) apt-file search purge-old-kernels. Uzgodniony apt-get -y, usunę go.
bmaupin
1
@Dan, ponieważ nie używam wersji innych niż LTS, nie byłem pewien, kiedy to się zaczęło. Ale mogę powiedzieć na pewno, że sudo apt-get autoremovenie usuwa jąder w 14.04. Jeśli wiesz, co to jest, możesz zaktualizować odpowiedź do określonej wersji!
bmaupin
43

Usuwanie wpisów z Grub 2 Wpisy należy usunąć, edytując lub usuwając pliki w folderze /etc/grub.d. Plik /boot/grub/grub.cfg jest tylko do odczytu i zwykle nie powinien wymagać edycji.

Za dużo jąder?

  • Jeśli nie jesteś pewien, jakiego jądra używasz, w terminalu wpisz uname -r .

  • Jądra usunięte za pomocą APT (Synaptic, „apt-get remove” itp.) Automatycznie zaktualizują grub.cfg i nie jest wymagana żadna akcja użytkownika.

  • Świetnym narzędziem do usuwania jąder (i pozycji menu) jest Ubuntu-Tweak, bezpieczna i łatwa w obsłudze aplikacja GUI.

  • Zainstaluj poprawki Ubuntu

  • Ubuntu-Tweak będzie dostępny w kategorii Aplikacje> Narzędzia systemowe.

Usuń starsze wpisy jądra

  • Wybierz „Package Cleaner” po lewej stronie i „Clean Kernel” z prawego panelu.

  • Naciśnij przycisk „Odblokuj” w prawym dolnym rogu, wprowadź hasło.

  • Wybierz z wyświetlanej listy obrazy jądra i nagłówki, które chcesz usunąć. Używanego jądra nie ma na liście.

  • Naciśnij przycisk „Oczyść” w prawym dolnym rogu, aby usunąć wybrane obrazy jądra i nagłówki.

Usuń systemy operacyjne z menu Grub

  • Inne systemy operacyjne, które zostały usunięte z komputera, również zostaną usunięte z menu po uruchomieniu „update-grub” jako root.

  • Pozycje menu są umieszczane w menu Grub2 według skryptów. Jeśli nie chcesz, aby inne systemy operacyjne były wprowadzane w menu, wyłącz /etc/grub.d/30_osprober

  • Uruchom to polecenie, aby zatrzymać działanie skryptu
    sudo chmod -x /etc/grub.d/30_os-prober

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

Usuń Memtest86 + z menu Grub
sudo chmod -x /etc/grub.d/20_memtest86+

  • Uruchom komendę update-grub, aby zezwolić na uwzględnienie zmian w grub.cfg

Źródło

Uwaga: po aktualizacji jądra do menu GRUB dodawany jest nowy wpis. W razie potrzeby możesz usunąć starszy, jednak najbardziej doświadczeni użytkownicy doradzą, aby zachować przynajmniej jeden zapasowy wpis na wypadek, gdyby coś poszło nie tak z aktualizacją, a ty trzeba uruchomić starszą wersję jądra dla celów rozwiązywania problemów.

Alternatywny sposób na usunięcie wpisów jądra (przed 10.04)

dla GRUB nie GRUB2

menedżer uruchamiania Zainstaluj menedżera uruchamiania

Możesz go znaleźć w System >> Administracja >> alternatywny tekst
alternatywny tekst
Na drugim zrzucie ekranu możesz wybrać, ile jąder ma zostać pokazanych? Zasadniczo trzymam go na 1, ale kiedy dostaję aktualizację jądra, zawsze zmieniam ją na 2 przed ponownym uruchomieniem, aby móc wybrać starsze jądro, jeśli nowe jądro ma problemy ze sprzętem. Kiedy już wiem, że nowe jądro działa dobrze, zmieniam je z powrotem na 1.

karthick87
źródło
2
Właściwie, startupmanager dint daje mi takie okno na Ubuntu 10.04, zamiast tego po prostu dał okno z dwiema zakładkami -> Opcje uruchamiania i Zaawansowane .. aw zaawansowanym trybie nie ma opcji ograniczenia liczby jąder. Więc proszę zaktualizuj odpowiedź dla Ubuntu 10.04. (I dlatego obniżyłem głos ...)
Sen
jakiś pomysł, jak można zdefiniować „liczbę jąder do zachowania” na maszynie, która nie ma zainstalowanego GUI (serwer)?
sylvainulg
startupmanager jest nieaktualny. Zobacz grup-customizer
muhasturk
39

Czysto wiersz poleceń, spowoduje to usunięcie wszystkich oprócz bieżącego i drugiego najbardziej aktualnego (poprzez „-2” w poleceniu head poniżej):

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
Kees Cook
źródło
9
one-liner stamtąd :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
Dmitrij Verkhoturov
@DmitryPaskal, powinieneś dodać to jako nową odpowiedź.
saji89
10
@DmitryPaskal Jak zawsze, nie tylko kopiuj-wklej je bez ich zrozumienia. Na mojej maszynie ta jedna linijka pasuje również, linux-libc-dev:amd64której nie należy usuwać.
jamesadney
1
@Kees Cook, czy argument awk nie powinien być otoczony tylko pojedynczymi cudzysłowami? Jeśli Twoim celem jest dodanie „linux-image-” do linii potokowych, wydaje się, że działa to tylko wtedy, gdy używasz awk '{print "linux-image-" $0}'.
Mark
to nie działa dla mnie, obejmuje moje niestandardowe zainstalowane jądro (Ubuntu 14.04 z 3.17)
Alex R
35

Aktualizacja: obecnie purge-old-kernelsjest przestarzała .

Stworzyłem skrypt do czyszczenia jąder nawet w trudnych warunkach. Nazywa się linux-purgei można go znaleźć tutaj .

Jeśli chcesz po prostu wyczyścić jądra (i powiązane pakiety), które są starsze niż obecnie używane jądro, gdy system nie jest uszkodzony, możesz użyć tego skryptu .

Jest też strona dokumentacji Ubuntu, do której przyczyniłem się w kwestii usuwania starych jąder tutaj .

jarno
źródło
Wygląda na purge-old-kernelsto, że nie jest w dokładnej wersji (1.22) bikeshed. Czy istnieje rozsądny / bezpieczny sposób na uzyskanie bardziej precyzyjnego roweru od niedawna? Czy może byłoby łatwiej / bezpieczniej po prostu zainstalować skrypt? Wolałbym jednak skorzystać z repozytorium, pomimo długiej listy zależności ..
drevicko
1
@drevicko Zobacz tutaj .
jarno
1
@drevicko, na pewno,dlocate -lsbin bikeshed
jarno
1
@drevicko, zobacz także inne pytanie
jarno
1
@ChrisW tak jest. Właśnie wprowadziłem niewielką poprawę do skryptu, więc najlepiej jest używać najnowszej wersji.
jarno
29

Możesz śledzić Korzystanie z „nienadzorowanej uaktualnień” sekcję pakietów z Automatic Updates Bezpieczeństwo artykule na Ubuntu Wiki wykonać to.

Musisz zmienić następujący wiersz w pliku /etc/apt/apt.conf.d/50unattended-upgrades ;

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

z

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

aby automatycznie usuwać stare pakiety, w tym jądra.

Usuń lub skomentuj linię

"^linux-image.*"; 

w sekcji „NeverAutoRemove” pliku /etc/apt/apt.conf.d/01autoremove.

Qwerty
źródło
2
Zrobiłem to, ale wciąż gromadziłem ponad 3 stare jądra, które zużywały 100 MB. Dodałem więc apt-get autoremovedo mojej codziennej pracy crona, która faktycznie wykonuje aktualizacje, ponieważ nie zawsze przechodzi ona przez wbudowanego menedżera aktualizacji.
Marcos
Myślę, że działa to w Trusty tylko dla jąder, które zostały zainstalowane automatycznie.
jarno
Jest to świetne, aby zapobiec tworzeniu się starych jąder podczas autoaktualizacji pakietów, np. Z aktualizacjami nienadzorowanymi. Jeśli jednak nie uruchomisz się ponownie, może się okazać, że pakiet dla aktualnie działającego jądra został odinstalowany! Może to powodować jeden problem: nowe urządzenia, które podłączasz, mogą nie działać, ponieważ nie można na nich załadować modułu, ponieważ nie ma go już na dysku. (Szybkim rozwiązaniem tego
problemu jest ponowne
Stworzyłem zautomatyzowane rozwiązanie wyżej wymienionego problemu. Jeśli uważasz, że jest to dobre podejście, dodaj je do odpowiedzi Qwerty.
joeytwiddle
27

Najszybszym / prostszym sposobem (dotyczy co najmniej od 12.04), który jest już dostępny z Ubuntu, jest apt-get. Wykonaj następujące czynności, jeśli chcesz usunąć wszystkie starsze wersje jądra, które nie są używane (z wyjątkiem poprzedniej, z której nie korzystasz. Aby upewnić się, że jeśli bieżąca wersja jądra ulegnie awarii, masz do zrobienia powrót do poprzedniego stanu). Wykonaj następujące czynności:

sudo apt-get autoclean

To wyeliminuje wszelkie stare pliki (w tym wersje jądra), które możesz mieć. Zauważ, że jeśli masz wiele starych wersji, potrwa to chwilę, ponieważ musi się upewnić, że usunięcie wersji jądra nie spowoduje żadnych problemów. Dla mnie usunięcie ostatnich 12 wersji jądra zajęło około 2 minut. Możesz także wykonać następujące czynności:

sudo apt-get clean

Co wyeliminuje wszystko pobrane i zapisane w folderze pamięci podręcznej apt. Wreszcie masz:

sudo apt-get autoremove

który sprawdziłby wszelkie nieużywane pakiety i usunął je w razie potrzeby. Jest to idealne rozwiązanie dla bibliotek i pakietów zależności, które nie są już potrzebne żadnej zainstalowanej aplikacji.

Luis Alvarado
źródło
1
Przypuszczam, że zmieniło się to w nowszych wydaniach, ponieważ w 14.04 to po prostu czyści pamięć podręczną pakietów i nie wpływa na zainstalowane pakiety ani grub.
jarno
2
Mogę potwierdzić, że sudo apt-get autoremoveusuwa stare (więcej niż jedna wersja) jądra w 14.04. Może być konieczne uruchomienie go przed i po aktualizacji jądra. Kiedy uruchomiłem przed aktualizacją, usunąłem tylko ogólną wersję starego jądra. Następnie, po aktualizacji mojego jądra, usunąłem również wersję lowlatency starego jądra.
tekNorah
Miałem na myśli sudo apt-get autocleanpolecenie. @ tekNorah Zainstalowałem kilka starszych jąder, a następnie uruchomiłem je sudo apt-get autoremovew Ubuntu Studio 14.04. Nie usunął żadnych jąder. Mam zainstalowane tylko jądra lowlatency. Dlaczego masz zainstalowane zarówno jądro -generic, jak i -lowlatency?
jarno
5
Tak, działało to dla mnie pięknie, wyczyściło wszystkie stare jądra poprawnie i nie polega na szalonych skryptach jednowierszowych! Polecam, chciałbym móc to zagłosować więcej niż raz!
Jeff Atwood
1
@JeffAtwood dobrze, może usunąć więcej bezpiecznych jąder. Zobacz raport o błędzie
jarno
25

10.04 Metoda GUI

Computer Janitor może wyczyścić stare jądra i uważam, że jest domyślnie instalowany w Ubuntu (ale nie Kubuntu).

GRUB 1, jeśli go używasz, ma opcję /boot/grub/menu.lstokreślającą, ile jąder ma wyświetlać maksymalnie. GRUB 2, o ile mogę powiedzieć, nie ma.

maco
źródło
4
Nie należy używać komputera Janitor - jest on błędny i został teraz usunięty jako domyślna aplikacja w natty / oneiric / precision.
fossfreedom
2
Zamiast tego zainstaluj „Ubuntu Tweak” zgodnie z opisem w innej odpowiedzi (własnej ppa), która ma własnego „komputerowego woźnego” (nie mylić z „komputerowym woźnym”, który tymczasowo był dostępny w starszych wersjach Ubuntu)
Michael
25

Aby dowiedzieć się, jakie jądra i nagłówki są zainstalowane, użyj

dpkg -l | grep linux-image

dpkg -l | grep linux-headers

Następnie możesz je usuwać pojedynczo lub razem, pamiętaj tylko, aby zachować najnowsze.

Istnieje również kilka przydatnych poleceń i skryptów do automatyzacji usuwania.

http://ubuntuforums.org/showthread.php?t=1658648

Następujące roszczenia do usunięcia wszystkich nieużywanych jąder i nagłówków:

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

(użyj, apt-get -yaby usunąć bez pytania)

Oto, co dzieje się po uruchomieniu 18.04.1:

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

\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[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
mikewhokolwiek
źródło
Skrypt znaleziony na forum jest wadliwy. Może nie usunąć pożądanego pakietu nagłówka (jeśli zdarzy się, że użyjesz starego jądra -pae), a z drugiej strony może usunąć niektóre pakiety, które chcesz zachować.
jarno
Dziękuje za komentarz. Skrypt może nie być idealny, jednak używam go od lat, głównie w wersjach 12.04 i 14.04, 32 i 64 bity, i nie miałem żadnych problemów. ... i tak, linux-libc-devjest zainstalowany.
mikewhthing
linux-libc-devPodejrzewam, że numer wersji odpowiada numerowi wersji obecnego jądra. Tutaj dpkg -l linux-libc-dev | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'drukuje linux-libc-dev: amd64
jarno
Nadal nie mogę odtworzyć twoich ustaleń, jednak dla pewności zmodyfikowałem polecenie, dodając dodatkowy filtr - grep -E "(image|headers)".
mikewhith
1
Najpierw spróbuj bez -yflagi z czystką, proszę ...!
niebezpieczne89
16

Aby usunąć starsze jądra systemu Linux, najpierw uruchom jądro, które chcesz zachować.

Możesz również sprawdzić wersję jądra za pomocą polecenia, uname -raby przez pomyłkę nie usunąć niewłaściwej wersji.

Teraz przejdź do menedżera pakietów synaptycznych i wyszukaj linux-imagei usuń starsze wersje oprócz tej pokazanej przez górne polecenie. Ogólnie wolę iść z najnowszym.

Teraz po ponownym uruchomieniu zobaczysz czystsze menu grub.

anurag-jain
źródło
Jest to prawdopodobnie najbardziej podstawowa metoda dla użytkowników, którzy zainstalowali komputer bez dozorcy komputera.
Broam
1
Od Ubuntu 11.04 menu grub domyślnie pokazuje tylko bieżące jądro, starsze jądra są ukryte w menu „Poprzednie jądra”. Ta metoda nadal będzie działać na czyszczenie starszych.
Andy
14

Możesz zainstalować ubuntu-tweak, a następnie Idź do Aplikacje -> Narzędzie systemowe -> ubuntu tweak i

wprowadź opis zdjęcia tutajkliknij opcję czyszczenia pakietu i czyszczenia jądra. nie pokazuje aktualnie używanego jądra, więc zawsze będziesz bezpieczny.

Lincity
źródło
8

Osobiście lubię używać Synaptic. To sprawia, że ​​czuję się bardziej bezpiecznie, co się dzieje. Jedyną aplikacją, której użyłem, która ma opcję usuwania starych jąder, jest Ubuntu Tweak .

Jak usunąć jądra, których nie używasz:

  • Otwórz UbuntuTweak
  • Kliknij „Package Cleaner” w sekcji „Aplikacje” w lewym panelu
  • Po prawej stronie „widoku czyszczenia” naciśnij „Wyczyść jądra”
  • Wybierz wszystkie jądra - myślę, że tego używanego nie ma na liście, ale na wszelki wypadek sprawdź, czy działa uname -aw terminalu
Alan Featherston
źródło
W Synaptic możesz filtrować według „Komponentów” -> „Jądro i moduły”, które obejmują wszystkie jądra. Sortuj według pierwszej kolumny: „S” (Status), aby wszystkie zainstalowane jądra były na górze. Rzeczywiście update-grubzaleca się.
niebezpieczne89
6

Możesz odinstalować stare jądra ( linux-image-...pakiety) za pomocą Synaptic, a to usunie je z menu uruchamiania. Uważaj, aby nie usunąć działającego jądra (możesz sprawdzić jego wersję za pomocą uname -r).

Pamiętaj, że posiadanie jednej lub dwóch starszych wersji może pomóc w rozwiązywaniu problemów, jeśli coś pójdzie nie tak.

Alternatywnie możesz edytować / usuwać wpisy ręcznie ( gksu gedit /boot/grub/grub.cfg), ale zostaną one ponownie wygenerowane po aktualizacji do nowszego jądra. Jeśli myślisz o usunięciu recovery modeopcji - nie rób tego. Mogą się przydać, jeśli złamiesz coś, co uniemożliwi uruchomienie.


Sprawdź tę stronę.

evgeny
źródło
Grub2 buduje teraz swój wpis grub za każdym razem, gdy instalowane jest nowe jądro. za pomocą update-grubktórego ponownie napisze wszystkie te jądra.
Marco Ceppi
4

Jest to rozwiązanie oparte wyłącznie na linii poleceń.

Najpierw wygeneruj listę wszystkich zainstalowanych wersji jądra oprócz aktualnie działającego jądra:

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

Alternatywnie wygeneruj listę wszystkich zainstalowanych wersji jądra oprócz dwóch ostatnich:

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

Sprawdź listę. Upewnij się, że wersje jądra, które chcesz zachować, nie znajdują się na liście. Użyj polecenia, uname -raby zobaczyć wersję aktualnie uruchomionego jądra.

Jeśli jesteś zadowolony z wyników, możesz użyć apt-getdo usunięcia pakietów.

Najpierw suchy bieg (na przykładzie pierwszego generatora):

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

Potem prawdziwy bieg:

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

Jeśli chcesz zautomatyzować proces, dodaj --yesparametr:

sudo apt-get --yes purge $(
  ...)
lesmana
źródło
@jarno Doceniam twój wysiłek, aby połączyć i zoptymalizować moją linię poleceń. Usunąłem twoją linię poleceń, ponieważ wolę czytelność i prostotę. Celowo dostosowałem swoje polecenie pod kątem czytelności i prostoty. Przynajmniej czytelny i prosty dla mojego mózgu. Proszę zamieścić wiersz polecenia jako komentarz lub we własnej odpowiedzi.
lesmana
1
Łączy to dwa cele: Zachowaj dwa ostatnie jądra i utrzymuj jądra nowsze niż bieżące sudo apt-get purge -- $(ls -1U /boot/vmlinuz* | cut -d- -f2,3 | sort -uV | head -n -2 | awk -v c=$(uname -r | cut -d- -f1,2) '($0==c){exit} //' | sed -r -e 's/\./\\./g' -e 's/.*/-&($|-)/'). Nie ma takiej potrzeby, dpkg-queryponieważ apt-getmoże obsługiwać wyrażenia regularne. Zwróć uwagę, w jaki sposób unikam kropek i dodam przedrostek i sufiks w wyrażeniu regularnym. Używając skryptu we własnej odpowiedzi , możesz także zachować niektóre jądra, które są starsze niż bieżące.
jarno
4

Zaletą tej odpowiedzi jest to, że natywny Ubuntu Bash jest używany bez instalowania aplikacji innych firm. Użytkownicy niestandardowych jąder, którzy nie używali aptlub nie dpkgmogli zmienić tego skryptu bash zgodnie z własnymi potrzebami. Ta odpowiedź jest oparta na ( Jak selektywnie wyczyścić wszystkie stare jądra jednocześnie ).

Rozwiązanie oparte na Zenity

Zenity zapewnia przyjemny interfejs GUI do terminala do przetwarzania listy i wybierania elementów za pomocą przycisków opcji :

jądra rm 1

Jak wskazuje tytuł, nie można usunąć bieżącego jądra, z którego uruchomiono system, i nie ma go na liście. Podany rozmiar określa, ile zostanie zapisanych w /bootkatalogu. Więcej jest zapisywane na dysku, ponieważ pliki binarne jądra znajdują się również w innych obszarach. Uwaga z 27 lipca 2017: Katalogi /usr/src/*kernel_version*i /lib/modules/*kernel_version*teraz również są uwzględnione.

Data modyfikacji zostaje odkryta za pomocą statpolecenia. W moim systemie ta data jest „dotykana” za każdym razem, gdy jądro jest uruchamiane przy użyciu tego ( Jak dowiedzieć się, kiedy konkretna wersja jądra została ostatnio uruchomiona? ) Skrypt restartu cron . Jednak w twoim systemie data będzie datą wydania jądra, a nie ostatnim uruchomieniem systemu.

apt-get purge daje szansę na przerwanie ciąży

Masz ostatnią okazję, aby zobaczyć wszystko, co zostanie wyczyszczone i zobaczyć całkowite miejsce na dysku (nieco mylące), które zostanie odzyskane:

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] 

Kod

Skopiuj ten kod do pliku wykonywalnego o nazwie rm-kernelsw /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

UWAGA: Aby utworzyć plik, potrzebujesz uprawnień sudo, więc użyj:

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

Aby użyć pliku wykonywalnego:

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

Wersja serwera

rm-kernels-serverto wersja serwerowa do selektywnego usuwania jąder jednocześnie. Zamiast okna dialogowego z graficznym interfejsem użytkownika do wybrania jądra do oczyszczenia służy okno dialogowe tekstowe.

  • Przed uruchomieniem skryptu musisz zainstalować funkcję okna dialogowego, używając:

    sudo apt install dialog

Okno dialogowe jest w domyślnej instalacji Ubuntu Desktop, ale nie w Ubuntu Server.

Przykładowy ekran

rm-kernels-server 1

rm-kernels-server kod bash

#!/bin/bash

# NAME: rm-kernels-server
# PATH: /usr/local/bin
# DESC: Provide dialog checklist of kernels to remove
#       Non-GUI, text based interface for server distro's.

# DATE: Mar 10, 2017. Modified Jul 28, 2017.

# NOTE: Will not delete current kernel.

#       With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
#       # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
#       First time for `du` 34 seconds.
#       Second time for `du` 1 second.

# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
#       By default `du` is not used and estimated size is displayed.

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    echo "root access required. Use: sudo rm-kernels-server"
    exit 99
fi

# Must have the dialog package. On Servers, not installed by default
command -v dialog >/dev/null 2>&1 || { echo >&2 "dialog package required but it is not installed.  Aborting."; exit 99; }

OLDIFS="$IFS"
IFS="|"
item_list=() # Deviate from rm-kernels here.

current_version=$(uname -r)
i=0
for f in /boot/vmlinuz*
do
    if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
    [[ $f =~ vmlinuz-(.*) ]]
    ((i++)) # Item List
    v=${BASH_REMATCH[1]}        # example: 4.9.21-040921-generic
    v_main="${v%-*}"            # example: 4.9.21-040921

    # Kernel size in /boot/*4.9.21-040921-generic*
    s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')

    if [[ $# -ne 0 ]] ; then    # Was a parameter passed?
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             # Kernel headers size in /usr/src/*4.9.21-040921*
             s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
        else
             s2="0M"            # Linux Headers are not installed
        fi
        # Kernel image size in /lib/modules/4.9.21-040921-generic*
        s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
    else
        # Estimate sizof of optional headers at 125MB and size of image at 220MB
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             s2="125M"
        else
             s2="0M"            # Linux Headers are not installed
        fi
        s3="220M"
    fi

    # Strip out "M" provided by human readable option of du and add 3 sizes together
    s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
    t=$(( t + s ))
    s=$s" MB"
    d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
    item_list=("${item_list[@]}" "$i" "$v ! $d ! $s" off)
done

cmd=(dialog --backtitle "rm-kernels-server - Total: $t MB excluding: $current_version" \
    --title "Use space bar to toggle kernel(s) to remove" \
    --column-separator "!" \
    --separate-output \
    --ascii-lines \
    --checklist "         Kernel Version --------- Modified Date  Size" 20 60 15)

selections=$("${cmd[@]}" "${item_list[@]}" 2>&1 >/dev/tty)

IFS=$OLDIFS

if [ $? -ne 0 ] ; then
    echo cancel selected
    exit 1
fi

i=0
choices=()

for select in $selections ; do
    ((i++))
    j=$(( 1 + ($select - 1) * 3 ))
    choices[i]=$(echo ${item_list[j]} | cut -f1 -d"!")
done

i=0
list=""
for choice in "${choices[@]}" ; do
    if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
    ((i++))

    short_choice=$(echo $choice | cut -f1-2 -d"-")
    header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)

    # If -lowlatency and -generic are purged at same time the _all header directory
    # remains on disk for specific version with no -generic or -lowlatency below.
    if [[ $header_count -lt 3 ]]; then
        # Remove all w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
        list="$list""linux-image-$choice- linux-headers-$choice" 
    fi

done

if [ "$i" -gt 0 ] ; then
    apt-get purge $list
fi

UWAGA: W wezwaniu do dialogdyrektywy --ascii-linesprzekazywana jest zamiana rozszerzonego zestawu znaków rysowania linii (który sshnie lubi) na „+ ----- +” dla pól rysowania. Jeśli nie podoba ci się ten wygląd, możesz użyć --no-linesdyrektywy w ogóle bez pudełka.


Aktualizacje z 28 lipca 2017 r

Pobrano obliczony rozmiar każdego jądra, z /boot/*kernel_version*którego było 5 plików o łącznej ~ 50 MB. Formuła uległa zmianie, aby uwzględnić pliki w /usr/src/*kernel_version*i /lib/modules/*kernel_version*. Obliczony rozmiar każdego jądra wynosi teraz ~ 400 MB. Powyższy kod dla rm-kernelsi rm-kernels-serverzostał zaktualizowany. Jednak powyższe przykładowe ekrany nie odzwierciedlają jeszcze tych zmian.

Domyślnie szacuje się rozmiar plików nagłówków linuksa na 125 MB i obrazu linux na 220 MB, ponieważ dumoże być boleśnie powolny, chyba że pliki są w pamięci podręcznej. Aby uzyskać rzeczywisty rozmiar, użyj dudowolnego parametru do skryptu.

Suma wszystkich rozmiarów jądra (z wyjątkiem bieżącej wersji, której nie można usunąć) jest teraz wyświetlana na pasku tytułu.

Okno dialogowe używane do wyświetlania daty ostatniego dostępu każdego jądra . Ta data może zostać masowo nadpisana dla wszystkich jąder podczas tworzenia kopii zapasowej lub podobnych operacji. Okno dialogowe pokazuje teraz zamiast tego datę modyfikacji .

WinEunuuchs2Unix
źródło
2

Łatwym sposobem na pozbycie się prawie wszystkich przestarzałych pakietów, pakietów, które nie są już na żadnej liście pakietów, oraz przestarzałych jąder jest wykonanie jednej z następujących czynności:

dpkg --purge $(aptitude search ?obsolete)

Pominie to jednak pakiety, które są nadal zalecane przez inne pakiety, a argument -R / - bez-poleca nie rozwiązuje tego problemu.

dselect po przełączeniu trybu sortowania na „o” pokaże wszystkie przestarzałe pakiety, w tym te, które brakuje, ale niektóre osoby nie lubią ich używać.

Chris Cheney
źródło
Podane przeze mnie polecenie nie usuwa starych jąder ani nie wpływa na menu grub.
jarno
2

Zaakceptowana odpowiedź polegająca sedna usunięciu starszych jąder na stałe ma pewne wady, jeśli ktoś nie uruchomił ponownie komputera po aktualizacji jądra, polecenie usunie także nowsze jądro.

Oto alternatywne rozwiązanie, które weźmie pod uwagę wszystkie sytuacje, aby usunąć tylko rzeczywiste starsze jądra:

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

Jeśli masz wersję nowszą niż bieżąca, pojawi się ostrzeżenie, aby najpierw ponownie uruchomić komputer. Zauważ również, że starsze jądra są zachowane z dobrego powodu, który jest taki, że jeśli w jakiś sposób zepsujesz swoje obecne jądro, powodując niestabilność systemu, powinieneś być w stanie uruchomić się na dowolnym starszym jądrze.

heemayl
źródło
Nie usunie to jąder ani jąder o innym smaku niż ogólny.
jarno
Przypuszczam, że odwołujesz się do tych sed rozwiązań.
jarno
@jarno: Jak o wymianie grep -Po "^linux-image-[^-]+-[^-]+-generic\b"z grep -Eo "^linux-(image|headers|tools)-[^-]+-[^-]+(|-generic)\s" | sed -e "s/\s//g"i grep -Po ".*(?=-[a-z]*$)"z grep -Eo "^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"a grep -Po "[0-9].*(?=-[a-z]*)"z grep -Eo "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"?
Sadi
@Sadi, wel, ja też nie znalazłbym jąder lowlatency.
jarno
1
Dzięki. Inne metody nie działały dla mnie. Twój wykonał robotę.
Philippe Delteil,
1

ailurus ma funkcję usuwania starych jąder, a także nieużywanych konfiguracji. Osobiście usuwam go ręcznie z synaptic. Możesz zainstalować ailurus z getdeb oraz ppa

sagarchalizować
źródło
„Ailurus to narzędzie do tworzenia kopii zapasowych nazw zainstalowanych programów.… W przeszłości Ailurus miał wiele funkcji. Teraz ma tylko jedną funkcję. Ponieważ uważam, że jedna naprawdę przydatna funkcja jest lepsza niż dziesiątki mniej użytecznej funkcji”.
jarno
1

Mam do tego skrypt, który nie wymaga bardzo fantazyjnej analizy ciągów.

Usuń nagłówki i obrazy oprócz bieżącego, aby zwolnić miejsce

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)+
Paulo Santos
źródło
1

Możesz użyć ukuu - to wszystko GUI - do aktualizacji i usuwania starych jąder. Pracuje dla mnie!

Pamiętaj tylko, że zostaw ostatnie 2 zainstalowane i oczywiście „działające” jądro.

Możesz także ustawić ukuu, aby wyświetlał tylko wersje główne, nawet jądra RC, wersje ukryte.

ukuu

Możesz znaleźć ukuu w Synaptic, lub instrukcje są tutaj:

OMG! Ubuntu instrukcje instalacji ukuu

sprocketoctopus
źródło
1

Na podstawie poprzedniej odpowiedzi Davida Kempa poniższy skrypt wyczyści wszystkie nagłówki i obrazy z wyjątkiem ostatnich 2 wersji.

#!/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]\+\).*/\1/' | 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 purge

(użyj, apt-get -yaby usunąć bez pytania)

Mark
źródło
Czy jest jakiś powód, dla którego został to odrzucony? Czy to nie zadziałało dla kogoś? Podczas kopiowania / wklejania upewnij się, że nie owijasz długich linii podczas wklejania. Nie miałem problemów z działaniem.
Mark
Najnowsze wydanie jądra w mojej maszynie to 3.13.0-43-lowlatency. Ten skrypt wyczyściłby linux-headers-3.13.0-43-lowlatency.
jarno
@jarno, jak to ustaliłeś? aby wypróbować to bez robienia czegokolwiek, dodaj flagę „-s” do polecenia apt-get (lub po prostu usuń | xargs sudo apt-get -y purgecałkowicie). Jeśli wydrukuje 3.13.0-43-lowlatency, być może masz jakieś nowsze wersje niż ta zainstalowana w twoim systemie.
Mark
Próbowałem symulacji. Nie, ale usunąłem niektóre wcześniejsze wersje jądra, ale nie zostały one usunięte, a odpowiednie pakiety nagłówków zostały usunięte.
jarno
W każdym razie opracowuję skrypt oparty na idei odpowiedzi Sankalpa.
jarno
0

Oto ogólny zarys tego, co zrobiłem, ostrożnie, ponieważ nie jestem ekspertem od Linuksa. Upewnij się, że wiesz, co robisz, i że utworzyłeś kopię zapasową plików, które modyfikujesz.

gedit /boot/grub/grub.cfg

następnie znajdź wpisy, które chcesz zachować, zaznaczymy je i skopiujemy

cd /etc/grub.d
ls

zobaczysz listę plików takich jak 10_linux i 30_os-prober

sudo chmod -x 10_linux

przestanie to automatycznie dodawać wszystkie wpisy linuksa do menu rozruchu grub.

gksudo gedit 40_custom

otwórz niestandardowy plik menu rozruchu, a następnie wróć do grub.cfg (który nadal powinien być otwarty w gedit) i skopiuj wpisy, które chcesz zachować ... takie jak

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
}

wklej je 40_custom, a następnie zapisz.

sudo chmod 755 40_custom

sprawia, że ​​jest wykonywalny, a następnie aktualizujemy grub, co zmieni plik grub.cfg:

sudo update-grub

OSTRZEŻENIE, jeśli zaktualizujesz jądro lub system operacyjny, menu rozruchu prawdopodobnie się nie zaktualizuje ... musisz to zrobić ręcznie. Ale wykonanie tej procedury pozwoli ci jeszcze bardziej dostosować menu startowe, na przykład usunąć wersję jądra i po prostu wstawić nazwę Ubuntu ... tj. Ubuntu Lucid 10.04 itp.

Mam nadzieję, że ktoś uzna to za pomocne, ponieważ zajęło mi to trochę czasu, aby wymyślić ... nigdzie nie widziałem tego rozwiązania ...

Joe
źródło
3
Ta odpowiedź wydaje się przesadna. Lepiej jest po prostu usunąć stare jądra.
Scott Severance
Przeczytałem, że dodatkowe jądra mogą być przydatne w sytuacjach odzyskiwania. Jest to także prosty sposób edycji tekstu wpisu rozruchowego. Zamiast więc mówić „Ubuntu, jądro Linuksa xxxx-yy --text1 -text2 -t3 -t4 --t5 itd. Itd. Itd.” (Gdzie wpisy --text oznaczają tylko niektóre opcje / parametry, których nie rozumiem), możesz zmienić do „Ubuntu xx.yy”, chociaż miałem nawias „{”, którego nie mogłem się pozbyć.
Joe
1
Trzymam najbliższe poprzednie jądro, dopóki nie sprawdzę, czy najbardziej aktualne jądro działa poprawnie. Jeśli to zadziała, nie przestanie działać. Po zweryfikowaniu najnowszego jądra (po około tygodniu) nie mam powodu, aby trzymać stare jądro w pobliżu. Jeśli to nie zadziała, to mam najnowsze znane dobre jądro, do którego mogę wrócić. Aktualnie używam starego jądra z powodu błędu showstopper w obecnych jądrach. Ale to nie zmienia mojej ogólnej polityki. Potrzebujesz tylko jednego znanego dobrego jądra.
Scott Severance
0

Zainstaluj menedżera pakietów synaptycznych i przejdź do karty filtrów (myślę, że filtry, jeśli nie wypróbuję wszystkich 5) i wybierz „lokalny”. Spowoduje to wyświetlenie osieroconych pakietów w systemie, takich jak jądra. Po ich odinstalowaniu uruchom update-grub. To polecenie aktualizuje listę opcji rozruchu dla grub.

Jeśli to się nie powiedzie, zawsze możesz spróbować apt-get remove linux-image-version-generic.

Smakować
źródło
W Synaptic możesz filtrować według „Komponentów” -> „Jądro i moduły”, które obejmują wszystkie jądra. Sortuj według pierwszej kolumny: „S” (Status), aby wszystkie zainstalowane jądra były na górze. Rzeczywiście update-grubzaleca się.
niebezpieczne89
0

Aby mieć nieco większą kontrolę nad tym, które wersje zachować, wyraźnie wybierz te, które chcesz usunąć. Na przykład, jeśli chcesz usunąć jądro w wersji 3.2.0. [49-53], użyj prostej forpętli:

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

Dopasuj listę wersji jądra, aby dopasować.

NeilNjae
źródło
0

Spróbuj tego. Uruchom jako root.

Zapisz ten skrypt jako, powiedzmy ./keep-n-kernels.sh

Podaj jako argument wiersza poleceń liczbę najnowszych jąder, które chcesz zachować.

    
#! / bin / bash

# przekaż n jako argument wiersza poleceń, a znajdzie wszystkie zainstalowane
# jądra i zachowaj tylko najnowsze n => odinstaluj wszystkie starsze

# dpkg -l 'linux- *' | sed '/ ^ ii /! d; /' "$ (uname -r | sed" s /\(.*\)-\([^ 0-9] \ + \) / \ 1 / ")" '/ d; s / ^ [^] * [^] * \ ([^] * \). * / \ 1 /; / [0-9] /! d '
# to polecenie wyświetla listę wszystkich pakietów Z WYJĄTKIEM najnowszego jądra.
# źródło: https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels

n = 1 USD

# znajdź zainstalowane wersje jądra:
# dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep | sortuj -n
# podaje numery wersji, po jednym w każdym wierszu
# dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep | sed 's /\...$// g' | grep -v '\ ... $' | sort -u
# daje tylko te, które pojawiają się w obrazie linux

# sufiks, np. -generic-pae
# rodzaj jądra, do którego się ładujesz
sufiks = $ (uname -r | sed 's: ^ [0-9] \. [0-9] \. [0-9] \ - [0-9] \ {2 \} :: g')

polecenie = "apt-get purge"

dla wersji w $ (dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep. | sed 's /\...$// g' | grep -v ' \ ... $ '| sort -u | head -n - $ {n})
zrobić
    polecenie = $ {polecenie} "^ linux-image - $ {wersja} $ {sufiks}"
gotowy

polecenie $

Przykładowe użycie:

# ./keep-n-kernels.sh 4 # uruchom polecenie apt-get, aby usunąć wszystkie jądra oprócz 4 najnowszych

Jeśli chcesz [I NA WŁASNE RYZYKO], możesz dodać -y (lub flagę wymuszenia) do komendy apt-get i sprawić, by nie była interaktywna.

Sankalp
źródło
Usuwa wszystkie jądra, jeśli uruchomisz ./keep-n-kernels.sh 0. Wykrywanie łańcucha sufiksu nie działa; Myślę, że sufiks = $ (uname -r | sed -r 's / ^ [0-9.] * (- [0-9.] +) * //') lub sufiks = $ (uname -r | egrep - -only-dopasowanie - '- [[: alpha:] -] + $') zrobiłoby.
jarno
Ale myślę, że pomysł jest fajny. Pracowałem nad ulepszeniem skryptu i być może opublikuję go tutaj, kiedy uważam, że jest wystarczająco gotowy.
jarno
Proszę podziel się, @jarno. Cieszę się, że pomysł wydaje się przydatny.
Sankalp,
Ok,
oto
0

Korzystam z pulpitu KDE, a najłatwiejszą dostępną opcją było użycie aplikacji kde-config-grub2, jak to sugerowano tutaj: https://www.kubuntuforums.net/showthread.php?58075-remove-old-linux-versions (który już zainstalowałem w celu ustawienia obrazu tła, domyślnej opcji rozruchu itp.). Obok rozwijanego pola, w którym można wybrać domyślny wpis, znajduje się przycisk „Usuń stare wpisy”. Kliknięcie tego przycisku wyświetla listę wszystkich zainstalowanych jąder i możesz wybrać, które z nich chcesz usunąć. Po zastosowaniu zmian użyje programu dpkg, aby usunąć je z systemu, a także z menu GRUB.

Ben
źródło
0

Aby wejść, możesz także wydać

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

jako root, a zadanie zostanie wykonane.

Severo Raz
źródło
0

Jeśli używasz ansible do sterowania maszynami, ten poradnik może być pomocny.

---
 - hosts: all
   become: yes
   tasks:
    - name: "Run apt-get autoremove"
      apt: 
        name: linux-image-generic
        autoremove: yes
        state: present 
        update_cache: yes
        cache_valid_time: 3600
Flickerfly
źródło